--- a/jdk/src/java.base/share/classes/java/lang/Math.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/Math.java Thu Sep 25 15:31:13 2014 -0700
@@ -123,6 +123,18 @@
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
* result is NaN.
@@ -233,7 +245,7 @@
* @since 1.2
*/
public static double toRadians(double angdeg) {
- return angdeg / 180.0 * PI;
+ return angdeg * DEGREES_TO_RADIANS;
}
/**
@@ -249,7 +261,7 @@
* @since 1.2
*/
public static double toDegrees(double angrad) {
- return angrad * 180.0 / PI;
+ return angrad * RADIANS_TO_DEGREES;
}
/**
--- a/jdk/src/java.base/share/classes/java/lang/StrictMath.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/StrictMath.java Thu Sep 25 15:31:13 2014 -0700
@@ -98,6 +98,19 @@
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
* result is NaN.
@@ -179,7 +192,7 @@
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 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;
}
/**
--- a/jdk/src/java.base/share/classes/java/lang/String.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Thu Sep 25 15:31:13 2014 -0700
@@ -1451,11 +1451,9 @@
*/
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;
}
--- a/jdk/src/java.base/share/classes/java/security/KeyPairGenerator.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/security/KeyPairGenerator.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 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 @@
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 @@
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 @@
provider = instance.provider;
this.serviceIterator = serviceIterator;
initType = I_NONE;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("KeyPairGenerator." + algorithm +
+ " algorithm from: " + provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/java/security/KeyStore.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/security/KeyStore.java Thu Sep 25 15:31:13 2014 -0700
@@ -37,6 +37,8 @@
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 @@
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 @@
this.keyStoreSpi = keyStoreSpi;
this.provider = provider;
this.type = type;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("KeyStore." + type.toUpperCase() + " type from: " +
+ this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/java/security/MessageDigest.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/security/MessageDigest.java Thu Sep 25 15:31:13 2014 -0700
@@ -35,6 +35,8 @@
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 @@
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 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");
}
--- a/jdk/src/java.base/share/classes/java/security/SecureRandom.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandom.java Thu Sep 25 15:31:13 2014 -0700
@@ -32,6 +32,7 @@
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 @@
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 @@
this.secureRandomSpi = secureRandomSpi;
this.provider = provider;
this.algorithm = algorithm;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("SecureRandom." + algorithm +
+ " algorithm from: " + this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/java/security/Signature.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/security/Signature.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 @@
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 @@
throws InvalidKeyException {
engineInitVerify(publicKey);
state = VERIFY;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Signature." + algorithm +
+ " verification algorithm from: " + this.provider.getName());
+ }
}
/**
@@ -495,6 +505,11 @@
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 @@
throws InvalidKeyException {
engineInitSign(privateKey);
state = SIGN;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Signature." + algorithm +
+ " signing algorithm from: " + this.provider.getName());
+ }
}
/**
@@ -529,6 +549,11 @@
throws InvalidKeyException {
engineInitSign(privateKey, random);
state = SIGN;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Signature." + algorithm +
+ " signing algorithm from: " + this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/java/util/Formatter.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/java/util/Formatter.java Thu Sep 25 15:31:13 2014 -0700
@@ -2498,7 +2498,7 @@
// 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 @@
/**
* 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 @@
// 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 @@
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 @@
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 @@
return width;
}
- int width() {
- return width;
- }
-
private int precision(String s) {
precision = -1;
if (s != null) {
@@ -2679,44 +2677,41 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
// 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 @@
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 @@
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 @@
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 @@
}
// justify based on width
- a.append(justify(sb.toString()));
+ appendJustified(a, sb);
}
// !Double.isInfinite(value) && !Double.isNaN(value)
@@ -3263,31 +3258,31 @@
= 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 @@
= 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 @@
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 @@
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 @@
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 @@
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 @@
trailingSign(sb, neg);
// justify based on width
- a.append(justify(sb.toString()));
+ appendJustified(a, sb);
}
// value > 0
@@ -3565,7 +3556,7 @@
= 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 @@
// 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);
-
- char[] exp = bdl.exponent();
+ trailingZeros(mant, nzeros);
+
+ 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]);
-
- 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(sign);
+
+ 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 @@
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 @@
// 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);
-
- localizedMagnitude(sb, mant, f, adjustWidth(width, f, neg), l);
+ trailingZeros(mant, nzeros);
+
+ 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 @@
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 @@
// 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 @@
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
+ private void trailingZeros(StringBuilder sb, int nzeros) {
+ for (int i = 0; i < nzeros; i++) {
+ sb.append('0');
+ }
}
- // 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';
- }
- 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 @@
// 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 @@
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 @@
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 @@
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 @@
}
// 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 @@
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 @@
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());
--- a/jdk/src/java.base/share/classes/javax/crypto/Cipher.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/javax/crypto/Cipher.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 @@
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 @@
}
}
+ 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 @@
initialized = true;
this.opmode = opmode;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Cipher." + transformation + " " +
+ getOpmodeString(opmode) + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
@@ -1372,6 +1398,12 @@
initialized = true;
this.opmode = opmode;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Cipher." + transformation + " " +
+ getOpmodeString(opmode) + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
@@ -1509,6 +1541,12 @@
initialized = true;
this.opmode = opmode;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Cipher." + transformation + " " +
+ getOpmodeString(opmode) + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
@@ -1693,6 +1731,12 @@
initialized = true;
this.opmode = opmode;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Cipher." + transformation + " " +
+ getOpmodeString(opmode) + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/javax/crypto/KeyAgreement.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/javax/crypto/KeyAgreement.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 @@
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 @@
throw new InvalidKeyException(e);
}
}
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("KeyAgreement." + algorithm + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
@@ -524,6 +534,11 @@
} else {
chooseProvider(I_PARAMS, key, params, random);
}
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("KeyAgreement." + algorithm + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/javax/crypto/KeyGenerator.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/javax/crypto/KeyGenerator.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 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 @@
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 @@
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 @@
throw new NoSuchAlgorithmException
(algorithm + " KeyGenerator not available");
}
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("KeyGenerator." + algorithm + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/javax/crypto/Mac.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/javax/crypto/Mac.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 @@
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 @@
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 @@
chooseProvider(key, params);
}
initialized = true;
+
+ if (!skipDebug && pdebug != null) {
+ pdebug.println("Mac." + algorithm + " algorithm from: " +
+ this.provider.getName());
+ }
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/util/Debug.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/share/classes/sun/security/util/Debug.java Thu Sep 25 15:31:13 2014 -0700
@@ -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 @@
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);
--- a/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c Thu Sep 25 15:31:13 2014 -0700
@@ -140,24 +140,25 @@
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
--- a/jdk/src/java.base/windows/native/libnio/ch/FileDispatcherImpl.c Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/src/java.base/windows/native/libnio/ch/FileDispatcherImpl.c Thu Sep 25 15:31:13 2014 -0700
@@ -126,39 +126,30 @@
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 @@
if (error == ERROR_NO_DATA) {
return IOS_UNAVAILABLE;
}
- JNU_ThrowIOExceptionWithLastError(env, "Read 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;
}
- lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN);
- if (lowPos == ((DWORD)-1)) {
- if (GetLastError() != ERROR_SUCCESS) {
- JNU_ThrowIOExceptionWithLastError(env, "Seek failed");
- return IOS_THROWN;
- }
- }
return convertReturnVal(env, (jint)read, JNI_TRUE);
}
@@ -194,18 +186,18 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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);
}
--- a/jdk/test/ProblemList.txt Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/test/ProblemList.txt Thu Sep 25 15:31:13 2014 -0700
@@ -122,6 +122,13 @@
############################################################################
+# jdk_instrument
+
+# 8058536
+java/lang/instrument/NativeMethodPrefixAgent.java generic-all
+
+############################################################################
+
# jdk_management
# 8044591
--- a/jdk/test/java/awt/Graphics2D/DrawString/DrawStringCrash.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/test/java/awt/Graphics2D/DrawString/DrawStringCrash.java Thu Sep 25 15:31:13 2014 -0700
@@ -52,7 +52,7 @@
Graphics2D g2d = bi.createGraphics();
while (len < maxLen) {
try {
- g2d.drawString(s, 20, 20);
+ g2d.drawString(sb.toString(), 20, 20);
} catch (OutOfMemoryError e) {
return;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/ws/xsanymixed/CopyingResponse.java Thu Sep 25 15:31:13 2014 -0700
@@ -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();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/ws/xsanymixed/ServiceImpl.java Thu Sep 25 15:31:13 2014 -0700
@@ -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);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/ws/xsanymixed/Test.java Thu Sep 25 15:31:13 2014 -0700
@@ -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();
+ }
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Thu Sep 25 15:31:13 2014 -0700
@@ -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."
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/ws/xsanymixed/service.wsdl Thu Sep 25 15:31:13 2014 -0700
@@ -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>
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Thu Sep 25 15:31:13 2014 -0700
@@ -36,12 +36,10 @@
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 @@
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;
--- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Thu Sep 25 15:57:37 2014 +0400
+++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Thu Sep 25 15:31:13 2014 -0700
@@ -614,20 +614,34 @@
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 " +