Merge
This commit is contained in:
commit
fee4fbec38
@ -122,6 +122,18 @@ public final class Math {
|
||||
*/
|
||||
public static final double PI = 3.14159265358979323846;
|
||||
|
||||
/**
|
||||
* Constant by which to multiply an angular value in degrees to obtain an
|
||||
* angular value in radians.
|
||||
*/
|
||||
private static final double DEGREES_TO_RADIANS = 0.017453292519943295;
|
||||
|
||||
/**
|
||||
* Constant by which to multiply an angular value in radians to obtain an
|
||||
* angular value in degrees.
|
||||
*/
|
||||
private static final double RADIANS_TO_DEGREES = 57.29577951308232;
|
||||
|
||||
/**
|
||||
* Returns the trigonometric sine of an angle. Special cases:
|
||||
* <ul><li>If the argument is NaN or an infinity, then the
|
||||
@ -233,7 +245,7 @@ public final class Math {
|
||||
* @since 1.2
|
||||
*/
|
||||
public static double toRadians(double angdeg) {
|
||||
return angdeg / 180.0 * PI;
|
||||
return angdeg * DEGREES_TO_RADIANS;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -249,7 +261,7 @@ public final class Math {
|
||||
* @since 1.2
|
||||
*/
|
||||
public static double toDegrees(double angrad) {
|
||||
return angrad * 180.0 / PI;
|
||||
return angrad * RADIANS_TO_DEGREES;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -97,6 +97,19 @@ public final class StrictMath {
|
||||
*/
|
||||
public static final double PI = 3.14159265358979323846;
|
||||
|
||||
/**
|
||||
* Constant by which to multiply an angular value in degrees to obtain an
|
||||
* angular value in radians.
|
||||
*/
|
||||
private static final double DEGREES_TO_RADIANS = 0.017453292519943295;
|
||||
|
||||
/**
|
||||
* Constant by which to multiply an angular value in radians to obtain an
|
||||
* angular value in degrees.
|
||||
*/
|
||||
|
||||
private static final double RADIANS_TO_DEGREES = 57.29577951308232;
|
||||
|
||||
/**
|
||||
* Returns the trigonometric sine of an angle. Special cases:
|
||||
* <ul><li>If the argument is NaN or an infinity, then the
|
||||
@ -179,7 +192,7 @@ public final class StrictMath {
|
||||
public static strictfp double toRadians(double angdeg) {
|
||||
// Do not delegate to Math.toRadians(angdeg) because
|
||||
// this method has the strictfp modifier.
|
||||
return angdeg / 180.0 * PI;
|
||||
return angdeg * DEGREES_TO_RADIANS;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -196,7 +209,7 @@ public final class StrictMath {
|
||||
public static strictfp double toDegrees(double angrad) {
|
||||
// Do not delegate to Math.toDegrees(angrad) because
|
||||
// this method has the strictfp modifier.
|
||||
return angrad * 180.0 / PI;
|
||||
return angrad * RADIANS_TO_DEGREES;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1451,11 +1451,9 @@ public final class String
|
||||
*/
|
||||
public int hashCode() {
|
||||
int h = hash;
|
||||
if (h == 0 && value.length > 0) {
|
||||
char val[] = value;
|
||||
|
||||
for (int i = 0; i < value.length; i++) {
|
||||
h = 31 * h + val[i];
|
||||
if (h == 0) {
|
||||
for (char v : value) {
|
||||
h = 31 * h + v;
|
||||
}
|
||||
hash = h;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -33,6 +33,7 @@ import java.security.Provider.Service;
|
||||
|
||||
import sun.security.jca.*;
|
||||
import sun.security.jca.GetInstance.Instance;
|
||||
import sun.security.util.Debug;
|
||||
|
||||
/**
|
||||
* The KeyPairGenerator class is used to generate pairs of
|
||||
@ -126,6 +127,11 @@ import sun.security.jca.GetInstance.Instance;
|
||||
|
||||
public abstract class KeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("keypairgenerator");
|
||||
|
||||
private final String algorithm;
|
||||
|
||||
// The provider
|
||||
@ -167,6 +173,12 @@ public abstract class KeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
kpg = new Delegate(spi, algorithm);
|
||||
}
|
||||
kpg.provider = instance.provider;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyPairGenerator." + algorithm +
|
||||
" algorithm from: " + kpg.provider.getName());
|
||||
}
|
||||
|
||||
return kpg;
|
||||
}
|
||||
|
||||
@ -557,6 +569,11 @@ public abstract class KeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
provider = instance.provider;
|
||||
this.serviceIterator = serviceIterator;
|
||||
initType = I_NONE;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyPairGenerator." + algorithm +
|
||||
" algorithm from: " + provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -37,6 +37,8 @@ import javax.crypto.SecretKey;
|
||||
import javax.security.auth.DestroyFailedException;
|
||||
import javax.security.auth.callback.*;
|
||||
|
||||
import sun.security.util.Debug;
|
||||
|
||||
/**
|
||||
* This class represents a storage facility for cryptographic
|
||||
* keys and certificates.
|
||||
@ -177,6 +179,11 @@ import javax.security.auth.callback.*;
|
||||
|
||||
public class KeyStore {
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("keystore");
|
||||
|
||||
/*
|
||||
* Constant to lookup in the Security properties file to determine
|
||||
* the default keystore type.
|
||||
@ -801,6 +808,11 @@ public class KeyStore {
|
||||
this.keyStoreSpi = keyStoreSpi;
|
||||
this.provider = provider;
|
||||
this.type = type;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyStore." + type.toUpperCase() + " type from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -35,6 +35,8 @@ import java.io.ByteArrayInputStream;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import sun.security.util.Debug;
|
||||
|
||||
/**
|
||||
* This MessageDigest class provides applications the functionality of a
|
||||
* message digest algorithm, such as SHA-1 or SHA-256.
|
||||
@ -103,6 +105,11 @@ import java.nio.ByteBuffer;
|
||||
|
||||
public abstract class MessageDigest extends MessageDigestSpi {
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("messagedigest");
|
||||
|
||||
private String algorithm;
|
||||
|
||||
// The state of this digest
|
||||
@ -156,18 +163,23 @@ public abstract class MessageDigest extends MessageDigestSpi {
|
||||
public static MessageDigest getInstance(String algorithm)
|
||||
throws NoSuchAlgorithmException {
|
||||
try {
|
||||
MessageDigest md;
|
||||
Object[] objs = Security.getImpl(algorithm, "MessageDigest",
|
||||
(String)null);
|
||||
if (objs[0] instanceof MessageDigest) {
|
||||
MessageDigest md = (MessageDigest)objs[0];
|
||||
md.provider = (Provider)objs[1];
|
||||
return md;
|
||||
md = (MessageDigest)objs[0];
|
||||
} else {
|
||||
MessageDigest delegate =
|
||||
new Delegate((MessageDigestSpi)objs[0], algorithm);
|
||||
delegate.provider = (Provider)objs[1];
|
||||
return delegate;
|
||||
md = new Delegate((MessageDigestSpi)objs[0], algorithm);
|
||||
}
|
||||
md.provider = (Provider)objs[1];
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("MessageDigest." + algorithm +
|
||||
" algorithm from: " + md.provider.getName());
|
||||
}
|
||||
|
||||
return md;
|
||||
|
||||
} catch(NoSuchProviderException e) {
|
||||
throw new NoSuchAlgorithmException(algorithm + " not found");
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ import java.security.Provider.Service;
|
||||
|
||||
import sun.security.jca.*;
|
||||
import sun.security.jca.GetInstance.Instance;
|
||||
import sun.security.util.Debug;
|
||||
|
||||
/**
|
||||
* This class provides a cryptographically strong random number
|
||||
@ -93,6 +94,11 @@ import sun.security.jca.GetInstance.Instance;
|
||||
|
||||
public class SecureRandom extends java.util.Random {
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("securerandom");
|
||||
|
||||
/**
|
||||
* The provider.
|
||||
*
|
||||
@ -235,6 +241,11 @@ public class SecureRandom extends java.util.Random {
|
||||
this.secureRandomSpi = secureRandomSpi;
|
||||
this.provider = provider;
|
||||
this.algorithm = algorithm;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("SecureRandom." + algorithm +
|
||||
" algorithm from: " + this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -121,6 +121,11 @@ public abstract class Signature extends SignatureSpi {
|
||||
private static final Debug debug =
|
||||
Debug.getInstance("jca", "Signature");
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("signature");
|
||||
|
||||
/*
|
||||
* The algorithm for this signature object.
|
||||
* This value is used to map an OID to the particular algorithm.
|
||||
@ -451,6 +456,11 @@ public abstract class Signature extends SignatureSpi {
|
||||
throws InvalidKeyException {
|
||||
engineInitVerify(publicKey);
|
||||
state = VERIFY;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Signature." + algorithm +
|
||||
" verification algorithm from: " + this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -495,6 +505,11 @@ public abstract class Signature extends SignatureSpi {
|
||||
PublicKey publicKey = certificate.getPublicKey();
|
||||
engineInitVerify(publicKey);
|
||||
state = VERIFY;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Signature." + algorithm +
|
||||
" verification algorithm from: " + this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -511,6 +526,11 @@ public abstract class Signature extends SignatureSpi {
|
||||
throws InvalidKeyException {
|
||||
engineInitSign(privateKey);
|
||||
state = SIGN;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Signature." + algorithm +
|
||||
" signing algorithm from: " + this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -529,6 +549,11 @@ public abstract class Signature extends SignatureSpi {
|
||||
throws InvalidKeyException {
|
||||
engineInitSign(privateKey, random);
|
||||
state = SIGN;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Signature." + algorithm +
|
||||
" signing algorithm from: " + this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2498,7 +2498,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// last ordinary index
|
||||
int lasto = -1;
|
||||
|
||||
FormatString[] fsa = parse(format);
|
||||
List<FormatString> fsa = parse(format);
|
||||
for (FormatString fs : fsa) {
|
||||
int index = fs.index();
|
||||
try {
|
||||
@ -2541,7 +2541,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
/**
|
||||
* Finds format specifiers in the format string.
|
||||
*/
|
||||
private FormatString[] parse(String s) {
|
||||
private List<FormatString> parse(String s) {
|
||||
ArrayList<FormatString> al = new ArrayList<>();
|
||||
Matcher m = fsPattern.matcher(s);
|
||||
for (int i = 0, len = s.length(); i < len; ) {
|
||||
@ -2553,21 +2553,21 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// Make sure we didn't miss any invalid format specifiers
|
||||
checkText(s, i, m.start());
|
||||
// Assume previous characters were fixed text
|
||||
al.add(new FixedString(s.substring(i, m.start())));
|
||||
al.add(new FixedString(s, i, m.start()));
|
||||
}
|
||||
|
||||
al.add(new FormatSpecifier(m));
|
||||
al.add(new FormatSpecifier(s, m));
|
||||
i = m.end();
|
||||
} else {
|
||||
// No more valid format specifiers. Check for possible invalid
|
||||
// format specifiers.
|
||||
checkText(s, i, len);
|
||||
// The rest of the string is fixed text
|
||||
al.add(new FixedString(s.substring(i)));
|
||||
al.add(new FixedString(s, i, s.length()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return al.toArray(new FormatString[al.size()]);
|
||||
return al;
|
||||
}
|
||||
|
||||
private static void checkText(String s, int start, int end) {
|
||||
@ -2588,11 +2588,17 @@ public final class Formatter implements Closeable, Flushable {
|
||||
|
||||
private class FixedString implements FormatString {
|
||||
private String s;
|
||||
FixedString(String s) { this.s = s; }
|
||||
private int start;
|
||||
private int end;
|
||||
FixedString(String s, int start, int end) {
|
||||
this.s = s;
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
public int index() { return -2; }
|
||||
public void print(Object arg, Locale l)
|
||||
throws IOException { a.append(s); }
|
||||
public String toString() { return s; }
|
||||
throws IOException { a.append(s, start, end); }
|
||||
public String toString() { return s.substring(start, end); }
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2635,17 +2641,13 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return index;
|
||||
}
|
||||
|
||||
private Flags flags(String s) {
|
||||
f = Flags.parse(s);
|
||||
private Flags flags(String s, int start, int end) {
|
||||
f = Flags.parse(s, start, end);
|
||||
if (f.contains(Flags.PREVIOUS))
|
||||
index = -1;
|
||||
return f;
|
||||
}
|
||||
|
||||
Flags flags() {
|
||||
return f;
|
||||
}
|
||||
|
||||
private int width(String s) {
|
||||
width = -1;
|
||||
if (s != null) {
|
||||
@ -2660,10 +2662,6 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return width;
|
||||
}
|
||||
|
||||
int width() {
|
||||
return width;
|
||||
}
|
||||
|
||||
private int precision(String s) {
|
||||
precision = -1;
|
||||
if (s != null) {
|
||||
@ -2679,44 +2677,41 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return precision;
|
||||
}
|
||||
|
||||
int precision() {
|
||||
return precision;
|
||||
}
|
||||
|
||||
private char conversion(String s) {
|
||||
c = s.charAt(0);
|
||||
private char conversion(char conv) {
|
||||
c = conv;
|
||||
if (!dt) {
|
||||
if (!Conversion.isValid(c))
|
||||
if (!Conversion.isValid(c)) {
|
||||
throw new UnknownFormatConversionException(String.valueOf(c));
|
||||
if (Character.isUpperCase(c))
|
||||
}
|
||||
if (Character.isUpperCase(c)) {
|
||||
f.add(Flags.UPPERCASE);
|
||||
c = Character.toLowerCase(c);
|
||||
if (Conversion.isText(c))
|
||||
c = Character.toLowerCase(c);
|
||||
}
|
||||
if (Conversion.isText(c)) {
|
||||
index = -2;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
private char conversion() {
|
||||
return c;
|
||||
}
|
||||
|
||||
FormatSpecifier(Matcher m) {
|
||||
FormatSpecifier(String s, Matcher m) {
|
||||
int idx = 1;
|
||||
|
||||
index(m.group(idx++));
|
||||
flags(m.group(idx++));
|
||||
flags(s, m.start(idx), m.end(idx++));
|
||||
width(m.group(idx++));
|
||||
precision(m.group(idx++));
|
||||
|
||||
String tT = m.group(idx++);
|
||||
if (tT != null) {
|
||||
int tTStart = m.start(idx);
|
||||
int tTEnd = m.end(idx++);
|
||||
if (tTStart != -1 && tTEnd != -1) {
|
||||
dt = true;
|
||||
if (tT.equals("T"))
|
||||
if (tTStart == tTEnd - 1 && s.charAt(tTStart) == 'T') {
|
||||
f.add(Flags.UPPERCASE);
|
||||
}
|
||||
}
|
||||
|
||||
conversion(m.group(idx));
|
||||
conversion(s.charAt(m.start(idx)));
|
||||
|
||||
if (dt)
|
||||
checkDateTime();
|
||||
@ -2909,21 +2904,25 @@ public final class Formatter implements Closeable, Flushable {
|
||||
s = s.substring(0, precision);
|
||||
if (f.contains(Flags.UPPERCASE))
|
||||
s = s.toUpperCase();
|
||||
a.append(justify(s));
|
||||
appendJustified(a, s);
|
||||
}
|
||||
|
||||
private String justify(String s) {
|
||||
if (width == -1)
|
||||
return s;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
boolean pad = f.contains(Flags.LEFT_JUSTIFY);
|
||||
int sp = width - s.length();
|
||||
if (!pad)
|
||||
for (int i = 0; i < sp; i++) sb.append(' ');
|
||||
sb.append(s);
|
||||
if (pad)
|
||||
for (int i = 0; i < sp; i++) sb.append(' ');
|
||||
return sb.toString();
|
||||
private Appendable appendJustified(Appendable a, CharSequence cs) throws IOException {
|
||||
if (width == -1) {
|
||||
return a.append(cs);
|
||||
}
|
||||
boolean padRight = f.contains(Flags.LEFT_JUSTIFY);
|
||||
int sp = width - cs.length();
|
||||
if (padRight) {
|
||||
a.append(cs);
|
||||
}
|
||||
for (int i = 0; i < sp; i++) {
|
||||
a.append(' ');
|
||||
}
|
||||
if (!padRight) {
|
||||
a.append(cs);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
@ -3088,17 +3087,13 @@ public final class Formatter implements Closeable, Flushable {
|
||||
|
||||
if (c == Conversion.DECIMAL_INTEGER) {
|
||||
boolean neg = value < 0;
|
||||
char[] va;
|
||||
if (value < 0)
|
||||
va = Long.toString(value, 10).substring(1).toCharArray();
|
||||
else
|
||||
va = Long.toString(value, 10).toCharArray();
|
||||
String valueStr = Long.toString(value, 10);
|
||||
|
||||
// leading sign indicator
|
||||
leadingSign(sb, neg);
|
||||
|
||||
// the value
|
||||
localizedMagnitude(sb, va, f, adjustWidth(width, f, neg), l);
|
||||
localizedMagnitude(sb, valueStr, neg ? 1 : 0, f, adjustWidth(width, f, neg), l);
|
||||
|
||||
// trailing sign indicator
|
||||
trailingSign(sb, neg);
|
||||
@ -3113,8 +3108,9 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// apply ALTERNATE (radix indicator for octal) before ZERO_PAD
|
||||
if (f.contains(Flags.ALTERNATE))
|
||||
sb.append('0');
|
||||
if (f.contains(Flags.ZERO_PAD))
|
||||
for (int i = 0; i < width - len; i++) sb.append('0');
|
||||
if (f.contains(Flags.ZERO_PAD)) {
|
||||
trailingZeros(sb, width - len);
|
||||
}
|
||||
sb.append(s);
|
||||
} else if (c == Conversion.HEXADECIMAL_INTEGER) {
|
||||
checkBadFlags(Flags.PARENTHESES, Flags.LEADING_SPACE,
|
||||
@ -3127,15 +3123,16 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// apply ALTERNATE (radix indicator for hex) before ZERO_PAD
|
||||
if (f.contains(Flags.ALTERNATE))
|
||||
sb.append(f.contains(Flags.UPPERCASE) ? "0X" : "0x");
|
||||
if (f.contains(Flags.ZERO_PAD))
|
||||
for (int i = 0; i < width - len; i++) sb.append('0');
|
||||
if (f.contains(Flags.ZERO_PAD)) {
|
||||
trailingZeros(sb, width - len);
|
||||
}
|
||||
if (f.contains(Flags.UPPERCASE))
|
||||
s = s.toUpperCase();
|
||||
sb.append(s);
|
||||
}
|
||||
|
||||
// justify based on width
|
||||
a.append(justify(sb.toString()));
|
||||
appendJustified(a, sb);
|
||||
}
|
||||
|
||||
// neg := val < 0
|
||||
@ -3172,8 +3169,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
|
||||
// the value
|
||||
if (c == Conversion.DECIMAL_INTEGER) {
|
||||
char[] va = v.toString().toCharArray();
|
||||
localizedMagnitude(sb, va, f, adjustWidth(width, f, neg), l);
|
||||
localizedMagnitude(sb, v.toString(), 0, f, adjustWidth(width, f, neg), l);
|
||||
} else if (c == Conversion.OCTAL_INTEGER) {
|
||||
String s = v.toString(8);
|
||||
|
||||
@ -3187,8 +3183,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
sb.append('0');
|
||||
}
|
||||
if (f.contains(Flags.ZERO_PAD)) {
|
||||
for (int i = 0; i < width - len; i++)
|
||||
sb.append('0');
|
||||
trailingZeros(sb, width - len);
|
||||
}
|
||||
sb.append(s);
|
||||
} else if (c == Conversion.HEXADECIMAL_INTEGER) {
|
||||
@ -3203,9 +3198,9 @@ public final class Formatter implements Closeable, Flushable {
|
||||
len += 2;
|
||||
sb.append(f.contains(Flags.UPPERCASE) ? "0X" : "0x");
|
||||
}
|
||||
if (f.contains(Flags.ZERO_PAD))
|
||||
for (int i = 0; i < width - len; i++)
|
||||
sb.append('0');
|
||||
if (f.contains(Flags.ZERO_PAD)) {
|
||||
trailingZeros(sb, width - len);
|
||||
}
|
||||
if (f.contains(Flags.UPPERCASE))
|
||||
s = s.toUpperCase();
|
||||
sb.append(s);
|
||||
@ -3215,7 +3210,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
trailingSign(sb, (value.signum() == -1));
|
||||
|
||||
// justify based on width
|
||||
a.append(justify(sb.toString()));
|
||||
appendJustified(a, sb);
|
||||
}
|
||||
|
||||
private void print(float value, Locale l) throws IOException {
|
||||
@ -3246,7 +3241,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
}
|
||||
|
||||
// justify based on width
|
||||
a.append(justify(sb.toString()));
|
||||
appendJustified(a, sb);
|
||||
}
|
||||
|
||||
// !Double.isInfinite(value) && !Double.isNaN(value)
|
||||
@ -3263,31 +3258,31 @@ public final class Formatter implements Closeable, Flushable {
|
||||
= FormattedFloatingDecimal.valueOf(value, prec,
|
||||
FormattedFloatingDecimal.Form.SCIENTIFIC);
|
||||
|
||||
char[] mant = addZeros(fd.getMantissa(), prec);
|
||||
StringBuilder mant = new StringBuilder().append(fd.getMantissa());
|
||||
addZeros(mant, prec);
|
||||
|
||||
// If the precision is zero and the '#' flag is set, add the
|
||||
// requested decimal point.
|
||||
if (f.contains(Flags.ALTERNATE) && (prec == 0))
|
||||
mant = addDot(mant);
|
||||
if (f.contains(Flags.ALTERNATE) && (prec == 0)) {
|
||||
mant.append('.');
|
||||
}
|
||||
|
||||
char[] exp = (value == 0.0)
|
||||
? new char[] {'+','0','0'} : fd.getExponent();
|
||||
|
||||
int newW = width;
|
||||
if (width != -1)
|
||||
if (width != -1) {
|
||||
newW = adjustWidth(width - exp.length - 1, f, neg);
|
||||
localizedMagnitude(sb, mant, f, newW, l);
|
||||
}
|
||||
localizedMagnitude(sb, mant, 0, f, newW, l);
|
||||
|
||||
sb.append(f.contains(Flags.UPPERCASE) ? 'E' : 'e');
|
||||
|
||||
Flags flags = f.dup().remove(Flags.GROUP);
|
||||
char sign = exp[0];
|
||||
assert(sign == '+' || sign == '-');
|
||||
sb.append(sign);
|
||||
|
||||
char[] tmp = new char[exp.length - 1];
|
||||
System.arraycopy(exp, 1, tmp, 0, exp.length - 1);
|
||||
sb.append(localizedMagnitude(null, tmp, flags, -1, l));
|
||||
localizedMagnitudeExp(sb, exp, 1, l);
|
||||
} else if (c == Conversion.DECIMAL_FLOAT) {
|
||||
// Create a new FormattedFloatingDecimal with the desired
|
||||
// precision.
|
||||
@ -3297,17 +3292,18 @@ public final class Formatter implements Closeable, Flushable {
|
||||
= FormattedFloatingDecimal.valueOf(value, prec,
|
||||
FormattedFloatingDecimal.Form.DECIMAL_FLOAT);
|
||||
|
||||
char[] mant = addZeros(fd.getMantissa(), prec);
|
||||
StringBuilder mant = new StringBuilder().append(fd.getMantissa());
|
||||
addZeros(mant, prec);
|
||||
|
||||
// If the precision is zero and the '#' flag is set, add the
|
||||
// requested decimal point.
|
||||
if (f.contains(Flags.ALTERNATE) && (prec == 0))
|
||||
mant = addDot(mant);
|
||||
mant.append('.');
|
||||
|
||||
int newW = width;
|
||||
if (width != -1)
|
||||
newW = adjustWidth(width, f, neg);
|
||||
localizedMagnitude(sb, mant, f, newW, l);
|
||||
localizedMagnitude(sb, mant, 0, f, newW, l);
|
||||
} else if (c == Conversion.GENERAL) {
|
||||
int prec = precision;
|
||||
if (precision == -1)
|
||||
@ -3316,18 +3312,18 @@ public final class Formatter implements Closeable, Flushable {
|
||||
prec = 1;
|
||||
|
||||
char[] exp;
|
||||
char[] mant;
|
||||
StringBuilder mant = new StringBuilder();
|
||||
int expRounded;
|
||||
if (value == 0.0) {
|
||||
exp = null;
|
||||
mant = new char[] {'0'};
|
||||
mant.append('0');
|
||||
expRounded = 0;
|
||||
} else {
|
||||
FormattedFloatingDecimal fd
|
||||
= FormattedFloatingDecimal.valueOf(value, prec,
|
||||
FormattedFloatingDecimal.Form.GENERAL);
|
||||
exp = fd.getExponent();
|
||||
mant = fd.getMantissa();
|
||||
mant.append(fd.getMantissa());
|
||||
expRounded = fd.getExponentRounded();
|
||||
}
|
||||
|
||||
@ -3337,11 +3333,12 @@ public final class Formatter implements Closeable, Flushable {
|
||||
prec -= expRounded + 1;
|
||||
}
|
||||
|
||||
mant = addZeros(mant, prec);
|
||||
addZeros(mant, prec);
|
||||
// If the precision is zero and the '#' flag is set, add the
|
||||
// requested decimal point.
|
||||
if (f.contains(Flags.ALTERNATE) && (prec == 0))
|
||||
mant = addDot(mant);
|
||||
if (f.contains(Flags.ALTERNATE) && (prec == 0)) {
|
||||
mant.append('.');
|
||||
}
|
||||
|
||||
int newW = width;
|
||||
if (width != -1) {
|
||||
@ -3350,19 +3347,16 @@ public final class Formatter implements Closeable, Flushable {
|
||||
else
|
||||
newW = adjustWidth(width, f, neg);
|
||||
}
|
||||
localizedMagnitude(sb, mant, f, newW, l);
|
||||
localizedMagnitude(sb, mant, 0, f, newW, l);
|
||||
|
||||
if (exp != null) {
|
||||
sb.append(f.contains(Flags.UPPERCASE) ? 'E' : 'e');
|
||||
|
||||
Flags flags = f.dup().remove(Flags.GROUP);
|
||||
char sign = exp[0];
|
||||
assert(sign == '+' || sign == '-');
|
||||
sb.append(sign);
|
||||
|
||||
char[] tmp = new char[exp.length - 1];
|
||||
System.arraycopy(exp, 1, tmp, 0, exp.length - 1);
|
||||
sb.append(localizedMagnitude(null, tmp, flags, -1, l));
|
||||
localizedMagnitudeExp(sb, exp, 1, l);
|
||||
}
|
||||
} else if (c == Conversion.HEXADECIMAL_FLOAT) {
|
||||
int prec = precision;
|
||||
@ -3374,74 +3368,71 @@ public final class Formatter implements Closeable, Flushable {
|
||||
|
||||
String s = hexDouble(value, prec);
|
||||
|
||||
char[] va;
|
||||
StringBuilder va = new StringBuilder();
|
||||
boolean upper = f.contains(Flags.UPPERCASE);
|
||||
sb.append(upper ? "0X" : "0x");
|
||||
|
||||
if (f.contains(Flags.ZERO_PAD))
|
||||
for (int i = 0; i < width - s.length() - 2; i++)
|
||||
sb.append('0');
|
||||
if (f.contains(Flags.ZERO_PAD)) {
|
||||
trailingZeros(sb, width - s.length() - 2);
|
||||
}
|
||||
|
||||
int idx = s.indexOf('p');
|
||||
va = s.substring(0, idx).toCharArray();
|
||||
if (upper) {
|
||||
String tmp = new String(va);
|
||||
String tmp = s.substring(0, idx);
|
||||
// don't localize hex
|
||||
tmp = tmp.toUpperCase(Locale.US);
|
||||
va = tmp.toCharArray();
|
||||
va.append(tmp);
|
||||
} else {
|
||||
va.append(s, 0, idx);
|
||||
}
|
||||
sb.append(prec != 0 ? addZeros(va, prec) : va);
|
||||
if (prec != 0) {
|
||||
addZeros(va, prec);
|
||||
}
|
||||
sb.append(va);
|
||||
sb.append(upper ? 'P' : 'p');
|
||||
sb.append(s.substring(idx+1));
|
||||
sb.append(s, idx+1, s.length());
|
||||
}
|
||||
}
|
||||
|
||||
// Add zeros to the requested precision.
|
||||
private char[] addZeros(char[] v, int prec) {
|
||||
private void addZeros(StringBuilder sb, int prec) {
|
||||
// Look for the dot. If we don't find one, the we'll need to add
|
||||
// it before we add the zeros.
|
||||
int len = sb.length();
|
||||
int i;
|
||||
for (i = 0; i < v.length; i++) {
|
||||
if (v[i] == '.')
|
||||
for (i = 0; i < len; i++) {
|
||||
if (sb.charAt(i) == '.') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
boolean needDot = false;
|
||||
if (i == v.length) {
|
||||
if (i == len) {
|
||||
needDot = true;
|
||||
}
|
||||
|
||||
// Determine existing precision.
|
||||
int outPrec = v.length - i - (needDot ? 0 : 1);
|
||||
int outPrec = len - i - (needDot ? 0 : 1);
|
||||
assert (outPrec <= prec);
|
||||
if (outPrec == prec)
|
||||
return v;
|
||||
|
||||
// Create new array with existing contents.
|
||||
char[] tmp
|
||||
= new char[v.length + prec - outPrec + (needDot ? 1 : 0)];
|
||||
System.arraycopy(v, 0, tmp, 0, v.length);
|
||||
if (outPrec == prec) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add dot if previously determined to be necessary.
|
||||
int start = v.length;
|
||||
if (needDot) {
|
||||
tmp[v.length] = '.';
|
||||
start++;
|
||||
sb.append('.');
|
||||
}
|
||||
|
||||
// Add zeros.
|
||||
for (int j = start; j < tmp.length; j++)
|
||||
tmp[j] = '0';
|
||||
|
||||
return tmp;
|
||||
trailingZeros(sb, prec - outPrec);
|
||||
}
|
||||
|
||||
// Method assumes that d > 0.
|
||||
private String hexDouble(double d, int prec) {
|
||||
// Let Double.toHexString handle simple cases
|
||||
if(!Double.isFinite(d) || d == 0.0 || prec == 0 || prec >= 13)
|
||||
if (!Double.isFinite(d) || d == 0.0 || prec == 0 || prec >= 13) {
|
||||
// remove "0x"
|
||||
return Double.toHexString(d).substring(2);
|
||||
else {
|
||||
} else {
|
||||
assert(prec >= 1 && prec <= 12);
|
||||
|
||||
int exponent = Math.getExponent(d);
|
||||
@ -3534,7 +3525,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
trailingSign(sb, neg);
|
||||
|
||||
// justify based on width
|
||||
a.append(justify(sb.toString()));
|
||||
appendJustified(a, sb);
|
||||
}
|
||||
|
||||
// value > 0
|
||||
@ -3565,7 +3556,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
= new BigDecimalLayout(v.unscaledValue(), v.scale(),
|
||||
BigDecimalLayoutForm.SCIENTIFIC);
|
||||
|
||||
char[] mant = bdl.mantissa();
|
||||
StringBuilder mant = bdl.mantissa();
|
||||
|
||||
// Add a decimal point if necessary. The mantissa may not
|
||||
// contain a decimal point if the scale is zero (the internal
|
||||
@ -3573,29 +3564,29 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// precision is one. Append a decimal point if '#' is set or if
|
||||
// we require zero padding to get to the requested precision.
|
||||
if ((origPrec == 1 || !bdl.hasDot())
|
||||
&& (nzeros > 0 || (f.contains(Flags.ALTERNATE))))
|
||||
mant = addDot(mant);
|
||||
&& (nzeros > 0 || (f.contains(Flags.ALTERNATE)))) {
|
||||
mant.append('.');
|
||||
}
|
||||
|
||||
// Add trailing zeros in the case precision is greater than
|
||||
// the number of available digits after the decimal separator.
|
||||
mant = trailingZeros(mant, nzeros);
|
||||
trailingZeros(mant, nzeros);
|
||||
|
||||
char[] exp = bdl.exponent();
|
||||
StringBuilder exp = bdl.exponent();
|
||||
int newW = width;
|
||||
if (width != -1)
|
||||
newW = adjustWidth(width - exp.length - 1, f, neg);
|
||||
localizedMagnitude(sb, mant, f, newW, l);
|
||||
if (width != -1) {
|
||||
newW = adjustWidth(width - exp.length() - 1, f, neg);
|
||||
}
|
||||
localizedMagnitude(sb, mant, 0, f, newW, l);
|
||||
|
||||
sb.append(f.contains(Flags.UPPERCASE) ? 'E' : 'e');
|
||||
|
||||
Flags flags = f.dup().remove(Flags.GROUP);
|
||||
char sign = exp[0];
|
||||
char sign = exp.charAt(0);
|
||||
assert(sign == '+' || sign == '-');
|
||||
sb.append(exp[0]);
|
||||
sb.append(sign);
|
||||
|
||||
char[] tmp = new char[exp.length - 1];
|
||||
System.arraycopy(exp, 1, tmp, 0, exp.length - 1);
|
||||
sb.append(localizedMagnitude(null, tmp, flags, -1, l));
|
||||
sb.append(localizedMagnitude(null, exp, 1, flags, -1, l));
|
||||
} else if (c == Conversion.DECIMAL_FLOAT) {
|
||||
// Create a new BigDecimal with the desired precision.
|
||||
int prec = (precision == -1 ? 6 : precision);
|
||||
@ -3619,7 +3610,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
value.scale(),
|
||||
BigDecimalLayoutForm.DECIMAL_FLOAT);
|
||||
|
||||
char mant[] = bdl.mantissa();
|
||||
StringBuilder mant = bdl.mantissa();
|
||||
int nzeros = (bdl.scale() < prec ? prec - bdl.scale() : 0);
|
||||
|
||||
// Add a decimal point if necessary. The mantissa may not
|
||||
@ -3627,14 +3618,16 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// representation has no fractional part). Append a decimal
|
||||
// point if '#' is set or we require zero padding to get to the
|
||||
// requested precision.
|
||||
if (bdl.scale() == 0 && (f.contains(Flags.ALTERNATE) || nzeros > 0))
|
||||
mant = addDot(bdl.mantissa());
|
||||
if (bdl.scale() == 0 && (f.contains(Flags.ALTERNATE)
|
||||
|| nzeros > 0)) {
|
||||
mant.append('.');
|
||||
}
|
||||
|
||||
// Add trailing zeros if the precision is greater than the
|
||||
// number of available digits after the decimal separator.
|
||||
mant = trailingZeros(mant, nzeros);
|
||||
trailingZeros(mant, nzeros);
|
||||
|
||||
localizedMagnitude(sb, mant, f, adjustWidth(width, f, neg), l);
|
||||
localizedMagnitude(sb, mant, 0, f, adjustWidth(width, f, neg), l);
|
||||
} else if (c == Conversion.GENERAL) {
|
||||
int prec = precision;
|
||||
if (precision == -1)
|
||||
@ -3693,36 +3686,18 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return scale;
|
||||
}
|
||||
|
||||
// char[] with canonical string representation
|
||||
public char[] layoutChars() {
|
||||
StringBuilder sb = new StringBuilder(mant);
|
||||
if (exp != null) {
|
||||
sb.append('E');
|
||||
sb.append(exp);
|
||||
}
|
||||
return toCharArray(sb);
|
||||
}
|
||||
|
||||
public char[] mantissa() {
|
||||
return toCharArray(mant);
|
||||
public StringBuilder mantissa() {
|
||||
return mant;
|
||||
}
|
||||
|
||||
// The exponent will be formatted as a sign ('+' or '-') followed
|
||||
// by the exponent zero-padded to include at least two digits.
|
||||
public char[] exponent() {
|
||||
return toCharArray(exp);
|
||||
}
|
||||
|
||||
private char[] toCharArray(StringBuilder sb) {
|
||||
if (sb == null)
|
||||
return null;
|
||||
char[] result = new char[sb.length()];
|
||||
sb.getChars(0, result.length, result, 0);
|
||||
return result;
|
||||
public StringBuilder exponent() {
|
||||
return exp;
|
||||
}
|
||||
|
||||
private void layout(BigInteger intVal, int scale, BigDecimalLayoutForm form) {
|
||||
char coeff[] = intVal.toString().toCharArray();
|
||||
String coeff = intVal.toString();
|
||||
this.scale = scale;
|
||||
|
||||
// Construct a buffer, with sufficient capacity for all cases.
|
||||
@ -3730,71 +3705,73 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// if '.' needed, +2 for "E+", + up to 10 for adjusted
|
||||
// exponent. Otherwise it could have +1 if negative, plus
|
||||
// leading "0.00000"
|
||||
mant = new StringBuilder(coeff.length + 14);
|
||||
int len = coeff.length();
|
||||
mant = new StringBuilder(len + 14);
|
||||
|
||||
if (scale == 0) {
|
||||
int len = coeff.length;
|
||||
if (len > 1) {
|
||||
mant.append(coeff[0]);
|
||||
mant.append(coeff.charAt(0));
|
||||
if (form == BigDecimalLayoutForm.SCIENTIFIC) {
|
||||
mant.append('.');
|
||||
dot = true;
|
||||
mant.append(coeff, 1, len - 1);
|
||||
mant.append(coeff, 1, len);
|
||||
exp = new StringBuilder("+");
|
||||
if (len < 10)
|
||||
exp.append("0").append(len - 1);
|
||||
else
|
||||
if (len < 10) {
|
||||
exp.append('0').append(len - 1);
|
||||
} else {
|
||||
exp.append(len - 1);
|
||||
}
|
||||
} else {
|
||||
mant.append(coeff, 1, len - 1);
|
||||
mant.append(coeff, 1, len);
|
||||
}
|
||||
} else {
|
||||
mant.append(coeff);
|
||||
if (form == BigDecimalLayoutForm.SCIENTIFIC)
|
||||
if (form == BigDecimalLayoutForm.SCIENTIFIC) {
|
||||
exp = new StringBuilder("+00");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
long adjusted = -(long) scale + (coeff.length - 1);
|
||||
long adjusted = -(long) scale + (len - 1);
|
||||
if (form == BigDecimalLayoutForm.DECIMAL_FLOAT) {
|
||||
// count of padding zeros
|
||||
int pad = scale - coeff.length;
|
||||
int pad = scale - len;
|
||||
if (pad >= 0) {
|
||||
// 0.xxx form
|
||||
mant.append("0.");
|
||||
dot = true;
|
||||
for (; pad > 0 ; pad--) mant.append('0');
|
||||
trailingZeros(mant, pad);
|
||||
mant.append(coeff);
|
||||
} else {
|
||||
if (-pad < coeff.length) {
|
||||
if (-pad < len) {
|
||||
// xx.xx form
|
||||
mant.append(coeff, 0, -pad);
|
||||
mant.append('.');
|
||||
dot = true;
|
||||
mant.append(coeff, -pad, scale);
|
||||
mant.append(coeff, -pad, -pad + scale);
|
||||
} else {
|
||||
// xx form
|
||||
mant.append(coeff, 0, coeff.length);
|
||||
for (int i = 0; i < -scale; i++)
|
||||
mant.append('0');
|
||||
mant.append(coeff, 0, len);
|
||||
trailingZeros(mant, -scale);
|
||||
this.scale = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// x.xxx form
|
||||
mant.append(coeff[0]);
|
||||
if (coeff.length > 1) {
|
||||
mant.append(coeff.charAt(0));
|
||||
if (len > 1) {
|
||||
mant.append('.');
|
||||
dot = true;
|
||||
mant.append(coeff, 1, coeff.length-1);
|
||||
mant.append(coeff, 1, len);
|
||||
}
|
||||
exp = new StringBuilder();
|
||||
if (adjusted != 0) {
|
||||
long abs = Math.abs(adjusted);
|
||||
// require sign
|
||||
exp.append(adjusted < 0 ? '-' : '+');
|
||||
if (abs < 10)
|
||||
if (abs < 10) {
|
||||
exp.append('0');
|
||||
}
|
||||
exp.append(abs);
|
||||
} else {
|
||||
exp.append("+00");
|
||||
@ -3810,45 +3787,27 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return newW;
|
||||
}
|
||||
|
||||
// Add a '.' to th mantissa if required
|
||||
private char[] addDot(char[] mant) {
|
||||
char[] tmp = mant;
|
||||
tmp = new char[mant.length + 1];
|
||||
System.arraycopy(mant, 0, tmp, 0, mant.length);
|
||||
tmp[tmp.length - 1] = '.';
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// Add trailing zeros in the case precision is greater than the number
|
||||
// of available digits after the decimal separator.
|
||||
private char[] trailingZeros(char[] mant, int nzeros) {
|
||||
char[] tmp = mant;
|
||||
if (nzeros > 0) {
|
||||
tmp = new char[mant.length + nzeros];
|
||||
System.arraycopy(mant, 0, tmp, 0, mant.length);
|
||||
for (int i = mant.length; i < tmp.length; i++)
|
||||
tmp[i] = '0';
|
||||
// Add trailing zeros
|
||||
private void trailingZeros(StringBuilder sb, int nzeros) {
|
||||
for (int i = 0; i < nzeros; i++) {
|
||||
sb.append('0');
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
private void print(Calendar t, char c, Locale l) throws IOException
|
||||
{
|
||||
private void print(Calendar t, char c, Locale l) throws IOException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
print(sb, t, c, l);
|
||||
|
||||
// justify based on width
|
||||
String s = justify(sb.toString());
|
||||
if (f.contains(Flags.UPPERCASE))
|
||||
s = s.toUpperCase();
|
||||
|
||||
a.append(s);
|
||||
if (f.contains(Flags.UPPERCASE)) {
|
||||
appendJustified(a, sb.toString().toUpperCase());
|
||||
} else {
|
||||
appendJustified(a, sb);
|
||||
}
|
||||
}
|
||||
|
||||
private Appendable print(StringBuilder sb, Calendar t, char c,
|
||||
Locale l)
|
||||
throws IOException
|
||||
{
|
||||
private Appendable print(StringBuilder sb, Calendar t, char c, Locale l)
|
||||
throws IOException {
|
||||
if (sb == null)
|
||||
sb = new StringBuilder();
|
||||
switch (c) {
|
||||
@ -4021,6 +3980,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
// this may be in wrong place for some locales
|
||||
StringBuilder tsb = new StringBuilder();
|
||||
print(tsb, t, DateTime.AM_PM, l);
|
||||
|
||||
sb.append(tsb.toString().toUpperCase(l != null ? l : Locale.US));
|
||||
break;
|
||||
}
|
||||
@ -4058,10 +4018,11 @@ public final class Formatter implements Closeable, Flushable {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
print(sb, t, c, l);
|
||||
// justify based on width
|
||||
String s = justify(sb.toString());
|
||||
if (f.contains(Flags.UPPERCASE))
|
||||
s = s.toUpperCase();
|
||||
a.append(s);
|
||||
if (f.contains(Flags.UPPERCASE)) {
|
||||
appendJustified(a, sb.toString().toUpperCase());
|
||||
} else {
|
||||
appendJustified(a, sb);
|
||||
}
|
||||
}
|
||||
|
||||
private Appendable print(StringBuilder sb, TemporalAccessor t, char c,
|
||||
@ -4309,20 +4270,17 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return zero;
|
||||
}
|
||||
|
||||
private StringBuilder
|
||||
localizedMagnitude(StringBuilder sb, long value, Flags f,
|
||||
int width, Locale l)
|
||||
{
|
||||
char[] va = Long.toString(value, 10).toCharArray();
|
||||
return localizedMagnitude(sb, va, f, width, l);
|
||||
private StringBuilder localizedMagnitude(StringBuilder sb,
|
||||
long value, Flags f, int width, Locale l) {
|
||||
return localizedMagnitude(sb, Long.toString(value, 10), 0, f, width, l);
|
||||
}
|
||||
|
||||
private StringBuilder
|
||||
localizedMagnitude(StringBuilder sb, char[] value, Flags f,
|
||||
int width, Locale l)
|
||||
{
|
||||
if (sb == null)
|
||||
private StringBuilder localizedMagnitude(StringBuilder sb,
|
||||
CharSequence value, final int offset, Flags f, int width,
|
||||
Locale l) {
|
||||
if (sb == null) {
|
||||
sb = new StringBuilder();
|
||||
}
|
||||
int begin = sb.length();
|
||||
|
||||
char zero = getZero(l);
|
||||
@ -4332,10 +4290,10 @@ public final class Formatter implements Closeable, Flushable {
|
||||
int grpSize = -1;
|
||||
char decSep = '\0';
|
||||
|
||||
int len = value.length;
|
||||
int len = value.length();
|
||||
int dot = len;
|
||||
for (int j = 0; j < len; j++) {
|
||||
if (value[j] == '.') {
|
||||
for (int j = offset; j < len; j++) {
|
||||
if (value.charAt(j) == '.') {
|
||||
dot = j;
|
||||
break;
|
||||
}
|
||||
@ -4363,7 +4321,7 @@ public final class Formatter implements Closeable, Flushable {
|
||||
}
|
||||
|
||||
// localize the digits inserting group separators as necessary
|
||||
for (int j = 0; j < len; j++) {
|
||||
for (int j = offset; j < len; j++) {
|
||||
if (j == dot) {
|
||||
sb.append(decSep);
|
||||
// no more group separators after the decimal separator
|
||||
@ -4371,20 +4329,36 @@ public final class Formatter implements Closeable, Flushable {
|
||||
continue;
|
||||
}
|
||||
|
||||
char c = value[j];
|
||||
char c = value.charAt(j);
|
||||
sb.append((char) ((c - '0') + zero));
|
||||
if (grpSep != '\0' && j != dot - 1 && ((dot - j) % grpSize == 1))
|
||||
if (grpSep != '\0' && j != dot - 1 && ((dot - j) % grpSize == 1)) {
|
||||
sb.append(grpSep);
|
||||
}
|
||||
}
|
||||
|
||||
// apply zero padding
|
||||
len = sb.length();
|
||||
if (width != -1 && f.contains(Flags.ZERO_PAD))
|
||||
for (int k = 0; k < width - len; k++)
|
||||
if (width != -1 && f.contains(Flags.ZERO_PAD)) {
|
||||
for (int k = sb.length(); k < width; k++) {
|
||||
sb.insert(begin, zero);
|
||||
}
|
||||
}
|
||||
|
||||
return sb;
|
||||
}
|
||||
|
||||
// Specialized localization of exponents, where the source value can only
|
||||
// contain characters '0' through '9', starting at index offset, and no
|
||||
// group separators is added for any locale.
|
||||
private void localizedMagnitudeExp(StringBuilder sb, char[] value,
|
||||
final int offset, Locale l) {
|
||||
char zero = getZero(l);
|
||||
|
||||
int len = value.length;
|
||||
for (int j = offset; j < len; j++) {
|
||||
char c = value[j];
|
||||
sb.append((char) ((c - '0') + zero));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class Flags {
|
||||
@ -4433,10 +4407,10 @@ public final class Formatter implements Closeable, Flushable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public static Flags parse(String s) {
|
||||
char[] ca = s.toCharArray();
|
||||
public static Flags parse(String s, int start, int end) {
|
||||
Flags f = new Flags(0);
|
||||
for (char c : ca) {
|
||||
for (int i = start; i < end; i++) {
|
||||
char c = s.charAt(i);
|
||||
Flags v = parse(c);
|
||||
if (f.contains(v))
|
||||
throw new DuplicateFormatFlagsException(v.toString());
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -167,6 +167,11 @@ public class Cipher {
|
||||
private static final Debug debug =
|
||||
Debug.getInstance("jca", "Cipher");
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("cipher");
|
||||
|
||||
/**
|
||||
* Constant used to initialize cipher to encryption mode.
|
||||
*/
|
||||
@ -1110,6 +1115,21 @@ public class Cipher {
|
||||
}
|
||||
}
|
||||
|
||||
private static String getOpmodeString(int opmode) {
|
||||
switch (opmode) {
|
||||
case ENCRYPT_MODE:
|
||||
return "encryption";
|
||||
case DECRYPT_MODE:
|
||||
return "decryption";
|
||||
case WRAP_MODE:
|
||||
return "key wrapping";
|
||||
case UNWRAP_MODE:
|
||||
return "key unwrapping";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes this cipher with a key.
|
||||
*
|
||||
@ -1235,6 +1255,12 @@ public class Cipher {
|
||||
|
||||
initialized = true;
|
||||
this.opmode = opmode;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Cipher." + transformation + " " +
|
||||
getOpmodeString(opmode) + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1372,6 +1398,12 @@ public class Cipher {
|
||||
|
||||
initialized = true;
|
||||
this.opmode = opmode;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Cipher." + transformation + " " +
|
||||
getOpmodeString(opmode) + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1509,6 +1541,12 @@ public class Cipher {
|
||||
|
||||
initialized = true;
|
||||
this.opmode = opmode;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Cipher." + transformation + " " +
|
||||
getOpmodeString(opmode) + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1693,6 +1731,12 @@ public class Cipher {
|
||||
|
||||
initialized = true;
|
||||
this.opmode = opmode;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Cipher." + transformation + " " +
|
||||
getOpmodeString(opmode) + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -78,6 +78,11 @@ public class KeyAgreement {
|
||||
private static final Debug debug =
|
||||
Debug.getInstance("jca", "KeyAgreement");
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("keyagreement");
|
||||
|
||||
// The provider
|
||||
private Provider provider;
|
||||
|
||||
@ -468,6 +473,11 @@ public class KeyAgreement {
|
||||
throw new InvalidKeyException(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyAgreement." + algorithm + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -524,6 +534,11 @@ public class KeyAgreement {
|
||||
} else {
|
||||
chooseProvider(I_PARAMS, key, params, random);
|
||||
}
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyAgreement." + algorithm + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -33,6 +33,7 @@ import java.security.spec.*;
|
||||
|
||||
import sun.security.jca.*;
|
||||
import sun.security.jca.GetInstance.Instance;
|
||||
import sun.security.util.Debug;
|
||||
|
||||
/**
|
||||
* This class provides the functionality of a secret (symmetric) key generator.
|
||||
@ -108,6 +109,11 @@ import sun.security.jca.GetInstance.Instance;
|
||||
|
||||
public class KeyGenerator {
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("keygenerator");
|
||||
|
||||
// see java.security.KeyPairGenerator for failover notes
|
||||
|
||||
private final static int I_NONE = 1;
|
||||
@ -145,6 +151,11 @@ public class KeyGenerator {
|
||||
this.spi = keyGenSpi;
|
||||
this.provider = provider;
|
||||
this.algorithm = algorithm;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyGenerator." + algorithm + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
private KeyGenerator(String algorithm) throws NoSuchAlgorithmException {
|
||||
@ -158,6 +169,11 @@ public class KeyGenerator {
|
||||
throw new NoSuchAlgorithmException
|
||||
(algorithm + " KeyGenerator not available");
|
||||
}
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("KeyGenerator." + algorithm + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -77,6 +77,11 @@ public class Mac implements Cloneable {
|
||||
private static final Debug debug =
|
||||
Debug.getInstance("jca", "Mac");
|
||||
|
||||
private static final Debug pdebug =
|
||||
Debug.getInstance("provider", "Provider");
|
||||
private static final boolean skipDebug =
|
||||
Debug.isOn("engine=") && !Debug.isOn("mac");
|
||||
|
||||
// The provider
|
||||
private Provider provider;
|
||||
|
||||
@ -413,6 +418,11 @@ public class Mac implements Cloneable {
|
||||
throw new InvalidKeyException("init() failed", e);
|
||||
}
|
||||
initialized = true;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Mac." + algorithm + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -435,6 +445,11 @@ public class Mac implements Cloneable {
|
||||
chooseProvider(key, params);
|
||||
}
|
||||
initialized = true;
|
||||
|
||||
if (!skipDebug && pdebug != null) {
|
||||
pdebug.println("Mac." + algorithm + " algorithm from: " +
|
||||
this.provider.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -104,7 +104,15 @@ public class Debug {
|
||||
System.err.println("codebase=<URL>");
|
||||
System.err.println(" only dump output if specified codebase");
|
||||
System.err.println(" is being checked");
|
||||
|
||||
System.err.println();
|
||||
System.err.println("The following can be used with provider:");
|
||||
System.err.println();
|
||||
System.err.println("engine=<engines>");
|
||||
System.err.println(" only dump output for the specified list");
|
||||
System.err.println(" of JCA engines. Supported values:");
|
||||
System.err.println(" Cipher, KeyAgreement, KeyGenerator,");
|
||||
System.err.println(" KeyPairGenerator, KeyStore, Mac,");
|
||||
System.err.println(" MessageDigest, SecureRandom, Signature.");
|
||||
System.err.println();
|
||||
System.err.println("Note: Separate multiple options with a comma");
|
||||
System.exit(0);
|
||||
|
@ -140,24 +140,25 @@ JNIEXPORT jlong JNICALL
|
||||
Java_sun_nio_ch_FileChannelImpl_position0(JNIEnv *env, jobject this,
|
||||
jobject fdo, jlong offset)
|
||||
{
|
||||
DWORD lowPos = 0;
|
||||
long highPos = 0;
|
||||
BOOL result = 0;
|
||||
HANDLE h = (HANDLE)(handleval(env, fdo));
|
||||
LARGE_INTEGER where;
|
||||
DWORD whence;
|
||||
|
||||
if (offset < 0) {
|
||||
lowPos = SetFilePointer(h, 0, &highPos, FILE_CURRENT);
|
||||
where.QuadPart = 0;
|
||||
whence = FILE_CURRENT;
|
||||
} else {
|
||||
lowPos = (DWORD)offset;
|
||||
highPos = (long)(offset >> 32);
|
||||
lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN);
|
||||
where.QuadPart = offset;
|
||||
whence = FILE_BEGIN;
|
||||
}
|
||||
if (lowPos == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
result = SetFilePointerEx(h, where, &where, whence);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
return (((jlong)highPos) << 32) | lowPos;
|
||||
return (jlong)where.QuadPart;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
|
@ -126,39 +126,30 @@ Java_sun_nio_ch_FileDispatcherImpl_pread0(JNIEnv *env, jclass clazz, jobject fdo
|
||||
DWORD read = 0;
|
||||
BOOL result = 0;
|
||||
HANDLE h = (HANDLE)(handleval(env, fdo));
|
||||
DWORD lowPos = 0;
|
||||
long highPos = 0;
|
||||
DWORD lowOffset = 0;
|
||||
long highOffset = 0;
|
||||
LARGE_INTEGER currPos;
|
||||
OVERLAPPED ov;
|
||||
|
||||
if (h == INVALID_HANDLE_VALUE) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Invalid handle");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
lowPos = SetFilePointer(h, 0, &highPos, FILE_CURRENT);
|
||||
if (lowPos == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
currPos.QuadPart = 0;
|
||||
result = SetFilePointerEx(h, currPos, &currPos, FILE_CURRENT);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
lowOffset = (DWORD)offset;
|
||||
highOffset = (DWORD)(offset >> 32);
|
||||
lowOffset = SetFilePointer(h, lowOffset, &highOffset, FILE_BEGIN);
|
||||
if (lowOffset == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
}
|
||||
ZeroMemory(&ov, sizeof(ov));
|
||||
ov.Offset = (DWORD)offset;
|
||||
ov.OffsetHigh = (DWORD)(offset >> 32);
|
||||
|
||||
result = ReadFile(h, /* File handle to read */
|
||||
(LPVOID)address, /* address to put data */
|
||||
len, /* number of bytes to read */
|
||||
&read, /* number of bytes read */
|
||||
NULL); /* struct with offset */
|
||||
&ov); /* position to read from */
|
||||
|
||||
if (result == 0) {
|
||||
int error = GetLastError();
|
||||
@ -168,17 +159,18 @@ Java_sun_nio_ch_FileDispatcherImpl_pread0(JNIEnv *env, jclass clazz, jobject fdo
|
||||
if (error == ERROR_NO_DATA) {
|
||||
return IOS_UNAVAILABLE;
|
||||
}
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Read failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN);
|
||||
if (lowPos == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
if (error != ERROR_HANDLE_EOF) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Read failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
}
|
||||
|
||||
result = SetFilePointerEx(h, currPos, NULL, FILE_BEGIN);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
return convertReturnVal(env, (jint)read, JNI_TRUE);
|
||||
}
|
||||
|
||||
@ -194,18 +186,18 @@ Java_sun_nio_ch_FileDispatcherImpl_write0(JNIEnv *env, jclass clazz, jobject fdo
|
||||
OVERLAPPED ov;
|
||||
LPOVERLAPPED lpOv;
|
||||
if (append == JNI_TRUE) {
|
||||
ZeroMemory(&ov, sizeof(ov));
|
||||
ov.Offset = (DWORD)0xFFFFFFFF;
|
||||
ov.OffsetHigh = (DWORD)0xFFFFFFFF;
|
||||
ov.hEvent = NULL;
|
||||
lpOv = &ov;
|
||||
} else {
|
||||
lpOv = NULL;
|
||||
}
|
||||
result = WriteFile(h, /* File handle to write */
|
||||
(LPCVOID)address, /* pointers to the buffers */
|
||||
len, /* number of bytes to write */
|
||||
&written, /* receives number of bytes written */
|
||||
lpOv); /* overlapped struct */
|
||||
result = WriteFile(h, /* File handle to write */
|
||||
(LPCVOID)address, /* pointer to the buffer */
|
||||
len, /* number of bytes to write */
|
||||
&written, /* receives number of bytes written */
|
||||
lpOv); /* overlapped struct */
|
||||
}
|
||||
|
||||
if ((h == INVALID_HANDLE_VALUE) || (result == 0)) {
|
||||
@ -232,9 +224,9 @@ Java_sun_nio_ch_FileDispatcherImpl_writev0(JNIEnv *env, jclass clazz, jobject fd
|
||||
OVERLAPPED ov;
|
||||
LPOVERLAPPED lpOv;
|
||||
if (append == JNI_TRUE) {
|
||||
ZeroMemory(&ov, sizeof(ov));
|
||||
ov.Offset = (DWORD)0xFFFFFFFF;
|
||||
ov.OffsetHigh = (DWORD)0xFFFFFFFF;
|
||||
ov.hEvent = NULL;
|
||||
lpOv = &ov;
|
||||
} else {
|
||||
lpOv = NULL;
|
||||
@ -270,46 +262,35 @@ Java_sun_nio_ch_FileDispatcherImpl_pwrite0(JNIEnv *env, jclass clazz, jobject fd
|
||||
BOOL result = 0;
|
||||
DWORD written = 0;
|
||||
HANDLE h = (HANDLE)(handleval(env, fdo));
|
||||
DWORD lowPos = 0;
|
||||
long highPos = 0;
|
||||
DWORD lowOffset = 0;
|
||||
long highOffset = 0;
|
||||
LARGE_INTEGER currPos;
|
||||
OVERLAPPED ov;
|
||||
|
||||
lowPos = SetFilePointer(h, 0, &highPos, FILE_CURRENT);
|
||||
if (lowPos == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
currPos.QuadPart = 0;
|
||||
result = SetFilePointerEx(h, currPos, &currPos, FILE_CURRENT);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
lowOffset = (DWORD)offset;
|
||||
highOffset = (DWORD)(offset >> 32);
|
||||
lowOffset = SetFilePointer(h, lowOffset, &highOffset, FILE_BEGIN);
|
||||
if (lowOffset == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
}
|
||||
ZeroMemory(&ov, sizeof(ov));
|
||||
ov.Offset = (DWORD)offset;
|
||||
ov.OffsetHigh = (DWORD)(offset >> 32);
|
||||
|
||||
result = WriteFile(h, /* File handle to write */
|
||||
(LPCVOID)address, /* pointers to the buffers */
|
||||
len, /* number of bytes to write */
|
||||
&written, /* receives number of bytes written */
|
||||
NULL); /* no overlapped struct */
|
||||
result = WriteFile(h, /* File handle to write */
|
||||
(LPCVOID)address, /* pointer to the buffer */
|
||||
len, /* number of bytes to write */
|
||||
&written, /* receives number of bytes written */
|
||||
&ov); /* position to write at */
|
||||
|
||||
if ((h == INVALID_HANDLE_VALUE) || (result == 0)) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Write failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN);
|
||||
if (lowPos == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
result = SetFilePointerEx(h, currPos, NULL, FILE_BEGIN);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
return convertReturnVal(env, (jint)written, JNI_FALSE);
|
||||
@ -342,20 +323,17 @@ JNIEXPORT jint JNICALL
|
||||
Java_sun_nio_ch_FileDispatcherImpl_truncate0(JNIEnv *env, jobject this,
|
||||
jobject fdo, jlong size)
|
||||
{
|
||||
DWORD lowPos = 0;
|
||||
long highPos = 0;
|
||||
BOOL result = 0;
|
||||
HANDLE h = (HANDLE)(handleval(env, fdo));
|
||||
LARGE_INTEGER offset;
|
||||
|
||||
lowPos = (DWORD)size;
|
||||
highPos = (long)(size >> 32);
|
||||
lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN);
|
||||
if (lowPos == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Truncation failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
offset.QuadPart = size;
|
||||
result = SetFilePointerEx(h, offset, NULL, FILE_BEGIN);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Truncation failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
result = SetEndOfFile(h);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Truncation failed");
|
||||
@ -367,18 +345,16 @@ Java_sun_nio_ch_FileDispatcherImpl_truncate0(JNIEnv *env, jobject this,
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_sun_nio_ch_FileDispatcherImpl_size0(JNIEnv *env, jobject this, jobject fdo)
|
||||
{
|
||||
DWORD sizeLow = 0;
|
||||
DWORD sizeHigh = 0;
|
||||
BOOL result = 0;
|
||||
HANDLE h = (HANDLE)(handleval(env, fdo));
|
||||
LARGE_INTEGER size;
|
||||
|
||||
sizeLow = GetFileSize(h, &sizeHigh);
|
||||
if (sizeLow == ((DWORD)-1)) {
|
||||
if (GetLastError() != ERROR_SUCCESS) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Size failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
result = GetFileSizeEx(h, &size);
|
||||
if (result == 0) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Size failed");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
return (((jlong)sizeHigh) << 32) | sizeLow;
|
||||
return (jlong)size.QuadPart;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
@ -407,7 +383,7 @@ Java_sun_nio_ch_FileDispatcherImpl_lock0(JNIEnv *env, jobject this, jobject fdo,
|
||||
if (result == 0) {
|
||||
int error = GetLastError();
|
||||
if (error == ERROR_IO_PENDING) {
|
||||
LPDWORD dwBytes;
|
||||
DWORD dwBytes;
|
||||
result = GetOverlappedResult(h, &o, &dwBytes, TRUE);
|
||||
if (result != 0) {
|
||||
return sun_nio_ch_FileDispatcherImpl_LOCKED;
|
||||
@ -442,8 +418,19 @@ Java_sun_nio_ch_FileDispatcherImpl_release0(JNIEnv *env, jobject this,
|
||||
o.Offset = lowPos;
|
||||
o.OffsetHigh = highPos;
|
||||
result = UnlockFileEx(h, 0, lowNumBytes, highNumBytes, &o);
|
||||
if (result == 0 && GetLastError() != ERROR_NOT_LOCKED) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Release failed");
|
||||
if (result == 0) {
|
||||
int error = GetLastError();
|
||||
if (error == ERROR_IO_PENDING) {
|
||||
DWORD dwBytes;
|
||||
result = GetOverlappedResult(h, &o, &dwBytes, TRUE);
|
||||
if (result == 0) {
|
||||
return;
|
||||
}
|
||||
error = GetLastError();
|
||||
}
|
||||
if (error != ERROR_NOT_LOCKED) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "Release failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -464,8 +451,7 @@ Java_sun_nio_ch_FileDispatcherImpl_close0(JNIEnv *env, jclass clazz, jobject fdo
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_sun_nio_ch_FileDispatcherImpl_closeByHandle(JNIEnv *env, jclass clazz,
|
||||
jlong fd)
|
||||
Java_sun_nio_ch_FileDispatcherImpl_closeByHandle(JNIEnv *env, jclass clazz, jlong fd)
|
||||
{
|
||||
closeFile(env, fd);
|
||||
}
|
||||
|
@ -122,6 +122,13 @@
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_instrument
|
||||
|
||||
# 8058536
|
||||
java/lang/instrument/NativeMethodPrefixAgent.java generic-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_management
|
||||
|
||||
# 8044591
|
||||
|
@ -52,7 +52,7 @@ public class DrawStringCrash {
|
||||
Graphics2D g2d = bi.createGraphics();
|
||||
while (len < maxLen) {
|
||||
try {
|
||||
g2d.drawString(s, 20, 20);
|
||||
g2d.drawString(sb.toString(), 20, 20);
|
||||
} catch (OutOfMemoryError e) {
|
||||
return;
|
||||
}
|
||||
|
35
jdk/test/javax/xml/ws/xsanymixed/CopyingResponse.java
Normal file
35
jdk/test/javax/xml/ws/xsanymixed/CopyingResponse.java
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
import org.somewhere.ws.EchoRequest;
|
||||
import org.somewhere.ws.EchoResponse;
|
||||
|
||||
public class CopyingResponse extends EchoResponse {
|
||||
|
||||
public CopyingResponse() {}
|
||||
|
||||
public CopyingResponse(EchoRequest request) {
|
||||
content = request.getContent();
|
||||
}
|
||||
}
|
51
jdk/test/javax/xml/ws/xsanymixed/ServiceImpl.java
Normal file
51
jdk/test/javax/xml/ws/xsanymixed/ServiceImpl.java
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import org.somewhere.ws.EchoRequest;
|
||||
import org.somewhere.ws.EchoResponse;
|
||||
import org.somewhere.ws.TestPort;
|
||||
|
||||
import javax.jws.WebService;
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
|
||||
/**
|
||||
* Simple Webservice implementation just copying xml part as is
|
||||
* from incoming request into outgoing response
|
||||
*/
|
||||
@WebService(
|
||||
endpointInterface = "org.somewhere.ws.TestPort",
|
||||
targetNamespace = "http://ws.somewhere.org/",
|
||||
serviceName = "TestService",
|
||||
portName = "TestPort")
|
||||
public class ServiceImpl implements TestPort {
|
||||
|
||||
public static final QName PORT_NAME = new QName("http://ws.somewhere.org/", "TestPort");
|
||||
public static final QName SERVICE_NAME = new QName("http://ws.somewhere.org/", "TestService");
|
||||
|
||||
@Override
|
||||
public EchoResponse echo(EchoRequest request) {
|
||||
return new CopyingResponse(request);
|
||||
}
|
||||
|
||||
}
|
197
jdk/test/javax/xml/ws/xsanymixed/Test.java
Normal file
197
jdk/test/javax/xml/ws/xsanymixed/Test.java
Normal file
@ -0,0 +1,197 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8036981 8038966 8051441
|
||||
* @summary the content of xs:any content:mixed should remain as is,
|
||||
* no white space changes and no changes to namespace prefixes
|
||||
* @run shell compile-wsdl.sh
|
||||
* @run main/othervm Test
|
||||
*/
|
||||
|
||||
import com.sun.net.httpserver.HttpServer;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
import javax.xml.ws.Dispatch;
|
||||
import javax.xml.ws.Endpoint;
|
||||
import javax.xml.ws.Service;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.URL;
|
||||
import java.nio.file.FileVisitResult;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.SimpleFileVisitor;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
|
||||
import static java.nio.file.FileVisitResult.CONTINUE;
|
||||
|
||||
public class Test {
|
||||
|
||||
private static HttpServer httpServer;
|
||||
private static Endpoint endpoint;
|
||||
private static final String NL = System.getProperty("line.separator");
|
||||
|
||||
private static final String XS_ANY_MIXED_PART =
|
||||
"<AppHdr xmlns=\"urn:head.001\">" + NL +
|
||||
" <Fr>" + NL + NL +
|
||||
"<FIId xmlns=\"urn:head.009\">" + NL + NL +
|
||||
" any" + NL +
|
||||
" white" + NL +
|
||||
" space" + NL + NL +
|
||||
" <FinInstnId>... and" + NL + NL +
|
||||
" NO namespace prefixes!!!" + NL + NL +
|
||||
" </FinInstnId>" + NL + NL +
|
||||
" </FIId>" + NL +
|
||||
"</Fr>" + NL +
|
||||
"</AppHdr>";
|
||||
|
||||
private static final String XML_REQUEST = "<soap:Envelope " +
|
||||
"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
|
||||
"xmlns:ws=\"http://ws.somewhere.org/\">" +
|
||||
"<soap:Header/><soap:Body>" +
|
||||
"<ws:echoRequest>" + NL +
|
||||
XS_ANY_MIXED_PART + NL +
|
||||
"</ws:echoRequest>" +
|
||||
"</soap:Body></soap:Envelope>";
|
||||
|
||||
private static String deployWebservice() throws IOException {
|
||||
// Manually create HttpServer here using ephemeral address for port
|
||||
// so as to not end up with attempt to bind to an in-use port
|
||||
httpServer = HttpServer.create(new InetSocketAddress(0), 0);
|
||||
httpServer.start();
|
||||
endpoint = Endpoint.create(new ServiceImpl());
|
||||
endpoint.publish(httpServer.createContext("/wservice"));
|
||||
|
||||
String wsdlAddress = "http://localhost:" + httpServer.getAddress().getPort() + "/wservice?wsdl";
|
||||
log("address = " + wsdlAddress);
|
||||
return wsdlAddress;
|
||||
}
|
||||
|
||||
private static void stopWebservice() {
|
||||
if (endpoint != null && endpoint.isPublished()) {
|
||||
endpoint.stop();
|
||||
}
|
||||
if (httpServer != null) {
|
||||
httpServer.stop(0);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException, TransformerException {
|
||||
|
||||
try {
|
||||
String address = deployWebservice();
|
||||
Service service = Service.create(new URL(address), ServiceImpl.SERVICE_NAME);
|
||||
|
||||
Dispatch<Source> d = service.createDispatch(ServiceImpl.PORT_NAME, Source.class, Service.Mode.MESSAGE);
|
||||
Source response = d.invoke(new StreamSource(new StringReader(XML_REQUEST)));
|
||||
|
||||
String resultXml = toString(response);
|
||||
|
||||
log("= request ======== \n");
|
||||
log(XML_REQUEST);
|
||||
log("= result ========= \n");
|
||||
log(resultXml);
|
||||
log("\n==================");
|
||||
|
||||
boolean xsAnyMixedPartSame = resultXml.contains(XS_ANY_MIXED_PART);
|
||||
log("resultXml.contains(XS_ANY_PART) = " + xsAnyMixedPartSame);
|
||||
if (!xsAnyMixedPartSame) {
|
||||
fail("The xs:any content=mixed part is supposed to be same in request and response.");
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
log("TEST PASSED");
|
||||
} finally {
|
||||
stopWebservice();
|
||||
|
||||
// if you need to debug or explore wsdl generation result
|
||||
// comment this line out:
|
||||
deleteGeneratedFiles();
|
||||
}
|
||||
}
|
||||
|
||||
private static String toString(Source response) throws TransformerException, IOException {
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||
Transformer transformer = transformerFactory.newTransformer();
|
||||
transformer.transform(response, new StreamResult(bos));
|
||||
bos.close();
|
||||
return new String(bos.toByteArray());
|
||||
}
|
||||
|
||||
private static void fail(String message) {
|
||||
log("TEST FAILED.");
|
||||
throw new RuntimeException(message);
|
||||
}
|
||||
|
||||
private static void log(String msg) {
|
||||
System.out.println(msg);
|
||||
}
|
||||
|
||||
private static void deleteGeneratedFiles() {
|
||||
Path p = Paths.get("..", "classes", "javax", "xml", "ws", "xsanymixed", "org");
|
||||
System.out.println("performing cleanup, deleting wsdl compilation result: " + p.toFile().getAbsolutePath());
|
||||
if (Files.exists(p)) {
|
||||
try {
|
||||
Files.walkFileTree(p, new SimpleFileVisitor<Path>() {
|
||||
@Override
|
||||
public FileVisitResult visitFile(
|
||||
Path file,
|
||||
BasicFileAttributes attrs) throws IOException {
|
||||
|
||||
System.out.println("deleting file [" + file.toFile().getAbsoluteFile() + "]");
|
||||
Files.delete(file);
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileVisitResult postVisitDirectory(
|
||||
Path dir,
|
||||
IOException exc) throws IOException {
|
||||
|
||||
System.out.println("deleting dir [" + dir.toFile().getAbsoluteFile() + "]");
|
||||
if (exc == null) {
|
||||
Files.delete(dir);
|
||||
return CONTINUE;
|
||||
} else {
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
36
jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh
Normal file
36
jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh
Normal file
@ -0,0 +1,36 @@
|
||||
#! /bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
#
|
||||
|
||||
if [ "x$TESTJAVA" = x ]; then
|
||||
TESTJAVA=$1; shift
|
||||
TESTCLASSES=.
|
||||
fi
|
||||
|
||||
echo "compiling [test-service.wsdl] wsdl ..."
|
||||
$TESTJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl
|
||||
|
||||
echo "WSDL compiled. Main test class Test.java can be compiled now."
|
87
jdk/test/javax/xml/ws/xsanymixed/service.wsdl
Normal file
87
jdk/test/javax/xml/ws/xsanymixed/service.wsdl
Normal file
@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!--
|
||||
Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:tns="http://ws.somewhere.org/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
|
||||
name="TestService"
|
||||
targetNamespace="http://ws.somewhere.org/">
|
||||
|
||||
<types>
|
||||
<xsd:schema targetNamespace="http://ws.somewhere.org/" version="1.0"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.somewhere.org/">
|
||||
|
||||
<xsd:element type="tns:echoRequest" name="echoRequest"/>
|
||||
<xsd:element type="tns:echoResponse" name="echoResponse"/>
|
||||
|
||||
<xsd:complexType name="echoRequest" mixed="true">
|
||||
<xsd:sequence>
|
||||
<xsd:any namespace="##any" processContents="skip" minOccurs="1" maxOccurs="10"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="echoResponse" mixed="true">
|
||||
<xsd:sequence>
|
||||
<xsd:any namespace="##any" processContents="skip" minOccurs="1" maxOccurs="10"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="echoRequest">
|
||||
<part element="tns:echoRequest" name="parameters"/>
|
||||
</message>
|
||||
<message name="echoResponse">
|
||||
<part element="tns:echoResponse" name="parameters"/>
|
||||
</message>
|
||||
|
||||
<portType name="TestPort">
|
||||
<operation name="echo">
|
||||
<input message="tns:echoRequest" wsam:Action="http://ws.somewhere.org/tester/echoRequest"/>
|
||||
<output message="tns:echoResponse" wsam:Action="http://ws.somewhere.org/tester/echoResponse"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="TestServicePortBinding" type="tns:TestPort">
|
||||
<soap:binding style="document"
|
||||
transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
|
||||
<operation name="echo">
|
||||
<soap:operation soapAction=""/>
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="TestService">
|
||||
<port binding="tns:TestServicePortBinding" name="TestPort">
|
||||
<soap:address location="http://localhost/ws/tester"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
@ -36,12 +36,10 @@ import java.util.concurrent.CountDownLatch;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.Phaser;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collector;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import sun.management.VMManagement;
|
||||
@ -177,6 +175,11 @@ public final class ProcessTools {
|
||||
for(Map.Entry<Thread, StackTraceElement[]> s : Thread.getAllStackTraces().entrySet()) {
|
||||
printStack(s.getKey(), s.getValue());
|
||||
}
|
||||
|
||||
if (p.isAlive()) {
|
||||
p.destroyForcibly();
|
||||
}
|
||||
|
||||
stdoutTask.cancel(true);
|
||||
stderrTask.cancel(true);
|
||||
throw e;
|
||||
|
@ -614,20 +614,34 @@ public class JMXStartStopTest {
|
||||
try (ServerSocket ss = new ServerSocket(0))
|
||||
{
|
||||
busyPort = ss.getLocalPort();
|
||||
jcmd(
|
||||
line -> {
|
||||
boolean match = line.contains("Port already in use: " +
|
||||
busyPort);
|
||||
System.out.println("[match] " + line + " => " + match);
|
||||
if (match) {
|
||||
checks.getAndUpdate((op) -> op | 4);
|
||||
}
|
||||
},
|
||||
CMD_START,
|
||||
"jmxremote.port=" + ss.getLocalPort(),
|
||||
"jmxremote.rmi.port=" + pa.getPort2(),
|
||||
"jmxremote.authenticate=false",
|
||||
"jmxremote.ssl=false");
|
||||
int retryCntr = 1;
|
||||
do {
|
||||
final boolean[] retry = new boolean[]{false};
|
||||
jcmd(
|
||||
line -> {
|
||||
boolean match = line.contains("Port already in use: " +
|
||||
busyPort);
|
||||
System.out.println("[match] " + line + " => " + match);
|
||||
if (match) {
|
||||
checks.getAndUpdate((op) -> op | 4);
|
||||
retry[0] = false;
|
||||
} else if (line.contains("Exception thrown by the agent")) {
|
||||
retry[0] = true;
|
||||
}
|
||||
},
|
||||
CMD_START,
|
||||
"jmxremote.port=" + ss.getLocalPort(),
|
||||
"jmxremote.rmi.port=" + pa.getPort2(),
|
||||
"jmxremote.authenticate=false",
|
||||
"jmxremote.ssl=false"
|
||||
);
|
||||
if (!retry[0]) {
|
||||
break;
|
||||
}
|
||||
System.out.println("Attempt " + retryCntr + " >>>");
|
||||
System.out.println("Unexpected reply from the agent. Retrying in 500ms ...");
|
||||
Thread.sleep(500);
|
||||
} while (retryCntr++ < 10);
|
||||
}
|
||||
if ((checks.get() & 1) == 0) {
|
||||
throw new Exception("Starting agent on port " + pa.getPort1() + " should " +
|
||||
|
Loading…
Reference in New Issue
Block a user