() {
@Override
@@ -1168,7 +1171,8 @@ public class LogManager {
* Any log level definitions in the new configuration file will be
* applied using Logger.setLevel(), if the target Logger exists.
*
- * A PropertyChangeEvent will be fired after the properties are read.
+ * Any {@linkplain #addConfigurationListener registered configuration
+ * listener} will be invoked after the properties are read.
*
* @exception SecurityException if a security manager exists and if
* the caller does not have LoggingPermission("control").
@@ -1302,7 +1306,8 @@ public class LogManager {
/**
* Reinitialize the logging properties and reread the logging configuration
* from the given stream, which should be in java.util.Properties format.
- * A PropertyChangeEvent will be fired after the properties are read.
+ * Any {@linkplain #addConfigurationListener registered configuration
+ * listener} will be invoked after the properties are read.
*
* Any log level definitions in the new configuration file will be
* applied using Logger.setLevel(), if the target Logger exists.
@@ -1335,10 +1340,14 @@ public class LogManager {
// Set levels on any pre-existing loggers, based on the new properties.
setLevelsOnExistingLoggers();
- // Note that we need to reinitialize global handles when
- // they are first referenced.
- synchronized (this) {
- initializedGlobalHandlers = false;
+ try {
+ invokeConfigurationListeners();
+ } finally {
+ // Note that we need to reinitialize global handles when
+ // they are first referenced.
+ synchronized (this) {
+ initializedGlobalHandlers = false;
+ }
}
}
@@ -1620,4 +1629,95 @@ public class LogManager {
}
return loggingMXBean;
}
+
+ /**
+ * Adds a configuration listener to be invoked each time the logging
+ * configuration is read.
+ * If the listener is already registered the method does nothing.
+ *
+ * The listener is invoked with privileges that are restricted by the
+ * calling context of this method.
+ * The order in which the listeners are invoked is unspecified.
+ *
+ * It is recommended that listeners do not throw errors or exceptions.
+ *
+ * If a listener terminates with an uncaught error or exception then
+ * the first exception will be propagated to the caller of
+ * {@link #readConfiguration()} (or {@link #readConfiguration(java.io.InputStream)})
+ * after all listeners have been invoked.
+ *
+ * @implNote If more than one listener terminates with an uncaught error or
+ * exception, an implementation may record the additional errors or
+ * exceptions as {@linkplain Throwable#addSuppressed(java.lang.Throwable)
+ * suppressed exceptions}.
+ *
+ * @param listener A configuration listener that will be invoked after the
+ * configuration changed.
+ * @return This LogManager.
+ * @throws SecurityException if a security manager exists and if the
+ * caller does not have LoggingPermission("control").
+ * @throws NullPointerException if the listener is null.
+ *
+ * @since 1.9
+ */
+ public LogManager addConfigurationListener(Runnable listener) {
+ final Runnable r = Objects.requireNonNull(listener);
+ checkPermission();
+ final SecurityManager sm = System.getSecurityManager();
+ final AccessControlContext acc =
+ sm == null ? null : AccessController.getContext();
+ final PrivilegedAction pa =
+ acc == null ? null : () -> { r.run() ; return null; };
+ final Runnable pr =
+ acc == null ? r : () -> AccessController.doPrivileged(pa, acc);
+ // Will do nothing if already registered.
+ listeners.putIfAbsent(r, pr);
+ return this;
+ }
+
+ /**
+ * Removes a previously registered configuration listener.
+ *
+ * Returns silently if the listener is not found.
+ *
+ * @param listener the configuration listener to remove.
+ * @throws NullPointerException if the listener is null.
+ * @throws SecurityException if a security manager exists and if the
+ * caller does not have LoggingPermission("control").
+ *
+ * @since 1.9
+ */
+ public void removeConfigurationListener(Runnable listener) {
+ final Runnable key = Objects.requireNonNull(listener);
+ checkPermission();
+ listeners.remove(key);
+ }
+
+ private void invokeConfigurationListeners() {
+ Throwable t = null;
+
+ // We're using an IdentityHashMap because we want to compare
+ // keys using identity (==).
+ // We don't want to loop within a block synchronized on 'listeners'
+ // to avoid invoking listeners from yet another synchronized block.
+ // So we're taking a snapshot of the values list to avoid the risk of
+ // ConcurrentModificationException while looping.
+ //
+ for (Runnable c : listeners.values().toArray(new Runnable[0])) {
+ try {
+ c.run();
+ } catch (ThreadDeath death) {
+ throw death;
+ } catch (Error | RuntimeException x) {
+ if (t == null) t = x;
+ else t.addSuppressed(x);
+ }
+ }
+ // Listeners are not supposed to throw exceptions, but if that
+ // happens, we will rethrow the first error or exception that is raised
+ // after all listeners have been invoked.
+ if (t instanceof Error) throw (Error)t;
+ if (t instanceof RuntimeException) throw (RuntimeException)t;
+ }
+
}
diff --git a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/signature/XMLSignature.java b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/signature/XMLSignature.java
index 6ea1443af3a..ae8593bc600 100644
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/signature/XMLSignature.java
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/signature/XMLSignature.java
@@ -699,15 +699,15 @@ public final class XMLSignature extends SignatureElementProxy {
//create a SignatureAlgorithms from the SignatureMethod inside
//SignedInfo. This is used to validate the signature.
SignatureAlgorithm sa = si.getSignatureAlgorithm();
- if (log.isLoggable(java.util.logging.Level.FINE)) {
- log.log(java.util.logging.Level.FINE, "signatureMethodURI = " + sa.getAlgorithmURI());
- log.log(java.util.logging.Level.FINE, "jceSigAlgorithm = " + sa.getJCEAlgorithmString());
- log.log(java.util.logging.Level.FINE, "jceSigProvider = " + sa.getJCEProviderName());
- log.log(java.util.logging.Level.FINE, "PublicKey = " + pk);
- }
byte sigBytes[] = null;
try {
sa.initVerify(pk);
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "signatureMethodURI = " + sa.getAlgorithmURI());
+ log.log(java.util.logging.Level.FINE, "jceSigAlgorithm = " + sa.getJCEAlgorithmString());
+ log.log(java.util.logging.Level.FINE, "jceSigProvider = " + sa.getJCEProviderName());
+ log.log(java.util.logging.Level.FINE, "PublicKey = " + pk);
+ }
// Get the canonicalized (normalized) SignedInfo
SignerOutputStream so = new SignerOutputStream(sa);
diff --git a/jdk/src/jdk.crypto.ec/share/native/libsunec/ECC_JNI.cpp b/jdk/src/jdk.crypto.ec/share/native/libsunec/ECC_JNI.cpp
index 684f82eac3f..5c07645d0dc 100644
--- a/jdk/src/jdk.crypto.ec/share/native/libsunec/ECC_JNI.cpp
+++ b/jdk/src/jdk.crypto.ec/share/native/libsunec/ECC_JNI.cpp
@@ -211,6 +211,7 @@ JNICALL Java_sun_security_ec_ECDSASignature_signDigest
digest_item.len = jDigestLength;
ECPrivateKey privKey;
+ privKey.privateValue.data = NULL;
// Initialize the ECParams struct
ECParams *ecparams = NULL;
@@ -387,9 +388,14 @@ JNICALL Java_sun_security_ec_ECDHKeyAgreement_deriveKey
{
jbyteArray jSecret = NULL;
ECParams *ecparams = NULL;
+ SECItem privateValue_item;
+ privateValue_item.data = NULL;
+ SECItem publicValue_item;
+ publicValue_item.data = NULL;
+ SECKEYECParams params_item;
+ params_item.data = NULL;
// Extract private key value
- SECItem privateValue_item;
privateValue_item.len = env->GetArrayLength(privateKey);
privateValue_item.data =
(unsigned char *) env->GetByteArrayElements(privateKey, 0);
@@ -398,7 +404,6 @@ JNICALL Java_sun_security_ec_ECDHKeyAgreement_deriveKey
}
// Extract public key value
- SECItem publicValue_item;
publicValue_item.len = env->GetArrayLength(publicKey);
publicValue_item.data =
(unsigned char *) env->GetByteArrayElements(publicKey, 0);
@@ -407,7 +412,6 @@ JNICALL Java_sun_security_ec_ECDHKeyAgreement_deriveKey
}
// Initialize the ECParams struct
- SECKEYECParams params_item;
params_item.len = env->GetArrayLength(encodedParams);
params_item.data =
(unsigned char *) env->GetByteArrayElements(encodedParams, 0);
diff --git a/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/ContentSigner.java b/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/ContentSigner.java
index 1a29bf7ca33..0446ab405b0 100644
--- a/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/ContentSigner.java
+++ b/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/ContentSigner.java
@@ -37,6 +37,7 @@ import java.security.cert.CertificateException;
* @author Vincent Ryan
*/
+@jdk.Exported
public abstract class ContentSigner {
/**
diff --git a/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/package-info.java b/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/package-info.java
new file mode 100644
index 00000000000..554d4c7b076
--- /dev/null
+++ b/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/package-info.java
@@ -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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+/**
+ * This package comprises the interfaces and classes used to define the
+ * signing mechanism used by the jarsigner tool.
+ *
+ * Clients may override the default signing mechanism of the jarsigner
+ * tool by supplying an alternative implementation of
+ * {@link com.sun.jarsigner.ContentSigner}.
+ */
+
+@jdk.Exported
+package com.sun.jarsigner;
diff --git a/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/package.html b/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/package.html
deleted file mode 100644
index b00d655d9a2..00000000000
--- a/jdk/src/jdk.dev/share/classes/com/sun/jarsigner/package.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
- Jarsigner Signing Mechanism Package
-
-
-This package comprises the interfaces and classes used to define the
-signing mechanism used by the jarsigner tool.
-
-Clients may override the default signing mechanism of the jarsigner
-tool by supplying an alternative implementation of
-{@link com.sun.jarsigner.ContentSigner}.
-
-
diff --git a/jdk/test/java/lang/invoke/LFCaching/TestMethods.java b/jdk/test/java/lang/invoke/LFCaching/TestMethods.java
index 794709a7919..875307387a4 100644
--- a/jdk/test/java/lang/invoke/LFCaching/TestMethods.java
+++ b/jdk/test/java/lang/invoke/LFCaching/TestMethods.java
@@ -44,7 +44,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -83,7 +83,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -91,7 +91,7 @@ public enum TestMethods {
int dropArgsPos = Helper.RNG.nextInt(realArity + 1);
data.put("dropArgsPos", dropArgsPos);
MethodType mtDropArgs = TestMethods.randomMethodTypeGenerator(
- Helper.RNG.nextInt(Helper.MAX_ARITY - realArity));
+ Helper.RNG.nextInt(super.maxArity - realArity));
data.put("mtDropArgs", mtDropArgs);
return data;
}
@@ -106,20 +106,20 @@ public enum TestMethods {
int mtTgtSlotsCount = TestMethods.argSlotsCount(mtTarget);
int mtDASlotsCount = TestMethods.argSlotsCount(mtDropArgs);
List> fakeParList;
- if (mtTgtSlotsCount + mtDASlotsCount > Helper.MAX_ARITY - 1) {
+ if (mtTgtSlotsCount + mtDASlotsCount > super.maxArity - 1) {
fakeParList = TestMethods.reduceArgListToSlotsCount(mtDropArgs.parameterList(),
- Helper.MAX_ARITY - mtTgtSlotsCount - 1);
+ super.maxArity - mtTgtSlotsCount - 1);
} else {
fakeParList = mtDropArgs.parameterList();
}
return MethodHandles.dropArguments(target, dropArgsPos, fakeParList);
}
},
- EXPLICIT_CAST_ARGUMENTS("explicitCastArguments") {
+ EXPLICIT_CAST_ARGUMENTS("explicitCastArguments", Helper.MAX_ARITY / 2) {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY / 2);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -146,11 +146,11 @@ public enum TestMethods {
return MethodHandles.explicitCastArguments(target, mtExcplCastArgs);
}
},
- FILTER_ARGUMENTS("filterArguments") {
+ FILTER_ARGUMENTS("filterArguments", Helper.MAX_ARITY / 2) {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY / 2);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -184,7 +184,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -211,7 +211,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -236,18 +236,18 @@ public enum TestMethods {
return MethodHandles.insertArguments(target, insertArgsPos, insertList);
}
},
- PERMUTE_ARGUMENTS("permuteArguments") {
+ PERMUTE_ARGUMENTS("permuteArguments", Helper.MAX_ARITY / 2) {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY / 2);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
// Arity after reducing because of long and double take 2 slots.
int realArity = mtTarget.parameterCount();
int[] permuteArgsReorderArray = new int[realArity];
- int mtParmuteArgsNum = Helper.RNG.nextInt(Helper.MAX_ARITY);
- mtParmuteArgsNum = mtParmuteArgsNum == 0 ? 1 : mtParmuteArgsNum;
- MethodType mtPermuteArgs = TestMethods.randomMethodTypeGenerator(mtParmuteArgsNum);
+ int mtPermuteArgsNum = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ mtPermuteArgsNum = mtPermuteArgsNum == 0 ? 1 : mtPermuteArgsNum;
+ MethodType mtPermuteArgs = TestMethods.randomMethodTypeGenerator(mtPermuteArgsNum);
mtTarget = mtTarget.changeReturnType(mtPermuteArgs.returnType());
for (int i = 0; i < realArity; i++) {
int mtPermuteArgsParNum = Helper.RNG.nextInt(mtPermuteArgs.parameterCount());
@@ -275,7 +275,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -293,7 +293,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -329,7 +329,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -359,11 +359,11 @@ public enum TestMethods {
return MethodHandles.catchException(target, Exception.class, handler);
}
},
- INVOKER("invoker") {
+ INVOKER("invoker", Helper.MAX_ARITY - 1) {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -375,11 +375,11 @@ public enum TestMethods {
return MethodHandles.invoker(mtTarget);
}
},
- EXACT_INVOKER("exactInvoker") {
+ EXACT_INVOKER("exactInvoker", Helper.MAX_ARITY - 1) {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -391,11 +391,11 @@ public enum TestMethods {
return MethodHandles.exactInvoker(mtTarget);
}
},
- SPREAD_INVOKER("spreadInvoker") {
+ SPREAD_INVOKER("spreadInvoker", Helper.MAX_ARITY - 1) {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
// Arity after reducing because of long and double take 2 slots.
@@ -416,7 +416,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -436,7 +436,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -456,7 +456,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -481,7 +481,7 @@ public enum TestMethods {
@Override
public Map getTestCaseData() {
Map data = new HashMap<>();
- int desiredArity = Helper.RNG.nextInt(Helper.MAX_ARITY);
+ int desiredArity = Helper.RNG.nextInt(super.maxArity);
MethodType mtTarget = TestMethods.randomMethodTypeGenerator(desiredArity);
data.put("mtTarget", mtTarget);
return data;
@@ -503,8 +503,15 @@ public enum TestMethods {
*/
public final String name;
- private TestMethods(String name) {
+ private final int maxArity;
+
+ private TestMethods(String name, int maxArity) {
this.name = name;
+ this.maxArity = maxArity;
+ }
+
+ private TestMethods(String name) {
+ this(name, Helper.MAX_ARITY);
}
protected MethodHandle getMH(Map data, TestMethods.Kind kind) throws NoSuchMethodException, IllegalAccessException {
diff --git a/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java b/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java
index 7d7f1749416..2101c4cb4bf 100644
--- a/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java
+++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java
@@ -59,13 +59,13 @@ public class MemoryTest {
// (or equivalent for other collectors)
// Number of GC memory managers = 2
- // Hotspot VM 1.8+ after perm gen removal is expected to have two or
- // three non-heap memory pools:
- // - Code cache
+ // Hotspot VM 1.8+ after perm gen removal is expected to have between two
+ // or five non-heap memory pools:
+ // - Code cache (between one and three depending on the -XX:SegmentedCodeCache option)
// - Metaspace
// - Compressed Class Space (if compressed class pointers are used)
private static int[] expectedMinNumPools = {3, 2};
- private static int[] expectedMaxNumPools = {3, 3};
+ private static int[] expectedMaxNumPools = {3, 5};
private static int expectedNumGCMgrs = 2;
private static int expectedNumMgrs = expectedNumGCMgrs + 2;
private static String[] types = { "heap", "non-heap" };
diff --git a/jdk/test/java/net/InetAddress/IPv4Formats.java b/jdk/test/java/net/InetAddress/IPv4Formats.java
index 7c6dc866f2a..ceef7e1f3f7 100644
--- a/jdk/test/java/net/InetAddress/IPv4Formats.java
+++ b/jdk/test/java/net/InetAddress/IPv4Formats.java
@@ -36,7 +36,7 @@ public class IPv4Formats {
{"126.1", "126.0.0.1"},
{"128.50.65534", "128.50.255.254"},
{"192.168.1.2", "192.168.1.2"},
- {"hello.foo.bar", null},
+ {"invalidhost.invalid", null},
{"1024.1.2.3", null},
{"128.14.66000", null }
};
diff --git a/jdk/test/java/util/logging/FileHandlerPath.java b/jdk/test/java/util/logging/FileHandlerPath.java
new file mode 100644
index 00000000000..93859091c9b
--- /dev/null
+++ b/jdk/test/java/util/logging/FileHandlerPath.java
@@ -0,0 +1,315 @@
+/*
+ * 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 java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FilePermission;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import static java.nio.file.StandardOpenOption.CREATE_NEW;
+import static java.nio.file.StandardOpenOption.WRITE;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+import java.util.PropertyPermission;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.FileHandler;
+import java.util.logging.LogManager;
+import java.util.logging.LoggingPermission;
+
+/**
+ * @test
+ * @bug 8059269
+ * @summary tests that using a simple (non composite) pattern does not lead
+ * to NPE when the lock file already exists.
+ * @run main/othervm FileHandlerPath UNSECURE
+ * @run main/othervm FileHandlerPath SECURE
+ * @author danielfuchs
+ */
+public class FileHandlerPath {
+
+ /**
+ * We will test the simple pattern in two configurations.
+ * UNSECURE: No security manager.
+ * SECURE: With the security manager present - and the required
+ * permissions granted.
+ */
+ public static enum TestCase {
+ UNSECURE, SECURE;
+ public void run(Properties propertyFile) throws Exception {
+ System.out.println("Running test case: " + name());
+ Configure.setUp(this, propertyFile);
+ test(this.name() + " " + propertyFile.getProperty("test.name"), propertyFile);
+ }
+ }
+
+
+ // Use a random name provided by UUID to avoid collision with other tests
+ final static String logFile = FileHandlerPath.class.getSimpleName() + "_"
+ + UUID.randomUUID().toString() + ".log";
+ final static String tmpLogFile;
+ final static String userDir = System.getProperty("user.dir");
+ final static String tmpDir = System.getProperty("java.io.tmpdir");
+ private static final List properties;
+ static {
+ tmpLogFile = new File(tmpDir, logFile).toString();
+ Properties props1 = new Properties();
+ Properties props2 = new Properties();
+ props1.setProperty("test.name", "relative file");
+ props1.setProperty("test.file.name", logFile);
+ props1.setProperty(FileHandler.class.getName() + ".pattern", logFile);
+ props1.setProperty(FileHandler.class.getName() + ".count", "1");
+ props2.setProperty("test.name", "absoluste file");
+ props2.setProperty("test.file.name", tmpLogFile);
+ props2.setProperty(FileHandler.class.getName() + ".pattern", "%t/" + logFile);
+ props2.setProperty(FileHandler.class.getName() + ".count", "1");
+ properties = Collections.unmodifiableList(Arrays.asList(
+ props1,
+ props2));
+ }
+
+ public static void main(String... args) throws Exception {
+
+ if (args == null || args.length == 0) {
+ args = new String[] {
+ TestCase.UNSECURE.name(),
+ TestCase.SECURE.name(),
+ };
+ }
+
+ // Sanity checks
+
+ if (!Files.isWritable(Paths.get(userDir))) {
+ throw new RuntimeException(userDir +
+ ": user.dir is not writable - can't run test.");
+ }
+ if (!Files.isWritable(Paths.get(tmpDir))) {
+ throw new RuntimeException(tmpDir +
+ ": java.io.tmpdir is not writable - can't run test.");
+ }
+
+ File[] files = {
+ new File(logFile),
+ new File(tmpLogFile),
+ new File(logFile+".1"),
+ new File(tmpLogFile+".1"),
+ new File(logFile+".lck"),
+ new File(tmpLogFile+".lck"),
+ new File(logFile+".1.lck"),
+ new File(tmpLogFile+".1.lck")
+ };
+
+ for (File log : files) {
+ if (log.exists()) {
+ throw new Exception(log +": file already exists - can't run test.");
+ }
+ }
+
+ // Now start the real test
+
+ try {
+ for (String testName : args) {
+ for (Properties propertyFile : properties) {
+ TestCase test = TestCase.valueOf(testName);
+ test.run(propertyFile);
+ }
+ }
+ } finally {
+ // Cleanup...
+ Configure.doPrivileged(() -> {
+ for(File log : files) {
+ try {
+ final boolean isLockFile = log.getName().endsWith(".lck");
+ // lock file should already be deleted, except if the
+ // test failed in exception.
+ // log file should all be present, except if the test
+ // failed in exception.
+ if (log.exists()) {
+ if (!isLockFile) {
+ System.out.println("deleting "+log.toString());
+ } else {
+ System.err.println("deleting lock file "+log.toString());
+ }
+ log.delete();
+ } else {
+ if (!isLockFile) {
+ System.err.println(log.toString() + ": not found.");
+ }
+ }
+ } catch (Throwable t) {
+ // should not happen
+ t.printStackTrace();
+ }
+ }
+ });
+ }
+ }
+
+ static class Configure {
+ static Policy policy = null;
+ static final AtomicBoolean allowAll = new AtomicBoolean(false);
+ static void setUp(TestCase test, Properties propertyFile) {
+ switch (test) {
+ case SECURE:
+ if (policy == null && System.getSecurityManager() != null) {
+ throw new IllegalStateException("SecurityManager already set");
+ } else if (policy == null) {
+ policy = new SimplePolicy(TestCase.SECURE, allowAll);
+ Policy.setPolicy(policy);
+ System.setSecurityManager(new SecurityManager());
+ }
+ if (System.getSecurityManager() == null) {
+ throw new IllegalStateException("No SecurityManager.");
+ }
+ if (policy == null) {
+ throw new IllegalStateException("policy not configured");
+ }
+ break;
+ case UNSECURE:
+ if (System.getSecurityManager() != null) {
+ throw new IllegalStateException("SecurityManager already set");
+ }
+ break;
+ default:
+ new InternalError("No such testcase: " + test);
+ }
+ doPrivileged(() -> {
+ try {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ propertyFile.store(bytes, propertyFile.getProperty("test.name"));
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes.toByteArray());
+ LogManager.getLogManager().readConfiguration(bais);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ });
+ }
+ static void doPrivileged(Runnable run) {
+ allowAll.set(true);
+ try {
+ run.run();
+ } finally {
+ allowAll.set(false);
+ }
+ }
+ }
+
+ public static void test(String name, Properties props) throws Exception {
+ System.out.println("Testing: " + name);
+ String file = props.getProperty("test.file.name");
+ // create the lock files first - in order to take the path that
+ // used to trigger the NPE
+ Files.createFile(Paths.get(file + ".lck"));
+ Files.createFile(Paths.get(file + ".1.lck"));
+ final FileHandler f1 = new FileHandler();
+ final FileHandler f2 = new FileHandler();
+ f1.close();
+ f2.close();
+ System.out.println("Success for " + name);
+ }
+
+
+ final static class PermissionsBuilder {
+ final Permissions perms;
+ public PermissionsBuilder() {
+ this(new Permissions());
+ }
+ public PermissionsBuilder(Permissions perms) {
+ this.perms = perms;
+ }
+ public PermissionsBuilder add(Permission p) {
+ perms.add(p);
+ return this;
+ }
+ public PermissionsBuilder addAll(PermissionCollection col) {
+ if (col != null) {
+ for (Enumeration e = col.elements(); e.hasMoreElements(); ) {
+ perms.add(e.nextElement());
+ }
+ }
+ return this;
+ }
+ public Permissions toPermissions() {
+ final PermissionsBuilder builder = new PermissionsBuilder();
+ builder.addAll(perms);
+ return builder.perms;
+ }
+ }
+
+ public static class SimplePolicy extends Policy {
+
+ final Permissions permissions;
+ final Permissions allPermissions;
+ final AtomicBoolean allowAll;
+ public SimplePolicy(TestCase test, AtomicBoolean allowAll) {
+ this.allowAll = allowAll;
+ permissions = new Permissions();
+ permissions.add(new LoggingPermission("control", null)); // needed by new FileHandler()
+ permissions.add(new FilePermission("<>", "read")); // needed by new FileHandler()
+ permissions.add(new FilePermission(logFile, "write,delete")); // needed by new FileHandler()
+ permissions.add(new FilePermission(logFile+".lck", "write,delete")); // needed by FileHandler.close()
+ permissions.add(new FilePermission(logFile+".1", "write,delete")); // needed by new FileHandler()
+ permissions.add(new FilePermission(logFile+".1.lck", "write,delete")); // needed by FileHandler.close()
+ permissions.add(new FilePermission(tmpLogFile, "write,delete")); // needed by new FileHandler()
+ permissions.add(new FilePermission(tmpLogFile+".lck", "write,delete")); // needed by FileHandler.close()
+ permissions.add(new FilePermission(tmpLogFile+".1", "write,delete")); // needed by new FileHandler()
+ permissions.add(new FilePermission(tmpLogFile+".1.lck", "write,delete")); // needed by FileHandler.close()
+ permissions.add(new FilePermission(userDir, "write")); // needed by new FileHandler()
+ permissions.add(new FilePermission(tmpDir, "write")); // needed by new FileHandler()
+ permissions.add(new PropertyPermission("user.dir", "read"));
+ permissions.add(new PropertyPermission("java.io.tmpdir", "read"));
+ allPermissions = new Permissions();
+ allPermissions.add(new java.security.AllPermission());
+ }
+
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ if (allowAll.get()) return allPermissions.implies(permission);
+ return permissions.implies(permission);
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return new PermissionsBuilder().addAll(allowAll.get()
+ ? allPermissions : permissions).toPermissions();
+ }
+
+ @Override
+ public PermissionCollection getPermissions(ProtectionDomain domain) {
+ return new PermissionsBuilder().addAll(allowAll.get()
+ ? allPermissions : permissions).toPermissions();
+ }
+ }
+
+}
diff --git a/jdk/test/java/util/logging/FileHandlerPatternExceptions.java b/jdk/test/java/util/logging/FileHandlerPatternExceptions.java
new file mode 100644
index 00000000000..a4026d9bde9
--- /dev/null
+++ b/jdk/test/java/util/logging/FileHandlerPatternExceptions.java
@@ -0,0 +1,331 @@
+/*
+ * 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 java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.AccessControlException;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.FileHandler;
+import java.util.logging.LogManager;
+
+/**
+ * @test
+ * @bug 8025690
+ * @summary tests that an empty or null pattern always result in an exception.
+ * @run main/othervm FileHandlerPatternExceptions UNSECURE
+ * @run main/othervm FileHandlerPatternExceptions SECURE
+ * @author danielfuchs
+ */
+public class FileHandlerPatternExceptions {
+
+ /**
+ * We will test null/empty pattern in two configurations.
+ * UNSECURE: No security manager.
+ * SECURE: With the security manager present - and the required
+ * permissions granted.
+ */
+ public static enum TestCase {
+ UNSECURE, SECURE;
+ public void run(Properties propertyFile) throws Exception {
+ System.out.println("Running test case: " + name());
+ Configure.setUp(this, propertyFile);
+ test(this.name() + " " + propertyFile.getProperty("test.name"));
+ }
+ }
+
+
+ private static final String PREFIX =
+ "FileHandler-" + UUID.randomUUID() + ".log";
+ private static final String userDir = System.getProperty("user.dir", ".");
+ private static final boolean userDirWritable = Files.isWritable(Paths.get(userDir));
+
+ private static final List properties;
+ static {
+ Properties props1 = new Properties();
+ Properties props2 = new Properties();
+ props1.setProperty("test.name", "with count=1");
+ props1.setProperty(FileHandler.class.getName() + ".pattern", "");
+ props1.setProperty(FileHandler.class.getName() + ".count", "1");
+ props2.setProperty("test.name", "with count=2");
+ props2.setProperty(FileHandler.class.getName() + ".pattern", "");
+ props2.setProperty(FileHandler.class.getName() + ".count", "2");
+ properties = Collections.unmodifiableList(Arrays.asList(
+ props1,
+ props2));
+ }
+
+ public static void main(String... args) throws Exception {
+
+
+ if (args == null || args.length == 0) {
+ args = new String[] {
+ TestCase.UNSECURE.name(),
+ TestCase.SECURE.name(),
+ };
+ }
+
+ try {
+ for (String testName : args) {
+ for (Properties propertyFile : properties) {
+ TestCase test = TestCase.valueOf(testName);
+ test.run(propertyFile);
+ }
+ }
+ } finally {
+ if (userDirWritable) {
+ Configure.doPrivileged(() -> {
+ // cleanup - delete files that have been created
+ try {
+ Files.list(Paths.get(userDir))
+ .filter((f) -> f.toString().contains(PREFIX))
+ .forEach((f) -> {
+ try {
+ System.out.println("deleting " + f);
+ Files.delete(f);
+ } catch(Throwable t) {
+ System.err.println("Failed to delete " + f + ": " + t);
+ }
+ });
+ } catch(Throwable t) {
+ System.err.println("Cleanup failed to list files: " + t);
+ t.printStackTrace();
+ }
+ });
+ }
+ }
+ }
+
+ static class Configure {
+ static Policy policy = null;
+ static final AtomicBoolean allowAll = new AtomicBoolean(false);
+ static void setUp(TestCase test, Properties propertyFile) {
+ switch (test) {
+ case SECURE:
+ if (policy == null && System.getSecurityManager() != null) {
+ throw new IllegalStateException("SecurityManager already set");
+ } else if (policy == null) {
+ policy = new SimplePolicy(TestCase.SECURE, allowAll);
+ Policy.setPolicy(policy);
+ System.setSecurityManager(new SecurityManager());
+ }
+ if (System.getSecurityManager() == null) {
+ throw new IllegalStateException("No SecurityManager.");
+ }
+ if (policy == null) {
+ throw new IllegalStateException("policy not configured");
+ }
+ break;
+ case UNSECURE:
+ if (System.getSecurityManager() != null) {
+ throw new IllegalStateException("SecurityManager already set");
+ }
+ break;
+ default:
+ new InternalError("No such testcase: " + test);
+ }
+ doPrivileged(() -> {
+ try {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ propertyFile.store(bytes, propertyFile.getProperty("test.name"));
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes.toByteArray());
+ LogManager.getLogManager().readConfiguration(bais);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ });
+ }
+ static void doPrivileged(Runnable run) {
+ allowAll.set(true);
+ try {
+ run.run();
+ } finally {
+ allowAll.set(false);
+ }
+ }
+ }
+
+ @FunctionalInterface
+ public static interface FileHandlerSupplier {
+ public FileHandler test() throws Exception;
+ }
+
+ private static void checkException(Class extends Exception> type, FileHandlerSupplier test) {
+ Throwable t = null;
+ FileHandler f = null;
+ try {
+ f = test.test();
+ } catch (Throwable x) {
+ t = x;
+ }
+ try {
+ if (type != null && t == null) {
+ throw new RuntimeException("Expected " + type.getName() + " not thrown");
+ } else if (type != null && t != null) {
+ if (type.isInstance(t)) {
+ System.out.println("Recieved expected exception: " + t);
+ } else {
+ throw new RuntimeException("Exception type mismatch: "
+ + type.getName() + " expected, "
+ + t.getClass().getName() + " received.", t);
+ }
+ } else if (t != null) {
+ throw new RuntimeException("Unexpected exception received: " + t, t);
+ }
+ } finally {
+ if (f != null) {
+ // f should always be null when an exception is expected,
+ // but in case the test doesn't behave as expected we will
+ // want to close f.
+ try { f.close(); } catch (Throwable x) {};
+ }
+ }
+ }
+
+ public static void test(String name) throws Exception {
+ System.out.println("Testing: " + name);
+ checkException(RuntimeException.class, () -> new FileHandler());
+ checkException(IllegalArgumentException.class, () -> new FileHandler(""));
+ checkException(NullPointerException.class, () -> new FileHandler(null));
+
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", true));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", false));
+ checkException(NullPointerException.class, () -> new FileHandler(null, true));
+ checkException(NullPointerException.class, () -> new FileHandler(null, false));
+
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", 1, 1));
+ checkException(IllegalArgumentException.class, () -> new FileHandler(PREFIX, 0, 0));
+ checkException(IllegalArgumentException.class, () -> new FileHandler(PREFIX, -1, 1));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", 0, 0));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", -1, 1));
+
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", 1, 1, true));
+ checkException(IllegalArgumentException.class, () -> new FileHandler(PREFIX, 0, 0, true));
+ checkException(IllegalArgumentException.class, () -> new FileHandler(PREFIX, -1, 1, true));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", 0, 0, true));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", -1, 1, true));
+
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", 1, 1, false));
+ checkException(IllegalArgumentException.class, () -> new FileHandler(PREFIX, 0, 0, false));
+ checkException(IllegalArgumentException.class, () -> new FileHandler(PREFIX, -1, 1, false));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", 0, 0, false));
+ checkException(IllegalArgumentException.class, () -> new FileHandler("", -1, 1, false));
+
+ final Class extends Exception> expectedException =
+ System.getSecurityManager() != null ? AccessControlException.class : null;
+
+ if (userDirWritable || expectedException != null) {
+ // These calls will create files in user.dir in the UNSECURE case.
+ // The file name contain a random UUID (PREFIX) which identifies them
+ // and allow us to remove them cleanly at the end (see finally block
+ // in main()).
+ checkException(expectedException,
+ () -> new FileHandler(PREFIX, 0, 1, true));
+ checkException(expectedException,
+ () -> new FileHandler(PREFIX, 1, 2, true));
+ checkException(expectedException,
+ () -> new FileHandler(PREFIX, 0, 1, false));
+ checkException(expectedException,
+ () -> new FileHandler(PREFIX, 1, 2, false));
+ }
+ }
+
+
+ final static class PermissionsBuilder {
+ final Permissions perms;
+ public PermissionsBuilder() {
+ this(new Permissions());
+ }
+ public PermissionsBuilder(Permissions perms) {
+ this.perms = perms;
+ }
+ public PermissionsBuilder add(Permission p) {
+ perms.add(p);
+ return this;
+ }
+ public PermissionsBuilder addAll(PermissionCollection col) {
+ if (col != null) {
+ for (Enumeration e = col.elements(); e.hasMoreElements(); ) {
+ perms.add(e.nextElement());
+ }
+ }
+ return this;
+ }
+ public Permissions toPermissions() {
+ final PermissionsBuilder builder = new PermissionsBuilder();
+ builder.addAll(perms);
+ return builder.perms;
+ }
+ }
+
+ public static class SimplePolicy extends Policy {
+
+ final Permissions permissions;
+ final Permissions allPermissions;
+ final AtomicBoolean allowAll;
+ public SimplePolicy(TestCase test, AtomicBoolean allowAll) {
+ this.allowAll = allowAll;
+ // we don't actually need any permission to create our
+ // FileHandlers because we're passing invalid parameters
+ // which will make the creation fail...
+ permissions = new Permissions();
+
+ // these are used for configuring the test itself...
+ allPermissions = new Permissions();
+ allPermissions.add(new java.security.AllPermission());
+
+ }
+
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ if (allowAll.get()) return allPermissions.implies(permission);
+ return permissions.implies(permission);
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return new PermissionsBuilder().addAll(allowAll.get()
+ ? allPermissions : permissions).toPermissions();
+ }
+
+ @Override
+ public PermissionCollection getPermissions(ProtectionDomain domain) {
+ return new PermissionsBuilder().addAll(allowAll.get()
+ ? allPermissions : permissions).toPermissions();
+ }
+ }
+
+}
diff --git a/jdk/test/java/util/logging/TestConfigurationListeners.java b/jdk/test/java/util/logging/TestConfigurationListeners.java
new file mode 100644
index 00000000000..375019e8656
--- /dev/null
+++ b/jdk/test/java/util/logging/TestConfigurationListeners.java
@@ -0,0 +1,489 @@
+/*
+ * 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 java.io.ByteArrayInputStream;
+import java.io.FilePermission;
+import java.io.IOException;
+import java.security.AccessControlException;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.ConcurrentModificationException;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.PropertyPermission;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.LogManager;
+import java.util.logging.LoggingPermission;
+
+/**
+ * @test
+ * @bug 8043306
+ * @summary tests LogManager.addConfigurationListener and
+ * LogManager.removeConfigurationListener;
+ * @build TestConfigurationListeners
+ * @run main/othervm TestConfigurationListeners UNSECURE
+ * @run main/othervm TestConfigurationListeners PERMISSION
+ * @run main/othervm TestConfigurationListeners SECURE
+ * @author danielfuchs
+ */
+public class TestConfigurationListeners {
+
+ /**
+ * We will test add and remove ConfigurationListeners in 3 configurations.
+ * UNSECURE: No security manager.
+ * SECURE: With the security manager present - and the required
+ * LoggingPermission("control") granted.
+ * PERMISSION: With the security manager present - and the required
+ * LoggingPermission("control") *not* granted. Here we will
+ * test that the expected security permission is thrown.
+ */
+ public static enum TestCase {
+ UNSECURE, SECURE, PERMISSION;
+ public void run(String name) throws Exception {
+ System.out.println("Running test case: " + name());
+ switch (this) {
+ case UNSECURE:
+ testUnsecure(name);
+ break;
+ case SECURE:
+ testSecure(name);
+ break;
+ case PERMISSION:
+ testPermission(name);
+ break;
+ default:
+ throw new Error("Unknown test case: "+this);
+ }
+ }
+ public String loggerName(String name) {
+ return name;
+ }
+ }
+
+ public static void main(String... args) throws Exception {
+
+
+ if (args == null || args.length == 0) {
+ args = new String[] {
+ TestCase.UNSECURE.name(),
+ TestCase.SECURE.name(),
+ };
+ }
+
+ for (String testName : args) {
+ TestCase test = TestCase.valueOf(testName);
+ test.run(test.loggerName("foo.bar"));
+ }
+ }
+
+ /**
+ * Test without security manager.
+ * @param loggerName The logger to use.
+ * @throws Exception if the test fails.
+ */
+ public static void testUnsecure(String loggerName) throws Exception {
+ if (System.getSecurityManager() != null) {
+ throw new Error("Security manager is set");
+ }
+ test(loggerName);
+ }
+
+ /**
+ * Test with security manager.
+ * @param loggerName The logger to use.
+ * @throws Exception if the test fails.
+ */
+ public static void testSecure(String loggerName) throws Exception {
+ if (System.getSecurityManager() != null) {
+ throw new Error("Security manager is already set");
+ }
+ Policy.setPolicy(new SimplePolicy(TestCase.SECURE));
+ System.setSecurityManager(new SecurityManager());
+ test(loggerName);
+ }
+
+ /**
+ * Test the LoggingPermission("control") is required.
+ * @param loggerName The logger to use.
+ */
+ public static void testPermission(String loggerName) {
+ TestConfigurationListener run = new TestConfigurationListener(
+ TestCase.PERMISSION.toString());
+ if (System.getSecurityManager() != null) {
+ throw new Error("Security manager is already set");
+ }
+ Policy.setPolicy(new SimplePolicy(TestCase.PERMISSION));
+ System.setSecurityManager(new SecurityManager());
+
+ try {
+ LogManager.getLogManager().addConfigurationListener(run);
+ throw new RuntimeException("addConfigurationListener: Permission not checked!");
+ } catch (AccessControlException x) {
+ boolean ok = false;
+ if (x.getPermission() instanceof LoggingPermission) {
+ if ("control".equals(x.getPermission().getName())) {
+ System.out.println("addConfigurationListener: Got expected exception: " + x);
+ ok = true;
+ }
+ }
+ if (!ok) {
+ throw new RuntimeException("addConfigurationListener: Unexpected exception: "+x, x);
+ }
+ }
+
+ try {
+ LogManager.getLogManager().removeConfigurationListener(run);
+ throw new RuntimeException("removeConfigurationListener: Permission not checked!");
+ } catch (AccessControlException x) {
+ boolean ok = false;
+ if (x.getPermission() instanceof LoggingPermission) {
+ if ("control".equals(x.getPermission().getName())) {
+ System.out.println("removeConfigurationListener: Got expected exception: " + x);
+ ok = true;
+ }
+ }
+ if (!ok) {
+ throw new RuntimeException("removeConfigurationListener: Unexpected exception: "+x, x);
+ }
+ }
+ try {
+ LogManager.getLogManager().addConfigurationListener(null);
+ throw new RuntimeException(
+ "addConfigurationListener(null): Expected NPE not thrown.");
+ } catch (NullPointerException npe) {
+ System.out.println("Got expected NPE: "+npe);
+ }
+
+ try {
+ LogManager.getLogManager().removeConfigurationListener(null);
+ throw new RuntimeException(
+ "removeConfigurationListener(null): Expected NPE not thrown.");
+ } catch (NullPointerException npe) {
+ System.out.println("Got expected NPE: "+npe);
+ }
+
+
+ }
+
+
+ static class TestConfigurationListener implements Runnable {
+ final AtomicLong count = new AtomicLong(0);
+ final String name;
+ TestConfigurationListener(String name) {
+ this.name = name;
+ }
+ @Override
+ public void run() {
+ final long times = count.incrementAndGet();
+ System.out.println("Configured \"" + name + "\": " + times);
+ }
+ }
+
+ static class ConfigurationListenerException extends RuntimeException {
+ public ConfigurationListenerException(String msg) {
+ super(msg);
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + ": " + getMessage();
+ }
+ }
+ static class ConfigurationListenerError extends Error {
+ public ConfigurationListenerError(String msg) {
+ super(msg);
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + ": " + getMessage();
+ }
+ }
+
+ static class ThrowingConfigurationListener extends TestConfigurationListener {
+
+ final boolean error;
+ public ThrowingConfigurationListener(String name, boolean error) {
+ super(name);
+ this.error = error;
+ }
+
+ @Override
+ public void run() {
+ if (error)
+ throw new ConfigurationListenerError(name);
+ else
+ throw new ConfigurationListenerException(name);
+ }
+
+ @Override
+ public String toString() {
+ final Class extends Throwable> type =
+ error ? ConfigurationListenerError.class
+ : ConfigurationListenerException.class;
+ return type.getName()+ ": " + name;
+ }
+
+ }
+
+ private static void expect(TestConfigurationListener listener, long value) {
+ final long got = listener.count.longValue();
+ if (got != value) {
+ throw new RuntimeException(listener.name + " expected " + value +", got " + got);
+ }
+
+ }
+
+ public interface ThrowingConsumer {
+ public void accept(T t) throws I;
+ }
+
+ public static class ReadConfiguration implements ThrowingConsumer {
+
+ @Override
+ public void accept(LogManager t) throws IOException {
+ t.readConfiguration();
+ }
+
+ }
+
+ public static void test(String loggerName) throws Exception {
+ System.out.println("Starting test for " + loggerName);
+ test("m.readConfiguration()", (m) -> m.readConfiguration());
+ test("m.readConfiguration(new ByteArrayInputStream(new byte[0]))",
+ (m) -> m.readConfiguration(new ByteArrayInputStream(new byte[0])));
+ System.out.println("Test passed for " + loggerName);
+ }
+
+ public static void test(String testName,
+ ThrowingConsumer readConfiguration) throws Exception {
+
+
+ System.out.println("\nBEGIN " + testName);
+ LogManager m = LogManager.getLogManager();
+
+ final TestConfigurationListener l1 = new TestConfigurationListener("l#1");
+ final TestConfigurationListener l2 = new TestConfigurationListener("l#2");
+ final TestConfigurationListener l3 = new ThrowingConfigurationListener("l#3", false);
+ final TestConfigurationListener l4 = new ThrowingConfigurationListener("l#4", true);
+ final TestConfigurationListener l5 = new ThrowingConfigurationListener("l#5", false);
+
+ final Set expectedExceptions =
+ Collections.unmodifiableSet(
+ new HashSet<>(Arrays.asList(
+ l3.toString(), l4.toString(), l5.toString())));
+
+ m.addConfigurationListener(l1);
+ m.addConfigurationListener(l2);
+ expect(l1, 0);
+ expect(l2, 0);
+
+ readConfiguration.accept(m);
+ expect(l1, 1);
+ expect(l2, 1);
+ m.addConfigurationListener(l1);
+ expect(l1, 1);
+ expect(l2, 1);
+ readConfiguration.accept(m);
+ expect(l1, 2);
+ expect(l2, 2);
+ m.removeConfigurationListener(l1);
+ expect(l1, 2);
+ expect(l2, 2);
+ readConfiguration.accept(m);
+ expect(l1, 2);
+ expect(l2, 3);
+ m.removeConfigurationListener(l1);
+ expect(l1, 2);
+ expect(l2, 3);
+ readConfiguration.accept(m);
+ expect(l1, 2);
+ expect(l2, 4);
+ m.removeConfigurationListener(l2);
+ expect(l1, 2);
+ expect(l2, 4);
+ readConfiguration.accept(m);
+ expect(l1, 2);
+ expect(l2, 4);
+
+ // l1 and l2 should no longer be present: this should not fail...
+ m.removeConfigurationListener(l1);
+ m.removeConfigurationListener(l1);
+ m.removeConfigurationListener(l2);
+ m.removeConfigurationListener(l2);
+ expect(l1, 2);
+ expect(l2, 4);
+
+ readConfiguration.accept(m);
+ expect(l1, 2);
+ expect(l2, 4);
+
+ // add back l1 and l2
+ m.addConfigurationListener(l1);
+ m.addConfigurationListener(l2);
+ expect(l1, 2);
+ expect(l2, 4);
+
+ readConfiguration.accept(m);
+ expect(l1, 3);
+ expect(l2, 5);
+
+ m.removeConfigurationListener(l1);
+ m.removeConfigurationListener(l2);
+ expect(l1, 3);
+ expect(l2, 5);
+
+ readConfiguration.accept(m);
+ expect(l1, 3);
+ expect(l2, 5);
+
+ // Check the behavior when listeners throw exceptions
+ // l3, l4, and l5 will throw an error/exception.
+ // The first that is raised will be propagated, after all listeners
+ // have been invoked. The other exceptions will be added to the
+ // suppressed list.
+ //
+ // We will check that all listeners have been invoked and that we
+ // have the set of 3 exceptions expected from l3, l4, l5.
+ //
+ m.addConfigurationListener(l4);
+ m.addConfigurationListener(l1);
+ m.addConfigurationListener(l2);
+ m.addConfigurationListener(l3);
+ m.addConfigurationListener(l5);
+
+ try {
+ readConfiguration.accept(m);
+ throw new RuntimeException("Excpected exception/error not raised");
+ } catch(ConfigurationListenerException | ConfigurationListenerError t) {
+ final Set received = new HashSet<>();
+ received.add(t.toString());
+ for (Throwable s : t.getSuppressed()) {
+ received.add(s.toString());
+ }
+ System.out.println("Received exceptions: " + received);
+ if (!expectedExceptions.equals(received)) {
+ throw new RuntimeException(
+ "List of received exceptions differs from expected:"
+ + "\n\texpected: " + expectedExceptions
+ + "\n\treceived: " + received);
+ }
+ }
+ expect(l1, 4);
+ expect(l2, 6);
+
+ m.removeConfigurationListener(l1);
+ m.removeConfigurationListener(l2);
+ m.removeConfigurationListener(l3);
+ m.removeConfigurationListener(l4);
+ m.removeConfigurationListener(l5);
+ readConfiguration.accept(m);
+ expect(l1, 4);
+ expect(l2, 6);
+
+
+ try {
+ m.addConfigurationListener(null);
+ throw new RuntimeException(
+ "addConfigurationListener(null): Expected NPE not thrown.");
+ } catch (NullPointerException npe) {
+ System.out.println("Got expected NPE: "+npe);
+ }
+
+ try {
+ m.removeConfigurationListener(null);
+ throw new RuntimeException(
+ "removeConfigurationListener(null): Expected NPE not thrown.");
+ } catch (NullPointerException npe) {
+ System.out.println("Got expected NPE: "+npe);
+ }
+
+ System.out.println("END " + testName+"\n");
+
+ }
+
+
+ final static class PermissionsBuilder {
+ final Permissions perms;
+ public PermissionsBuilder() {
+ this(new Permissions());
+ }
+ public PermissionsBuilder(Permissions perms) {
+ this.perms = perms;
+ }
+ public PermissionsBuilder add(Permission p) {
+ perms.add(p);
+ return this;
+ }
+ public PermissionsBuilder addAll(PermissionCollection col) {
+ if (col != null) {
+ for (Enumeration e = col.elements(); e.hasMoreElements(); ) {
+ perms.add(e.nextElement());
+ }
+ }
+ return this;
+ }
+ public Permissions toPermissions() {
+ final PermissionsBuilder builder = new PermissionsBuilder();
+ builder.addAll(perms);
+ return builder.perms;
+ }
+ }
+
+ public static class SimplePolicy extends Policy {
+
+ final Permissions permissions;
+ public SimplePolicy(TestCase test) {
+ permissions = new Permissions();
+ if (test != TestCase.PERMISSION) {
+ permissions.add(new LoggingPermission("control", null));
+ permissions.add(new PropertyPermission("java.util.logging.config.class", "read"));
+ permissions.add(new PropertyPermission("java.util.logging.config.file", "read"));
+ permissions.add(new PropertyPermission("java.home", "read"));
+ permissions.add(new FilePermission("<>", "read"));
+ }
+ }
+
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ return permissions.implies(permission);
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return new PermissionsBuilder().addAll(permissions).toPermissions();
+ }
+
+ @Override
+ public PermissionCollection getPermissions(ProtectionDomain domain) {
+ return new PermissionsBuilder().addAll(permissions).toPermissions();
+ }
+ }
+
+}
diff --git a/jdk/test/sun/security/tools/keytool/autotest.sh b/jdk/test/sun/security/tools/keytool/autotest.sh
index 8154af5939b..73e8761d0a9 100644
--- a/jdk/test/sun/security/tools/keytool/autotest.sh
+++ b/jdk/test/sun/security/tools/keytool/autotest.sh
@@ -84,6 +84,11 @@ case "$OS" in
"/usr/lib/nss/libsoftokn3.so"`
fi
;;
+ Darwin )
+ LIBNAME=`find_one \
+ "/Applications/Firefox.app/Contents/MacOS/libsoftokn3.dylib" \
+ "/Applications/Thunderbird.app//Contents/MacOS/libsoftokn3.dylib"`
+ ;;
* )
echo "Will not run test on: ${OS}"
exit 0;
@@ -95,6 +100,12 @@ if [ "$LIBNAME" = "" ]; then
exit 0
fi
+echo "Using NSS lib at $LIBNAME"
+
+if [ $OS = Darwin ]; then
+ export DYLD_LIBRARY_PATH=`dirname $LIBNAME`
+fi
+
${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d . -XDignore.symbol.file \
${TESTSRC}${FS}KeyToolTest.java || exit 10
diff --git a/jdk/test/sun/text/resources/LocaleData b/jdk/test/sun/text/resources/LocaleData
index 635416d9189..205932144d3 100644
--- a/jdk/test/sun/text/resources/LocaleData
+++ b/jdk/test/sun/text/resources/LocaleData
@@ -2502,7 +2502,7 @@ CalendarData/lt_LT/minimalDaysInFirstWeek=4
CalendarData/pl_PL/minimalDaysInFirstWeek=4
CalendarData/pt_PT/minimalDaysInFirstWeek=4
-#bug 4945388
+#bug 4945388
CurrencyNames/be_BY/BYR=\u0420\u0443\u0431
CurrencyNames/bg_BG/BGN=\u043B\u0432.
@@ -5419,7 +5419,7 @@ FormatData/en_SG/DatePatterns/1=MMMM d, yyyy
FormatData/en_SG/DatePatterns/2=MMM d, yyyy
FormatData/en_SG/DatePatterns/3=M/d/yy
FormatData/en_SG/DateTimePatterns/0={1} {0}
-# Use approved data
+# Use approved data
FormatData/ms/Eras/0=BCE
FormatData/ms/Eras/1=CE
FormatData/sr_BA/MonthNames/5=\u0458\u0443\u043d\u0438
@@ -5568,7 +5568,7 @@ TimeZoneNames/de/WET/4=WESZ
FormatData/fi/AmPmMarkers/0=ap.
FormatData/fi/AmPmMarkers/1=ip.
-# bug 6507067
+# bug 6507067
TimeZoneNames/zh_TW/Asia\/Taipei/1=\u53f0\u7063\u6a19\u6e96\u6642\u9593
TimeZoneNames/zh_TW/Asia\/Taipei/2=TST
@@ -7699,3 +7699,577 @@ FormatData/es_DO/DatePatterns/3=dd/MM/yy
# bug 8055222
CurrencyNames/lt_LT/EUR=\u20AC
+
+# bug 8042126 + missing MonthNarrows data
+FormatData//MonthNarrows/0=1
+FormatData//MonthNarrows/1=2
+FormatData//MonthNarrows/2=3
+FormatData//MonthNarrows/3=4
+FormatData//MonthNarrows/4=5
+FormatData//MonthNarrows/5=6
+FormatData//MonthNarrows/6=7
+FormatData//MonthNarrows/7=8
+FormatData//MonthNarrows/8=9
+FormatData//MonthNarrows/9=10
+FormatData//MonthNarrows/10=11
+FormatData//MonthNarrows/11=12
+FormatData//MonthNarrows/12=
+FormatData/bg/MonthNarrows/0=\u044f
+FormatData/bg/MonthNarrows/1=\u0444
+FormatData/bg/MonthNarrows/2=\u043c
+FormatData/bg/MonthNarrows/3=\u0430
+FormatData/bg/MonthNarrows/4=\u043c
+FormatData/bg/MonthNarrows/5=\u044e
+FormatData/bg/MonthNarrows/6=\u044e
+FormatData/bg/MonthNarrows/7=\u0430
+FormatData/bg/MonthNarrows/8=\u0441
+FormatData/bg/MonthNarrows/9=\u043e
+FormatData/bg/MonthNarrows/10=\u043d
+FormatData/bg/MonthNarrows/11=\u0434
+FormatData/bg/MonthNarrows/12=
+FormatData/zh_TW/MonthNarrows/0=1
+FormatData/zh_TW/MonthNarrows/1=2
+FormatData/zh_TW/MonthNarrows/2=3
+FormatData/zh_TW/MonthNarrows/3=4
+FormatData/zh_TW/MonthNarrows/4=5
+FormatData/zh_TW/MonthNarrows/5=6
+FormatData/zh_TW/MonthNarrows/6=7
+FormatData/zh_TW/MonthNarrows/7=8
+FormatData/zh_TW/MonthNarrows/8=9
+FormatData/zh_TW/MonthNarrows/9=10
+FormatData/zh_TW/MonthNarrows/10=11
+FormatData/zh_TW/MonthNarrows/11=12
+FormatData/zh_TW/MonthNarrows/12=
+FormatData/it/MonthNarrows/0=G
+FormatData/it/MonthNarrows/1=F
+FormatData/it/MonthNarrows/2=M
+FormatData/it/MonthNarrows/3=A
+FormatData/it/MonthNarrows/4=M
+FormatData/it/MonthNarrows/5=G
+FormatData/it/MonthNarrows/6=L
+FormatData/it/MonthNarrows/7=A
+FormatData/it/MonthNarrows/8=S
+FormatData/it/MonthNarrows/9=O
+FormatData/it/MonthNarrows/10=N
+FormatData/it/MonthNarrows/11=D
+FormatData/it/MonthNarrows/12=
+FormatData/ko/MonthNarrows/0=1\uc6d4
+FormatData/ko/MonthNarrows/1=2\uc6d4
+FormatData/ko/MonthNarrows/2=3\uc6d4
+FormatData/ko/MonthNarrows/3=4\uc6d4
+FormatData/ko/MonthNarrows/4=5\uc6d4
+FormatData/ko/MonthNarrows/5=6\uc6d4
+FormatData/ko/MonthNarrows/6=7\uc6d4
+FormatData/ko/MonthNarrows/7=8\uc6d4
+FormatData/ko/MonthNarrows/8=9\uc6d4
+FormatData/ko/MonthNarrows/9=10\uc6d4
+FormatData/ko/MonthNarrows/10=11\uc6d4
+FormatData/ko/MonthNarrows/11=12\uc6d4
+FormatData/ko/MonthNarrows/12=
+FormatData/uk/MonthNarrows/0=\u0421
+FormatData/uk/MonthNarrows/1=\u041b
+FormatData/uk/MonthNarrows/2=\u0411
+FormatData/uk/MonthNarrows/3=\u041a
+FormatData/uk/MonthNarrows/4=\u0422
+FormatData/uk/MonthNarrows/5=\u0427
+FormatData/uk/MonthNarrows/6=\u041b
+FormatData/uk/MonthNarrows/7=\u0421
+FormatData/uk/MonthNarrows/8=\u0412
+FormatData/uk/MonthNarrows/9=\u0416
+FormatData/uk/MonthNarrows/10=\u041b
+FormatData/uk/MonthNarrows/11=\u0413
+FormatData/uk/MonthNarrows/12=
+FormatData/lv/MonthNarrows/0=J
+FormatData/lv/MonthNarrows/1=F
+FormatData/lv/MonthNarrows/2=M
+FormatData/lv/MonthNarrows/3=A
+FormatData/lv/MonthNarrows/4=M
+FormatData/lv/MonthNarrows/5=J
+FormatData/lv/MonthNarrows/6=J
+FormatData/lv/MonthNarrows/7=A
+FormatData/lv/MonthNarrows/8=S
+FormatData/lv/MonthNarrows/9=O
+FormatData/lv/MonthNarrows/10=N
+FormatData/lv/MonthNarrows/11=D
+FormatData/lv/MonthNarrows/12=
+FormatData/pt/MonthNarrows/0=J
+FormatData/pt/MonthNarrows/1=F
+FormatData/pt/MonthNarrows/2=M
+FormatData/pt/MonthNarrows/3=A
+FormatData/pt/MonthNarrows/4=M
+FormatData/pt/MonthNarrows/5=J
+FormatData/pt/MonthNarrows/6=J
+FormatData/pt/MonthNarrows/7=A
+FormatData/pt/MonthNarrows/8=S
+FormatData/pt/MonthNarrows/9=O
+FormatData/pt/MonthNarrows/10=N
+FormatData/pt/MonthNarrows/11=D
+FormatData/pt/MonthNarrows/12=
+FormatData/sk/MonthNarrows/0=j
+FormatData/sk/MonthNarrows/1=f
+FormatData/sk/MonthNarrows/2=m
+FormatData/sk/MonthNarrows/3=a
+FormatData/sk/MonthNarrows/4=m
+FormatData/sk/MonthNarrows/5=j
+FormatData/sk/MonthNarrows/6=j
+FormatData/sk/MonthNarrows/7=a
+FormatData/sk/MonthNarrows/8=s
+FormatData/sk/MonthNarrows/9=o
+FormatData/sk/MonthNarrows/10=n
+FormatData/sk/MonthNarrows/11=d
+FormatData/sk/MonthNarrows/12=
+FormatData/hi_IN/MonthNarrows/0=\u091c
+FormatData/hi_IN/MonthNarrows/1=\u092b\u093c
+FormatData/hi_IN/MonthNarrows/2=\u092e\u093e
+FormatData/hi_IN/MonthNarrows/3=\u0905
+FormatData/hi_IN/MonthNarrows/4=\u092e
+FormatData/hi_IN/MonthNarrows/5=\u091c\u0942
+FormatData/hi_IN/MonthNarrows/6=\u091c\u0941
+FormatData/hi_IN/MonthNarrows/7=\u0905
+FormatData/hi_IN/MonthNarrows/8=\u0938\u093f
+FormatData/hi_IN/MonthNarrows/9=\u0905
+FormatData/hi_IN/MonthNarrows/10=\u0928
+FormatData/hi_IN/MonthNarrows/11=\u0926\u093f
+FormatData/hi_IN/MonthNarrows/12=
+FormatData/ga/MonthNarrows/0=E
+FormatData/ga/MonthNarrows/1=F
+FormatData/ga/MonthNarrows/2=M
+FormatData/ga/MonthNarrows/3=A
+FormatData/ga/MonthNarrows/4=B
+FormatData/ga/MonthNarrows/5=M
+FormatData/ga/MonthNarrows/6=I
+FormatData/ga/MonthNarrows/7=L
+FormatData/ga/MonthNarrows/8=M
+FormatData/ga/MonthNarrows/9=D
+FormatData/ga/MonthNarrows/10=S
+FormatData/ga/MonthNarrows/11=N
+FormatData/ga/MonthNarrows/12=
+FormatData/et/MonthNarrows/0=J
+FormatData/et/MonthNarrows/1=V
+FormatData/et/MonthNarrows/2=M
+FormatData/et/MonthNarrows/3=A
+FormatData/et/MonthNarrows/4=M
+FormatData/et/MonthNarrows/5=J
+FormatData/et/MonthNarrows/6=J
+FormatData/et/MonthNarrows/7=A
+FormatData/et/MonthNarrows/8=S
+FormatData/et/MonthNarrows/9=O
+FormatData/et/MonthNarrows/10=N
+FormatData/et/MonthNarrows/11=D
+FormatData/et/MonthNarrows/12=
+FormatData/sv/MonthNarrows/0=J
+FormatData/sv/MonthNarrows/1=F
+FormatData/sv/MonthNarrows/2=M
+FormatData/sv/MonthNarrows/3=A
+FormatData/sv/MonthNarrows/4=M
+FormatData/sv/MonthNarrows/5=J
+FormatData/sv/MonthNarrows/6=J
+FormatData/sv/MonthNarrows/7=A
+FormatData/sv/MonthNarrows/8=S
+FormatData/sv/MonthNarrows/9=O
+FormatData/sv/MonthNarrows/10=N
+FormatData/sv/MonthNarrows/11=D
+FormatData/sv/MonthNarrows/12=
+FormatData/cs/MonthNarrows/0=l
+FormatData/cs/MonthNarrows/1=\u00fa
+FormatData/cs/MonthNarrows/2=b
+FormatData/cs/MonthNarrows/3=d
+FormatData/cs/MonthNarrows/4=k
+FormatData/cs/MonthNarrows/5=\u010d
+FormatData/cs/MonthNarrows/6=\u010d
+FormatData/cs/MonthNarrows/7=s
+FormatData/cs/MonthNarrows/8=z
+FormatData/cs/MonthNarrows/9=\u0159
+FormatData/cs/MonthNarrows/10=l
+FormatData/cs/MonthNarrows/11=p
+FormatData/cs/MonthNarrows/12=
+FormatData/el/MonthNarrows/0=\u0399
+FormatData/el/MonthNarrows/1=\u03a6
+FormatData/el/MonthNarrows/2=\u039c
+FormatData/el/MonthNarrows/3=\u0391
+FormatData/el/MonthNarrows/4=\u039c
+FormatData/el/MonthNarrows/5=\u0399
+FormatData/el/MonthNarrows/6=\u0399
+FormatData/el/MonthNarrows/7=\u0391
+FormatData/el/MonthNarrows/8=\u03a3
+FormatData/el/MonthNarrows/9=\u039f
+FormatData/el/MonthNarrows/10=\u039d
+FormatData/el/MonthNarrows/11=\u0394
+FormatData/el/MonthNarrows/12=
+FormatData/hu/MonthNarrows/0=J
+FormatData/hu/MonthNarrows/1=F
+FormatData/hu/MonthNarrows/2=M
+FormatData/hu/MonthNarrows/3=\u00c1
+FormatData/hu/MonthNarrows/4=M
+FormatData/hu/MonthNarrows/5=J
+FormatData/hu/MonthNarrows/6=J
+FormatData/hu/MonthNarrows/7=A
+FormatData/hu/MonthNarrows/8=Sz
+FormatData/hu/MonthNarrows/9=O
+FormatData/hu/MonthNarrows/10=N
+FormatData/hu/MonthNarrows/11=D
+FormatData/hu/MonthNarrows/12=
+FormatData/es/MonthNarrows/0=E
+FormatData/es/MonthNarrows/1=F
+FormatData/es/MonthNarrows/2=M
+FormatData/es/MonthNarrows/3=A
+FormatData/es/MonthNarrows/4=M
+FormatData/es/MonthNarrows/5=J
+FormatData/es/MonthNarrows/6=J
+FormatData/es/MonthNarrows/7=A
+FormatData/es/MonthNarrows/8=S
+FormatData/es/MonthNarrows/9=O
+FormatData/es/MonthNarrows/10=N
+FormatData/es/MonthNarrows/11=D
+FormatData/es/MonthNarrows/12=
+FormatData/tr/MonthNarrows/0=O
+FormatData/tr/MonthNarrows/1=\u015e
+FormatData/tr/MonthNarrows/2=M
+FormatData/tr/MonthNarrows/3=N
+FormatData/tr/MonthNarrows/4=M
+FormatData/tr/MonthNarrows/5=H
+FormatData/tr/MonthNarrows/6=T
+FormatData/tr/MonthNarrows/7=A
+FormatData/tr/MonthNarrows/8=E
+FormatData/tr/MonthNarrows/9=E
+FormatData/tr/MonthNarrows/10=K
+FormatData/tr/MonthNarrows/11=A
+FormatData/tr/MonthNarrows/12=
+FormatData/hr/MonthNarrows/0=1.
+FormatData/hr/MonthNarrows/1=2.
+FormatData/hr/MonthNarrows/2=3.
+FormatData/hr/MonthNarrows/3=4.
+FormatData/hr/MonthNarrows/4=5.
+FormatData/hr/MonthNarrows/5=6.
+FormatData/hr/MonthNarrows/6=7.
+FormatData/hr/MonthNarrows/7=8.
+FormatData/hr/MonthNarrows/8=9.
+FormatData/hr/MonthNarrows/9=10.
+FormatData/hr/MonthNarrows/10=11.
+FormatData/hr/MonthNarrows/11=12.
+FormatData/hr/MonthNarrows/12=
+FormatData/lt/MonthNarrows/0=S
+FormatData/lt/MonthNarrows/1=V
+FormatData/lt/MonthNarrows/2=K
+FormatData/lt/MonthNarrows/3=B
+FormatData/lt/MonthNarrows/4=G
+FormatData/lt/MonthNarrows/5=B
+FormatData/lt/MonthNarrows/6=L
+FormatData/lt/MonthNarrows/7=R
+FormatData/lt/MonthNarrows/8=R
+FormatData/lt/MonthNarrows/9=S
+FormatData/lt/MonthNarrows/10=L
+FormatData/lt/MonthNarrows/11=G
+FormatData/lt/MonthNarrows/12=
+FormatData/sq/MonthNarrows/0=J
+FormatData/sq/MonthNarrows/1=S
+FormatData/sq/MonthNarrows/2=M
+FormatData/sq/MonthNarrows/3=P
+FormatData/sq/MonthNarrows/4=M
+FormatData/sq/MonthNarrows/5=Q
+FormatData/sq/MonthNarrows/6=K
+FormatData/sq/MonthNarrows/7=G
+FormatData/sq/MonthNarrows/8=S
+FormatData/sq/MonthNarrows/9=T
+FormatData/sq/MonthNarrows/10=N
+FormatData/sq/MonthNarrows/11=D
+FormatData/sq/MonthNarrows/12=
+FormatData/fr/MonthNarrows/0=J
+FormatData/fr/MonthNarrows/1=F
+FormatData/fr/MonthNarrows/2=M
+FormatData/fr/MonthNarrows/3=A
+FormatData/fr/MonthNarrows/4=M
+FormatData/fr/MonthNarrows/5=J
+FormatData/fr/MonthNarrows/6=J
+FormatData/fr/MonthNarrows/7=A
+FormatData/fr/MonthNarrows/8=S
+FormatData/fr/MonthNarrows/9=O
+FormatData/fr/MonthNarrows/10=N
+FormatData/fr/MonthNarrows/11=D
+FormatData/fr/MonthNarrows/12=
+FormatData/is/MonthNarrows/0=J
+FormatData/is/MonthNarrows/1=F
+FormatData/is/MonthNarrows/2=M
+FormatData/is/MonthNarrows/3=A
+FormatData/is/MonthNarrows/4=M
+FormatData/is/MonthNarrows/5=J
+FormatData/is/MonthNarrows/6=J
+FormatData/is/MonthNarrows/7=\u00c1
+FormatData/is/MonthNarrows/8=L
+FormatData/is/MonthNarrows/9=O
+FormatData/is/MonthNarrows/10=N
+FormatData/is/MonthNarrows/11=D
+FormatData/is/MonthNarrows/12=
+FormatData/de/MonthNarrows/0=J
+FormatData/de/MonthNarrows/1=F
+FormatData/de/MonthNarrows/2=M
+FormatData/de/MonthNarrows/3=A
+FormatData/de/MonthNarrows/4=M
+FormatData/de/MonthNarrows/5=J
+FormatData/de/MonthNarrows/6=J
+FormatData/de/MonthNarrows/7=A
+FormatData/de/MonthNarrows/8=S
+FormatData/de/MonthNarrows/9=O
+FormatData/de/MonthNarrows/10=N
+FormatData/de/MonthNarrows/11=D
+FormatData/de/MonthNarrows/12=
+FormatData/en/MonthNarrows/0=J
+FormatData/en/MonthNarrows/1=F
+FormatData/en/MonthNarrows/2=M
+FormatData/en/MonthNarrows/3=A
+FormatData/en/MonthNarrows/4=M
+FormatData/en/MonthNarrows/5=J
+FormatData/en/MonthNarrows/6=J
+FormatData/en/MonthNarrows/7=A
+FormatData/en/MonthNarrows/8=S
+FormatData/en/MonthNarrows/9=O
+FormatData/en/MonthNarrows/10=N
+FormatData/en/MonthNarrows/11=D
+FormatData/en/MonthNarrows/12=
+FormatData/ca/MonthNarrows/0=G
+FormatData/ca/MonthNarrows/1=F
+FormatData/ca/MonthNarrows/2=M
+FormatData/ca/MonthNarrows/3=A
+FormatData/ca/MonthNarrows/4=M
+FormatData/ca/MonthNarrows/5=J
+FormatData/ca/MonthNarrows/6=G
+FormatData/ca/MonthNarrows/7=A
+FormatData/ca/MonthNarrows/8=S
+FormatData/ca/MonthNarrows/9=O
+FormatData/ca/MonthNarrows/10=N
+FormatData/ca/MonthNarrows/11=D
+FormatData/ca/MonthNarrows/12=
+FormatData/sl/MonthNarrows/0=j
+FormatData/sl/MonthNarrows/1=f
+FormatData/sl/MonthNarrows/2=m
+FormatData/sl/MonthNarrows/3=a
+FormatData/sl/MonthNarrows/4=m
+FormatData/sl/MonthNarrows/5=j
+FormatData/sl/MonthNarrows/6=j
+FormatData/sl/MonthNarrows/7=a
+FormatData/sl/MonthNarrows/8=s
+FormatData/sl/MonthNarrows/9=o
+FormatData/sl/MonthNarrows/10=n
+FormatData/sl/MonthNarrows/11=d
+FormatData/sl/MonthNarrows/12=
+FormatData/fi/MonthNarrows/0=T
+FormatData/fi/MonthNarrows/1=H
+FormatData/fi/MonthNarrows/2=M
+FormatData/fi/MonthNarrows/3=H
+FormatData/fi/MonthNarrows/4=T
+FormatData/fi/MonthNarrows/5=K
+FormatData/fi/MonthNarrows/6=H
+FormatData/fi/MonthNarrows/7=E
+FormatData/fi/MonthNarrows/8=S
+FormatData/fi/MonthNarrows/9=L
+FormatData/fi/MonthNarrows/10=M
+FormatData/fi/MonthNarrows/11=J
+FormatData/fi/MonthNarrows/12=
+FormatData/mk/MonthNarrows/0=\u0458
+FormatData/mk/MonthNarrows/1=\u0444
+FormatData/mk/MonthNarrows/2=\u043c
+FormatData/mk/MonthNarrows/3=\u0430
+FormatData/mk/MonthNarrows/4=\u043c
+FormatData/mk/MonthNarrows/5=\u0458
+FormatData/mk/MonthNarrows/6=\u0458
+FormatData/mk/MonthNarrows/7=\u0430
+FormatData/mk/MonthNarrows/8=\u0441
+FormatData/mk/MonthNarrows/9=\u043e
+FormatData/mk/MonthNarrows/10=\u043d
+FormatData/mk/MonthNarrows/11=\u0434
+FormatData/mk/MonthNarrows/12=
+FormatData/sr-Latn/MonthNarrows/0=j
+FormatData/sr-Latn/MonthNarrows/1=f
+FormatData/sr-Latn/MonthNarrows/2=m
+FormatData/sr-Latn/MonthNarrows/3=a
+FormatData/sr-Latn/MonthNarrows/4=m
+FormatData/sr-Latn/MonthNarrows/5=j
+FormatData/sr-Latn/MonthNarrows/6=j
+FormatData/sr-Latn/MonthNarrows/7=a
+FormatData/sr-Latn/MonthNarrows/8=s
+FormatData/sr-Latn/MonthNarrows/9=o
+FormatData/sr-Latn/MonthNarrows/10=n
+FormatData/sr-Latn/MonthNarrows/11=d
+FormatData/sr-Latn/MonthNarrows/12=
+FormatData/th/MonthNarrows/0=\u0e21.\u0e04.
+FormatData/th/MonthNarrows/1=\u0e01.\u0e1e.
+FormatData/th/MonthNarrows/2=\u0e21\u0e35.\u0e04.
+FormatData/th/MonthNarrows/3=\u0e40\u0e21.\u0e22.
+FormatData/th/MonthNarrows/4=\u0e1e.\u0e04.
+FormatData/th/MonthNarrows/5=\u0e21\u0e34.\u0e22
+FormatData/th/MonthNarrows/6=\u0e01.\u0e04.
+FormatData/th/MonthNarrows/7=\u0e2a.\u0e04.
+FormatData/th/MonthNarrows/8=\u0e01.\u0e22.
+FormatData/th/MonthNarrows/9=\u0e15.\u0e04.
+FormatData/th/MonthNarrows/10=\u0e1e.\u0e22.
+FormatData/th/MonthNarrows/11=\u0e18.\u0e04.
+FormatData/th/MonthNarrows/12=
+FormatData/ar/MonthNarrows/0=\u064a
+FormatData/ar/MonthNarrows/1=\u0641
+FormatData/ar/MonthNarrows/2=\u0645
+FormatData/ar/MonthNarrows/3=\u0623
+FormatData/ar/MonthNarrows/4=\u0648
+FormatData/ar/MonthNarrows/5=\u0646
+FormatData/ar/MonthNarrows/6=\u0644
+FormatData/ar/MonthNarrows/7=\u063a
+FormatData/ar/MonthNarrows/8=\u0633
+FormatData/ar/MonthNarrows/9=\u0643
+FormatData/ar/MonthNarrows/10=\u0628
+FormatData/ar/MonthNarrows/11=\u062f
+FormatData/ar/MonthNarrows/12=
+FormatData/ru/MonthNarrows/0=\u042f
+FormatData/ru/MonthNarrows/1=\u0424
+FormatData/ru/MonthNarrows/2=\u041c
+FormatData/ru/MonthNarrows/3=\u0410
+FormatData/ru/MonthNarrows/4=\u041c
+FormatData/ru/MonthNarrows/5=\u0418
+FormatData/ru/MonthNarrows/6=\u0418
+FormatData/ru/MonthNarrows/7=\u0410
+FormatData/ru/MonthNarrows/8=\u0421
+FormatData/ru/MonthNarrows/9=\u041e
+FormatData/ru/MonthNarrows/10=\u041d
+FormatData/ru/MonthNarrows/11=\u0414
+FormatData/ru/MonthNarrows/12=
+FormatData/ms/MonthNarrows/0=J
+FormatData/ms/MonthNarrows/1=F
+FormatData/ms/MonthNarrows/2=M
+FormatData/ms/MonthNarrows/3=A
+FormatData/ms/MonthNarrows/4=M
+FormatData/ms/MonthNarrows/5=J
+FormatData/ms/MonthNarrows/6=J
+FormatData/ms/MonthNarrows/7=O
+FormatData/ms/MonthNarrows/8=S
+FormatData/ms/MonthNarrows/9=O
+FormatData/ms/MonthNarrows/10=N
+FormatData/ms/MonthNarrows/11=D
+FormatData/ms/MonthNarrows/12=
+FormatData/nl/MonthNarrows/0=J
+FormatData/nl/MonthNarrows/1=F
+FormatData/nl/MonthNarrows/2=M
+FormatData/nl/MonthNarrows/3=A
+FormatData/nl/MonthNarrows/4=M
+FormatData/nl/MonthNarrows/5=J
+FormatData/nl/MonthNarrows/6=J
+FormatData/nl/MonthNarrows/7=A
+FormatData/nl/MonthNarrows/8=S
+FormatData/nl/MonthNarrows/9=O
+FormatData/nl/MonthNarrows/10=N
+FormatData/nl/MonthNarrows/11=D
+FormatData/nl/MonthNarrows/12=
+FormatData/vi/MonthNarrows/0=1
+FormatData/vi/MonthNarrows/1=2
+FormatData/vi/MonthNarrows/2=3
+FormatData/vi/MonthNarrows/3=4
+FormatData/vi/MonthNarrows/4=5
+FormatData/vi/MonthNarrows/5=6
+FormatData/vi/MonthNarrows/6=7
+FormatData/vi/MonthNarrows/7=8
+FormatData/vi/MonthNarrows/8=9
+FormatData/vi/MonthNarrows/9=10
+FormatData/vi/MonthNarrows/10=11
+FormatData/vi/MonthNarrows/11=12
+FormatData/vi/MonthNarrows/12=
+FormatData/sr/MonthNarrows/0=\u0458
+FormatData/sr/MonthNarrows/1=\u0444
+FormatData/sr/MonthNarrows/2=\u043c
+FormatData/sr/MonthNarrows/3=\u0430
+FormatData/sr/MonthNarrows/4=\u043c
+FormatData/sr/MonthNarrows/5=\u0458
+FormatData/sr/MonthNarrows/6=\u0458
+FormatData/sr/MonthNarrows/7=\u0430
+FormatData/sr/MonthNarrows/8=\u0441
+FormatData/sr/MonthNarrows/9=\u043e
+FormatData/sr/MonthNarrows/10=\u043d
+FormatData/sr/MonthNarrows/11=\u0434
+FormatData/sr/MonthNarrows/12=
+FormatData/mt/MonthNarrows/0=J
+FormatData/mt/MonthNarrows/1=F
+FormatData/mt/MonthNarrows/2=M
+FormatData/mt/MonthNarrows/3=A
+FormatData/mt/MonthNarrows/4=M
+FormatData/mt/MonthNarrows/5=\u0120
+FormatData/mt/MonthNarrows/6=L
+FormatData/mt/MonthNarrows/7=A
+FormatData/mt/MonthNarrows/8=S
+FormatData/mt/MonthNarrows/9=O
+FormatData/mt/MonthNarrows/10=N
+FormatData/mt/MonthNarrows/11=D
+FormatData/mt/MonthNarrows/12=
+FormatData/da/MonthNarrows/0=J
+FormatData/da/MonthNarrows/1=F
+FormatData/da/MonthNarrows/2=M
+FormatData/da/MonthNarrows/3=A
+FormatData/da/MonthNarrows/4=M
+FormatData/da/MonthNarrows/5=J
+FormatData/da/MonthNarrows/6=J
+FormatData/da/MonthNarrows/7=A
+FormatData/da/MonthNarrows/8=S
+FormatData/da/MonthNarrows/9=O
+FormatData/da/MonthNarrows/10=N
+FormatData/da/MonthNarrows/11=D
+FormatData/da/MonthNarrows/12=
+FormatData/ro/MonthNarrows/0=I
+FormatData/ro/MonthNarrows/1=F
+FormatData/ro/MonthNarrows/2=M
+FormatData/ro/MonthNarrows/3=A
+FormatData/ro/MonthNarrows/4=M
+FormatData/ro/MonthNarrows/5=I
+FormatData/ro/MonthNarrows/6=I
+FormatData/ro/MonthNarrows/7=A
+FormatData/ro/MonthNarrows/8=S
+FormatData/ro/MonthNarrows/9=O
+FormatData/ro/MonthNarrows/10=N
+FormatData/ro/MonthNarrows/11=D
+FormatData/ro/MonthNarrows/12=
+FormatData/no/MonthNarrows/0=J
+FormatData/no/MonthNarrows/1=F
+FormatData/no/MonthNarrows/2=M
+FormatData/no/MonthNarrows/3=A
+FormatData/no/MonthNarrows/4=M
+FormatData/no/MonthNarrows/5=J
+FormatData/no/MonthNarrows/6=J
+FormatData/no/MonthNarrows/7=A
+FormatData/no/MonthNarrows/8=S
+FormatData/no/MonthNarrows/9=O
+FormatData/no/MonthNarrows/10=N
+FormatData/no/MonthNarrows/11=D
+FormatData/no/MonthNarrows/12=
+FormatData/pl/MonthNarrows/0=s
+FormatData/pl/MonthNarrows/1=l
+FormatData/pl/MonthNarrows/2=m
+FormatData/pl/MonthNarrows/3=k
+FormatData/pl/MonthNarrows/4=m
+FormatData/pl/MonthNarrows/5=c
+FormatData/pl/MonthNarrows/6=l
+FormatData/pl/MonthNarrows/7=s
+FormatData/pl/MonthNarrows/8=w
+FormatData/pl/MonthNarrows/9=p
+FormatData/pl/MonthNarrows/10=l
+FormatData/pl/MonthNarrows/11=g
+FormatData/pl/MonthNarrows/12=
+FormatData/iw/MonthNarrows/0=1
+FormatData/iw/MonthNarrows/1=2
+FormatData/iw/MonthNarrows/2=3
+FormatData/iw/MonthNarrows/3=4
+FormatData/iw/MonthNarrows/4=5
+FormatData/iw/MonthNarrows/5=6
+FormatData/iw/MonthNarrows/6=7
+FormatData/iw/MonthNarrows/7=8
+FormatData/iw/MonthNarrows/8=9
+FormatData/iw/MonthNarrows/9=10
+FormatData/iw/MonthNarrows/10=11
+FormatData/iw/MonthNarrows/11=12
+FormatData/iw/MonthNarrows/12=
+FormatData/zh/MonthNarrows/0=1
+FormatData/zh/MonthNarrows/1=2
+FormatData/zh/MonthNarrows/2=3
+FormatData/zh/MonthNarrows/3=4
+FormatData/zh/MonthNarrows/4=5
+FormatData/zh/MonthNarrows/5=6
+FormatData/zh/MonthNarrows/6=7
+FormatData/zh/MonthNarrows/7=8
+FormatData/zh/MonthNarrows/8=9
+FormatData/zh/MonthNarrows/9=10
+FormatData/zh/MonthNarrows/10=11
+FormatData/zh/MonthNarrows/11=12
+FormatData/zh/MonthNarrows/12=
diff --git a/jdk/test/sun/text/resources/LocaleDataTest.java b/jdk/test/sun/text/resources/LocaleDataTest.java
index 66039d08f40..abfdd97943d 100644
--- a/jdk/test/sun/text/resources/LocaleDataTest.java
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java
@@ -36,7 +36,7 @@
* 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495
* 7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509
* 7114053 7074882 7040556 8013836 8021121 6192407 6931564 8027695 8017142
- * 8037343 8055222
+ * 8037343 8055222 8042126
* @summary Verify locale data
*
*/