Merge
This commit is contained in:
commit
34616cd876
1
.hgtags
1
.hgtags
@ -312,3 +312,4 @@ ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66
|
||||
56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67
|
||||
5b500c93ce4822d47061cd518ff3f72d9d8cb5b5 jdk9-b68
|
||||
d69c968463f0ae5d0b45de3fc14fe65171b23948 jdk9-b69
|
||||
43d0179ee9de3bfffae3417f09e07eb6d8efc963 jdk9-b70
|
||||
|
@ -312,3 +312,4 @@ dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
|
||||
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
|
||||
70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
|
||||
1bcfd6b8726582cff5a42dbfc75903e36f9dd4fe jdk9-b69
|
||||
eed77fcd77711fcdba05f18fc22f37d86efb243c jdk9-b70
|
||||
|
@ -312,3 +312,4 @@ afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65
|
||||
4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67
|
||||
8efad64f40eb8cd4df376c0a5275892eeb396bbd jdk9-b68
|
||||
de8acedcb5b5870f1dc54cba575aaa5d33897ea2 jdk9-b69
|
||||
e7cf01990ed366bd493080663259281e91ce223b jdk9-b70
|
||||
|
@ -472,3 +472,4 @@ e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
|
||||
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
|
||||
11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
|
||||
ff0929a59ced0e144201aa05819ae2e47d6f2c61 jdk9-b69
|
||||
8672e9264db30c21504063932dbc374eabc287a1 jdk9-b70
|
||||
|
@ -312,3 +312,4 @@ d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66
|
||||
78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67
|
||||
82aae947938ec9b0119fdd78a616d0b7263072ee jdk9-b68
|
||||
f844a908d3308f47d73cf64e87c98d37d5d76ce8 jdk9-b69
|
||||
42180703e0a362c1de7cdbf61d2cbc6609e678c4 jdk9-b70
|
||||
|
@ -24,7 +24,6 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.InputStream;
|
||||
import java.lang.ClassLoader;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
@ -115,33 +114,6 @@ public final class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return resource using the same classloader for the ObjectFactory by
|
||||
* default or bootclassloader when Security Manager is in place
|
||||
*/
|
||||
public static InputStream getResourceAsStream(final String name) {
|
||||
if (System.getSecurityManager() != null) {
|
||||
return getResourceAsStream(null, name);
|
||||
} else {
|
||||
return getResourceAsStream(findClassLoader(), name);
|
||||
}
|
||||
}
|
||||
|
||||
public static InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name) {
|
||||
return (InputStream) AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream("/" + name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a resource bundle using the specified base name, the default locale,
|
||||
* and the caller's class loader.
|
||||
|
@ -128,29 +128,10 @@ public final class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return resource using the same classloader for the ObjectFactory by
|
||||
* default or bootclassloader when Security Manager is in place
|
||||
*/
|
||||
public static InputStream getResourceAsStream(final String name) {
|
||||
if (System.getSecurityManager()!=null) {
|
||||
return getResourceAsStream(null, name);
|
||||
} else {
|
||||
return getResourceAsStream(ObjectFactory.findClassLoader(), name);
|
||||
}
|
||||
}
|
||||
|
||||
public static InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name) {
|
||||
return (InputStream) AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream("/"+name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
return SecuritySupport.class.getResourceAsStream("/"+name);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -343,10 +343,7 @@ public class CoreDOMImplementationImpl
|
||||
*/
|
||||
public LSSerializer createLSSerializer() {
|
||||
try {
|
||||
Class serializerClass = ObjectFactory.findProviderClass(
|
||||
"com.sun.org.apache.xml.internal.serializer.dom3.LSSerializerImpl",
|
||||
ObjectFactory.findClassLoader(), true);
|
||||
return (LSSerializer) serializerClass.newInstance();
|
||||
return new com.sun.org.apache.xml.internal.serializer.dom3.LSSerializerImpl();
|
||||
}
|
||||
catch (Exception e) {}
|
||||
// Fall back to Xerces' deprecated serializer if
|
||||
|
@ -118,34 +118,6 @@ public final class SecuritySupport {
|
||||
throw (FileNotFoundException)e.getException();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Return resource using the same classloader for the ObjectFactory by default
|
||||
* or bootclassloader when Security Manager is in place
|
||||
*/
|
||||
public static InputStream getResourceAsStream(final String name) {
|
||||
if (System.getSecurityManager()!=null) {
|
||||
return getResourceAsStream(null, name);
|
||||
} else {
|
||||
return getResourceAsStream(ObjectFactory.findClassLoader(), name);
|
||||
}
|
||||
}
|
||||
|
||||
public static InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream("/"+name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a resource bundle using the specified base name, the default locale, and the caller's class loader.
|
||||
|
@ -23,7 +23,6 @@ package com.sun.org.apache.xerces.internal.xinclude;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
@ -113,23 +112,6 @@ final class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = ClassLoader.getSystemResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean getFileExists(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
|
@ -23,7 +23,6 @@ package com.sun.org.apache.xml.internal.serialize;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
@ -113,23 +112,6 @@ final class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = ClassLoader.getSystemResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean getFileExists(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
|
@ -36,6 +36,7 @@ import java.util.Properties;
|
||||
import com.sun.org.apache.xml.internal.serializer.DOM3Serializer;
|
||||
import com.sun.org.apache.xml.internal.serializer.Encodings;
|
||||
import com.sun.org.apache.xml.internal.serializer.Serializer;
|
||||
import com.sun.org.apache.xml.internal.serializer.ToXMLStream;
|
||||
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory;
|
||||
import com.sun.org.apache.xml.internal.serializer.SerializerFactory;
|
||||
import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
|
||||
@ -218,7 +219,8 @@ final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
|
||||
|
||||
// Get a serializer that seriailizes according to the properties,
|
||||
// which in this case is to xml
|
||||
fXMLSerializer = SerializerFactory.getSerializer(configProps);
|
||||
fXMLSerializer = new ToXMLStream();
|
||||
fXMLSerializer.setOutputFormat(configProps);
|
||||
|
||||
// Initialize Serializer
|
||||
fXMLSerializer.setOutputFormat(fDOMConfigProperties);
|
||||
@ -262,9 +264,6 @@ final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
|
||||
// entities
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
|
||||
// preserve entities
|
||||
fDOMConfigProperties.setProperty(
|
||||
OutputPropertiesFactory.S_KEY_ENTITIES, DOMConstants.S_XSL_VALUE_ENTITIES);
|
||||
|
||||
// error-handler
|
||||
// Should we set our default ErrorHandler
|
||||
@ -290,9 +289,6 @@ final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
|
||||
+ DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
|
||||
// preserve entities
|
||||
fDOMConfigProperties.setProperty(
|
||||
OutputPropertiesFactory.S_KEY_ENTITIES, "");
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_CDATA_SECTIONS,
|
||||
DOMConstants.DOM3_DEFAULT_FALSE);
|
||||
@ -531,8 +527,6 @@ final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
|
||||
if (state) {
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(
|
||||
OutputPropertiesFactory.S_KEY_ENTITIES, DOMConstants.S_XSL_VALUE_ENTITIES);
|
||||
} else {
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
@ -679,31 +673,29 @@ final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
|
||||
fFeatures |= WELLFORMED;
|
||||
fFeatures |= ELEM_CONTENT_WHITESPACE;
|
||||
fFeatures |= COMMENTS;
|
||||
|
||||
// infoset
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
}
|
||||
|
||||
// infoset
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
|
||||
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
fDOMConfigProperties.setProperty(
|
||||
OutputPropertiesFactory.S_KEY_ENTITIES, "");
|
||||
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
|
||||
+ DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
|
||||
} else if (name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)) {
|
||||
String msg = Utils.messages.createMessage(
|
||||
MsgKey.ER_FEATURE_NOT_SUPPORTED,
|
||||
|
@ -27,11 +27,9 @@ import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
import com.sun.org.apache.xpath.internal.XPathContext;
|
||||
import com.sun.org.apache.xpath.internal.objects.XNumber;
|
||||
import com.sun.org.apache.xpath.internal.objects.XObject;
|
||||
import com.sun.org.apache.xpath.internal.objects.XString;
|
||||
import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
|
||||
import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
|
||||
import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
|
||||
|
||||
/**
|
||||
@ -69,7 +67,7 @@ public class FuncSystemProperty extends FunctionOneArg
|
||||
// property argument is to be looked for.
|
||||
Properties xsltInfo = new Properties();
|
||||
|
||||
loadPropertyFile(XSLT_PROPERTIES, xsltInfo);
|
||||
loadPropertyFile(xsltInfo);
|
||||
|
||||
if (indexOfNSSep > 0)
|
||||
{
|
||||
@ -159,25 +157,21 @@ public class FuncSystemProperty extends FunctionOneArg
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a propery bundle from a specified file
|
||||
* Retrieve a property bundle from XSLT_PROPERTIES
|
||||
*
|
||||
* @param file The string name of the property file. The name
|
||||
* should already be fully qualified as path/filename
|
||||
* @param target The target property bag the file will be placed into.
|
||||
*/
|
||||
public void loadPropertyFile(String file, Properties target)
|
||||
private void loadPropertyFile(Properties target)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Use SecuritySupport class to provide priveleged access to property file
|
||||
InputStream is = SecuritySupport.getResourceAsStream(ObjectFactory.findClassLoader(),
|
||||
file);
|
||||
// Use SecuritySupport class to provide privileged access to property file
|
||||
InputStream is = SecuritySupport.getResourceAsStream(XSLT_PROPERTIES);
|
||||
|
||||
// get a buffered version
|
||||
BufferedInputStream bis = new BufferedInputStream(is);
|
||||
|
||||
target.load(bis); // and load up the property bag from this
|
||||
bis.close(); // close out after reading
|
||||
try (BufferedInputStream bis = new BufferedInputStream(is)) {
|
||||
target.load(bis); // and load up the property bag from this
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -26,9 +26,7 @@
|
||||
package javax.xml.datatype;
|
||||
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@ -77,23 +75,6 @@ class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean doesFileExist(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
|
@ -26,9 +26,7 @@
|
||||
package javax.xml.parsers;
|
||||
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@ -81,23 +79,6 @@ class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean doesFileExist(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
|
@ -26,9 +26,7 @@
|
||||
package javax.xml.stream;
|
||||
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@ -81,23 +79,6 @@ class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean doesFileExist(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
|
@ -26,9 +26,7 @@
|
||||
package javax.xml.transform;
|
||||
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@ -79,23 +77,6 @@ class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean doesFileExist(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
|
@ -418,30 +418,8 @@ class SchemaFactoryFinder {
|
||||
private static final Class<SchemaFactory> SERVICE_CLASS = SchemaFactory.class;
|
||||
|
||||
|
||||
// Used for debugging purposes
|
||||
private static String which( Class<?> clazz ) {
|
||||
return which( clazz.getName(), clazz.getClassLoader() );
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Search the specified classloader for the given classname.</p>
|
||||
*
|
||||
* @param classname the fully qualified name of the class to search for
|
||||
* @param loader the classloader to search
|
||||
*
|
||||
* @return the source location of the resource, or null if it wasn't found
|
||||
*/
|
||||
private static String which(String classname, ClassLoader loader) {
|
||||
|
||||
String classnameAsResource = classname.replace('.', '/') + ".class";
|
||||
|
||||
if( loader==null ) loader = ClassLoader.getSystemClassLoader();
|
||||
|
||||
//URL it = loader.getResource(classnameAsResource);
|
||||
URL it = ss.getResourceAsURL(loader, classnameAsResource);
|
||||
if (it != null) {
|
||||
return it.toString();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return ss.getClassSource(clazz);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, 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
|
||||
@ -25,12 +25,9 @@
|
||||
|
||||
package javax.xml.validation;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@ -43,9 +40,10 @@ class SecuritySupport {
|
||||
|
||||
|
||||
ClassLoader getContextClassLoader() {
|
||||
return (ClassLoader)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return
|
||||
AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
|
||||
@Override
|
||||
public ClassLoader run() {
|
||||
ClassLoader cl = null;
|
||||
//try {
|
||||
cl = Thread.currentThread().getContextClassLoader();
|
||||
@ -58,9 +56,9 @@ class SecuritySupport {
|
||||
}
|
||||
|
||||
String getSystemProperty(final String propName) {
|
||||
return (String)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
@Override
|
||||
public String run() {
|
||||
return System.getProperty(propName);
|
||||
}
|
||||
});
|
||||
@ -70,9 +68,10 @@ class SecuritySupport {
|
||||
throws FileNotFoundException
|
||||
{
|
||||
try {
|
||||
return (FileInputStream)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws FileNotFoundException {
|
||||
return AccessController.doPrivileged(
|
||||
new PrivilegedExceptionAction<FileInputStream>() {
|
||||
@Override
|
||||
public FileInputStream run() throws FileNotFoundException {
|
||||
return new FileInputStream(file);
|
||||
}
|
||||
});
|
||||
@ -81,83 +80,29 @@ class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getURLInputStream(final URL url)
|
||||
throws IOException
|
||||
{
|
||||
try {
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws IOException {
|
||||
return url.openStream();
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException e) {
|
||||
throw (IOException)e.getException();
|
||||
}
|
||||
}
|
||||
|
||||
URL getResourceAsURL(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (URL)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
URL url;
|
||||
if (cl == null) {
|
||||
url = Object.class.getResource(name);
|
||||
} else {
|
||||
url = cl.getResource(name);
|
||||
}
|
||||
return url;
|
||||
// Used for debugging purposes
|
||||
String getClassSource(Class<?> cls) {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
@Override
|
||||
public String run() {
|
||||
CodeSource cs = cls.getProtectionDomain().getCodeSource();
|
||||
if (cs != null) {
|
||||
URL loc = cs.getLocation();
|
||||
return loc != null ? loc.toString() : "(no location)";
|
||||
} else {
|
||||
return "(no code source)";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Enumeration getResources(final ClassLoader cl,
|
||||
final String name) throws IOException
|
||||
{
|
||||
try{
|
||||
return (Enumeration)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws IOException{
|
||||
Enumeration enumeration;
|
||||
if (cl == null) {
|
||||
enumeration = ClassLoader.getSystemResources(name);
|
||||
} else {
|
||||
enumeration = cl.getResources(name);
|
||||
}
|
||||
return enumeration;
|
||||
}
|
||||
});
|
||||
}catch(PrivilegedActionException e){
|
||||
throw (IOException)e.getException();
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean doesFileExist(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return new Boolean(f.exists());
|
||||
}
|
||||
})).booleanValue();
|
||||
return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
return f.exists();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, 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
|
||||
@ -27,9 +27,7 @@ package javax.xml.xpath;
|
||||
|
||||
import java.net.URL;
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
@ -42,9 +40,9 @@ class SecuritySupport {
|
||||
|
||||
|
||||
ClassLoader getContextClassLoader() {
|
||||
return (ClassLoader)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
|
||||
@Override
|
||||
public ClassLoader run() {
|
||||
ClassLoader cl = null;
|
||||
try {
|
||||
cl = Thread.currentThread().getContextClassLoader();
|
||||
@ -55,21 +53,22 @@ class SecuritySupport {
|
||||
}
|
||||
|
||||
String getSystemProperty(final String propName) {
|
||||
return (String)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return System.getProperty(propName);
|
||||
}
|
||||
});
|
||||
return AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
@Override
|
||||
public String run() {
|
||||
return System.getProperty(propName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
FileInputStream getFileInputStream(final File file)
|
||||
throws FileNotFoundException
|
||||
{
|
||||
try {
|
||||
return (FileInputStream)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws FileNotFoundException {
|
||||
return AccessController.doPrivileged(
|
||||
new PrivilegedExceptionAction<FileInputStream>() {
|
||||
@Override
|
||||
public FileInputStream run() throws FileNotFoundException {
|
||||
return new FileInputStream(file);
|
||||
}
|
||||
});
|
||||
@ -78,83 +77,29 @@ class SecuritySupport {
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getURLInputStream(final URL url)
|
||||
throws IOException
|
||||
{
|
||||
try {
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws IOException {
|
||||
return url.openStream();
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException e) {
|
||||
throw (IOException)e.getException();
|
||||
}
|
||||
}
|
||||
|
||||
URL getResourceAsURL(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (URL)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
URL url;
|
||||
if (cl == null) {
|
||||
url = Object.class.getResource(name);
|
||||
} else {
|
||||
url = cl.getResource(name);
|
||||
}
|
||||
return url;
|
||||
// Used for debugging purposes
|
||||
String getClassSource(Class<?> cls) {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
@Override
|
||||
public String run() {
|
||||
CodeSource cs = cls.getProtectionDomain().getCodeSource();
|
||||
if (cs != null) {
|
||||
URL loc = cs.getLocation();
|
||||
return loc != null ? loc.toString() : "(no location)";
|
||||
} else {
|
||||
return "(no code source)";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Enumeration getResources(final ClassLoader cl,
|
||||
final String name) throws IOException
|
||||
{
|
||||
try{
|
||||
return (Enumeration)
|
||||
AccessController.doPrivileged(new PrivilegedExceptionAction() {
|
||||
public Object run() throws IOException{
|
||||
Enumeration enumeration;
|
||||
if (cl == null) {
|
||||
enumeration = ClassLoader.getSystemResources(name);
|
||||
} else {
|
||||
enumeration = cl.getResources(name);
|
||||
}
|
||||
return enumeration;
|
||||
}
|
||||
});
|
||||
}catch(PrivilegedActionException e){
|
||||
throw (IOException)e.getException();
|
||||
}
|
||||
}
|
||||
|
||||
InputStream getResourceAsStream(final ClassLoader cl,
|
||||
final String name)
|
||||
{
|
||||
return (InputStream)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
return ris;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean doesFileExist(final File f) {
|
||||
return ((Boolean)
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
return new Boolean(f.exists());
|
||||
}
|
||||
})).booleanValue();
|
||||
return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
return f.exists();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -414,30 +414,9 @@ class XPathFactoryFinder {
|
||||
|
||||
private static final Class<XPathFactory> SERVICE_CLASS = XPathFactory.class;
|
||||
|
||||
private static String which( Class clazz ) {
|
||||
return which( clazz.getName(), clazz.getClassLoader() );
|
||||
// Used for debugging purposes
|
||||
private static String which( Class<?> clazz ) {
|
||||
return ss.getClassSource(clazz);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Search the specified classloader for the given classname.</p>
|
||||
*
|
||||
* @param classname the fully qualified name of the class to search for
|
||||
* @param loader the classloader to search
|
||||
*
|
||||
* @return the source location of the resource, or null if it wasn't found
|
||||
*/
|
||||
private static String which(String classname, ClassLoader loader) {
|
||||
|
||||
String classnameAsResource = classname.replace('.', '/') + ".class";
|
||||
|
||||
if( loader==null ) loader = ClassLoader.getSystemClassLoader();
|
||||
|
||||
//URL it = loader.getResource(classnameAsResource);
|
||||
URL it = ss.getResourceAsURL(loader, classnameAsResource);
|
||||
if (it != null) {
|
||||
return it.toString();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ class SecuritySupport {
|
||||
public Object run() {
|
||||
InputStream ris;
|
||||
if (cl == null) {
|
||||
ris = Object.class.getResourceAsStream(name);
|
||||
ris = SecuritySupport.class.getResourceAsStream(name);
|
||||
} else {
|
||||
ris = cl.getResourceAsStream(name);
|
||||
}
|
||||
|
@ -29,5 +29,8 @@ tier1 =
|
||||
tier2 = \
|
||||
:jaxp_all
|
||||
|
||||
# No tier 3 tests.
|
||||
tier3 =
|
||||
|
||||
jaxp_all = \
|
||||
javax/xml/jaxp
|
||||
|
@ -101,7 +101,6 @@ public class LSSerializerTest {
|
||||
|
||||
/*
|
||||
* @bug 8080906
|
||||
* It will fail in a Jigsaw build until JDK-8080266 is fixed.
|
||||
*/
|
||||
@Test
|
||||
public void testDefaultLSSerializer() throws Exception {
|
||||
@ -134,6 +133,9 @@ public class LSSerializerTest {
|
||||
DOMImplementation impl = doc.getImplementation();
|
||||
DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0");
|
||||
LSSerializer writer = implLS.createLSSerializer();
|
||||
|
||||
System.out.println("Serializer is: " + implLS.getClass().getName() + " " + implLS);
|
||||
|
||||
DOMErrorHandlerImpl eh = new DOMErrorHandlerImpl();
|
||||
writer.getDomConfig().setParameter("error-handler", eh);
|
||||
|
||||
@ -200,6 +202,8 @@ public class LSSerializerTest {
|
||||
DOMImplementationLS domImplementationLS = (DOMImplementationLS) domImplementation;
|
||||
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
|
||||
|
||||
System.out.println("Serializer is: " + lsSerializer.getClass().getName() + " " + lsSerializer);
|
||||
|
||||
// get configuration
|
||||
DOMConfiguration domConfiguration = lsSerializer.getDomConfig();
|
||||
|
||||
@ -294,6 +298,8 @@ public class LSSerializerTest {
|
||||
DOMImplementationLS domImplementationLS = (DOMImplementationLS) domImplementation;
|
||||
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
|
||||
|
||||
System.out.println("Serializer is: " + lsSerializer.getClass().getName() + " " + lsSerializer);
|
||||
|
||||
// get default serialization
|
||||
String defaultSerialization = lsSerializer.writeToString(document);
|
||||
|
||||
|
@ -315,3 +315,4 @@ df100399ed27d0eaa57c137ca99819a0fee66178 jdk9-b64
|
||||
c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67
|
||||
b5878b03d1b2e105917d959fbfa3c57c22495803 jdk9-b68
|
||||
f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69
|
||||
94084caa27a3c8a09a7510aef596ebd64e97c569 jdk9-b70
|
||||
|
@ -23,6 +23,9 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This package defines APIs related to WS-Addressing.
|
||||
*/
|
||||
@javax.xml.bind.annotation.XmlSchema(namespace=W3CEndpointReference.NS,
|
||||
location="http://www.w3.org/2006/03/addressing/ws-addr.xsd")
|
||||
package javax.xml.ws.wsaddressing;
|
||||
|
@ -1,30 +0,0 @@
|
||||
<!--
|
||||
Copyright (c) 2005, 2012, 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.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<body>
|
||||
This package defines APIs related to WS-Addressing.
|
||||
</body>
|
||||
</html>
|
@ -312,3 +312,4 @@ ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
|
||||
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
|
||||
046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
|
||||
551323004d0ce2f1d4b0e99552f7e0cdcebc6fca jdk9-b69
|
||||
a7f731125b7fb0e4b0186172f85a21e2d5139f7e jdk9-b70
|
||||
|
@ -26,6 +26,7 @@
|
||||
include GensrcCommon.gmk
|
||||
|
||||
include GensrcLocaleData.gmk
|
||||
include GensrcCLDR.gmk
|
||||
include GensrcCharacterData.gmk
|
||||
include GensrcMisc.gmk
|
||||
include GensrcCharsetMapping.gmk
|
||||
|
@ -23,19 +23,30 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
CLDRVERSION := 21.0.1
|
||||
CLDRVERSION := 27.0.0
|
||||
CLDRSRCDIR := $(JDK_TOPDIR)/src/jdk.localedata/share/classes/sun/util/cldr/resources/$(subst .,_,$(CLDRVERSION))
|
||||
|
||||
GENSRC_BASEDIR := $(SUPPORT_OUTPUTDIR)/gensrc/java.base
|
||||
GENSRC_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata
|
||||
|
||||
CLDR_METAINFO_FILE := $(GENSRC_DIR)/sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.java
|
||||
CLDR_BASEMETAINFO_FILE := $(GENSRC_DIR)/sun/util/cldr/CLDRBaseLocaleDataMetaInfo.java
|
||||
CLDR_METAINFO_FILE := $(GENSRC_DIR)/sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo_jdk_localedata.java
|
||||
|
||||
CLDR_BASE_LOCALES := "en-US"
|
||||
|
||||
$(CLDR_BASEMETAINFO_FILE): $(wildcard $(CLDRSRCDIR)/common/dtd/*.dtd) \
|
||||
$(wildcard $(CLDRSRCDIR)/common/main/en*.xml) \
|
||||
$(wildcard $(CLDRSRCDIR)/common/supplemental/*.xml) \
|
||||
$(BUILD_TOOLS_JDK)
|
||||
$(MKDIR) -p $(GENSRC_BASEDIR)
|
||||
$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) -baselocales $(CLDR_BASE_LOCALES) -basemodule -o $(GENSRC_BASEDIR)
|
||||
|
||||
$(CLDR_METAINFO_FILE): $(wildcard $(CLDRSRCDIR)/common/dtd/*.dtd) \
|
||||
$(wildcard $(CLDRSRCDIR)/common/main/*.xml) \
|
||||
$(wildcard $(CLDRSRCDIR)/common/supplemental/*.xml) \
|
||||
$(BUILD_TOOLS_JDK)
|
||||
$(MKDIR) -p $(GENSRC_DIR)
|
||||
$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) -o $(GENSRC_DIR)
|
||||
$(TOOL_CLDRCONVERTER) -base $(CLDRSRCDIR) -baselocales $(CLDR_BASE_LOCALES) -o $(GENSRC_DIR)
|
||||
|
||||
GENSRC_CLDR := $(CLDR_METAINFO_FILE)
|
||||
GENSRC_JDK_LOCALEDATA += $(GENSRC_CLDR)
|
||||
GENSRC_JAVA_BASE += $(CLDR_BASEMETAINFO_FILE)
|
||||
GENSRC_JDK_LOCALEDATA += $(CLDR_METAINFO_FILE)
|
||||
|
@ -42,51 +42,54 @@ LOCALE_FILES := $(shell $(FIND) $(JDK_TOPDIR)/src/java.base/share/classes \
|
||||
LOCALE_RESOURCES := $(sort $(subst .properties,,$(subst .java,,$(notdir $(LOCALE_FILES)))))
|
||||
|
||||
# Include the list of resources found during the previous compile.
|
||||
-include $(SUPPORT_OUTPUTDIR)/gensrc/java.base/_the.locale_resources
|
||||
-include $(SUPPORT_OUTPUTDIR)/gensrc/_the.locale_resources
|
||||
|
||||
MISSING_RESOURCES := $(filter-out $(LOCALE_RESOURCES), $(PREV_LOCALE_RESOURCES))
|
||||
NEW_RESOURCES := $(filter-out $(PREV_LOCALE_RESOURCES), $(LOCALE_RESOURCES))
|
||||
|
||||
ifneq (, $(MISSING_RESOURCES)$(NEW_RESOURCES))
|
||||
# There is a difference in the number of supported resources. Trigger a regeneration.
|
||||
$(shell $(RM) $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/locale/provider/LocaleDataMetaInfo.java)
|
||||
$(shell $(RM) $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/locale/provider/BaseLocaleDataMetaInfo.java \
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/provider/NonBaseLocaleDataMetaInfo.java \
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/cldr/CLDRBaseLocaleDataMetaInfo.java \
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo_jdk_localedata.java)
|
||||
endif
|
||||
|
||||
# The EN locales
|
||||
EN_LOCALES := en%
|
||||
# The base locales
|
||||
BASE_LOCALES := en en-US
|
||||
|
||||
# Locales that don't have any resource files should be included here.
|
||||
ALL_NON_EN_LOCALES := ja-JP-JP nb-NO nn-NO th-TH-TH
|
||||
ALL_NON_BASE_LOCALES := ja-JP-JP nb-NO nn-NO th-TH-TH
|
||||
|
||||
SED_ENARGS := -e 's|$(HASH)warn This file is preprocessed before being compiled|// -- This file was mechanically generated: Do not edit! -- //|g'
|
||||
SED_NONENARGS := $(SED_ENARGS)
|
||||
SED_BASEARGS := -e 's|$(HASH)warn This file is preprocessed before being compiled|// -- This file was mechanically generated: Do not edit! -- //|g'
|
||||
SED_NONBASEARGS := $(SED_BASEARGS)
|
||||
|
||||
# Fill in the languages and package names
|
||||
SED_ENARGS += -e 's/$(HASH)Lang$(HASH)/En/' \
|
||||
SED_BASEARGS += -e 's/$(HASH)Lang$(HASH)/Base/' \
|
||||
-e 's/$(HASH)Package$(HASH)/sun.util.locale.provider/'
|
||||
SED_NONENARGS += -e 's/$(HASH)Lang$(HASH)/NonEn/' \
|
||||
SED_NONBASEARGS += -e 's/$(HASH)Lang$(HASH)/NonBase/' \
|
||||
-e 's/$(HASH)Package$(HASH)/sun.util.resources.provider/'
|
||||
|
||||
# This macro creates a sed expression that substitues for example:
|
||||
# #FormatData_ENLocales# with: en% locales.
|
||||
# #FormatData_Locales# with: en-US locales.
|
||||
define CaptureLocale
|
||||
$1_LOCALES := $$(subst _,-,$$(filter-out $1, $$(subst $1_,,$$(filter $1_%, $(LOCALE_RESOURCES)))))
|
||||
$1_EN_LOCALES := $$(filter $(EN_LOCALES), $$($1_LOCALES))
|
||||
$1_NON_EN_LOCALES := $$(filter-out $(EN_LOCALES), $$($1_LOCALES))
|
||||
$1_BASE_LOCALES := $$(filter $(BASE_LOCALES), $$($1_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(filter-out $(BASE_LOCALES), $$($1_LOCALES))
|
||||
|
||||
# Special handling for Chinese locales to include implicit scripts
|
||||
$1_NON_EN_LOCALES := $$(subst zh-CN,zh-CN$$(SPACE)zh-Hans-CN, $$($1_NON_EN_LOCALES))
|
||||
$1_NON_EN_LOCALES := $$(subst zh-SG,zh-SG$$(SPACE)zh-Hans-SG, $$($1_NON_EN_LOCALES))
|
||||
$1_NON_EN_LOCALES := $$(subst zh-HK,zh-HK$$(SPACE)zh-Hant-HK, $$($1_NON_EN_LOCALES))
|
||||
$1_NON_EN_LOCALES := $$(subst zh-MO,zh-MO$$(SPACE)zh-Hant-MO, $$($1_NON_EN_LOCALES))
|
||||
$1_NON_EN_LOCALES := $$(subst zh-TW,zh-TW$$(SPACE)zh-Hant-TW, $$($1_NON_EN_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-CN,zh-CN$$(SPACE)zh-Hans-CN, $$($1_NON_BASE_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-SG,zh-SG$$(SPACE)zh-Hans-SG, $$($1_NON_BASE_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-HK,zh-HK$$(SPACE)zh-Hant-HK, $$($1_NON_BASE_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-MO,zh-MO$$(SPACE)zh-Hant-MO, $$($1_NON_BASE_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-TW,zh-TW$$(SPACE)zh-Hant-TW, $$($1_NON_BASE_LOCALES))
|
||||
|
||||
ALL_EN_LOCALES += $$($1_EN_LOCALES)
|
||||
ALL_NON_EN_LOCALES += $$($1_NON_EN_LOCALES)
|
||||
ALL_BASE_LOCALES += $$($1_BASE_LOCALES)
|
||||
ALL_NON_BASE_LOCALES += $$($1_NON_BASE_LOCALES)
|
||||
|
||||
# Don't sed in a space if there are no locales.
|
||||
SED_ENARGS += -e 's/$$(HASH)$1_Locales$$(HASH)/$$(if $$($1_EN_LOCALES),$$(SPACE)$$($1_EN_LOCALES),)/g'
|
||||
SED_NONENARGS += -e 's/$$(HASH)$1_Locales$$(HASH)/$$(if $$($1_NON_EN_LOCALES),$$(SPACE)$$($1_NON_EN_LOCALES),)/g'
|
||||
SED_BASEARGS += -e 's/$$(HASH)$1_Locales$$(HASH)/$$(if $$($1_BASE_LOCALES),$$(SPACE)$$($1_BASE_LOCALES),)/g'
|
||||
SED_NONBASEARGS += -e 's/$$(HASH)$1_Locales$$(HASH)/$$(if $$($1_NON_BASE_LOCALES),$$(SPACE)$$($1_NON_BASE_LOCALES),)/g'
|
||||
endef
|
||||
|
||||
#sun.text.resources.FormatData
|
||||
@ -113,27 +116,27 @@ $(eval $(call CaptureLocale,CurrencyNames))
|
||||
#sun.util.resources.CalendarData
|
||||
$(eval $(call CaptureLocale,CalendarData))
|
||||
|
||||
SED_ENARGS += -e 's/$(HASH)AvailableLocales_Locales$(HASH)/$(sort $(ALL_EN_LOCALES))/g'
|
||||
SED_NONENARGS += -e 's/$(HASH)AvailableLocales_Locales$(HASH)/$(sort $(ALL_NON_EN_LOCALES))/g'
|
||||
SED_BASEARGS += -e 's/$(HASH)AvailableLocales_Locales$(HASH)/$(sort $(ALL_BASE_LOCALES))/g'
|
||||
SED_NONBASEARGS += -e 's/$(HASH)AvailableLocales_Locales$(HASH)/$(sort $(ALL_NON_BASE_LOCALES))/g'
|
||||
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/locale/provider/EnLocaleDataMetaInfo.java: \
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/locale/provider/BaseLocaleDataMetaInfo.java: \
|
||||
$(JDK_TOPDIR)/src/java.base/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template
|
||||
$(MKDIR) -p $(@D)
|
||||
$(ECHO) Creating sun/util/locale/provider/EnLocaleDataMetaInfo.java from $(words $(LOCALE_RESOURCES)) found resources.
|
||||
$(ECHO) Creating sun/util/locale/provider/BaseLocaleDataMetaInfo.java from $(words $(LOCALE_RESOURCES)) found resources.
|
||||
$(PRINTF) "PREV_LOCALE_RESOURCES:=$(LOCALE_RESOURCES)" \
|
||||
> $(SUPPORT_OUTPUTDIR)/gensrc/_the.locale_resources
|
||||
$(SED) $(SED_ENARGS) $< > $@
|
||||
$(SED) $(SED_BASEARGS) $< > $@
|
||||
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/provider/NonEnLocaleDataMetaInfo.java: \
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/provider/NonBaseLocaleDataMetaInfo.java: \
|
||||
$(JDK_TOPDIR)/src/java.base/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template
|
||||
$(MKDIR) -p $(@D)
|
||||
$(ECHO) Creating sun/util/resources/provider/NonEnLocaleDataMetaInfo.java from $(words $(LOCALE_RESOURCES)) found resources.
|
||||
$(ECHO) Creating sun/util/resources/provider/NonBaseLocaleDataMetaInfo.java from $(words $(LOCALE_RESOURCES)) found resources.
|
||||
$(PRINTF) "PREV_LOCALE_RESOURCES:=$(LOCALE_RESOURCES)" \
|
||||
> $(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/_the.locale_resources
|
||||
$(SED) $(SED_NONENARGS) $< > $@
|
||||
> $(SUPPORT_OUTPUTDIR)/gensrc/_the.locale_resources
|
||||
$(SED) $(SED_NONBASEARGS) $< > $@
|
||||
|
||||
GENSRC_BASELOCALEDATA := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/locale/provider/EnLocaleDataMetaInfo.java
|
||||
GENSRC_LOCALEDATA := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/provider/NonEnLocaleDataMetaInfo.java
|
||||
GENSRC_BASELOCALEDATA := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/util/locale/provider/BaseLocaleDataMetaInfo.java
|
||||
GENSRC_LOCALEDATA := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/provider/NonBaseLocaleDataMetaInfo.java
|
||||
|
||||
################################################################################
|
||||
|
||||
|
@ -161,7 +161,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA, \
|
||||
-export:getLastErrorString \
|
||||
jvm.lib $(BUILD_LIBFDLIBM) $(WIN_VERIFY_LIB) \
|
||||
shell32.lib delayimp.lib -DELAYLOAD:shell32.dll \
|
||||
advapi32.lib, \
|
||||
advapi32.lib version.lib, \
|
||||
VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \
|
||||
RC_FLAGS := $(RC_FLAGS) \
|
||||
-D "JDK_FNAME=java.dll" \
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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,15 @@ abstract class AbstractLDMLHandler<V> extends DefaultHandler {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* start an element that defines an alias entry, with the value provided by the element's alias.
|
||||
*/
|
||||
void pushAliasEntry(String qName, Attributes attributes, String key) {
|
||||
if (!pushIfIgnored(qName, attributes)) {
|
||||
currentContainer = new AliasEntry(qName, currentContainer, key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* start an element that defines a string entry, with the value provided by an attribute value.
|
||||
*/
|
||||
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.
|
||||
*/
|
||||
|
||||
package build.tools.cldrconverter;
|
||||
|
||||
class AliasEntry extends StringEntry {
|
||||
AliasEntry(String qName, Container parent, String key) {
|
||||
super(qName, parent, key);
|
||||
}
|
||||
|
||||
AliasEntry(String qName, Container parent, String key, String value) {
|
||||
super(qName, parent, key, value);
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -32,6 +32,7 @@ import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
class Bundle {
|
||||
static enum Type {
|
||||
@ -81,7 +82,10 @@ class Bundle {
|
||||
};
|
||||
|
||||
private final static String[] DATETIME_PATTERN_KEYS = {
|
||||
"DateTimePatterns/date-time"
|
||||
"DateTimePatterns/full-dateTime",
|
||||
"DateTimePatterns/long-dateTime",
|
||||
"DateTimePatterns/medium-dateTime",
|
||||
"DateTimePatterns/short-dateTime",
|
||||
};
|
||||
|
||||
private final static String[] ERA_KEYS = {
|
||||
@ -170,6 +174,7 @@ class Bundle {
|
||||
for (index = 0; index < cldrBundles.length; index++) {
|
||||
if (cldrBundles[index].equals(id)) {
|
||||
myMap.putAll(CLDRConverter.getCLDRBundle(cldrBundles[index]));
|
||||
CLDRConverter.handleAliases(myMap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -179,10 +184,11 @@ class Bundle {
|
||||
for (int i = cldrBundles.length - 1; i > index; i--) {
|
||||
if (!("no".equals(cldrBundles[i]) || cldrBundles[i].startsWith("no_"))) {
|
||||
parentsMap.putAll(CLDRConverter.getCLDRBundle(cldrBundles[i]));
|
||||
CLDRConverter.handleAliases(parentsMap);
|
||||
}
|
||||
}
|
||||
// Duplicate myMap as parentsMap for "root" so that the
|
||||
// fallback works. This is a huck, though.
|
||||
// fallback works. This is a hack, though.
|
||||
if ("root".equals(cldrBundles[0])) {
|
||||
assert parentsMap.isEmpty();
|
||||
parentsMap.putAll(myMap);
|
||||
@ -370,6 +376,17 @@ class Bundle {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove all duplicates
|
||||
if (Objects.nonNull(parentsMap)) {
|
||||
for (Iterator<String> it = myMap.keySet().iterator(); it.hasNext();) {
|
||||
String key = it.next();
|
||||
if (Objects.deepEquals(parentsMap.get(key), myMap.get(key))) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return myMap;
|
||||
}
|
||||
|
||||
@ -506,11 +523,6 @@ class Bundle {
|
||||
if (patterns.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (String p : patterns) {
|
||||
if (p == null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
String key = calendarPrefix + name;
|
||||
if (!rawPatterns.equals(patterns)) {
|
||||
myMap.put("java.time." + key, rawPatterns.toArray(new String[len]));
|
||||
@ -630,7 +642,9 @@ class Bundle {
|
||||
if (name.contains("Standard Time")) {
|
||||
name = name.replace("Standard Time", "Daylight Time");
|
||||
} else if (name.endsWith("Mean Time")) {
|
||||
if (!name.startsWith("Greenwich ")) {
|
||||
name = name.replace("Mean Time", "Summer Time");
|
||||
}
|
||||
} else if (name.endsWith(" Time")) {
|
||||
name = name.replace(" Time", " Summer Time");
|
||||
}
|
||||
@ -644,8 +658,10 @@ class Bundle {
|
||||
if (name.endsWith("Standard Time")) {
|
||||
name = name.replace("Standard Time", "Time");
|
||||
} else if (name.endsWith("Mean Time")) {
|
||||
if (!name.startsWith("Greenwich ")) {
|
||||
name = name.replace("Mean Time", "Time");
|
||||
}
|
||||
}
|
||||
map.put(TZ_GEN_LONG_KEY, name);
|
||||
fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map);
|
||||
}
|
||||
@ -712,6 +728,15 @@ class Bundle {
|
||||
}
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
// 'l' is deprecated as a pattern character. Should be ignored.
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
// Use 'y' for now.
|
||||
appendN('y', count, sb);
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
case 'V':
|
||||
appendN('z', count, sb);
|
||||
@ -723,16 +748,14 @@ class Bundle {
|
||||
}
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
case 'U':
|
||||
case 'q':
|
||||
case 'Q':
|
||||
case 'l':
|
||||
case 'g':
|
||||
case 'j':
|
||||
case 'A':
|
||||
throw new InternalError(String.format("Unsupported letter: '%c', count=%d%n",
|
||||
cldrLetter, count));
|
||||
throw new InternalError(String.format("Unsupported letter: '%c', count=%d, id=%s%n",
|
||||
cldrLetter, count, id));
|
||||
default:
|
||||
appendN(cldrLetter, count, sb);
|
||||
break;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -32,6 +32,9 @@ import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.ResourceBundle.Control;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import org.xml.sax.SAXNotRecognizedException;
|
||||
@ -64,12 +67,22 @@ public class CLDRConverter {
|
||||
static final String TIMEZONE_ID_PREFIX = "timezone.id.";
|
||||
static final String ZONE_NAME_PREFIX = "timezone.displayname.";
|
||||
static final String METAZONE_ID_PREFIX = "metazone.id.";
|
||||
static final String PARENT_LOCALE_PREFIX = "parentLocale.";
|
||||
|
||||
private static SupplementDataParseHandler handlerSuppl;
|
||||
static NumberingSystemsParseHandler handlerNumbering;
|
||||
static MetaZonesParseHandler handlerMetaZones;
|
||||
private static BundleGenerator bundleGenerator;
|
||||
|
||||
// java.base module related
|
||||
static boolean isBaseModule = false;
|
||||
static final Set<Locale> BASE_LOCALES = new HashSet<>();
|
||||
|
||||
// "parentLocales" map
|
||||
private static final Map<String, SortedSet<String>> parentLocalesMap = new HashMap<>();
|
||||
private static final ResourceBundle.Control defCon =
|
||||
ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT);
|
||||
|
||||
static enum DraftType {
|
||||
UNCONFIRMED,
|
||||
PROVISIONAL,
|
||||
@ -142,6 +155,16 @@ public class CLDRConverter {
|
||||
}
|
||||
break;
|
||||
|
||||
case "-baselocales":
|
||||
// base locales
|
||||
setupBaseLocales(args[++i]);
|
||||
break;
|
||||
|
||||
case "-basemodule":
|
||||
// indicates java.base module resource generation
|
||||
isBaseModule = true;
|
||||
break;
|
||||
|
||||
case "-o":
|
||||
// output directory
|
||||
DESTINATION_DIR = args[++i];
|
||||
@ -179,8 +202,15 @@ public class CLDRConverter {
|
||||
NUMBERING_SOURCE_FILE = CLDR_BASE + "common/supplemental/numberingSystems.xml";
|
||||
METAZONES_SOURCE_FILE = CLDR_BASE + "common/supplemental/metaZones.xml";
|
||||
|
||||
if (BASE_LOCALES.isEmpty()) {
|
||||
setupBaseLocales("en-US");
|
||||
}
|
||||
|
||||
bundleGenerator = new ResourceBundleGenerator();
|
||||
|
||||
// Parse data independent of locales
|
||||
parseSupplemental();
|
||||
|
||||
List<Bundle> bundles = readBundleList();
|
||||
convertBundles(bundles);
|
||||
}
|
||||
@ -192,6 +222,9 @@ public class CLDRConverter {
|
||||
+ "\t-draft [approved | provisional | unconfirmed]%n"
|
||||
+ "\t\t draft level for using data (default: approved)%n"
|
||||
+ "\t-base dir base directory for CLDR input files%n"
|
||||
+ "\t-basemodule generates bundles that go into java.base module%n"
|
||||
+ "\t-baselocales loc(,loc)* locales that go into the base module%n"
|
||||
+ "\t-o dir output directory (default: ./build/gensrc)%n"
|
||||
+ "\t-o dir output directory (defaut: ./build/gensrc)%n"
|
||||
+ "\t-utf8 use UTF-8 rather than \\uxxxx (for debug)%n");
|
||||
}
|
||||
@ -248,7 +281,6 @@ public class CLDRConverter {
|
||||
}
|
||||
|
||||
private static List<Bundle> readBundleList() throws Exception {
|
||||
ResourceBundle.Control defCon = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT);
|
||||
List<Bundle> retList = new ArrayList<>();
|
||||
Path path = FileSystems.getDefault().getPath(SOURCE_FILE_DIR);
|
||||
try (DirectoryStream<Path> dirStr = Files.newDirectoryStream(path)) {
|
||||
@ -257,7 +289,7 @@ public class CLDRConverter {
|
||||
if (fileName.endsWith(".xml")) {
|
||||
String id = fileName.substring(0, fileName.indexOf('.'));
|
||||
Locale cldrLoc = Locale.forLanguageTag(toLanguageTag(id));
|
||||
List<Locale> candList = defCon.getCandidateLocales("", cldrLoc);
|
||||
List<Locale> candList = applyParentLocales("", defCon.getCandidateLocales("", cldrLoc));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (Locale loc : candList) {
|
||||
if (!loc.equals(Locale.ROOT)) {
|
||||
@ -269,9 +301,9 @@ public class CLDRConverter {
|
||||
sb.append("root");
|
||||
}
|
||||
Bundle b = new Bundle(id, sb.toString(), null, null);
|
||||
// Insert the bundle for en at the top so that it will get
|
||||
// Insert the bundle for root at the top so that it will get
|
||||
// processed first.
|
||||
if ("en".equals(id)) {
|
||||
if ("root".equals(id)) {
|
||||
retList.add(0, b);
|
||||
} else {
|
||||
retList.add(b);
|
||||
@ -282,7 +314,7 @@ public class CLDRConverter {
|
||||
return retList;
|
||||
}
|
||||
|
||||
private static Map<String, Map<String, Object>> cldrBundles = new HashMap<>();
|
||||
private static final Map<String, Map<String, Object>> cldrBundles = new HashMap<>();
|
||||
|
||||
static Map<String, Object> getCLDRBundle(String id) throws Exception {
|
||||
Map<String, Object> bundle = cldrBundles.get(id);
|
||||
@ -319,12 +351,19 @@ public class CLDRConverter {
|
||||
return bundle;
|
||||
}
|
||||
|
||||
private static void convertBundles(List<Bundle> bundles) throws Exception {
|
||||
// Parsers for data in "supplemental" directory
|
||||
//
|
||||
private static void parseSupplemental() throws Exception {
|
||||
// Parse SupplementalData file and store the information in the HashMap
|
||||
// Calendar information such as firstDay and minDay are stored in
|
||||
// supplementalData.xml as of CLDR1.4. Individual territory is listed
|
||||
// with its ISO 3166 country code while default is listed using UNM49
|
||||
// region and composition numerical code (001 for World.)
|
||||
//
|
||||
// SupplementalData file also provides the "parent" locales which
|
||||
// are othrwise not to be fallen back. Process them here as well.
|
||||
//
|
||||
info("..... Parsing supplementalData.xml .....");
|
||||
SAXParserFactory factorySuppl = SAXParserFactory.newInstance();
|
||||
factorySuppl.setValidating(true);
|
||||
SAXParser parserSuppl = factorySuppl.newSAXParser();
|
||||
@ -332,8 +371,14 @@ public class CLDRConverter {
|
||||
handlerSuppl = new SupplementDataParseHandler();
|
||||
File fileSupply = new File(SPPL_SOURCE_FILE);
|
||||
parserSuppl.parse(fileSupply, handlerSuppl);
|
||||
Map<String, Object> parentData = handlerSuppl.getData("root");
|
||||
parentData.keySet().forEach(key -> {
|
||||
parentLocalesMap.put(key, new TreeSet(
|
||||
Arrays.asList(((String)parentData.get(key)).split(" "))));
|
||||
});
|
||||
|
||||
// Parse numberingSystems to get digit zero character information.
|
||||
info("..... Parsing numberingSystem.xml .....");
|
||||
SAXParserFactory numberingParser = SAXParserFactory.newInstance();
|
||||
numberingParser.setValidating(true);
|
||||
SAXParser parserNumbering = numberingParser.newSAXParser();
|
||||
@ -343,6 +388,7 @@ public class CLDRConverter {
|
||||
parserNumbering.parse(fileNumbering, handlerNumbering);
|
||||
|
||||
// Parse metaZones to create mappings between Olson tzids and CLDR meta zone names
|
||||
info("..... Parsing metaZones.xml .....");
|
||||
SAXParserFactory metazonesParser = SAXParserFactory.newInstance();
|
||||
metazonesParser.setValidating(true);
|
||||
SAXParser parserMetaZones = metazonesParser.newSAXParser();
|
||||
@ -350,14 +396,23 @@ public class CLDRConverter {
|
||||
handlerMetaZones = new MetaZonesParseHandler();
|
||||
File fileMetaZones = new File(METAZONES_SOURCE_FILE);
|
||||
parserNumbering.parse(fileMetaZones, handlerMetaZones);
|
||||
}
|
||||
|
||||
private static void convertBundles(List<Bundle> bundles) throws Exception {
|
||||
// For generating information on supported locales.
|
||||
Map<String, SortedSet<String>> metaInfo = new HashMap<>();
|
||||
metaInfo.put("LocaleNames", new TreeSet<String>());
|
||||
metaInfo.put("CurrencyNames", new TreeSet<String>());
|
||||
metaInfo.put("TimeZoneNames", new TreeSet<String>());
|
||||
metaInfo.put("CalendarData", new TreeSet<String>());
|
||||
metaInfo.put("FormatData", new TreeSet<String>());
|
||||
metaInfo.put("LocaleNames", new TreeSet<>());
|
||||
metaInfo.put("CurrencyNames", new TreeSet<>());
|
||||
metaInfo.put("TimeZoneNames", new TreeSet<>());
|
||||
metaInfo.put("CalendarData", new TreeSet<>());
|
||||
metaInfo.put("FormatData", new TreeSet<>());
|
||||
metaInfo.put("AvailableLocales", new TreeSet<>());
|
||||
|
||||
// parent locales map. The mappings are put in base metaInfo file
|
||||
// for now.
|
||||
if (isBaseModule) {
|
||||
metaInfo.putAll(parentLocalesMap);
|
||||
}
|
||||
|
||||
for (Bundle bundle : bundles) {
|
||||
// Get the target map, which contains all the data that should be
|
||||
@ -367,21 +422,7 @@ public class CLDRConverter {
|
||||
|
||||
EnumSet<Bundle.Type> bundleTypes = bundle.getBundleTypes();
|
||||
|
||||
// Fill in any missing resources in the base bundle from en and en-US data.
|
||||
// This is because CLDR root.xml is supposed to be language neutral and doesn't
|
||||
// provide some resource data. Currently, the runtime assumes that there are all
|
||||
// resources though the parent resource bundle chain.
|
||||
if (bundle.isRoot()) {
|
||||
Map<String, Object> enData = new HashMap<>();
|
||||
// Create a superset of en-US and en bundles data in order to
|
||||
// fill in any missing resources in the base bundle.
|
||||
enData.putAll(Bundle.getBundle("en").getTargetMap());
|
||||
enData.putAll(Bundle.getBundle("en_US").getTargetMap());
|
||||
for (String key : enData.keySet()) {
|
||||
if (!targetMap.containsKey(key)) {
|
||||
targetMap.put(key, enData.get(key));
|
||||
}
|
||||
}
|
||||
// Add DateTimePatternChars because CLDR no longer supports localized patterns.
|
||||
targetMap.put("DateTimePatternChars", "GyMdkHmsSEDFwWahKzZ");
|
||||
}
|
||||
@ -418,60 +459,56 @@ public class CLDRConverter {
|
||||
}
|
||||
if (bundleTypes.contains(Bundle.Type.FORMATDATA)) {
|
||||
Map<String, Object> formatDataMap = extractFormatData(targetMap, bundle.getID());
|
||||
// LocaleData.getAvailableLocales depends on having FormatData bundles around
|
||||
if (!formatDataMap.isEmpty() || bundle.isRoot()) {
|
||||
metaInfo.get("FormatData").add(toLanguageTag(bundle.getID()));
|
||||
bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, BundleType.PLAIN);
|
||||
}
|
||||
}
|
||||
|
||||
// For testing
|
||||
SortedSet<String> allLocales = new TreeSet<>();
|
||||
allLocales.addAll(metaInfo.get("CurrencyNames"));
|
||||
allLocales.addAll(metaInfo.get("LocaleNames"));
|
||||
allLocales.addAll(metaInfo.get("CalendarData"));
|
||||
allLocales.addAll(metaInfo.get("FormatData"));
|
||||
metaInfo.put("AvailableLocales", allLocales);
|
||||
// For AvailableLocales
|
||||
metaInfo.get("AvailableLocales").add(toLanguageTag(bundle.getID()));
|
||||
}
|
||||
|
||||
bundleGenerator.generateMetaInfo(metaInfo);
|
||||
}
|
||||
|
||||
static final Map<String, String> aliases = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Translate the aliases into the real entries in the bundle map.
|
||||
*/
|
||||
static void handleAliases(Map<String, Object> bundleMap) {
|
||||
Set bundleKeys = bundleMap.keySet();
|
||||
try {
|
||||
for (String key : aliases.keySet()) {
|
||||
String targetKey = aliases.get(key);
|
||||
if (bundleKeys.contains(targetKey)) {
|
||||
bundleMap.putIfAbsent(key, bundleMap.get(targetKey));
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(CLDRConverter.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the language portion of the given id.
|
||||
* If id is "root", "" is returned.
|
||||
*/
|
||||
static String getLanguageCode(String id) {
|
||||
int index = id.indexOf('_');
|
||||
String lang = null;
|
||||
if (index != -1) {
|
||||
lang = id.substring(0, index);
|
||||
} else {
|
||||
lang = "root".equals(id) ? "" : id;
|
||||
}
|
||||
return lang;
|
||||
return "root".equals(id) ? "" : Locale.forLanguageTag(id.replaceAll("_", "-")).getLanguage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Examine if the id includes the country (territory) code. If it does, it returns
|
||||
* the country code.
|
||||
* Otherwise, it returns null. eg. when the id is "zh_Hans_SG", it return "SG".
|
||||
* For now, it does not return US M.49 code, e.g., '001', as those three digit numbers cannot
|
||||
* be translated into package names.
|
||||
*/
|
||||
private static String getCountryCode(String id) {
|
||||
//Truncate a variant code with '@' if there is any
|
||||
//(eg. de_DE@collation=phonebook,currency=DOM)
|
||||
if (id.indexOf('@') != -1) {
|
||||
id = id.substring(0, id.indexOf('@'));
|
||||
}
|
||||
String[] tokens = id.split("_");
|
||||
for (int index = 1; index < tokens.length; ++index) {
|
||||
if (tokens[index].length() == 2
|
||||
&& Character.isLetter(tokens[index].charAt(0))
|
||||
&& Character.isLetter(tokens[index].charAt(1))) {
|
||||
return tokens[index];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
static String getCountryCode(String id) {
|
||||
String ctry = Locale.forLanguageTag(id.replaceAll("_", "-")).getCountry();
|
||||
return ctry.length() == 2 ? ctry : null;
|
||||
}
|
||||
|
||||
private static class KeyComparator implements Comparator<String> {
|
||||
@ -598,6 +635,9 @@ public class CLDRConverter {
|
||||
private static Map<String, Object> extractFormatData(Map<String, Object> map, String id) {
|
||||
Map<String, Object> formatData = new LinkedHashMap<>();
|
||||
for (CalendarType calendarType : CalendarType.values()) {
|
||||
if (calendarType == CalendarType.GENERIC) {
|
||||
continue;
|
||||
}
|
||||
String prefix = calendarType.keyElementName();
|
||||
for (String element : FORMAT_DATA_ELEMENTS) {
|
||||
String key = prefix + element;
|
||||
@ -605,28 +645,15 @@ public class CLDRConverter {
|
||||
copyIfPresent(map, key, formatData);
|
||||
}
|
||||
}
|
||||
// Workaround for islamic-umalqura name support (JDK-8015986)
|
||||
switch (id) {
|
||||
case "ar":
|
||||
map.put(CLDRConverter.CALENDAR_NAME_PREFIX
|
||||
+ CalendarType.ISLAMIC_UMALQURA.lname(),
|
||||
// derived from CLDR 24 draft
|
||||
"\u0627\u0644\u062a\u0642\u0648\u064a\u0645 "
|
||||
+"\u0627\u0644\u0625\u0633\u0644\u0627\u0645\u064a "
|
||||
+"[\u0623\u0645 \u0627\u0644\u0642\u0631\u0649]");
|
||||
break;
|
||||
case "en":
|
||||
map.put(CLDRConverter.CALENDAR_NAME_PREFIX
|
||||
+ CalendarType.ISLAMIC_UMALQURA.lname(),
|
||||
// derived from CLDR 24 draft
|
||||
"Islamic Calendar [Umm al-Qura]");
|
||||
break;
|
||||
}
|
||||
// Copy available calendar names
|
||||
|
||||
for (String key : map.keySet()) {
|
||||
// Copy available calendar names
|
||||
if (key.startsWith(CLDRConverter.CALENDAR_NAME_PREFIX)) {
|
||||
String type = key.substring(CLDRConverter.CALENDAR_NAME_PREFIX.length());
|
||||
for (CalendarType calendarType : CalendarType.values()) {
|
||||
if (calendarType == CalendarType.GENERIC) {
|
||||
continue;
|
||||
}
|
||||
if (type.equals(calendarType.lname())) {
|
||||
Object value = map.get(key);
|
||||
formatData.put(key, value);
|
||||
@ -745,4 +772,43 @@ public class CLDRConverter {
|
||||
}
|
||||
return tag.replaceAll("-", "_");
|
||||
}
|
||||
|
||||
private static void setupBaseLocales(String localeList) {
|
||||
Arrays.stream(localeList.split(","))
|
||||
.map(Locale::forLanguageTag)
|
||||
.map(l -> Control.getControl(Control.FORMAT_DEFAULT)
|
||||
.getCandidateLocales("", l))
|
||||
.forEach(BASE_LOCALES::addAll);
|
||||
}
|
||||
|
||||
// applying parent locale rules to the passed candidates list
|
||||
// This has to match with the one in sun.util.cldr.CLDRLocaleProviderAdapter
|
||||
private static Map<Locale, Locale> childToParentLocaleMap = null;
|
||||
private static List<Locale> applyParentLocales(String baseName, List<Locale> candidates) {
|
||||
if (Objects.isNull(childToParentLocaleMap)) {
|
||||
childToParentLocaleMap = new HashMap<>();
|
||||
parentLocalesMap.keySet().forEach(key -> {
|
||||
String parent = key.substring(PARENT_LOCALE_PREFIX.length()).replaceAll("_", "-");
|
||||
parentLocalesMap.get(key).stream().forEach(child -> {
|
||||
childToParentLocaleMap.put(Locale.forLanguageTag(child),
|
||||
"root".equals(parent) ? Locale.ROOT : Locale.forLanguageTag(parent));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// check irregular parents
|
||||
for (int i = 0; i < candidates.size(); i++) {
|
||||
Locale l = candidates.get(i);
|
||||
Locale p = childToParentLocaleMap.get(l);
|
||||
if (!l.equals(Locale.ROOT) &&
|
||||
Objects.nonNull(p) &&
|
||||
!candidates.get(i+1).equals(p)) {
|
||||
List<Locale> applied = candidates.subList(0, i+1);
|
||||
applied.addAll(applyParentLocales(baseName, defCon.getCandidateLocales(baseName, p)));
|
||||
return applied;
|
||||
}
|
||||
}
|
||||
|
||||
return candidates;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -29,19 +29,21 @@ import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Constants for the Calendars supported by JRE.
|
||||
* Note that "GENERIC" calendar data will NOT be extracted to JDK's ResourceBundles.
|
||||
*/
|
||||
enum CalendarType {
|
||||
GREGORIAN("gregory"), BUDDHIST, JAPANESE, ROC,
|
||||
ISLAMIC, ISLAMIC_CIVIL("islamicc"), ISLAMIC_UMALQURA("islamic-umalqura");
|
||||
GENERIC, GREGORIAN("gregory"), BUDDHIST, JAPANESE, ROC,
|
||||
ISLAMIC, ISLAMIC_CIVIL("islamic-civil"), ISLAMIC_UMALQURA("islamic-umalqura");
|
||||
|
||||
private static final int[][] ERA_DATA = {
|
||||
// start index, array length
|
||||
{0, 2}, // generic
|
||||
{0, 2}, // gregorian
|
||||
{0, 1}, // buddhist
|
||||
{232, 4}, // japanese (eras from Meiji)
|
||||
{0, 2}, // roc (Minguo)
|
||||
{0, 1}, // islamic (Hijrah)
|
||||
{0, 1}, // islamicc (same as islamic)
|
||||
{0, 1}, // islamic-civil (same as islamic)
|
||||
{0, 1}, // islamic-umalqura
|
||||
};
|
||||
|
||||
@ -87,7 +89,7 @@ enum CalendarType {
|
||||
|
||||
static CalendarType forName(String name) {
|
||||
for (CalendarType type : values()) {
|
||||
if (type.lname.equals(name)) {
|
||||
if (type.lname.equals(name) || type.uname.equals(name)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -41,41 +41,46 @@ class CopyrightHeaders {
|
||||
" * Copyright (c) 2012, %d, Oracle and/or its affiliates. All rights reserved.\n" +
|
||||
" */\n";
|
||||
|
||||
// Last updated: - 1/16/2015, 1:42:31 PM
|
||||
private static final String UNICODE =
|
||||
"/*\n" +
|
||||
" * COPYRIGHT AND PERMISSION NOTICE\n" +
|
||||
" *\n" +
|
||||
" * Copyright (C) 1991-2012 Unicode, Inc. All rights reserved. Distributed under\n" +
|
||||
" * the Terms of Use in http://www.unicode.org/copyright.html.\n" +
|
||||
" * Copyright (C) 1991-2015 Unicode, Inc. All rights reserved.\n" +
|
||||
" * Distributed under the Terms of Use in \n" +
|
||||
" * http://www.unicode.org/copyright.html.\n" +
|
||||
" *\n" +
|
||||
" * Permission is hereby granted, free of charge, to any person obtaining a copy\n" +
|
||||
" * of the Unicode data files and any associated documentation (the \"Data\n" +
|
||||
" * Files\") or Unicode software and any associated documentation (the\n" +
|
||||
" * \"Software\") to deal in the Data Files or Software without restriction,\n" +
|
||||
" * including without limitation the rights to use, copy, modify, merge,\n" +
|
||||
" * publish, distribute, and/or sell copies of the Data Files or Software, and\n" +
|
||||
" * to permit persons to whom the Data Files or Software are furnished to do so,\n" +
|
||||
" * provided that (a) the above copyright notice(s) and this permission notice\n" +
|
||||
" * appear with all copies of the Data Files or Software, (b) both the above\n" +
|
||||
" * copyright notice(s) and this permission notice appear in associated\n" +
|
||||
" * documentation, and (c) there is clear notice in each modified Data File or\n" +
|
||||
" * in the Software as well as in the documentation associated with the Data\n" +
|
||||
" * File(s) or Software that the data or software has been modified.\n" +
|
||||
" * Permission is hereby granted, free of charge, to any person obtaining\n" +
|
||||
" * a copy of the Unicode data files and any associated documentation\n" +
|
||||
" * (the \"Data Files\") or Unicode software and any associated documentation\n" +
|
||||
" * (the \"Software\") to deal in the Data Files or Software\n" +
|
||||
" * without restriction, including without limitation the rights to use,\n" +
|
||||
" * copy, modify, merge, publish, distribute, and/or sell copies of\n" +
|
||||
" * the Data Files or Software, and to permit persons to whom the Data Files\n" +
|
||||
" * or Software are furnished to do so, provided that\n" +
|
||||
" * (a) this copyright and permission notice appear with all copies \n" +
|
||||
" * of the Data Files or Software,\n" +
|
||||
" * (b) this copyright and permission notice appear in associated \n" +
|
||||
" * documentation, and\n" +
|
||||
" * (c) there is clear notice in each modified Data File or in the Software\n" +
|
||||
" * as well as in the documentation associated with the Data File(s) or\n" +
|
||||
" * Software that the data or software has been modified.\n" +
|
||||
" *\n" +
|
||||
" * THE DATA FILES AND SOFTWARE ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY\n" +
|
||||
" * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n" +
|
||||
" * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF\n" +
|
||||
" * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS\n" +
|
||||
" * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR\n" +
|
||||
" * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,\n" +
|
||||
" * THE DATA FILES AND SOFTWARE ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n" +
|
||||
" * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n" +
|
||||
" * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n" +
|
||||
" * NONINFRINGEMENT OF THIRD PARTY RIGHTS.\n" +
|
||||
" * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS\n" +
|
||||
" * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL\n" +
|
||||
" * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,\n" +
|
||||
" * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n" +
|
||||
" * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE\n" +
|
||||
" * OF THE DATA FILES OR SOFTWARE.\n" +
|
||||
" * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n" +
|
||||
" * PERFORMANCE OF THE DATA FILES OR SOFTWARE.\n" +
|
||||
" *\n" +
|
||||
" * Except as contained in this notice, the name of a copyright holder shall not\n" +
|
||||
" * be used in advertising or otherwise to promote the sale, use or other\n" +
|
||||
" * dealings in these Data Files or Software without prior written authorization\n" +
|
||||
" * of the copyright holder.\n" +
|
||||
" * Except as contained in this notice, the name of a copyright holder\n" +
|
||||
" * shall not be used in advertising or otherwise to promote the sale,\n" +
|
||||
" * use or other dealings in these Data Files or Software without prior\n" +
|
||||
" * written authorization of the copyright holder.\n" +
|
||||
" */\n";
|
||||
|
||||
private static String OPENJDK2012 =
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -29,9 +29,11 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
@ -47,6 +49,8 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
private String zoneNameStyle; // "long" or "short" for time zone names
|
||||
private String zonePrefix;
|
||||
private final String id;
|
||||
private String currentContext = ""; // "format"/"stand-alone"
|
||||
private String currentWidth = ""; // "wide"/"narrow"/"abbreviated"
|
||||
|
||||
LDMLParseHandler(String id) {
|
||||
this.id = id;
|
||||
@ -78,20 +82,17 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
pushIgnoredContainer(qName);
|
||||
}
|
||||
break;
|
||||
|
||||
case "language":
|
||||
// for LocaleNames
|
||||
// copy string
|
||||
pushStringEntry(qName, attributes, CLDRConverter.LOCALE_NAME_PREFIX + attributes.getValue("type"));
|
||||
break;
|
||||
case "script":
|
||||
// for LocaleNames
|
||||
// copy string
|
||||
pushStringEntry(qName, attributes, CLDRConverter.LOCALE_NAME_PREFIX + attributes.getValue("type"));
|
||||
break;
|
||||
case "territory":
|
||||
case "variant":
|
||||
// for LocaleNames
|
||||
// copy string
|
||||
pushStringEntry(qName, attributes, CLDRConverter.LOCALE_NAME_PREFIX + attributes.getValue("type"));
|
||||
pushStringEntry(qName, attributes,
|
||||
CLDRConverter.LOCALE_NAME_PREFIX +
|
||||
(qName.equals("variant") ? "%%" : "") +
|
||||
attributes.getValue("type"));
|
||||
break;
|
||||
|
||||
//
|
||||
@ -112,9 +113,10 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// Calendar or currency
|
||||
case "displayName":
|
||||
{
|
||||
if (currentCalendarType != null) {
|
||||
if (currentContainer.getqName().equals("field")) {
|
||||
pushStringEntry(qName, attributes,
|
||||
currentCalendarType.keyElementName() + "field." + getContainerKey());
|
||||
(currentCalendarType != null ? currentCalendarType.keyElementName() : "")
|
||||
+ "field." + getContainerKey());
|
||||
} else {
|
||||
// for CurrencyNames
|
||||
// need to get the key from the containing <currency> element
|
||||
@ -149,10 +151,8 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
}
|
||||
break;
|
||||
case "fields":
|
||||
if (currentCalendarType != null) {
|
||||
{
|
||||
pushContainer(qName, attributes);
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
}
|
||||
break;
|
||||
case "field":
|
||||
@ -183,6 +183,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// need to keep stand-alone and format, to allow for inheritance in CLDR
|
||||
String type = attributes.getValue("type");
|
||||
if ("stand-alone".equals(type) || "format".equals(type)) {
|
||||
currentContext = type;
|
||||
pushKeyContainer(qName, attributes, type);
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
@ -194,8 +195,13 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// for FormatData
|
||||
// create string array for the two types that the JRE knows
|
||||
// keep info about the context type so we can sort out inheritance later
|
||||
if (currentCalendarType == null) {
|
||||
pushIgnoredContainer(qName);
|
||||
break;
|
||||
}
|
||||
String prefix = (currentCalendarType == null) ? "" : currentCalendarType.keyElementName();
|
||||
switch (attributes.getValue("type")) {
|
||||
currentWidth = attributes.getValue("type");
|
||||
switch (currentWidth) {
|
||||
case "wide":
|
||||
pushStringArrayEntry(qName, attributes, prefix + "MonthNames/" + getContainerKey(), 13);
|
||||
break;
|
||||
@ -222,6 +228,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// need to keep stand-alone and format, to allow for multiple inheritance in CLDR
|
||||
String type = attributes.getValue("type");
|
||||
if ("stand-alone".equals(type) || "format".equals(type)) {
|
||||
currentContext = type;
|
||||
pushKeyContainer(qName, attributes, type);
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
@ -234,7 +241,8 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// create string array for the two types that the JRE knows
|
||||
// keep info about the context type so we can sort out inheritance later
|
||||
String prefix = (currentCalendarType == null) ? "" : currentCalendarType.keyElementName();
|
||||
switch (attributes.getValue("type")) {
|
||||
currentWidth = attributes.getValue("type");
|
||||
switch (currentWidth) {
|
||||
case "wide":
|
||||
pushStringArrayEntry(qName, attributes, prefix + "DayNames/" + getContainerKey(), 7);
|
||||
break;
|
||||
@ -263,6 +271,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
{
|
||||
String type = attributes.getValue("type");
|
||||
if ("stand-alone".equals(type) || "format".equals(type)) {
|
||||
currentContext = type;
|
||||
pushKeyContainer(qName, attributes, type);
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
@ -272,7 +281,8 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
case "dayPeriodWidth":
|
||||
// for FormatData
|
||||
// create string array entry for am/pm. only keeping wide
|
||||
switch (attributes.getValue("type")) {
|
||||
currentWidth = attributes.getValue("type");
|
||||
switch (currentWidth) {
|
||||
case "wide":
|
||||
pushStringArrayEntry(qName, attributes, "AmPmMarkers/" + getContainerKey(), 2);
|
||||
break;
|
||||
@ -362,6 +372,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// need to keep stand-alone and format, to allow for inheritance in CLDR
|
||||
String type = attributes.getValue("type");
|
||||
if ("stand-alone".equals(type) || "format".equals(type)) {
|
||||
currentContext = type;
|
||||
pushKeyContainer(qName, attributes, type);
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
@ -373,7 +384,8 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// for FormatData
|
||||
// keep info about the context type so we can sort out inheritance later
|
||||
String prefix = (currentCalendarType == null) ? "" : currentCalendarType.keyElementName();
|
||||
switch (attributes.getValue("type")) {
|
||||
currentWidth = attributes.getValue("type");
|
||||
switch (currentWidth) {
|
||||
case "wide":
|
||||
pushStringArrayEntry(qName, attributes, prefix + "QuarterNames/" + getContainerKey(), 4);
|
||||
break;
|
||||
@ -450,12 +462,20 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
case "currencyFormat":
|
||||
// for FormatData
|
||||
// copy string for later assembly into NumberPatterns
|
||||
if (attributes.getValue("type").equals("standard")) {
|
||||
pushStringEntry(qName, attributes, "NumberPatterns/currency");
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
}
|
||||
break;
|
||||
case "percentFormat":
|
||||
// for FormatData
|
||||
// copy string for later assembly into NumberPatterns
|
||||
if (attributes.getValue("type").equals("standard")) {
|
||||
pushStringEntry(qName, attributes, "NumberPatterns/percent");
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
}
|
||||
break;
|
||||
case "defaultNumberingSystem":
|
||||
// default numbering system if multiple numbering systems are used.
|
||||
@ -582,12 +602,12 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
pushStringEntry(qName, attributes, prefix + "DateTimePatterns/" + attributes.getValue("type") + "-date");
|
||||
}
|
||||
break;
|
||||
case "dateTimeFormat":
|
||||
case "dateTimeFormatLength":
|
||||
{
|
||||
// for FormatData
|
||||
// copy string for later assembly into DateTimePatterns
|
||||
String prefix = (currentCalendarType == null) ? "" : currentCalendarType.keyElementName();
|
||||
pushStringEntry(qName, attributes, prefix + "DateTimePatterns/date-time");
|
||||
pushStringEntry(qName, attributes, prefix + "DateTimePatterns/" + attributes.getValue("type") + "-dateTime");
|
||||
}
|
||||
break;
|
||||
case "localizedPatternChars":
|
||||
@ -599,6 +619,20 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
}
|
||||
break;
|
||||
|
||||
// "alias" for root
|
||||
case "alias":
|
||||
{
|
||||
if (id.equals("root") &&
|
||||
!isIgnored(attributes) &&
|
||||
currentCalendarType != null &&
|
||||
!currentCalendarType.lname().startsWith("islamic-")) { // ignore Islamic variants
|
||||
pushAliasEntry(qName, attributes, attributes.getValue("path"));
|
||||
} else {
|
||||
pushIgnoredContainer(qName);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// treat anything else as a container
|
||||
pushContainer(qName, attributes);
|
||||
@ -606,6 +640,184 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String[] CONTEXTS = {"stand-alone", "format"};
|
||||
private static final String[] WIDTHS = {"wide", "narrow", "abbreviated"};
|
||||
private static final String[] LENGTHS = {"full", "long", "medium", "short"};
|
||||
|
||||
private void populateWidthAlias(String type, Set<String> keys) {
|
||||
for (String context : CONTEXTS) {
|
||||
for (String width : WIDTHS) {
|
||||
String keyName = toJDKKey(type+"Width", context, width);
|
||||
if (keyName.length() > 0) {
|
||||
keys.add(keyName + "," + context + "," + width);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void populateFormatLengthAlias(String type, Set<String> keys) {
|
||||
for (String length: LENGTHS) {
|
||||
String keyName = toJDKKey(type+"FormatLength", currentContext, length);
|
||||
if (keyName.length() > 0) {
|
||||
keys.add(keyName + "," + currentContext + "," + length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Set<String> populateAliasKeys(String qName, String context, String width) {
|
||||
HashSet<String> ret = new HashSet<>();
|
||||
String keyName = qName;
|
||||
|
||||
switch (qName) {
|
||||
case "monthWidth":
|
||||
case "dayWidth":
|
||||
case "quarterWidth":
|
||||
case "dayPeriodWidth":
|
||||
case "dateFormatLength":
|
||||
case "timeFormatLength":
|
||||
case "dateTimeFormatLength":
|
||||
case "eraNames":
|
||||
case "eraAbbr":
|
||||
case "eraNarrow":
|
||||
ret.add(toJDKKey(qName, context, width) + "," + context + "," + width);
|
||||
break;
|
||||
case "days":
|
||||
populateWidthAlias("day", ret);
|
||||
break;
|
||||
case "months":
|
||||
populateWidthAlias("month", ret);
|
||||
break;
|
||||
case "quarters":
|
||||
populateWidthAlias("quarter", ret);
|
||||
break;
|
||||
case "dayPeriods":
|
||||
populateWidthAlias("dayPeriod", ret);
|
||||
break;
|
||||
case "eras":
|
||||
ret.add(toJDKKey("eraNames", context, width) + "," + context + "," + width);
|
||||
ret.add(toJDKKey("eraAbbr", context, width) + "," + context + "," + width);
|
||||
ret.add(toJDKKey("eraNarrow", context, width) + "," + context + "," + width);
|
||||
break;
|
||||
case "dateFormats":
|
||||
populateFormatLengthAlias("date", ret);
|
||||
break;
|
||||
case "timeFormats":
|
||||
populateFormatLengthAlias("time", ret);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private String translateWidthAlias(String qName, String context, String width) {
|
||||
String keyName = qName;
|
||||
String type = Character.toUpperCase(qName.charAt(0)) + qName.substring(1, qName.indexOf("Width"));
|
||||
|
||||
switch (width) {
|
||||
case "wide":
|
||||
keyName = type + "Names/" + context;
|
||||
break;
|
||||
case "abbreviated":
|
||||
keyName = type + "Abbreviations/" + context;
|
||||
break;
|
||||
case "narrow":
|
||||
keyName = type + "Narrows/" + context;
|
||||
break;
|
||||
default:
|
||||
assert false;
|
||||
}
|
||||
|
||||
return keyName;
|
||||
}
|
||||
|
||||
private String toJDKKey(String containerqName, String context, String type) {
|
||||
String keyName = containerqName;
|
||||
|
||||
switch (containerqName) {
|
||||
case "monthWidth":
|
||||
case "dayWidth":
|
||||
case "quarterWidth":
|
||||
keyName = translateWidthAlias(keyName, context, type);
|
||||
break;
|
||||
case "dayPeriodWidth":
|
||||
switch (type) {
|
||||
case "wide":
|
||||
keyName = "AmPmMarkers/" + context;
|
||||
break;
|
||||
case "narrow":
|
||||
keyName = "narrow.AmPmMarkers/" + context;
|
||||
break;
|
||||
case "abbreviated":
|
||||
keyName = "";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "dateFormatLength":
|
||||
case "timeFormatLength":
|
||||
case "dateTimeFormatLength":
|
||||
keyName = "DateTimePatterns/" +
|
||||
type + "-" +
|
||||
keyName.substring(0, keyName.indexOf("FormatLength"));
|
||||
break;
|
||||
case "eraNames":
|
||||
keyName = "long.Eras";
|
||||
break;
|
||||
case "eraAbbr":
|
||||
keyName = "Eras";
|
||||
break;
|
||||
case "eraNarrow":
|
||||
keyName = "narrow.Eras";
|
||||
break;
|
||||
case "dateFormats":
|
||||
case "timeFormats":
|
||||
case "days":
|
||||
case "months":
|
||||
case "quarters":
|
||||
case "dayPeriods":
|
||||
case "eras":
|
||||
break;
|
||||
default:
|
||||
keyName = "";
|
||||
break;
|
||||
}
|
||||
|
||||
return keyName;
|
||||
}
|
||||
|
||||
private String getTarget(String qName, String path, String calType, String context, String width) {
|
||||
// qName
|
||||
int lastSlash = path.lastIndexOf('/');
|
||||
qName = path.substring(lastSlash+1);
|
||||
int bracket = qName.indexOf('[');
|
||||
if (bracket != -1) {
|
||||
qName = qName.substring(0, bracket);
|
||||
}
|
||||
|
||||
// calType
|
||||
String typeKey = "/calendar[@type='";
|
||||
int start = path.indexOf(typeKey);
|
||||
if (start != -1) {
|
||||
calType = path.substring(start+typeKey.length(), path.indexOf("']", start));
|
||||
}
|
||||
|
||||
// context
|
||||
typeKey = "Context[@type='";
|
||||
start = path.indexOf(typeKey);
|
||||
if (start != -1) {
|
||||
context = (path.substring(start+typeKey.length(), path.indexOf("']", start)));
|
||||
}
|
||||
|
||||
// width
|
||||
typeKey = "Width[@type='";
|
||||
start = path.indexOf(typeKey);
|
||||
if (start != -1) {
|
||||
width = path.substring(start+typeKey.length(), path.indexOf("']", start));
|
||||
}
|
||||
|
||||
return calType + "." + toJDKKey(qName, context, width);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||
assert qName.equals(currentContainer.getqName()) : "current=" + currentContainer.getqName() + ", param=" + qName;
|
||||
@ -628,6 +840,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
case "timeZoneNames":
|
||||
zonePrefix = null;
|
||||
break;
|
||||
|
||||
case "generic":
|
||||
case "standard":
|
||||
case "daylight":
|
||||
@ -638,8 +851,52 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
valmap.put(entry.getKey(), (String) entry.getValue());
|
||||
}
|
||||
break;
|
||||
|
||||
case "monthWidth":
|
||||
case "dayWidth":
|
||||
case "dayPeriodWidth":
|
||||
case "quarterWidth":
|
||||
currentWidth = "";
|
||||
putIfEntry();
|
||||
break;
|
||||
|
||||
case "monthContext":
|
||||
case "dayContext":
|
||||
case "dayPeriodContext":
|
||||
case "quarterContext":
|
||||
currentContext = "";
|
||||
putIfEntry();
|
||||
break;
|
||||
|
||||
default:
|
||||
if (currentContainer instanceof Entry) {
|
||||
putIfEntry();
|
||||
}
|
||||
currentContainer = currentContainer.getParent();
|
||||
}
|
||||
|
||||
private void putIfEntry() {
|
||||
if (currentContainer instanceof AliasEntry) {
|
||||
Entry<?> entry = (Entry<?>) currentContainer;
|
||||
String containerqName = entry.getParent().getqName();
|
||||
Set<String> keyNames = populateAliasKeys(containerqName, currentContext, currentWidth);
|
||||
if (!keyNames.isEmpty()) {
|
||||
for (String keyName : keyNames) {
|
||||
String[] tmp = keyName.split(",", 3);
|
||||
String calType = currentCalendarType.lname();
|
||||
String src = calType+"."+tmp[0];
|
||||
String target = getTarget(containerqName,
|
||||
entry.getKey(),
|
||||
calType,
|
||||
tmp[1].length()>0 ? tmp[1] : currentContext,
|
||||
tmp[2].length()>0 ? tmp[2] : currentWidth);
|
||||
if (target.substring(target.lastIndexOf('.')+1).equals(containerqName)) {
|
||||
target = target.substring(0, target.indexOf('.'))+"."+tmp[0];
|
||||
}
|
||||
CLDRConverter.aliases.put(src.replaceFirst("^gregorian.", ""),
|
||||
target.replaceFirst("^gregorian.", ""));
|
||||
}
|
||||
}
|
||||
} else if (currentContainer instanceof Entry) {
|
||||
Entry<?> entry = (Entry<?>) currentContainer;
|
||||
Object value = entry.getValue();
|
||||
if (value != null) {
|
||||
@ -647,6 +904,4 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
}
|
||||
}
|
||||
}
|
||||
currentContainer = currentContainer.getParent();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -30,22 +30,62 @@ import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Formatter;
|
||||
import java.util.HashSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
|
||||
class ResourceBundleGenerator implements BundleGenerator {
|
||||
// preferred timezones - keeping compatibility with JDK1.1 3 letter abbreviations
|
||||
private static final String[] preferredTZIDs = {
|
||||
"America/Los_Angeles",
|
||||
"America/Denver",
|
||||
"America/Phoenix",
|
||||
"America/Chicago",
|
||||
"America/New_York",
|
||||
"America/Indianapolis",
|
||||
"Pacific/Honolulu",
|
||||
"America/Anchorage",
|
||||
"America/Halifax",
|
||||
"America/Sitka",
|
||||
"America/St_Johns",
|
||||
"Europe/Paris",
|
||||
// Although CLDR does not support abbreviated zones, handle "GMT" as a
|
||||
// special case here, as it is specified in the javadoc.
|
||||
"GMT",
|
||||
"Africa/Casablanca",
|
||||
"Asia/Jerusalem",
|
||||
"Asia/Tokyo",
|
||||
"Europe/Bucharest",
|
||||
"Asia/Shanghai",
|
||||
};
|
||||
|
||||
// For duplicated values
|
||||
private static final String META_VALUE_PREFIX = "metaValue_";
|
||||
|
||||
@Override
|
||||
public void generateBundle(String packageName, String baseName, String localeID, boolean useJava,
|
||||
Map<String, ?> map, BundleType type) throws IOException {
|
||||
String suffix = useJava ? ".java" : ".properties";
|
||||
String lang = CLDRConverter.getLanguageCode(localeID);
|
||||
String ctry = CLDRConverter.getCountryCode(localeID);
|
||||
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator
|
||||
+ packageName + File.separator + "resources" + File.separator + "cldr";
|
||||
if (lang.length() > 0) {
|
||||
dirName = dirName + File.separator + lang;
|
||||
packageName = packageName + ".resources.cldr." + lang;
|
||||
if (CLDRConverter.isBaseModule ^ isBaseLocale(localeID)) {
|
||||
return;
|
||||
}
|
||||
dirName = dirName + File.separator + lang +
|
||||
(ctry != null && ctry.length() > 0 ? File.separator + ctry : "");
|
||||
packageName = packageName + ".resources.cldr." + lang +
|
||||
(ctry != null && ctry.length() > 0 ? "." + ctry : "");
|
||||
} else {
|
||||
if (!CLDRConverter.isBaseModule) {
|
||||
return;
|
||||
}
|
||||
packageName = packageName + ".resources.cldr";
|
||||
}
|
||||
File dir = new File(dirName);
|
||||
@ -89,6 +129,65 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
for (String key : metaKeys) {
|
||||
map.remove(key);
|
||||
}
|
||||
|
||||
// Make it preferred ordered
|
||||
LinkedHashMap<String, Object> newMap = new LinkedHashMap<>();
|
||||
for (String preferred : preferredTZIDs) {
|
||||
if (map.containsKey(preferred)) {
|
||||
newMap.put(preferred, map.remove(preferred));
|
||||
} else if ("GMT".equals(preferred) &&
|
||||
metaKeys.contains(CLDRConverter.METAZONE_ID_PREFIX+preferred)) {
|
||||
newMap.put(preferred, preferred);
|
||||
}
|
||||
}
|
||||
newMap.putAll(map);
|
||||
map = newMap;
|
||||
} else {
|
||||
// generic reduction of duplicated values
|
||||
Map<String, Object> newMap = null;
|
||||
for (String key : map.keySet()) {
|
||||
Object val = map.get(key);
|
||||
String metaVal = null;
|
||||
|
||||
for (Map.Entry<String, ?> entry : map.entrySet()) {
|
||||
String k = entry.getKey();
|
||||
if (!k.equals(key) &&
|
||||
Objects.deepEquals(val, entry.getValue()) &&
|
||||
!(Objects.nonNull(newMap) && newMap.containsKey(k))) {
|
||||
if (Objects.isNull(newMap)) {
|
||||
newMap = new HashMap<>();
|
||||
fmt = new Formatter();
|
||||
}
|
||||
|
||||
if (Objects.isNull(metaVal)) {
|
||||
metaVal = META_VALUE_PREFIX + key.replaceAll("\\.", "_");
|
||||
|
||||
if (val instanceof String[]) {
|
||||
fmt.format(" final String[] %s = new String[] {\n", metaVal);
|
||||
for (String s : (String[])val) {
|
||||
fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava));
|
||||
}
|
||||
fmt.format(" };\n");
|
||||
} else {
|
||||
fmt.format(" final String %s = \"%s\";\n", metaVal, CLDRConverter.saveConvert((String)val, useJava));
|
||||
}
|
||||
}
|
||||
|
||||
newMap.put(k, metaVal);
|
||||
}
|
||||
}
|
||||
|
||||
if (Objects.nonNull(metaVal)) {
|
||||
newMap.put(key, metaVal);
|
||||
}
|
||||
}
|
||||
|
||||
if (Objects.nonNull(newMap)) {
|
||||
for (String key : map.keySet()) {
|
||||
newMap.putIfAbsent(key, map.get(key));
|
||||
}
|
||||
map = newMap;
|
||||
}
|
||||
}
|
||||
|
||||
try (PrintWriter out = new PrintWriter(file, encoding)) {
|
||||
@ -114,7 +213,8 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
if (value == null) {
|
||||
CLDRConverter.warning("null value for " + key);
|
||||
} else if (value instanceof String) {
|
||||
if (type == BundleType.TIMEZONE) {
|
||||
if (type == BundleType.TIMEZONE ||
|
||||
((String)value).startsWith(META_VALUE_PREFIX)) {
|
||||
out.printf(" { \"%s\", %s },\n", key, CLDRConverter.saveConvert((String) value, useJava));
|
||||
} else {
|
||||
out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.saveConvert((String) value, useJava));
|
||||
@ -139,18 +239,22 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String METAINFO_CLASS = "CLDRLocaleDataMetaInfo";
|
||||
|
||||
@Override
|
||||
public void generateMetaInfo(Map<String, SortedSet<String>> metaInfo) throws IOException {
|
||||
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator + "util" +
|
||||
File.separator + "resources" + File.separator + "cldr" + File.separator +
|
||||
"provider" + File.separator ;
|
||||
File.separator +
|
||||
(CLDRConverter.isBaseModule ? "cldr" + File.separator + File.separator :
|
||||
"resources" + File.separator + "cldr" + File.separator + "provider" + File.separator);
|
||||
File dir = new File(dirName);
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
File file = new File(dir, METAINFO_CLASS + ".java");
|
||||
String className =
|
||||
(CLDRConverter.isBaseModule ? "CLDRBaseLocaleDataMetaInfo" :
|
||||
"CLDRLocaleDataMetaInfo_" +
|
||||
CLDRConverter.DESTINATION_DIR.substring(CLDRConverter.DESTINATION_DIR.lastIndexOf('/')+1)
|
||||
.replaceAll("\\.", "_"));
|
||||
File file = new File(dir, className + ".java");
|
||||
if (!file.exists()) {
|
||||
file.createNewFile();
|
||||
}
|
||||
@ -159,34 +263,71 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
try (PrintWriter out = new PrintWriter(file, "us-ascii")) {
|
||||
out.println(CopyrightHeaders.getOpenJDKCopyright());
|
||||
|
||||
out.println("package sun.util.resources.cldr.provider;\n\n"
|
||||
out.println((CLDRConverter.isBaseModule ? "package sun.util.cldr;\n\n" :
|
||||
"package sun.util.resources.cldr.provider;\n\n")
|
||||
+ "import java.util.HashMap;\n"
|
||||
+ "import java.util.Map;\n"
|
||||
+ "import java.util.ListResourceBundle;\n"
|
||||
+ "import sun.util.locale.provider.LocaleProviderAdapter;\n"
|
||||
+ "import sun.util.locale.provider.LocaleDataMetaInfo;\n");
|
||||
out.printf("public class %s extends ListResourceBundle implements LocaleDataMetaInfo {\n", METAINFO_CLASS);
|
||||
out.printf("public class %s extends ListResourceBundle implements LocaleDataMetaInfo {\n", className);
|
||||
out.println(" @Override\n" +
|
||||
" protected final Object[][] getContents() {\n" +
|
||||
" final Object[][] data = new Object[][] {");
|
||||
for (String key : metaInfo.keySet()) {
|
||||
out.printf(" { \"%s\",\n", key);
|
||||
out.printf(" \"%s\" },\n", toLocaleList(metaInfo.get(key)));
|
||||
out.printf(" \"%s\" },\n",
|
||||
toLocaleList(key.equals("FormatData") ? metaInfo.get("AvailableLocales") :
|
||||
metaInfo.get(key),
|
||||
key.startsWith(CLDRConverter.PARENT_LOCALE_PREFIX)));
|
||||
}
|
||||
out.println(" };\n return data;\n }\n\n");
|
||||
|
||||
out.println(" public LocaleProviderAdapter.Type getType() {\n" +
|
||||
out.println(" @Override\n" +
|
||||
" public LocaleProviderAdapter.Type getType() {\n" +
|
||||
" return LocaleProviderAdapter.Type.CLDR;\n" +
|
||||
" }\n\n");
|
||||
|
||||
out.println(" public String availableLanguageTags(String category) {\n" +
|
||||
out.println(" @Override\n" +
|
||||
" public String availableLanguageTags(String category) {\n" +
|
||||
" return getString(category);\n" +
|
||||
" };\n}");
|
||||
" };\n\n");
|
||||
|
||||
if (CLDRConverter.isBaseModule) {
|
||||
out.printf(" public Map<String, String> parentLocales() {\n" +
|
||||
" Map<String, String> ret = new HashMap<>();\n" +
|
||||
" keySet().stream()\n" +
|
||||
" .filter(key -> key.startsWith(\"%s\"))\n" +
|
||||
" .forEach(key -> ret.put(key.substring(%d), getString(key)));\n" +
|
||||
" return ret.isEmpty() ? null : ret;\n" +
|
||||
" };\n}",
|
||||
CLDRConverter.PARENT_LOCALE_PREFIX,
|
||||
CLDRConverter.PARENT_LOCALE_PREFIX.length());
|
||||
} else {
|
||||
out.println("}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String toLocaleList(SortedSet<String> set) {
|
||||
private static final Locale.Builder LOCALE_BUILDER = new Locale.Builder();
|
||||
private static boolean isBaseLocale(String localeID) {
|
||||
localeID = localeID.replaceAll("-", "_");
|
||||
// ignore script here
|
||||
Locale locale = LOCALE_BUILDER
|
||||
.clear()
|
||||
.setLanguage(CLDRConverter.getLanguageCode(localeID))
|
||||
.setRegion(CLDRConverter.getCountryCode(localeID))
|
||||
.build();
|
||||
return CLDRConverter.BASE_LOCALES.contains(locale);
|
||||
}
|
||||
|
||||
private static String toLocaleList(SortedSet<String> set, boolean all) {
|
||||
StringBuilder sb = new StringBuilder(set.size() * 6);
|
||||
for (String id : set) {
|
||||
if (!"root".equals(id)) {
|
||||
if (!all && CLDRConverter.isBaseModule ^ isBaseLocale(id)) {
|
||||
continue;
|
||||
}
|
||||
if (sb.length() > 0) {
|
||||
sb.append(' ');
|
||||
}
|
||||
|
@ -51,12 +51,21 @@ class SupplementDataParseHandler extends AbstractLDMLHandler<Object> {
|
||||
// When parsing the locale neutral file (supplementalData.xml),
|
||||
// we need to rely on the country code because
|
||||
// the weekData is listed using country code.
|
||||
//
|
||||
// weekData are generated per each country
|
||||
private final Map<String, Object> firstDayMap;
|
||||
private final Map<String, Object> minDaysMap;
|
||||
|
||||
// Parent locales. These information will only be
|
||||
// generated towards the base meta info, with the format of
|
||||
//
|
||||
// parentLocale.<parent_locale_id>=<child_locale_id>(" "<child_locale_id>)+
|
||||
private final Map<String, String> parentLocalesMap;
|
||||
|
||||
SupplementDataParseHandler() {
|
||||
firstDayMap = new HashMap<>();
|
||||
minDaysMap = new HashMap<>();
|
||||
parentLocalesMap = new HashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -68,16 +77,23 @@ class SupplementDataParseHandler extends AbstractLDMLHandler<Object> {
|
||||
* although this should not happen because supplementalData.xml includes
|
||||
* default value for the world ("001") for firstDay and minDays.
|
||||
*/
|
||||
Map<String, Object> getData(String country) {
|
||||
Map<String, Object> getData(String id) {
|
||||
Map<String, Object> values = new HashMap<>();
|
||||
String countryData = getWeekData(country, JAVA_FIRSTDAY, firstDayMap);
|
||||
if ("root".equals(id)) {
|
||||
parentLocalesMap.keySet().forEach(key -> {
|
||||
values.put(CLDRConverter.PARENT_LOCALE_PREFIX+key,
|
||||
parentLocalesMap.get(key));
|
||||
});
|
||||
} else {
|
||||
String countryData = getWeekData(id, JAVA_FIRSTDAY, firstDayMap);
|
||||
if (countryData != null) {
|
||||
values.put(JAVA_FIRSTDAY, countryData);
|
||||
}
|
||||
String minDaysData = getWeekData(country, JAVA_MINDAY, minDaysMap);
|
||||
String minDaysData = getWeekData(id, JAVA_MINDAY, minDaysMap);
|
||||
if (minDaysData != null) {
|
||||
values.put(JAVA_MINDAY, minDaysData);
|
||||
}
|
||||
}
|
||||
return values.isEmpty() ? null : values;
|
||||
}
|
||||
|
||||
@ -144,6 +160,13 @@ class SupplementDataParseHandler extends AbstractLDMLHandler<Object> {
|
||||
minDaysMap.put(attributes.getValue("territories"), attributes.getValue("count"));
|
||||
}
|
||||
break;
|
||||
case "parentLocale":
|
||||
if (!isIgnored(attributes)) {
|
||||
parentLocalesMap.put(
|
||||
attributes.getValue("parent").replaceAll("_", "-"),
|
||||
attributes.getValue("locales").replaceAll("_", "-"));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// treat anything else as a container
|
||||
pushContainer(qName, attributes);
|
||||
|
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.
|
||||
*/
|
||||
|
||||
package java.lang.invoke;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* Internal marker for some methods in the JSR 292 implementation.
|
||||
*/
|
||||
/*non-public*/
|
||||
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface InjectedProfile {
|
||||
}
|
@ -669,6 +669,11 @@ class InvokerBytecodeGenerator {
|
||||
switch (intr) {
|
||||
case SELECT_ALTERNATIVE:
|
||||
assert isSelectAlternative(i);
|
||||
if (PROFILE_GWT) {
|
||||
assert(name.arguments[0] instanceof Name &&
|
||||
nameRefersTo((Name)name.arguments[0], MethodHandleImpl.class, "profileBoolean"));
|
||||
mv.visitAnnotation("Ljava/lang/invoke/InjectedProfile;", true);
|
||||
}
|
||||
onStack = emitSelectAlternative(name, lambdaForm.names[i+1]);
|
||||
i++; // skip MH.invokeBasic of the selectAlternative result
|
||||
continue;
|
||||
|
@ -0,0 +1,267 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.
|
||||
*/
|
||||
package java.nio.file;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Spliterator;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* A file-based lines spliterator, leveraging a shared mapped byte buffer and
|
||||
* associated file channel, covering lines of a file for character encodings
|
||||
* where line feed characters can be easily identified from character encoded
|
||||
* bytes.
|
||||
*
|
||||
* <p>
|
||||
* When the root spliterator is first split a mapped byte buffer will be created
|
||||
* over the file for it's size that was observed when the stream was created.
|
||||
* Thus a mapped byte buffer is only required for parallel stream execution.
|
||||
* Sub-spliterators will share that mapped byte buffer. Splitting will use the
|
||||
* mapped byte buffer to find the closest line feed characters(s) to the left or
|
||||
* right of the mid-point of covered range of bytes of the file. If a line feed
|
||||
* is found then the spliterator is split with returned spliterator containing
|
||||
* the identified line feed characters(s) at the end of it's covered range of
|
||||
* bytes.
|
||||
*
|
||||
* <p>
|
||||
* Traversing will create a buffered reader, derived from the file channel, for
|
||||
* the range of bytes of the file. The lines are then read from that buffered
|
||||
* reader. Once traversing commences no further splitting can be performed and
|
||||
* the reference to the mapped byte buffer will be set to null.
|
||||
*/
|
||||
final class FileChannelLinesSpliterator implements Spliterator<String> {
|
||||
|
||||
static final Set<String> SUPPORTED_CHARSET_NAMES;
|
||||
static {
|
||||
SUPPORTED_CHARSET_NAMES = new HashSet<>();
|
||||
SUPPORTED_CHARSET_NAMES.add(StandardCharsets.UTF_8.name());
|
||||
SUPPORTED_CHARSET_NAMES.add(StandardCharsets.ISO_8859_1.name());
|
||||
SUPPORTED_CHARSET_NAMES.add(StandardCharsets.US_ASCII.name());
|
||||
}
|
||||
|
||||
private final FileChannel fc;
|
||||
private final Charset cs;
|
||||
private int index;
|
||||
private final int fence;
|
||||
|
||||
// Null before first split, non-null when splitting, null when traversing
|
||||
private ByteBuffer buffer;
|
||||
// Non-null when traversing
|
||||
private BufferedReader reader;
|
||||
|
||||
FileChannelLinesSpliterator(FileChannel fc, Charset cs, int index, int fence) {
|
||||
this.fc = fc;
|
||||
this.cs = cs;
|
||||
this.index = index;
|
||||
this.fence = fence;
|
||||
}
|
||||
|
||||
private FileChannelLinesSpliterator(FileChannel fc, Charset cs, int index, int fence, ByteBuffer buffer) {
|
||||
this.fc = fc;
|
||||
this.buffer = buffer;
|
||||
this.cs = cs;
|
||||
this.index = index;
|
||||
this.fence = fence;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tryAdvance(Consumer<? super String> action) {
|
||||
String line = readLine();
|
||||
if (line != null) {
|
||||
action.accept(line);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEachRemaining(Consumer<? super String> action) {
|
||||
String line;
|
||||
while ((line = readLine()) != null) {
|
||||
action.accept(line);
|
||||
}
|
||||
}
|
||||
|
||||
private BufferedReader getBufferedReader() {
|
||||
/**
|
||||
* A readable byte channel that reads bytes from an underlying
|
||||
* file channel over a specified range.
|
||||
*/
|
||||
ReadableByteChannel rrbc = new ReadableByteChannel() {
|
||||
@Override
|
||||
public int read(ByteBuffer dst) throws IOException {
|
||||
int bytesToRead = fence - index;
|
||||
if (bytesToRead == 0)
|
||||
return -1;
|
||||
|
||||
int bytesRead;
|
||||
if (bytesToRead < dst.remaining()) {
|
||||
// The number of bytes to read is less than remaining
|
||||
// bytes in the buffer
|
||||
// Snapshot the limit, reduce it, read, then restore
|
||||
int oldLimit = dst.limit();
|
||||
dst.limit(dst.position() + bytesToRead);
|
||||
bytesRead = fc.read(dst, index);
|
||||
dst.limit(oldLimit);
|
||||
} else {
|
||||
bytesRead = fc.read(dst, index);
|
||||
}
|
||||
if (bytesRead == -1) {
|
||||
index = fence;
|
||||
return bytesRead;
|
||||
}
|
||||
|
||||
index += bytesRead;
|
||||
return bytesRead;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpen() {
|
||||
return fc.isOpen();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
fc.close();
|
||||
}
|
||||
};
|
||||
return new BufferedReader(Channels.newReader(rrbc, cs.newDecoder(), -1));
|
||||
}
|
||||
|
||||
private String readLine() {
|
||||
if (reader == null) {
|
||||
reader = getBufferedReader();
|
||||
buffer = null;
|
||||
}
|
||||
|
||||
try {
|
||||
return reader.readLine();
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private ByteBuffer getMappedByteBuffer() {
|
||||
// TODO can the mapped byte buffer be explicitly unmapped?
|
||||
// It's possible, via a shared-secret mechanism, when either
|
||||
// 1) the spliterator starts traversing, although traversal can
|
||||
// happen concurrently for mulitple spliterators, so care is
|
||||
// needed in this case; or
|
||||
// 2) when the stream is closed using some shared holder to pass
|
||||
// the mapped byte buffer when it is created.
|
||||
try {
|
||||
return fc.map(FileChannel.MapMode.READ_ONLY, 0, fence);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Spliterator<String> trySplit() {
|
||||
// Cannot split after partial traverse
|
||||
if (reader != null)
|
||||
return null;
|
||||
|
||||
ByteBuffer b;
|
||||
if ((b = buffer) == null) {
|
||||
b = buffer = getMappedByteBuffer();
|
||||
}
|
||||
|
||||
final int hi = fence, lo = index;
|
||||
|
||||
// Check if line separator hits the mid point
|
||||
int mid = (lo + hi) >>> 1;
|
||||
int c = b.get(mid);
|
||||
if (c == '\n') {
|
||||
mid++;
|
||||
} else if (c == '\r') {
|
||||
// Check if a line separator of "\r\n"
|
||||
if (++mid < hi && b.get(mid) == '\n') {
|
||||
mid++;
|
||||
}
|
||||
} else {
|
||||
// TODO give up after a certain distance from the mid point?
|
||||
// Scan to the left and right of the mid point
|
||||
int midL = mid - 1;
|
||||
int midR = mid + 1;
|
||||
mid = 0;
|
||||
while (midL > lo && midR < hi) {
|
||||
// Sample to the left
|
||||
c = b.get(midL--);
|
||||
if (c == '\n' || c == '\r') {
|
||||
// If c is "\r" then no need to check for "\r\n"
|
||||
// since the subsequent value was previously checked
|
||||
mid = midL + 2;
|
||||
break;
|
||||
}
|
||||
|
||||
// Sample to the right
|
||||
c = b.get(midR++);
|
||||
if (c == '\n' || c == '\r') {
|
||||
mid = midR;
|
||||
// Check if line-separator is "\r\n"
|
||||
if (c == '\r' && mid < hi && b.get(mid) == '\n') {
|
||||
mid++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The left spliterator will have the line-separator at the end
|
||||
return (mid > lo && mid < hi)
|
||||
? new FileChannelLinesSpliterator(fc, cs, lo, index = mid, b)
|
||||
: null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long estimateSize() {
|
||||
// Use the number of bytes as an estimate.
|
||||
// We could divide by a constant that is the average number of
|
||||
// characters per-line, but that constant will be factored out.
|
||||
return fence - index;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getExactSizeIfKnown() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int characteristics() {
|
||||
return Spliterator.ORDERED | Spliterator.NONNULL;
|
||||
}
|
||||
}
|
@ -38,6 +38,7 @@ import java.io.Reader;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.io.Writer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.SeekableByteChannel;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CharsetDecoder;
|
||||
@ -3735,6 +3736,7 @@ public final class Files {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read all lines from a file as a {@code Stream}. Unlike {@link
|
||||
* #readAllLines(Path, Charset) readAllLines}, this method does not read
|
||||
@ -3748,6 +3750,10 @@ public final class Files {
|
||||
* <p> The returned stream contains a reference to an open file. The file
|
||||
* is closed by closing the stream.
|
||||
*
|
||||
* <p> The file contents should not be modified during the execution of the
|
||||
* terminal stream operation. Otherwise, the result of the terminal stream
|
||||
* operation is undefined.
|
||||
*
|
||||
* <p> After this method returns, then any subsequent I/O exception that
|
||||
* occurs while reading from the file or when a malformed or unmappable byte
|
||||
* sequence is read, is wrapped in an {@link UncheckedIOException} that will
|
||||
@ -3761,6 +3767,30 @@ public final class Files {
|
||||
* control structure to ensure that the stream's open file is closed promptly
|
||||
* after the stream's operations have completed.
|
||||
*
|
||||
* @implNote
|
||||
* This implementation supports good parallel stream performance for the
|
||||
* standard charsets {@link StandardCharsets#UTF_8 UTF-8},
|
||||
* {@link StandardCharsets#US_ASCII US-ASCII} and
|
||||
* {@link StandardCharsets#ISO_8859_1 ISO-8859-1}. Such
|
||||
* <em>line-optimal</em> charsets have the property that the encoded bytes
|
||||
* of a line feed ('\n') or a carriage return ('\r') are efficiently
|
||||
* identifiable from other encoded characters when randomly accessing the
|
||||
* bytes of the file.
|
||||
*
|
||||
* <p> For non-<em>line-optimal</em> charsets the stream source's
|
||||
* spliterator has poor splitting properties, similar to that of a
|
||||
* spliterator associated with an iterator or that associated with a stream
|
||||
* returned from {@link BufferedReader#lines()}. Poor splitting properties
|
||||
* can result in poor parallel stream performance.
|
||||
*
|
||||
* <p> For <em>line-optimal</em> charsets the stream source's spliterator
|
||||
* has good splitting properties, assuming the file contains a regular
|
||||
* sequence of lines. Good splitting properties can result in good parallel
|
||||
* stream performance. The spliterator for a <em>line-optimal</em> charset
|
||||
* takes advantage of the charset properties (a line feed or a carriage
|
||||
* return being efficient identifiable) such that when splitting it can
|
||||
* approximately divide the number of covered lines in half.
|
||||
*
|
||||
* @param path
|
||||
* the path to the file
|
||||
* @param cs
|
||||
@ -3781,7 +3811,50 @@ public final class Files {
|
||||
* @since 1.8
|
||||
*/
|
||||
public static Stream<String> lines(Path path, Charset cs) throws IOException {
|
||||
BufferedReader br = Files.newBufferedReader(path, cs);
|
||||
// Use the good splitting spliterator if:
|
||||
// 1) the path is associated with the default file system;
|
||||
// 2) the character set is supported; and
|
||||
// 3) the file size is such that all bytes can be indexed by int values
|
||||
// (this limitation is imposed by ByteBuffer)
|
||||
if (path.getFileSystem() == FileSystems.getDefault() &&
|
||||
FileChannelLinesSpliterator.SUPPORTED_CHARSET_NAMES.contains(cs.name())) {
|
||||
FileChannel fc = FileChannel.open(path, StandardOpenOption.READ);
|
||||
|
||||
Stream<String> fcls = createFileChannelLinesStream(fc, cs);
|
||||
if (fcls != null) {
|
||||
return fcls;
|
||||
}
|
||||
fc.close();
|
||||
}
|
||||
|
||||
return createBufferedReaderLinesStream(Files.newBufferedReader(path, cs));
|
||||
}
|
||||
|
||||
private static Stream<String> createFileChannelLinesStream(FileChannel fc, Charset cs) throws IOException {
|
||||
try {
|
||||
// Obtaining the size from the FileChannel is much faster
|
||||
// than obtaining using path.toFile().length()
|
||||
long length = fc.size();
|
||||
if (length <= Integer.MAX_VALUE) {
|
||||
Spliterator<String> s = new FileChannelLinesSpliterator(fc, cs, 0, (int) length);
|
||||
return StreamSupport.stream(s, false)
|
||||
.onClose(Files.asUncheckedRunnable(fc));
|
||||
}
|
||||
} catch (Error|RuntimeException|IOException e) {
|
||||
try {
|
||||
fc.close();
|
||||
} catch (IOException ex) {
|
||||
try {
|
||||
e.addSuppressed(ex);
|
||||
} catch (Throwable ignore) {
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Stream<String> createBufferedReaderLinesStream(BufferedReader br) {
|
||||
try {
|
||||
return br.lines().onClose(asUncheckedRunnable(br));
|
||||
} catch (Error|RuntimeException e) {
|
||||
@ -3790,7 +3863,8 @@ public final class Files {
|
||||
} catch (IOException ex) {
|
||||
try {
|
||||
e.addSuppressed(ex);
|
||||
} catch (Throwable ignore) {}
|
||||
} catch (Throwable ignore) {
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
@ -3804,6 +3878,10 @@ public final class Files {
|
||||
* <p> The returned stream contains a reference to an open file. The file
|
||||
* is closed by closing the stream.
|
||||
*
|
||||
* <p> The file contents should not be modified during the execution of the
|
||||
* terminal stream operation. Otherwise, the result of the terminal stream
|
||||
* operation is undefined.
|
||||
*
|
||||
* <p> This method works as if invoking it were equivalent to evaluating the
|
||||
* expression:
|
||||
* <pre>{@code
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2015, 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
|
||||
@ -41,30 +41,22 @@ import java.util.function.Function;
|
||||
*
|
||||
* <ul>
|
||||
*
|
||||
* <li>Algorithms (such as DSA, RSA, MD5 or SHA-1).
|
||||
* <li>Algorithms (such as DSA, RSA, or SHA-256).
|
||||
*
|
||||
* <li>Key generation, conversion, and management facilities (such as for
|
||||
* algorithm-specific keys).
|
||||
*
|
||||
*</ul>
|
||||
*
|
||||
* <p>Each provider has a name and a version number, and is configured
|
||||
* in each runtime it is installed in.
|
||||
*
|
||||
* <p>See <a href =
|
||||
* "../../../technotes/guides/security/crypto/CryptoSpec.html#Provider">The Provider Class</a>
|
||||
* in the "Java Cryptography Architecture API Specification & Reference"
|
||||
* for information about how a particular type of provider, the
|
||||
* cryptographic service provider, works and is installed. However,
|
||||
* please note that a provider can be used to implement any security
|
||||
* service in Java that uses a pluggable architecture with a choice
|
||||
* of implementations that fit underneath.
|
||||
* </ul>
|
||||
*
|
||||
* <p>Some provider implementations may encounter unrecoverable internal
|
||||
* errors during their operation, for example a failure to communicate with a
|
||||
* security token. A {@link ProviderException} should be used to indicate
|
||||
* such errors.
|
||||
*
|
||||
* <p>Please note that a provider can be used to implement any security
|
||||
* service in Java that uses a pluggable architecture with a choice
|
||||
* of implementations that fit underneath.
|
||||
*
|
||||
* <p>The service type {@code Provider} is reserved for use by the
|
||||
* security framework. Services of this type cannot be added, removed,
|
||||
* or modified by applications.
|
||||
@ -82,6 +74,28 @@ import java.util.function.Function;
|
||||
* <td>{@code provider.getClass().getName()}</td>
|
||||
* </table>
|
||||
*
|
||||
* <p>Each provider has a name and a version number. A provider normally
|
||||
* identifies itself with a file named {@code java.security.Provider}
|
||||
* in the resource directory {@code META-INF/services}.
|
||||
* Security providers are looked up via the {@link ServiceLoader} mechanism
|
||||
* using the {@link ClassLoader#getSystemClassLoader application class loader}.
|
||||
*
|
||||
* <p>Providers may be configured such that they are automatically
|
||||
* installed and made available at runtime via the
|
||||
* {@link Security#getProviders() Security.getProviders()} method.
|
||||
* The mechanism for configuring and installing security providers is
|
||||
* implementation-specific.
|
||||
*
|
||||
* @implNote
|
||||
* The JDK implementation supports static registration of the security
|
||||
* providers via the {@code conf/security/java.security} file in the Java
|
||||
* installation directory. These providers are automatically installed by
|
||||
* the JDK runtime, see <a href =
|
||||
* "../../../technotes/guides/security/crypto/CryptoSpec.html#Provider">The Provider Class</a>
|
||||
* in the "Java Cryptography Architecture API Specification & Reference"
|
||||
* for information about how a particular type of provider, the cryptographic
|
||||
* service provider, works and is installed.
|
||||
*
|
||||
* @author Benjamin Renaud
|
||||
* @author Andreas Sterbenz
|
||||
*/
|
||||
@ -121,6 +135,18 @@ public abstract class Provider extends Properties {
|
||||
|
||||
private transient boolean initialized;
|
||||
|
||||
private static Object newInstanceUtil(final Class<?> clazz,
|
||||
final Class<?> ctrParamClz, final Object ctorParamObj)
|
||||
throws Exception {
|
||||
if (ctrParamClz == null) {
|
||||
Constructor<?> con = clazz.getConstructor();
|
||||
return con.newInstance();
|
||||
} else {
|
||||
Constructor<?> con = clazz.getConstructor(ctrParamClz);
|
||||
return con.newInstance(ctorParamObj);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a provider with the specified name, version number,
|
||||
* and information.
|
||||
@ -139,6 +165,34 @@ public abstract class Provider extends Properties {
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply the supplied configuration argument to this provider instance
|
||||
* and return the configured provider. Note that if this provider cannot
|
||||
* be configured in-place, a new provider will be created and returned.
|
||||
* Therefore, callers should always use the returned provider.
|
||||
*
|
||||
* @implSpec
|
||||
* The default implementation throws {@code UnsupportedOperationException}.
|
||||
* Subclasses should override this method only if a configuration argument
|
||||
* is supported.
|
||||
*
|
||||
* @param configArg the configuration information for configuring this
|
||||
* provider.
|
||||
*
|
||||
* @throws UnsupportedOperationException if a configuration argument is
|
||||
* not supported.
|
||||
* @throws NullPointerException if the supplied configuration argument is
|
||||
null.
|
||||
* @throws InvalidParameterException if the supplied configuration argument
|
||||
* is invalid.
|
||||
* @return a provider configured with the supplied configuration argument.
|
||||
*
|
||||
* @since 1.9
|
||||
*/
|
||||
public Provider configure(String configArg) {
|
||||
throw new UnsupportedOperationException("configure is not supported");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this provider.
|
||||
*
|
||||
@ -212,8 +266,8 @@ public abstract class Provider extends Properties {
|
||||
/**
|
||||
* Reads a property list (key and element pairs) from the input stream.
|
||||
*
|
||||
* @param inStream the input stream.
|
||||
* @exception IOException if an error occurred when reading from the
|
||||
* @param inStream the input stream.
|
||||
* @exception IOException if an error occurred when reading from the
|
||||
* input stream.
|
||||
* @see java.util.Properties#load
|
||||
*/
|
||||
@ -1579,39 +1633,35 @@ public abstract class Provider extends Properties {
|
||||
}
|
||||
registered = true;
|
||||
}
|
||||
Class<?> ctrParamClz;
|
||||
try {
|
||||
EngineDescription cap = knownEngines.get(type);
|
||||
if (cap == null) {
|
||||
// unknown engine type, use generic code
|
||||
// this is the code path future for non-core
|
||||
// optional packages
|
||||
return newInstanceGeneric(constructorParameter);
|
||||
}
|
||||
if (cap.constructorParameterClassName == null) {
|
||||
if (constructorParameter != null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter not used with " + type
|
||||
+ " engines");
|
||||
}
|
||||
Class<?> clazz = getImplClass();
|
||||
Class<?>[] empty = {};
|
||||
Constructor<?> con = clazz.getConstructor(empty);
|
||||
return con.newInstance();
|
||||
ctrParamClz = constructorParameter == null?
|
||||
null : constructorParameter.getClass();
|
||||
} else {
|
||||
Class<?> paramClass = cap.getConstructorParameterClass();
|
||||
ctrParamClz = cap.constructorParameterClassName == null?
|
||||
null : Class.forName(cap.constructorParameterClassName);
|
||||
if (constructorParameter != null) {
|
||||
Class<?> argClass = constructorParameter.getClass();
|
||||
if (paramClass.isAssignableFrom(argClass) == false) {
|
||||
if (ctrParamClz == null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter must be instanceof "
|
||||
+ cap.constructorParameterClassName.replace('$', '.')
|
||||
+ " for engine type " + type);
|
||||
("constructorParameter not used with " + type
|
||||
+ " engines");
|
||||
} else {
|
||||
Class<?> argClass = constructorParameter.getClass();
|
||||
if (ctrParamClz.isAssignableFrom(argClass) == false) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter must be instanceof "
|
||||
+ cap.constructorParameterClassName.replace('$', '.')
|
||||
+ " for engine type " + type);
|
||||
}
|
||||
}
|
||||
}
|
||||
Class<?> clazz = getImplClass();
|
||||
Constructor<?> cons = clazz.getConstructor(paramClass);
|
||||
return cons.newInstance(constructorParameter);
|
||||
}
|
||||
return newInstanceUtil(getImplClass(), ctrParamClz, constructorParameter);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw e;
|
||||
} catch (InvocationTargetException e) {
|
||||
@ -1654,43 +1704,6 @@ public abstract class Provider extends Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic code path for unknown engine types. Call the
|
||||
* no-args constructor if constructorParameter is null, otherwise
|
||||
* use the first matching constructor.
|
||||
*/
|
||||
private Object newInstanceGeneric(Object constructorParameter)
|
||||
throws Exception {
|
||||
Class<?> clazz = getImplClass();
|
||||
if (constructorParameter == null) {
|
||||
// create instance with public no-arg constructor if it exists
|
||||
try {
|
||||
Class<?>[] empty = {};
|
||||
Constructor<?> con = clazz.getConstructor(empty);
|
||||
return con.newInstance();
|
||||
} catch (NoSuchMethodException e) {
|
||||
throw new NoSuchAlgorithmException("No public no-arg "
|
||||
+ "constructor found in class " + className);
|
||||
}
|
||||
}
|
||||
Class<?> argClass = constructorParameter.getClass();
|
||||
Constructor<?>[] cons = clazz.getConstructors();
|
||||
// find first public constructor that can take the
|
||||
// argument as parameter
|
||||
for (Constructor<?> con : cons) {
|
||||
Class<?>[] paramTypes = con.getParameterTypes();
|
||||
if (paramTypes.length != 1) {
|
||||
continue;
|
||||
}
|
||||
if (paramTypes[0].isAssignableFrom(argClass) == false) {
|
||||
continue;
|
||||
}
|
||||
return con.newInstance(constructorParameter);
|
||||
}
|
||||
throw new NoSuchAlgorithmException("No public constructor matching "
|
||||
+ argClass.getName() + " found in class " + className);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test whether this Service can use the specified parameter.
|
||||
* Returns false if this service cannot use the parameter. Returns
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2015, 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
|
||||
@ -41,7 +41,7 @@ import sun.security.jca.*;
|
||||
*
|
||||
* <p>The default values of security properties are read from an
|
||||
* implementation-specific location, which is typically the properties file
|
||||
* {@code lib/security/java.security} in the Java installation directory.
|
||||
* {@code conf/security/java.security} in the Java installation directory.
|
||||
*
|
||||
* @author Benjamin Renaud
|
||||
*/
|
||||
|
@ -737,7 +737,7 @@ public class Base64 {
|
||||
// anything left is invalid, if is not MIME.
|
||||
// if MIME, ignore all non-base64 character
|
||||
while (sp < sl) {
|
||||
if (isMIME && base64[src[sp++]] < 0)
|
||||
if (isMIME && base64[src[sp++] & 0xff] < 0)
|
||||
continue;
|
||||
throw new IllegalArgumentException(
|
||||
"Input byte array has incorrect ending byte at " + sp);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -242,8 +242,6 @@ public class DoubleSummaryStatistics implements DoubleConsumer {
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Returns a non-empty string representation of this object suitable for
|
||||
* debugging. The exact presentation format is unspecified and may vary
|
||||
* between implementations and versions.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -150,14 +150,12 @@ public class IntSummaryStatistics implements IntConsumer {
|
||||
return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Returns a non-empty string representation of this object suitable for
|
||||
* debugging. The exact presentation format is unspecified and may vary
|
||||
* between implementations and versions.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format(
|
||||
"%s{count=%d, sum=%d, min=%d, average=%f, max=%d}",
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -162,14 +162,12 @@ public class LongSummaryStatistics implements LongConsumer, IntConsumer {
|
||||
return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Returns a non-empty string representation of this object suitable for
|
||||
* debugging. The exact presentation format is unspecified and may vary
|
||||
* between implementations and versions.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format(
|
||||
"%s{count=%d, sum=%d, min=%d, average=%f, max=%d}",
|
||||
|
@ -112,29 +112,36 @@ import java.util.Locale;
|
||||
* provider returns null instead of a name, the lookup will proceed as
|
||||
* described above as if the locale was not supported.
|
||||
* <p>
|
||||
* Starting from JDK8, the search order of locale sensitive services can
|
||||
* The search order of locale sensitive services can
|
||||
* be configured by using the "java.locale.providers" system property.
|
||||
* This system property declares the user's preferred order for looking up
|
||||
* the locale sensitive services separated by a comma. It is only read at
|
||||
* the Java runtime startup, so the later call to System.setProperty() won't
|
||||
* affect the order.
|
||||
* <p>
|
||||
* Java Runtime Environment provides the following four locale providers:
|
||||
* <ul>
|
||||
* <li> "CLDR": A provider based on Unicode Consortium's
|
||||
* <a href="http://cldr.unicode.org/">CLDR Project</a>.
|
||||
* <li> "JRE": represents the locale sensitive services that is compatible
|
||||
* with the prior JDK releases (same with JDK8's "JRE").
|
||||
* <li> "SPI": represents the locale sensitive services implementing the subclasses of
|
||||
* this {@code LocaleServiceProvider} class.
|
||||
* <li> "HOST": A provider that reflects the user's custom settings in the
|
||||
* underlying operating system. This provider may not be available, depending
|
||||
* on the Java Runtime Environment implementation.
|
||||
* </ul>
|
||||
* <p>
|
||||
* For example, if the following is specified in the property:
|
||||
* <pre>
|
||||
* java.locale.providers=SPI,JRE
|
||||
* java.locale.providers=SPI,CLDR,JRE
|
||||
* </pre>
|
||||
* where "SPI" represents the locale sensitive services implemented in the
|
||||
* installed SPI providers, and "JRE" represents the locale sensitive services
|
||||
* in the Java Runtime Environment, the locale sensitive services in the SPI
|
||||
* providers are looked up first.
|
||||
* the locale sensitive services in the SPI providers are looked up first. If the
|
||||
* desired locale sensitive service is not available, then the runtime looks for CLDR,
|
||||
* JRE in that order.
|
||||
* <p>
|
||||
* There are two other possible locale sensitive service providers, i.e., "CLDR"
|
||||
* which is a provider based on Unicode Consortium's
|
||||
* <a href="http://cldr.unicode.org/">CLDR Project</a>, and "HOST" which is a
|
||||
* provider that reflects the user's custom settings in the underlying operating
|
||||
* system. These two providers may not be available, depending on the Java Runtime
|
||||
* Environment implementation. Specifying "JRE,SPI" is identical to the default
|
||||
* behavior, which is compatibile with the prior releases.
|
||||
* The default order for looking up the preferred locale providers is "CLDR,JRE,SPI",
|
||||
* so specifying "CLDR,JRE,SPI" is identical to the default behavior.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
|
@ -249,6 +249,11 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
|
||||
// If the last intermediate operation is stateful then
|
||||
// evaluate directly to avoid an extra collection step
|
||||
if (isParallel() && previousStage != null && opIsStateful()) {
|
||||
// Set the depth of this, last, pipeline stage to zero to slice the
|
||||
// pipeline such that this operation will not be included in the
|
||||
// upstream slice and upstream operations will not be included
|
||||
// in this slice
|
||||
depth = 0;
|
||||
return opEvaluateParallel(previousStage, previousStage.sourceSpliterator(0), generator);
|
||||
}
|
||||
else {
|
||||
@ -402,47 +407,19 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
|
||||
throw new IllegalStateException(MSG_CONSUMED);
|
||||
}
|
||||
|
||||
boolean hasTerminalFlags = terminalFlags != 0;
|
||||
if (isParallel() && sourceStage.sourceAnyStateful) {
|
||||
// Adjust pipeline stages if there are stateful ops,
|
||||
// and find the last short circuiting op, if any, that
|
||||
// defines the head stage for back-propagation of terminal flags
|
||||
@SuppressWarnings("rawtypes")
|
||||
AbstractPipeline backPropagationHead = sourceStage;
|
||||
int depth = 1;
|
||||
for (@SuppressWarnings("rawtypes") AbstractPipeline p = sourceStage.nextStage;
|
||||
p != null;
|
||||
p = p.nextStage) {
|
||||
if (p.opIsStateful()) {
|
||||
if (StreamOpFlag.SHORT_CIRCUIT.isKnown(p.sourceOrOpFlags)) {
|
||||
// If the stateful operation is a short-circuit operation
|
||||
// then move the back propagation head forwards
|
||||
// NOTE: there are no size-injecting ops
|
||||
backPropagationHead = p;
|
||||
}
|
||||
|
||||
depth = 0;
|
||||
}
|
||||
p.depth = depth++;
|
||||
}
|
||||
|
||||
// Adapt the source spliterator, evaluating each stateful op
|
||||
// in the pipeline up to and including this pipeline stage
|
||||
// Flags for each pipeline stage are adjusted accordingly
|
||||
boolean backPropagate = false;
|
||||
int upstreamTerminalFlags = terminalFlags & StreamOpFlag.UPSTREAM_TERMINAL_OP_MASK;
|
||||
// in the pipeline up to and including this pipeline stage.
|
||||
// The depth and flags of each pipeline stage are adjusted accordingly.
|
||||
int depth = 1;
|
||||
for (@SuppressWarnings("rawtypes") AbstractPipeline u = sourceStage, p = sourceStage.nextStage, e = this;
|
||||
u != e;
|
||||
u = p, p = p.nextStage) {
|
||||
|
||||
if (hasTerminalFlags &&
|
||||
(backPropagate || (backPropagate = (u == backPropagationHead)))) {
|
||||
// Back-propagate flags from the terminal operation
|
||||
u.combinedFlags = StreamOpFlag.combineOpFlags(upstreamTerminalFlags, u.combinedFlags);
|
||||
}
|
||||
|
||||
int thisOpFlags = p.sourceOrOpFlags;
|
||||
if (p.opIsStateful()) {
|
||||
depth = 0;
|
||||
|
||||
if (StreamOpFlag.SHORT_CIRCUIT.isKnown(thisOpFlags)) {
|
||||
// Clear the short circuit flag for next pipeline stage
|
||||
// This stage encapsulates short-circuiting, the next
|
||||
@ -460,11 +437,12 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
|
||||
? (thisOpFlags & ~StreamOpFlag.NOT_SIZED) | StreamOpFlag.IS_SIZED
|
||||
: (thisOpFlags & ~StreamOpFlag.IS_SIZED) | StreamOpFlag.NOT_SIZED;
|
||||
}
|
||||
p.depth = depth++;
|
||||
p.combinedFlags = StreamOpFlag.combineOpFlags(thisOpFlags, u.combinedFlags);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasTerminalFlags) {
|
||||
if (terminalFlags != 0) {
|
||||
// Apply flags from the terminal operation to last pipeline stage
|
||||
combinedFlags = StreamOpFlag.combineOpFlags(terminalFlags, combinedFlags);
|
||||
}
|
||||
@ -472,7 +450,6 @@ abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>>
|
||||
return spliterator;
|
||||
}
|
||||
|
||||
|
||||
// PipelineHelper
|
||||
|
||||
@Override
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, 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
|
||||
@ -27,14 +27,15 @@ package sun.security.jca;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
import java.security.*;
|
||||
|
||||
import sun.security.util.PropertyExpander;
|
||||
|
||||
/**
|
||||
* Class representing a configured provider. Encapsulates configuration
|
||||
* (className plus optional argument), the provider loading logic, and
|
||||
* Class representing a configured provider which encapsulates configuration
|
||||
* (provider name + optional argument), the provider loading logic, and
|
||||
* the loaded Provider object itself.
|
||||
*
|
||||
* @author Andreas Sterbenz
|
||||
@ -45,9 +46,8 @@ final class ProviderConfig {
|
||||
private final static sun.security.util.Debug debug =
|
||||
sun.security.util.Debug.getInstance("jca", "ProviderConfig");
|
||||
|
||||
// classname of the SunPKCS11-Solaris provider
|
||||
private static final String P11_SOL_NAME =
|
||||
"sun.security.pkcs11.SunPKCS11";
|
||||
// suffix for identifying the SunPKCS11-Solaris provider
|
||||
private static final String P11_SOL_NAME = "SunPKCS11";
|
||||
|
||||
// config file argument of the SunPKCS11-Solaris provider
|
||||
private static final String P11_SOL_ARG =
|
||||
@ -56,15 +56,10 @@ final class ProviderConfig {
|
||||
// maximum number of times to try loading a provider before giving up
|
||||
private final static int MAX_LOAD_TRIES = 30;
|
||||
|
||||
// parameters for the Provider(String) constructor,
|
||||
// use by doLoadProvider()
|
||||
private final static Class<?>[] CL_STRING = { String.class };
|
||||
// could be provider name (module) or provider class name (legacy)
|
||||
private final String provName;
|
||||
|
||||
// name of the provider class
|
||||
private final String className;
|
||||
|
||||
// argument to the provider constructor,
|
||||
// empty string indicates no-arg constructor
|
||||
// argument to the Provider.configure() call, never null
|
||||
private final String argument;
|
||||
|
||||
// number of times we have already tried to load this provider
|
||||
@ -77,20 +72,20 @@ final class ProviderConfig {
|
||||
// used to detect recursion
|
||||
private boolean isLoading;
|
||||
|
||||
ProviderConfig(String className, String argument) {
|
||||
if (className.equals(P11_SOL_NAME) && argument.equals(P11_SOL_ARG)) {
|
||||
ProviderConfig(String provName, String argument) {
|
||||
if (provName.endsWith(P11_SOL_NAME) && argument.equals(P11_SOL_ARG)) {
|
||||
checkSunPKCS11Solaris();
|
||||
}
|
||||
this.className = className;
|
||||
this.provName = provName;
|
||||
this.argument = expand(argument);
|
||||
}
|
||||
|
||||
ProviderConfig(String className) {
|
||||
this(className, "");
|
||||
ProviderConfig(String provName) {
|
||||
this(provName, "");
|
||||
}
|
||||
|
||||
ProviderConfig(Provider provider) {
|
||||
this.className = provider.getClass().getName();
|
||||
this.provName = provider.getName();
|
||||
this.argument = "";
|
||||
this.provider = provider;
|
||||
}
|
||||
@ -144,19 +139,20 @@ final class ProviderConfig {
|
||||
return false;
|
||||
}
|
||||
ProviderConfig other = (ProviderConfig)obj;
|
||||
return this.className.equals(other.className)
|
||||
return this.provName.equals(other.provName)
|
||||
&& this.argument.equals(other.argument);
|
||||
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return className.hashCode() + argument.hashCode();
|
||||
return provName.hashCode() + argument.hashCode();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
if (hasArgument()) {
|
||||
return className + "('" + argument + "')";
|
||||
return provName + "('" + argument + "')";
|
||||
} else {
|
||||
return className;
|
||||
return provName;
|
||||
}
|
||||
}
|
||||
|
||||
@ -172,21 +168,33 @@ final class ProviderConfig {
|
||||
if (shouldLoad() == false) {
|
||||
return null;
|
||||
}
|
||||
if (isLoading) {
|
||||
// because this method is synchronized, this can only
|
||||
// happen if there is recursion.
|
||||
if (debug != null) {
|
||||
debug.println("Recursion loading provider: " + this);
|
||||
new Exception("Call trace").printStackTrace();
|
||||
|
||||
// Create providers which are in java.base directly
|
||||
if (provName.equals("SUN") || provName.equals("sun.security.provider.Sun")) {
|
||||
p = new sun.security.provider.Sun();
|
||||
} else if (provName.equals("SunRsaSign") || provName.equals("sun.security.rsa.SunRsaSign")) {
|
||||
p = new sun.security.rsa.SunRsaSign();
|
||||
} else if (provName.equals("SunJCE") || provName.equals("com.sun.crypto.provider.SunJCE")) {
|
||||
p = new com.sun.crypto.provider.SunJCE();
|
||||
} else if (provName.equals("SunJSSE") || provName.equals("com.sun.net.ssl.internal.ssl.Provider")) {
|
||||
p = new com.sun.net.ssl.internal.ssl.Provider();
|
||||
} else {
|
||||
if (isLoading) {
|
||||
// because this method is synchronized, this can only
|
||||
// happen if there is recursion.
|
||||
if (debug != null) {
|
||||
debug.println("Recursion loading provider: " + this);
|
||||
new Exception("Call trace").printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
isLoading = true;
|
||||
tries++;
|
||||
p = doLoadProvider();
|
||||
} finally {
|
||||
isLoading = false;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
isLoading = true;
|
||||
tries++;
|
||||
p = doLoadProvider();
|
||||
} finally {
|
||||
isLoading = false;
|
||||
}
|
||||
provider = p;
|
||||
return p;
|
||||
@ -206,55 +214,39 @@ final class ProviderConfig {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<Provider>() {
|
||||
public Provider run() {
|
||||
if (debug != null) {
|
||||
debug.println("Loading provider: " + ProviderConfig.this);
|
||||
debug.println("Loading provider " + ProviderConfig.this);
|
||||
}
|
||||
ProviderLoader pl = new ProviderLoader();
|
||||
try {
|
||||
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
||||
Class<?> provClass;
|
||||
if (cl != null) {
|
||||
provClass = cl.loadClass(className);
|
||||
} else {
|
||||
provClass = Class.forName(className);
|
||||
}
|
||||
Object obj;
|
||||
if (hasArgument() == false) {
|
||||
obj = provClass.newInstance();
|
||||
} else {
|
||||
Constructor<?> cons = provClass.getConstructor(CL_STRING);
|
||||
obj = cons.newInstance(argument);
|
||||
}
|
||||
if (obj instanceof Provider) {
|
||||
if (debug != null) {
|
||||
debug.println("Loaded provider " + obj);
|
||||
Provider p = pl.load(provName);
|
||||
if (p != null) {
|
||||
if (hasArgument()) {
|
||||
p = p.configure(argument);
|
||||
}
|
||||
if (debug != null) {
|
||||
debug.println("Loaded provider " + p.getName());
|
||||
}
|
||||
return (Provider)obj;
|
||||
} else {
|
||||
if (debug != null) {
|
||||
debug.println(className + " is not a provider");
|
||||
debug.println("Error loading provider " +
|
||||
ProviderConfig.this);
|
||||
}
|
||||
disableLoad();
|
||||
}
|
||||
return p;
|
||||
} catch (Exception e) {
|
||||
if (e instanceof ProviderException) {
|
||||
// pass up
|
||||
throw e;
|
||||
} else {
|
||||
if (debug != null) {
|
||||
debug.println("Error loading provider " +
|
||||
ProviderConfig.this);
|
||||
e.printStackTrace();
|
||||
}
|
||||
disableLoad();
|
||||
return null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Throwable t;
|
||||
if (e instanceof InvocationTargetException) {
|
||||
t = ((InvocationTargetException)e).getCause();
|
||||
} else {
|
||||
t = e;
|
||||
}
|
||||
if (debug != null) {
|
||||
debug.println("Error loading provider " + ProviderConfig.this);
|
||||
t.printStackTrace();
|
||||
}
|
||||
// provider indicates fatal error, pass through exception
|
||||
if (t instanceof ProviderException) {
|
||||
throw (ProviderException)t;
|
||||
}
|
||||
// provider indicates that loading should not be retried
|
||||
if (t instanceof UnsupportedOperationException) {
|
||||
disableLoad();
|
||||
}
|
||||
return null;
|
||||
} catch (ExceptionInInitializerError err) {
|
||||
// no sufficient permission to initialize provider class
|
||||
if (debug != null) {
|
||||
@ -289,4 +281,119 @@ final class ProviderConfig {
|
||||
});
|
||||
}
|
||||
|
||||
// Inner class for loading security providers listed in java.security file
|
||||
private static final class ProviderLoader {
|
||||
private final ServiceLoader<Provider> services;
|
||||
|
||||
ProviderLoader() {
|
||||
// VM should already been booted at this point, if not
|
||||
// - Only providers in java.base should be loaded, don't use
|
||||
// ServiceLoader
|
||||
// - ClassLoader.getSystemClassLoader() will throw InternalError
|
||||
services = ServiceLoader.load(java.security.Provider.class,
|
||||
ClassLoader.getSystemClassLoader());
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the provider with the specified class name.
|
||||
*
|
||||
* @param name the name of the provider
|
||||
* @return the Provider, or null if it cannot be found or loaded
|
||||
* @throws ProviderException all other exceptions are ignored
|
||||
*/
|
||||
public Provider load(String pn) {
|
||||
if (debug != null) {
|
||||
debug.println("Attempt to load " + pn + " using SL");
|
||||
}
|
||||
Iterator<Provider> iter = services.iterator();
|
||||
while (iter.hasNext()) {
|
||||
try {
|
||||
Provider p = iter.next();
|
||||
String pName = p.getName();
|
||||
if (debug != null) {
|
||||
debug.println("Found SL Provider named " + pName);
|
||||
}
|
||||
if (pName.equals(pn)) {
|
||||
return p;
|
||||
}
|
||||
} catch (SecurityException | ServiceConfigurationError |
|
||||
InvalidParameterException ex) {
|
||||
// if provider loading fail due to security permission,
|
||||
// log it and move on to next provider
|
||||
if (debug != null) {
|
||||
debug.println("Encountered " + ex +
|
||||
" while iterating through SL, ignore and move on");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
// No success with ServiceLoader. Try loading provider the legacy,
|
||||
// i.e. pre-module, way via reflection
|
||||
try {
|
||||
return legacyLoad(pn);
|
||||
} catch (ProviderException pe) {
|
||||
// pass through
|
||||
throw pe;
|
||||
} catch (Exception ex) {
|
||||
// logged and ignored
|
||||
if (debug != null) {
|
||||
debug.println("Encountered " + ex +
|
||||
" during legacy load of " + pn);
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Provider legacyLoad(String classname) {
|
||||
|
||||
if (debug != null) {
|
||||
debug.println("Loading legacy provider: " + classname);
|
||||
}
|
||||
|
||||
try {
|
||||
Class<?> provClass =
|
||||
ClassLoader.getSystemClassLoader().loadClass(classname);
|
||||
|
||||
// only continue if the specified class extends Provider
|
||||
if (!Provider.class.isAssignableFrom(provClass)) {
|
||||
if (debug != null) {
|
||||
debug.println(classname + " is not a provider");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Provider p = AccessController.doPrivileged
|
||||
(new PrivilegedExceptionAction<Provider>() {
|
||||
public Provider run() throws Exception {
|
||||
return (Provider) provClass.newInstance();
|
||||
}
|
||||
});
|
||||
return p;
|
||||
} catch (Exception e) {
|
||||
Throwable t;
|
||||
if (e instanceof InvocationTargetException) {
|
||||
t = ((InvocationTargetException)e).getCause();
|
||||
} else {
|
||||
t = e;
|
||||
}
|
||||
if (debug != null) {
|
||||
debug.println("Error loading legacy provider " + classname);
|
||||
t.printStackTrace();
|
||||
}
|
||||
// provider indicates fatal error, pass through exception
|
||||
if (t instanceof ProviderException) {
|
||||
throw (ProviderException) t;
|
||||
}
|
||||
return null;
|
||||
} catch (ExceptionInInitializerError | NoClassDefFoundError err) {
|
||||
// no sufficient permission to access/initialize provider class
|
||||
if (debug != null) {
|
||||
debug.println("Error loading legacy provider " + classname);
|
||||
err.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, 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
|
||||
@ -178,9 +178,9 @@ public final class ProviderList {
|
||||
if (k == -1) {
|
||||
config = new ProviderConfig(entry);
|
||||
} else {
|
||||
String className = entry.substring(0, k);
|
||||
String provName = entry.substring(0, k);
|
||||
String argument = entry.substring(k + 1).trim();
|
||||
config = new ProviderConfig(className, argument);
|
||||
config = new ProviderConfig(provName, argument);
|
||||
}
|
||||
|
||||
// Get rid of duplicate providers.
|
||||
@ -200,10 +200,10 @@ public final class ProviderList {
|
||||
* bootclasspath and cannot be in signed JAR files. This is to avoid
|
||||
* possible recursion and deadlock during verification.
|
||||
*/
|
||||
ProviderList getJarList(String[] jarClassNames) {
|
||||
ProviderList getJarList(String[] jarProvNames) {
|
||||
List<ProviderConfig> newConfigs = new ArrayList<>();
|
||||
for (String className : jarClassNames) {
|
||||
ProviderConfig newConfig = new ProviderConfig(className);
|
||||
for (String provName : jarProvNames) {
|
||||
ProviderConfig newConfig = new ProviderConfig(provName);
|
||||
for (ProviderConfig config : configs) {
|
||||
// if the equivalent object is present in this provider list,
|
||||
// use the old object rather than the new object.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, 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
|
||||
@ -58,9 +58,13 @@ public class Providers {
|
||||
// empty
|
||||
}
|
||||
|
||||
// we need special handling to resolve circularities when loading
|
||||
// signed JAR files during startup. The code below is part of that.
|
||||
|
||||
// After the switch to modules, JDK providers are all in modules and JDK
|
||||
// no longer needs to load signed jars during start up.
|
||||
//
|
||||
// However, for earlier releases, it need special handling to resolve
|
||||
// circularities when loading signed JAR files during startup. The code
|
||||
// below is part of that.
|
||||
//
|
||||
// Basically, before we load data from a signed JAR file, we parse
|
||||
// the PKCS#7 file and verify the signature. We need a
|
||||
// CertificateFactory, Signatures, etc. to do that. We have to make
|
||||
@ -75,35 +79,24 @@ public class Providers {
|
||||
// The code here is used by sun.security.util.SignatureFileVerifier.
|
||||
// See there for details.
|
||||
|
||||
private static final String BACKUP_PROVIDER_CLASSNAME =
|
||||
"sun.security.provider.VerificationProvider";
|
||||
|
||||
// Hardcoded classnames of providers to use for JAR verification.
|
||||
// Hardcoded names of providers to use for JAR verification.
|
||||
// MUST NOT be on the bootclasspath and not in signed JAR files.
|
||||
private static final String[] jarVerificationProviders = {
|
||||
"sun.security.provider.Sun",
|
||||
"sun.security.rsa.SunRsaSign",
|
||||
// Note: SunEC *is* in a signed JAR file, but it's not signed
|
||||
// by EC itself. So it's still safe to be listed here.
|
||||
"SUN",
|
||||
"SunRsaSign",
|
||||
// Note: when SunEC is in a signed JAR file, it's not signed
|
||||
// by EC algorithms. So it's still safe to be listed here.
|
||||
// Need to use class name here, otherwise it cannot be loaded for
|
||||
// jar verification. Only those providers in java.base are created
|
||||
// directly by ProviderConfig class.
|
||||
"sun.security.ec.SunEC",
|
||||
BACKUP_PROVIDER_CLASSNAME,
|
||||
};
|
||||
|
||||
// Return to Sun provider or its backup.
|
||||
// Return Sun provider.
|
||||
// This method should only be called by
|
||||
// sun.security.util.ManifestEntryVerifier and java.security.SecureRandom.
|
||||
public static Provider getSunProvider() {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(jarVerificationProviders[0]);
|
||||
return (Provider)clazz.newInstance();
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(BACKUP_PROVIDER_CLASSNAME);
|
||||
return (Provider)clazz.newInstance();
|
||||
} catch (Exception ee) {
|
||||
throw new RuntimeException("Sun provider not found", e);
|
||||
}
|
||||
}
|
||||
return new sun.security.provider.Sun();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,6 +108,16 @@ public class Providers {
|
||||
public static Object startJarVerification() {
|
||||
ProviderList currentList = getProviderList();
|
||||
ProviderList jarList = currentList.getJarList(jarVerificationProviders);
|
||||
if (jarList.getProvider("SUN") == null) {
|
||||
// add backup provider
|
||||
Provider p;
|
||||
try {
|
||||
p = new sun.security.provider.VerificationProvider();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Missing provider for jar verification", e);
|
||||
}
|
||||
ProviderList.add(jarList, p);
|
||||
}
|
||||
// return the old thread-local provider list, usually null
|
||||
return beginThreadProviderList(jarList);
|
||||
}
|
||||
|
@ -728,21 +728,19 @@ public final class Main {
|
||||
provClass = Class.forName(provName);
|
||||
}
|
||||
|
||||
String provArg = provider.snd;
|
||||
Object obj;
|
||||
if (provArg == null) {
|
||||
obj = provClass.newInstance();
|
||||
} else {
|
||||
Constructor<?> c = provClass.getConstructor(PARAM_STRING);
|
||||
obj = c.newInstance(provArg);
|
||||
}
|
||||
Object obj = provClass.newInstance();
|
||||
if (!(obj instanceof Provider)) {
|
||||
MessageFormat form = new MessageFormat
|
||||
(rb.getString("provName.not.a.provider"));
|
||||
Object[] source = {provName};
|
||||
throw new Exception(form.format(source));
|
||||
}
|
||||
Security.addProvider((Provider)obj);
|
||||
Provider p = (Provider) obj;
|
||||
String provArg = provider.snd;
|
||||
if (provArg != null) {
|
||||
p = p.configure(provArg);
|
||||
}
|
||||
Security.addProvider(p);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -858,9 +858,6 @@ public class FormatData extends ParallelListResourceBundle {
|
||||
}
|
||||
},
|
||||
{ "DateTimePatternChars", "GyMdkHmsSEDFwWahKzZ" },
|
||||
|
||||
// Workaround for islamic-umalqura name support (JDK-8015986)
|
||||
{ "calendarname.islamic-umalqura", "Islamic Umm al-Qura Calendar" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2015, 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
|
||||
@ -26,37 +26,41 @@
|
||||
/*
|
||||
* COPYRIGHT AND PERMISSION NOTICE
|
||||
*
|
||||
* Copyright (C) 1991-2012 Unicode, Inc. All rights reserved. Distributed under
|
||||
* the Terms of Use in http://www.unicode.org/copyright.html.
|
||||
* Copyright (C) 1991-2015 Unicode, Inc. All rights reserved.
|
||||
* Distributed under the Terms of Use in
|
||||
* http://www.unicode.org/copyright.html.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of the Unicode data files and any associated documentation (the "Data
|
||||
* Files") or Unicode software and any associated documentation (the
|
||||
* "Software") to deal in the Data Files or Software without restriction,
|
||||
* including without limitation the rights to use, copy, modify, merge,
|
||||
* publish, distribute, and/or sell copies of the Data Files or Software, and
|
||||
* to permit persons to whom the Data Files or Software are furnished to do so,
|
||||
* provided that (a) the above copyright notice(s) and this permission notice
|
||||
* appear with all copies of the Data Files or Software, (b) both the above
|
||||
* copyright notice(s) and this permission notice appear in associated
|
||||
* documentation, and (c) there is clear notice in each modified Data File or
|
||||
* in the Software as well as in the documentation associated with the Data
|
||||
* File(s) or Software that the data or software has been modified.
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of the Unicode data files and any associated documentation
|
||||
* (the "Data Files") or Unicode software and any associated documentation
|
||||
* (the "Software") to deal in the Data Files or Software
|
||||
* without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, and/or sell copies of
|
||||
* the Data Files or Software, and to permit persons to whom the Data Files
|
||||
* or Software are furnished to do so, provided that
|
||||
* (a) this copyright and permission notice appear with all copies
|
||||
* of the Data Files or Software,
|
||||
* (b) this copyright and permission notice appear in associated
|
||||
* documentation, and
|
||||
* (c) there is clear notice in each modified Data File or in the Software
|
||||
* as well as in the documentation associated with the Data File(s) or
|
||||
* Software that the data or software has been modified.
|
||||
*
|
||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
|
||||
* NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
|
||||
* DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THE DATA FILES OR SOFTWARE.
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THE DATA FILES OR SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall not
|
||||
* be used in advertising or otherwise to promote the sale, use or other
|
||||
* dealings in these Data Files or Software without prior written authorization
|
||||
* of the copyright holder.
|
||||
* Except as contained in this notice, the name of a copyright holder
|
||||
* shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in these Data Files or Software without prior
|
||||
* written authorization of the copyright holder.
|
||||
*/
|
||||
|
||||
// Note: this file has been generated by a tool.
|
||||
@ -68,6 +72,21 @@ import sun.util.resources.OpenListResourceBundle;
|
||||
public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
@Override
|
||||
protected final Object[][] getContents() {
|
||||
final String[] rocMonthNarrows = {
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"10",
|
||||
"11",
|
||||
"12",
|
||||
"",
|
||||
};
|
||||
return new Object[][] {
|
||||
{ "QuarterAbbreviations",
|
||||
new String[] {
|
||||
@ -93,22 +112,6 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
"4",
|
||||
}
|
||||
},
|
||||
{ "calendarname.buddhist",
|
||||
"Buddhist Calendar" },
|
||||
{ "calendarname.gregorian",
|
||||
"Gregorian Calendar" },
|
||||
{ "calendarname.gregory",
|
||||
"Gregorian Calendar" },
|
||||
{ "calendarname.islamic",
|
||||
"Islamic Calendar" },
|
||||
{ "calendarname.islamic-civil",
|
||||
"Islamic-Civil Calendar" },
|
||||
{ "calendarname.islamicc",
|
||||
"Islamic-Civil Calendar" },
|
||||
{ "calendarname.japanese",
|
||||
"Japanese Calendar" },
|
||||
{ "calendarname.roc",
|
||||
"Minguo Calendar" },
|
||||
{ "field.dayperiod",
|
||||
"Dayperiod" },
|
||||
{ "field.era",
|
||||
@ -129,12 +132,51 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
"Year" },
|
||||
{ "field.zone",
|
||||
"Zone" },
|
||||
{ "islamic.AmPmMarkers",
|
||||
new String[] {
|
||||
"AM",
|
||||
"PM",
|
||||
}
|
||||
},
|
||||
{ "islamic.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, MMMM d, y GGGG",
|
||||
"MMMM d, y GGGG",
|
||||
"MMM d, y GGGG",
|
||||
"M/d/yy GGGG",
|
||||
"GGGG y MMMM d, EEEE",
|
||||
"GGGG y MMMM d",
|
||||
"GGGG y MMM d",
|
||||
"G y-MM-dd",
|
||||
}
|
||||
},
|
||||
{ "islamic.DayAbbreviations",
|
||||
new String[] {
|
||||
"Sun",
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
}
|
||||
},
|
||||
{ "islamic.DayNames",
|
||||
new String[] {
|
||||
"Sun",
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
}
|
||||
},
|
||||
{ "islamic.DayNarrows",
|
||||
new String[] {
|
||||
"S",
|
||||
"M",
|
||||
"T",
|
||||
"W",
|
||||
"T",
|
||||
"F",
|
||||
"S",
|
||||
}
|
||||
},
|
||||
{ "islamic.Eras",
|
||||
@ -178,20 +220,47 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
}
|
||||
},
|
||||
{ "islamic.MonthNarrows",
|
||||
rocMonthNarrows },
|
||||
{ "islamic.QuarterNames",
|
||||
new String[] {
|
||||
"Q1",
|
||||
"Q2",
|
||||
"Q3",
|
||||
"Q4",
|
||||
}
|
||||
},
|
||||
{ "islamic.QuarterNarrows",
|
||||
new String[] {
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"10",
|
||||
"11",
|
||||
"12",
|
||||
}
|
||||
},
|
||||
{ "islamic.TimePatterns",
|
||||
new String[] {
|
||||
"HH:mm:ss zzzz",
|
||||
"HH:mm:ss z",
|
||||
"HH:mm:ss",
|
||||
"HH:mm",
|
||||
}
|
||||
},
|
||||
{ "islamic.long.Eras",
|
||||
new String[] {
|
||||
"",
|
||||
"AH",
|
||||
}
|
||||
},
|
||||
{ "islamic.narrow.AmPmMarkers",
|
||||
new String[] {
|
||||
"a",
|
||||
"p",
|
||||
}
|
||||
},
|
||||
{ "islamic.narrow.Eras",
|
||||
new String[] {
|
||||
"",
|
||||
"AH",
|
||||
}
|
||||
},
|
||||
{ "islamic.short.Eras",
|
||||
@ -202,10 +271,16 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
},
|
||||
{ "java.time.buddhist.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, G y MMMM dd",
|
||||
"G y MMMM d, EEEE",
|
||||
"G y MMMM d",
|
||||
"G y MMM d",
|
||||
"GGGGG yyyy-MM-dd",
|
||||
"GGGGG y-MM-dd",
|
||||
}
|
||||
},
|
||||
{ "java.time.buddhist.long.Eras",
|
||||
new String[] {
|
||||
"BC",
|
||||
"BE",
|
||||
}
|
||||
},
|
||||
{ "java.time.buddhist.short.Eras",
|
||||
@ -216,10 +291,10 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
},
|
||||
{ "java.time.islamic.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, MMMM d, y G",
|
||||
"MMMM d, y G",
|
||||
"MMM d, y G",
|
||||
"M/d/yy G",
|
||||
"G y MMMM d, EEEE",
|
||||
"G y MMMM d",
|
||||
"G y MMM d",
|
||||
"GGGGG y-MM-dd",
|
||||
}
|
||||
},
|
||||
{ "java.time.japanese.DatePatterns",
|
||||
@ -248,12 +323,18 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
"Heisei",
|
||||
}
|
||||
},
|
||||
{ "java.time.long.Eras",
|
||||
new String[] {
|
||||
"BCE",
|
||||
"CE",
|
||||
}
|
||||
},
|
||||
{ "java.time.roc.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, G y MMMM dd",
|
||||
"G y MMMM d, EEEE",
|
||||
"G y MMMM d",
|
||||
"G y MMM d",
|
||||
"GGGGG yyy-MM-dd",
|
||||
"GGGGG y-MM-dd",
|
||||
}
|
||||
},
|
||||
{ "java.time.short.Eras",
|
||||
@ -262,12 +343,40 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
"AD",
|
||||
}
|
||||
},
|
||||
{ "roc.AmPmMarkers",
|
||||
new String[] {
|
||||
"AM",
|
||||
"PM",
|
||||
}
|
||||
},
|
||||
{ "roc.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, GGGG y MMMM dd",
|
||||
"GGGG y MMMM d, EEEE",
|
||||
"GGGG y MMMM d",
|
||||
"GGGG y MMM d",
|
||||
"G yyy-MM-dd",
|
||||
"G y-MM-dd",
|
||||
}
|
||||
},
|
||||
{ "roc.DayNames",
|
||||
new String[] {
|
||||
"Sun",
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
}
|
||||
},
|
||||
{ "roc.DayNarrows",
|
||||
new String[] {
|
||||
"S",
|
||||
"M",
|
||||
"T",
|
||||
"W",
|
||||
"T",
|
||||
"F",
|
||||
"S",
|
||||
}
|
||||
},
|
||||
{ "roc.Eras",
|
||||
@ -276,6 +385,84 @@ public class JavaTimeSupplementary extends OpenListResourceBundle {
|
||||
"R.O.C.",
|
||||
}
|
||||
},
|
||||
{ "roc.MonthAbbreviations",
|
||||
new String[] {
|
||||
"M01",
|
||||
"M02",
|
||||
"M03",
|
||||
"M04",
|
||||
"M05",
|
||||
"M06",
|
||||
"M07",
|
||||
"M08",
|
||||
"M09",
|
||||
"M10",
|
||||
"M11",
|
||||
"M12",
|
||||
"",
|
||||
}
|
||||
},
|
||||
{ "roc.MonthNames",
|
||||
new String[] {
|
||||
"M01",
|
||||
"M02",
|
||||
"M03",
|
||||
"M04",
|
||||
"M05",
|
||||
"M06",
|
||||
"M07",
|
||||
"M08",
|
||||
"M09",
|
||||
"M10",
|
||||
"M11",
|
||||
"M12",
|
||||
"",
|
||||
}
|
||||
},
|
||||
{ "roc.MonthNarrows",
|
||||
rocMonthNarrows },
|
||||
{ "roc.QuarterNames",
|
||||
new String[] {
|
||||
"Q1",
|
||||
"Q2",
|
||||
"Q3",
|
||||
"Q4",
|
||||
}
|
||||
},
|
||||
{ "roc.QuarterNarrows",
|
||||
new String[] {
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
}
|
||||
},
|
||||
{ "roc.TimePatterns",
|
||||
new String[] {
|
||||
"HH:mm:ss zzzz",
|
||||
"HH:mm:ss z",
|
||||
"HH:mm:ss",
|
||||
"HH:mm",
|
||||
}
|
||||
},
|
||||
{ "roc.long.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
"R.O.C.",
|
||||
}
|
||||
},
|
||||
{ "roc.narrow.AmPmMarkers",
|
||||
new String[] {
|
||||
"a",
|
||||
"p",
|
||||
}
|
||||
},
|
||||
{ "roc.narrow.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
"R.O.C.",
|
||||
}
|
||||
},
|
||||
{ "roc.short.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2015, 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
|
||||
@ -26,37 +26,41 @@
|
||||
/*
|
||||
* COPYRIGHT AND PERMISSION NOTICE
|
||||
*
|
||||
* Copyright (C) 1991-2012 Unicode, Inc. All rights reserved. Distributed under
|
||||
* the Terms of Use in http://www.unicode.org/copyright.html.
|
||||
* Copyright (C) 1991-2015 Unicode, Inc. All rights reserved.
|
||||
* Distributed under the Terms of Use in
|
||||
* http://www.unicode.org/copyright.html.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of the Unicode data files and any associated documentation (the "Data
|
||||
* Files") or Unicode software and any associated documentation (the
|
||||
* "Software") to deal in the Data Files or Software without restriction,
|
||||
* including without limitation the rights to use, copy, modify, merge,
|
||||
* publish, distribute, and/or sell copies of the Data Files or Software, and
|
||||
* to permit persons to whom the Data Files or Software are furnished to do so,
|
||||
* provided that (a) the above copyright notice(s) and this permission notice
|
||||
* appear with all copies of the Data Files or Software, (b) both the above
|
||||
* copyright notice(s) and this permission notice appear in associated
|
||||
* documentation, and (c) there is clear notice in each modified Data File or
|
||||
* in the Software as well as in the documentation associated with the Data
|
||||
* File(s) or Software that the data or software has been modified.
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of the Unicode data files and any associated documentation
|
||||
* (the "Data Files") or Unicode software and any associated documentation
|
||||
* (the "Software") to deal in the Data Files or Software
|
||||
* without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, and/or sell copies of
|
||||
* the Data Files or Software, and to permit persons to whom the Data Files
|
||||
* or Software are furnished to do so, provided that
|
||||
* (a) this copyright and permission notice appear with all copies
|
||||
* of the Data Files or Software,
|
||||
* (b) this copyright and permission notice appear in associated
|
||||
* documentation, and
|
||||
* (c) there is clear notice in each modified Data File or in the Software
|
||||
* as well as in the documentation associated with the Data File(s) or
|
||||
* Software that the data or software has been modified.
|
||||
*
|
||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
|
||||
* NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
|
||||
* DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THE DATA FILES OR SOFTWARE.
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THE DATA FILES OR SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall not
|
||||
* be used in advertising or otherwise to promote the sale, use or other
|
||||
* dealings in these Data Files or Software without prior written authorization
|
||||
* of the copyright holder.
|
||||
* Except as contained in this notice, the name of a copyright holder
|
||||
* shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in these Data Files or Software without prior
|
||||
* written authorization of the copyright holder.
|
||||
*/
|
||||
|
||||
// Note: this file has been generated by a tool.
|
||||
@ -69,14 +73,6 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
@Override
|
||||
protected final Object[][] getContents() {
|
||||
return new Object[][] {
|
||||
{ "QuarterAbbreviations",
|
||||
new String[] {
|
||||
"Q1",
|
||||
"Q2",
|
||||
"Q3",
|
||||
"Q4",
|
||||
}
|
||||
},
|
||||
{ "QuarterNames",
|
||||
new String[] {
|
||||
"1st quarter",
|
||||
@ -94,31 +90,15 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
{ "calendarname.islamic",
|
||||
"Islamic Calendar" },
|
||||
{ "calendarname.islamic-civil",
|
||||
"Islamic-Civil Calendar" },
|
||||
{ "calendarname.islamicc",
|
||||
"Islamic-Civil Calendar" },
|
||||
"Islamic Calendar (tabular, civil epoch)" },
|
||||
{ "calendarname.islamic-umalqura",
|
||||
"Islamic Calendar (Umm al-Qura)" },
|
||||
{ "calendarname.japanese",
|
||||
"Japanese Calendar" },
|
||||
{ "calendarname.roc",
|
||||
"Minguo Calendar" },
|
||||
{ "field.dayperiod",
|
||||
"AM/PM" },
|
||||
{ "field.era",
|
||||
"Era" },
|
||||
{ "field.hour",
|
||||
"Hour" },
|
||||
{ "field.minute",
|
||||
"Minute" },
|
||||
{ "field.month",
|
||||
"Month" },
|
||||
{ "field.second",
|
||||
"Second" },
|
||||
{ "field.week",
|
||||
"Week" },
|
||||
{ "field.weekday",
|
||||
"Day of the Week" },
|
||||
{ "field.year",
|
||||
"Year" },
|
||||
{ "field.zone",
|
||||
"Time Zone" },
|
||||
{ "islamic.DatePatterns",
|
||||
@ -126,7 +106,42 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
"EEEE, MMMM d, y GGGG",
|
||||
"MMMM d, y GGGG",
|
||||
"MMM d, y GGGG",
|
||||
"M/d/yy GGGG",
|
||||
"M/d/y G",
|
||||
}
|
||||
},
|
||||
{ "islamic.DayNames",
|
||||
new String[] {
|
||||
"Sunday",
|
||||
"Monday",
|
||||
"Tuesday",
|
||||
"Wednesday",
|
||||
"Thursday",
|
||||
"Friday",
|
||||
"Saturday",
|
||||
}
|
||||
},
|
||||
{ "islamic.QuarterAbbreviations",
|
||||
new String[] {
|
||||
"Q1",
|
||||
"Q2",
|
||||
"Q3",
|
||||
"Q4",
|
||||
}
|
||||
},
|
||||
{ "islamic.QuarterNames",
|
||||
new String[] {
|
||||
"1st quarter",
|
||||
"2nd quarter",
|
||||
"3rd quarter",
|
||||
"4th quarter",
|
||||
}
|
||||
},
|
||||
{ "islamic.TimePatterns",
|
||||
new String[] {
|
||||
"h:mm:ss a zzzz",
|
||||
"h:mm:ss a z",
|
||||
"h:mm:ss a",
|
||||
"h:mm a",
|
||||
}
|
||||
},
|
||||
{ "java.time.buddhist.DatePatterns",
|
||||
@ -134,7 +149,13 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
"EEEE, MMMM d, y G",
|
||||
"MMMM d, y G",
|
||||
"MMM d, y G",
|
||||
"M/d/yy GGGGG",
|
||||
"M/d/y GGGGG",
|
||||
}
|
||||
},
|
||||
{ "java.time.buddhist.short.Eras",
|
||||
new String[] {
|
||||
"BC",
|
||||
"BE",
|
||||
}
|
||||
},
|
||||
{ "java.time.islamic.DatePatterns",
|
||||
@ -142,7 +163,7 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
"EEEE, MMMM d, y G",
|
||||
"MMMM d, y G",
|
||||
"MMM d, y G",
|
||||
"M/d/yy G",
|
||||
"M/d/y GGGGG",
|
||||
}
|
||||
},
|
||||
{ "java.time.japanese.DatePatterns",
|
||||
@ -150,7 +171,7 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
"EEEE, MMMM d, y G",
|
||||
"MMMM d, y G",
|
||||
"MMM d, y G",
|
||||
"M/d/yy GGGGG",
|
||||
"M/d/y GGGGG",
|
||||
}
|
||||
},
|
||||
{ "java.time.long.Eras",
|
||||
@ -164,13 +185,7 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
"EEEE, MMMM d, y G",
|
||||
"MMMM d, y G",
|
||||
"MMM d, y G",
|
||||
"M/d/yy GGGGG",
|
||||
}
|
||||
},
|
||||
{ "java.time.short.Eras",
|
||||
new String[] {
|
||||
"BC",
|
||||
"AD",
|
||||
"M/d/y GGGGG",
|
||||
}
|
||||
},
|
||||
{ "roc.DatePatterns",
|
||||
@ -178,7 +193,128 @@ public class JavaTimeSupplementary_en extends OpenListResourceBundle {
|
||||
"EEEE, MMMM d, y GGGG",
|
||||
"MMMM d, y GGGG",
|
||||
"MMM d, y GGGG",
|
||||
"M/d/yy G",
|
||||
"M/d/y G",
|
||||
}
|
||||
},
|
||||
{ "roc.DayAbbreviations",
|
||||
new String[] {
|
||||
"Sun",
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
}
|
||||
},
|
||||
{ "roc.DayNames",
|
||||
new String[] {
|
||||
"Sunday",
|
||||
"Monday",
|
||||
"Tuesday",
|
||||
"Wednesday",
|
||||
"Thursday",
|
||||
"Friday",
|
||||
"Saturday",
|
||||
}
|
||||
},
|
||||
{ "roc.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
"Minguo",
|
||||
}
|
||||
},
|
||||
{ "roc.MonthAbbreviations",
|
||||
new String[] {
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"May",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Oct",
|
||||
"Nov",
|
||||
"Dec",
|
||||
"",
|
||||
}
|
||||
},
|
||||
{ "roc.MonthNames",
|
||||
new String[] {
|
||||
"January",
|
||||
"February",
|
||||
"March",
|
||||
"April",
|
||||
"May",
|
||||
"June",
|
||||
"July",
|
||||
"August",
|
||||
"September",
|
||||
"October",
|
||||
"November",
|
||||
"December",
|
||||
"",
|
||||
}
|
||||
},
|
||||
{ "roc.MonthNarrows",
|
||||
new String[] {
|
||||
"J",
|
||||
"F",
|
||||
"M",
|
||||
"A",
|
||||
"M",
|
||||
"J",
|
||||
"J",
|
||||
"A",
|
||||
"S",
|
||||
"O",
|
||||
"N",
|
||||
"D",
|
||||
"",
|
||||
}
|
||||
},
|
||||
{ "roc.QuarterAbbreviations",
|
||||
new String[] {
|
||||
"Q1",
|
||||
"Q2",
|
||||
"Q3",
|
||||
"Q4",
|
||||
}
|
||||
},
|
||||
{ "roc.QuarterNames",
|
||||
new String[] {
|
||||
"1st quarter",
|
||||
"2nd quarter",
|
||||
"3rd quarter",
|
||||
"4th quarter",
|
||||
}
|
||||
},
|
||||
{ "roc.TimePatterns",
|
||||
new String[] {
|
||||
"h:mm:ss a zzzz",
|
||||
"h:mm:ss a z",
|
||||
"h:mm:ss a",
|
||||
"h:mm a",
|
||||
}
|
||||
},
|
||||
{ "roc.long.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
"Minguo",
|
||||
}
|
||||
},
|
||||
{ "roc.narrow.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
"Minguo",
|
||||
}
|
||||
},
|
||||
{ "roc.short.Eras",
|
||||
new String[] {
|
||||
"Before R.O.C.",
|
||||
"Minguo",
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -1,106 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT AND PERMISSION NOTICE
|
||||
*
|
||||
* Copyright (C) 1991-2012 Unicode, Inc. All rights reserved. Distributed under
|
||||
* the Terms of Use in http://www.unicode.org/copyright.html.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of the Unicode data files and any associated documentation (the "Data
|
||||
* Files") or Unicode software and any associated documentation (the
|
||||
* "Software") to deal in the Data Files or Software without restriction,
|
||||
* including without limitation the rights to use, copy, modify, merge,
|
||||
* publish, distribute, and/or sell copies of the Data Files or Software, and
|
||||
* to permit persons to whom the Data Files or Software are furnished to do so,
|
||||
* provided that (a) the above copyright notice(s) and this permission notice
|
||||
* appear with all copies of the Data Files or Software, (b) both the above
|
||||
* copyright notice(s) and this permission notice appear in associated
|
||||
* documentation, and (c) there is clear notice in each modified Data File or
|
||||
* in the Software as well as in the documentation associated with the Data
|
||||
* File(s) or Software that the data or software has been modified.
|
||||
*
|
||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THE DATA FILES OR SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall not
|
||||
* be used in advertising or otherwise to promote the sale, use or other
|
||||
* dealings in these Data Files or Software without prior written authorization
|
||||
* of the copyright holder.
|
||||
*/
|
||||
|
||||
// Note: this file has been generated by a tool.
|
||||
|
||||
package sun.text.resources.en;
|
||||
|
||||
import sun.util.resources.OpenListResourceBundle;
|
||||
|
||||
public class JavaTimeSupplementary_en_SG extends OpenListResourceBundle {
|
||||
@Override
|
||||
protected final Object[][] getContents() {
|
||||
return new Object[][] {
|
||||
{ "java.time.buddhist.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, d MMMM, y G",
|
||||
"d MMMM, y G",
|
||||
"d MMM, y G",
|
||||
"d/M/yy GGGGG",
|
||||
}
|
||||
},
|
||||
{ "java.time.japanese.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, d MMMM, y G",
|
||||
"d MMMM, y G",
|
||||
"d MMM, y G",
|
||||
"d/M/yy GGGGG",
|
||||
}
|
||||
},
|
||||
{ "java.time.roc.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, d MMMM, y G",
|
||||
"d MMMM, y G",
|
||||
"d MMM, y G",
|
||||
"d/M/yy GGGGG",
|
||||
}
|
||||
},
|
||||
{ "roc.DatePatterns",
|
||||
new String[] {
|
||||
"EEEE, d MMMM, y GGGG",
|
||||
"d MMMM, y GGGG",
|
||||
"d MMM, y GGGG",
|
||||
"d/M/yy G",
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
@ -38,7 +38,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.text.resources.en;
|
||||
package sun.text.resources.en.US;
|
||||
|
||||
import sun.util.resources.ParallelListResourceBundle;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -30,9 +30,14 @@ import java.security.PrivilegedActionException;
|
||||
import java.security.PrivilegedExceptionAction;
|
||||
import java.text.spi.BreakIteratorProvider;
|
||||
import java.text.spi.CollatorProvider;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
@ -48,11 +53,16 @@ import sun.util.locale.provider.LocaleDataMetaInfo;
|
||||
*/
|
||||
public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
|
||||
|
||||
private final LocaleDataMetaInfo metaInfo;
|
||||
private static final CLDRBaseLocaleDataMetaInfo baseMetaInfo = new CLDRBaseLocaleDataMetaInfo();
|
||||
// Assumption: CLDR has only one non-Base module.
|
||||
private final LocaleDataMetaInfo nonBaseMetaInfo;
|
||||
|
||||
// parent locales map
|
||||
private static volatile Map<Locale, Locale> parentLocalesMap = null;
|
||||
|
||||
public CLDRLocaleProviderAdapter() {
|
||||
try {
|
||||
metaInfo = AccessController.doPrivileged(new PrivilegedExceptionAction<LocaleDataMetaInfo>() {
|
||||
nonBaseMetaInfo = AccessController.doPrivileged(new PrivilegedExceptionAction<LocaleDataMetaInfo>() {
|
||||
@Override
|
||||
public LocaleDataMetaInfo run() {
|
||||
for (LocaleDataMetaInfo ldmi : ServiceLoader.loadInstalled(LocaleDataMetaInfo.class)) {
|
||||
@ -70,7 +80,7 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
|
||||
throw new UnsupportedOperationException(e);
|
||||
}
|
||||
|
||||
if (metaInfo == null) {
|
||||
if (nonBaseMetaInfo == null) {
|
||||
throw new UnsupportedOperationException("CLDR locale data could not be found.");
|
||||
}
|
||||
}
|
||||
@ -107,7 +117,16 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
|
||||
|
||||
@Override
|
||||
protected Set<String> createLanguageTagSet(String category) {
|
||||
String supportedLocaleString = metaInfo.availableLanguageTags(category);
|
||||
// Directly call Base tags, as we know it's in the base module.
|
||||
String supportedLocaleString = baseMetaInfo.availableLanguageTags(category);
|
||||
String nonBaseTags = nonBaseMetaInfo.availableLanguageTags(category);
|
||||
if (nonBaseTags != null) {
|
||||
if (supportedLocaleString != null) {
|
||||
supportedLocaleString += " " + nonBaseTags;
|
||||
} else {
|
||||
supportedLocaleString = nonBaseTags;
|
||||
}
|
||||
}
|
||||
if (supportedLocaleString == null) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
@ -118,4 +137,46 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
|
||||
}
|
||||
return tagset;
|
||||
}
|
||||
|
||||
// Implementation of ResourceBundleBasedAdapter
|
||||
@Override
|
||||
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
|
||||
List<Locale> candidates = super.getCandidateLocales(baseName, locale);
|
||||
return applyParentLocales(baseName, candidates);
|
||||
}
|
||||
|
||||
private List<Locale> applyParentLocales(String baseName, List<Locale> candidates) {
|
||||
if (Objects.isNull(parentLocalesMap)) {
|
||||
Map<Locale, Locale> map = new HashMap<>();
|
||||
Map<String, String> parentLocales = baseMetaInfo.parentLocales();
|
||||
parentLocales.keySet().forEach(parent -> {
|
||||
Arrays.asList(parentLocales.get(parent).split(" ")).stream().forEach(child -> {
|
||||
map.put(Locale.forLanguageTag(child),
|
||||
"root".equals(parent) ? Locale.ROOT : Locale.forLanguageTag(parent));
|
||||
});
|
||||
});
|
||||
parentLocalesMap = Collections.unmodifiableMap(map);
|
||||
}
|
||||
|
||||
// check irregular parents
|
||||
for (int i = 0; i < candidates.size(); i++) {
|
||||
Locale l = candidates.get(i);
|
||||
Locale p = parentLocalesMap.get(l);
|
||||
if (!l.equals(Locale.ROOT) &&
|
||||
Objects.nonNull(p) &&
|
||||
!candidates.get(i+1).equals(p)) {
|
||||
List<Locale> applied = candidates.subList(0, i+1);
|
||||
applied.addAll(applyParentLocales(baseName, super.getCandidateLocales(baseName, p)));
|
||||
return applied;
|
||||
}
|
||||
}
|
||||
|
||||
return candidates;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupportedProviderLocale(Locale locale, Set<String> langtags) {
|
||||
return Locale.ROOT.equals(locale) ||
|
||||
langtags.contains(locale.stripExtensions().toLanguageTag());
|
||||
}
|
||||
}
|
||||
|
@ -186,6 +186,6 @@ public class BreakIteratorProviderImpl extends BreakIteratorProvider
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
}
|
||||
|
@ -63,6 +63,14 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
|
||||
if (key != null) {
|
||||
LocaleResources lr = LocaleProviderAdapter.forType(type).getLocaleResources(locale);
|
||||
String[] strings = javatime ? lr.getJavaTimeNames(key) : lr.getCalendarNames(key);
|
||||
|
||||
// If standalone names are requested and no "standalone." resources are found,
|
||||
// try the default ones instead.
|
||||
if (strings == null && key.indexOf("standalone.") != -1) {
|
||||
key = key.replaceFirst("standalone.", "");
|
||||
strings = javatime ? lr.getJavaTimeNames(key) : lr.getCalendarNames(key);
|
||||
}
|
||||
|
||||
if (strings != null && strings.length > 0) {
|
||||
if (field == DAY_OF_WEEK || field == YEAR) {
|
||||
--value;
|
||||
@ -118,6 +126,14 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
|
||||
if (key != null) {
|
||||
LocaleResources lr = LocaleProviderAdapter.forType(type).getLocaleResources(locale);
|
||||
String[] strings = javatime ? lr.getJavaTimeNames(key) : lr.getCalendarNames(key);
|
||||
|
||||
// If standalone names are requested and no "standalone." resources are found,
|
||||
// try the default ones instead.
|
||||
if (strings == null && key.indexOf("standalone.") != -1) {
|
||||
key = key.replaceFirst("standalone.", "");
|
||||
strings = javatime ? lr.getJavaTimeNames(key) : lr.getCalendarNames(key);
|
||||
}
|
||||
|
||||
if (strings != null) {
|
||||
if (!hasDuplicates(strings)) {
|
||||
if (field == YEAR) {
|
||||
@ -281,8 +297,8 @@ public class CalendarNameProviderImpl extends CalendarNameProvider implements Av
|
||||
break;
|
||||
|
||||
case DAY_OF_WEEK:
|
||||
// support standalone narrow day names
|
||||
if (isStandalone && isNarrow) {
|
||||
// support standalone day names
|
||||
if (isStandalone) {
|
||||
key.append("standalone.");
|
||||
}
|
||||
key.append("Day").append(toStyleName(baseStyle));
|
||||
|
@ -75,7 +75,7 @@ public class CollatorProviderImpl extends CollatorProvider implements AvailableL
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -63,7 +63,7 @@ public class DateFormatProviderImpl extends DateFormatProvider implements Availa
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -60,7 +60,7 @@ public class DateFormatSymbolsProviderImpl extends DateFormatSymbolsProvider imp
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -60,7 +60,7 @@ public class DecimalFormatSymbolsProviderImpl extends DecimalFormatSymbolsProvid
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -66,4 +66,9 @@ public class FallbackLocaleProviderAdapter extends JRELocaleProviderAdapter {
|
||||
protected Set<String> createLanguageTagSet(String category) {
|
||||
return rootTagSet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupportedProviderLocale(Locale locale, Set<String>langtags) {
|
||||
return Locale.ROOT.equals(locale);
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,9 @@ import java.text.spi.DecimalFormatSymbolsProvider;
|
||||
import java.text.spi.NumberFormatProvider;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
@ -379,6 +381,13 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements R
|
||||
return localeData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
|
||||
return ResourceBundle.Control
|
||||
.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT)
|
||||
.getCandidateLocales(baseName, locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of the installed locales. Currently, this simply returns
|
||||
* the list of locales for which a sun.text.resources.FormatData bundle
|
||||
@ -417,12 +426,12 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements R
|
||||
}
|
||||
|
||||
private static String createSupportedLocaleString(String category) {
|
||||
// Directly call English tags, as we know it's in the base module.
|
||||
String supportedLocaleString = EnLocaleDataMetaInfo.getSupportedLocaleString(category);
|
||||
// Directly call Base tags, as we know it's in the base module.
|
||||
String supportedLocaleString = BaseLocaleDataMetaInfo.getSupportedLocaleString(category);
|
||||
|
||||
// Use ServiceLoader to dynamically acquire installed locales' tags.
|
||||
try {
|
||||
String nonENTags = AccessController.doPrivileged(new PrivilegedExceptionAction<String>() {
|
||||
String nonBaseTags = AccessController.doPrivileged(new PrivilegedExceptionAction<String>() {
|
||||
@Override
|
||||
public String run() {
|
||||
String tags = null;
|
||||
@ -443,8 +452,8 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements R
|
||||
}
|
||||
});
|
||||
|
||||
if (nonENTags != null) {
|
||||
supportedLocaleString += " " + nonENTags;
|
||||
if (nonBaseTags != null) {
|
||||
supportedLocaleString += " " + nonBaseTags;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// catch any exception, and ignore them as if non-EN locales do not exist.
|
||||
@ -497,4 +506,22 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter implements R
|
||||
}
|
||||
return locales;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupportedProviderLocale(Locale locale, Set<String> langtags) {
|
||||
if (Locale.ROOT.equals(locale)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
locale = locale.stripExtensions();
|
||||
if (langtags.contains(locale.toLanguageTag())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String oldname = locale.toString().replace('_', '-');
|
||||
return langtags.contains(oldname) ||
|
||||
"ja-JP-JP".equals(oldname) ||
|
||||
"th-TH-TH".equals(oldname) ||
|
||||
"no-NO-NY".equals(oldname);
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ public class LocaleNameProviderImpl extends LocaleNameProvider implements Availa
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -88,8 +88,7 @@ public abstract class LocaleProviderAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* LocaleProviderAdapter preference list. The default list is intended
|
||||
* to behave the same manner in JDK7.
|
||||
* LocaleProviderAdapter preference list.
|
||||
*/
|
||||
private static final List<Type> adapterPreference;
|
||||
|
||||
@ -177,7 +176,14 @@ public abstract class LocaleProviderAdapter {
|
||||
defaultLocaleProviderAdapter = Type.JRE;
|
||||
}
|
||||
} else {
|
||||
// Default preference list
|
||||
// Default preference list.
|
||||
try {
|
||||
cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
|
||||
typeList.add(Type.CLDR);
|
||||
defaultLocaleProviderAdapter = Type.CLDR;
|
||||
} catch (UnsupportedOperationException e) {
|
||||
LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
|
||||
}
|
||||
typeList.add(Type.JRE);
|
||||
typeList.add(Type.SPI);
|
||||
defaultLocaleProviderAdapter = Type.JRE;
|
||||
@ -213,7 +219,10 @@ public abstract class LocaleProviderAdapter {
|
||||
public static LocaleProviderAdapter getResourceBundleBased() {
|
||||
for (Type type : getAdapterPreference()) {
|
||||
if (type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK) {
|
||||
return forType(type);
|
||||
LocaleProviderAdapter adapter = forType(type);
|
||||
if (adapter != null) {
|
||||
return adapter;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Shouldn't happen.
|
||||
@ -295,28 +304,9 @@ public abstract class LocaleProviderAdapter {
|
||||
* A utility method for implementing the default LocaleServiceProvider.isSupportedLocale
|
||||
* for the JRE, CLDR, and FALLBACK adapters.
|
||||
*/
|
||||
public static boolean isSupportedLocale(Locale locale, LocaleProviderAdapter.Type type, Set<String> langtags) {
|
||||
public boolean isSupportedProviderLocale(Locale locale, Set<String> langtags) {
|
||||
LocaleProviderAdapter.Type type = getAdapterType();
|
||||
assert type == Type.JRE || type == Type.CLDR || type == Type.FALLBACK;
|
||||
if (Locale.ROOT.equals(locale)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (type == Type.FALLBACK) {
|
||||
// no other locales except ROOT are supported for FALLBACK
|
||||
return false;
|
||||
}
|
||||
|
||||
locale = locale.stripExtensions();
|
||||
if (langtags.contains(locale.toLanguageTag())) {
|
||||
return true;
|
||||
}
|
||||
if (type == Type.JRE) {
|
||||
String oldname = locale.toString().replace('_', '-');
|
||||
return langtags.contains(oldname) ||
|
||||
"ja-JP-JP".equals(oldname) ||
|
||||
"th-TH-TH".equals(oldname) ||
|
||||
"no-NO-NY".equals(oldname);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -402,11 +402,12 @@ public class LocaleResources {
|
||||
if (timeStyle >= 0) {
|
||||
if (dateStyle >= 0) {
|
||||
String dateTimePattern = null;
|
||||
int dateTimeStyle = Math.max(dateStyle, timeStyle);
|
||||
if (prefix != null) {
|
||||
dateTimePattern = getDateTimePattern(prefix, "DateTimePatterns", 0, calType);
|
||||
dateTimePattern = getDateTimePattern(prefix, "DateTimePatterns", dateTimeStyle, calType);
|
||||
}
|
||||
if (dateTimePattern == null) {
|
||||
dateTimePattern = getDateTimePattern(null, "DateTimePatterns", 0, calType);
|
||||
dateTimePattern = getDateTimePattern(null, "DateTimePatterns", dateTimeStyle, calType);
|
||||
}
|
||||
switch (dateTimePattern) {
|
||||
case "{1} {0}":
|
||||
@ -416,7 +417,7 @@ public class LocaleResources {
|
||||
pattern = timePattern + " " + datePattern;
|
||||
break;
|
||||
default:
|
||||
pattern = MessageFormat.format(dateTimePattern, timePattern, datePattern);
|
||||
pattern = MessageFormat.format(dateTimePattern.replaceAll("'", "''"), timePattern, datePattern);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
@ -492,7 +493,10 @@ public class LocaleResources {
|
||||
assert prefix != null;
|
||||
return null;
|
||||
}
|
||||
return ((String[])value)[styleIndex];
|
||||
|
||||
// for DateTimePatterns. CLDR has multiple styles, while JRE has one.
|
||||
String[] styles = (String[])value;
|
||||
return (styles.length > 1 ? styles[styleIndex] : styles[0]);
|
||||
}
|
||||
|
||||
private static class ResourceReference extends SoftReference<Object> {
|
||||
|
@ -86,7 +86,7 @@ public class NumberFormatProviderImpl extends NumberFormatProvider implements Av
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -25,6 +25,8 @@
|
||||
|
||||
package sun.util.locale.provider;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import sun.util.resources.LocaleData;
|
||||
|
||||
/**
|
||||
@ -34,4 +36,9 @@ import sun.util.resources.LocaleData;
|
||||
*/
|
||||
public interface ResourceBundleBasedAdapter {
|
||||
public LocaleData getLocaleData();
|
||||
|
||||
/**
|
||||
* candidate locales customization
|
||||
*/
|
||||
public List<Locale> getCandidateLocales(String baseName, Locale locale);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015, 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
|
||||
@ -30,6 +30,7 @@ import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.spi.TimeZoneNameProvider;
|
||||
import sun.util.calendar.ZoneInfoFile;
|
||||
|
||||
/**
|
||||
* Concrete implementation of the
|
||||
@ -42,6 +43,7 @@ import java.util.spi.TimeZoneNameProvider;
|
||||
public class TimeZoneNameProviderImpl extends TimeZoneNameProvider {
|
||||
private final LocaleProviderAdapter.Type type;
|
||||
private final Set<String> langtags;
|
||||
private static final String CLDR_NO_INHERITANCE_MARKER = "\u2205\u2205\u2205";
|
||||
|
||||
TimeZoneNameProviderImpl(LocaleProviderAdapter.Type type, Set<String> langtags) {
|
||||
this.type = type;
|
||||
@ -62,7 +64,7 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider {
|
||||
|
||||
@Override
|
||||
public boolean isSupportedLocale(Locale locale) {
|
||||
return LocaleProviderAdapter.isSupportedLocale(locale, type, langtags);
|
||||
return LocaleProviderAdapter.forType(type).isSupportedProviderLocale(locale, langtags);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -121,7 +123,28 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider {
|
||||
private String[] getDisplayNameArray(String id, Locale locale) {
|
||||
Objects.requireNonNull(id);
|
||||
Objects.requireNonNull(locale);
|
||||
return LocaleProviderAdapter.forType(type).getLocaleResources(locale).getTimeZoneNames(id);
|
||||
|
||||
String[] ret =
|
||||
LocaleProviderAdapter.forType(type).getLocaleResources(locale).getTimeZoneNames(id);
|
||||
|
||||
if (Objects.nonNull(ret) && type == LocaleProviderAdapter.Type.CLDR) {
|
||||
// check for CLDR's "no inheritance marker"
|
||||
for (int index = 0; index < ret.length; index++) {
|
||||
TimeZone tz = null;
|
||||
if (CLDR_NO_INHERITANCE_MARKER.equals(ret[index])) {
|
||||
if (Objects.isNull(tz)) {
|
||||
tz = TimeZone.getTimeZone(id);
|
||||
}
|
||||
int offset = tz.getRawOffset();
|
||||
if (index == 3 || index == 4) { // daylight
|
||||
offset += tz.getDSTSavings();
|
||||
}
|
||||
ret[index] = ZoneInfoFile.toCustomID(offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -51,6 +51,7 @@ import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
import sun.util.locale.provider.JRELocaleProviderAdapter;
|
||||
import sun.util.locale.provider.LocaleProviderAdapter;
|
||||
import sun.util.locale.provider.ResourceBundleBasedAdapter;
|
||||
import static sun.util.locale.provider.LocaleProviderAdapter.Type.CLDR;
|
||||
import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE;
|
||||
|
||||
@ -205,16 +206,19 @@ public class LocaleData {
|
||||
*/
|
||||
@Override
|
||||
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
|
||||
List<Locale> candidates = super.getCandidateLocales(baseName, locale);
|
||||
LocaleProviderAdapter.Type type = baseName.contains(DOTCLDR) ? CLDR : JRE;
|
||||
LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
|
||||
List<Locale> candidates = adapter instanceof ResourceBundleBasedAdapter ?
|
||||
((ResourceBundleBasedAdapter)adapter).getCandidateLocales(baseName, locale) :
|
||||
super.getCandidateLocales(baseName, locale);
|
||||
|
||||
// Weed out Locales which are known to have no resource bundles
|
||||
int lastDot = baseName.lastIndexOf('.');
|
||||
String category = (lastDot >= 0) ? baseName.substring(lastDot + 1) : baseName;
|
||||
LocaleProviderAdapter.Type type = baseName.contains(DOTCLDR) ? CLDR : JRE;
|
||||
LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
|
||||
Set<String> langtags = ((JRELocaleProviderAdapter)adapter).getLanguageTagSet(category);
|
||||
if (!langtags.isEmpty()) {
|
||||
for (Iterator<Locale> itr = candidates.iterator(); itr.hasNext();) {
|
||||
if (!LocaleProviderAdapter.isSupportedLocale(itr.next(), type, langtags)) {
|
||||
if (!adapter.isSupportedProviderLocale(itr.next(), langtags)) {
|
||||
itr.remove();
|
||||
}
|
||||
}
|
||||
@ -247,17 +251,18 @@ public class LocaleData {
|
||||
private static final String DOTCLDR = ".cldr";
|
||||
|
||||
/**
|
||||
* Changes baseName to its per-language package name and
|
||||
* Changes baseName to its per-language/country package name and
|
||||
* calls the super class implementation. For example,
|
||||
* if the baseName is "sun.text.resources.FormatData" and locale is ja_JP,
|
||||
* the baseName is changed to "sun.text.resources.ja.FormatData". If
|
||||
* the baseName is changed to "sun.text.resources.ja.JP.FormatData". If
|
||||
* baseName contains "cldr", such as "sun.text.resources.cldr.FormatData",
|
||||
* the name is changed to "sun.text.resources.cldr.jp.FormatData".
|
||||
* the name is changed to "sun.text.resources.cldr.ja.JP.FormatData".
|
||||
*/
|
||||
@Override
|
||||
public String toBundleName(String baseName, Locale locale) {
|
||||
String newBaseName = baseName;
|
||||
String lang = locale.getLanguage();
|
||||
String ctry = locale.getCountry();
|
||||
if (lang.length() > 0) {
|
||||
if (baseName.startsWith(JRE.getUtilResourcesPackage())
|
||||
|| baseName.startsWith(JRE.getTextResourcesPackage())) {
|
||||
@ -268,7 +273,8 @@ public class LocaleData {
|
||||
if (baseName.indexOf(DOTCLDR, index) > 0) {
|
||||
index += DOTCLDR.length();
|
||||
}
|
||||
newBaseName = baseName.substring(0, index + 1) + lang
|
||||
ctry = (ctry.length() == 2) ? ("." + ctry) : "";
|
||||
newBaseName = baseName.substring(0, index + 1) + lang + ctry
|
||||
+ baseName.substring(index);
|
||||
}
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ grant codeBase "jrt:/jdk.crypto.ec" {
|
||||
|
||||
grant codeBase "jrt:/jdk.crypto.pkcs11" {
|
||||
permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
|
||||
permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
|
||||
permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
|
||||
permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
|
||||
// needs "security.pkcs11.allowSingleThreadedModules"
|
||||
|
@ -66,7 +66,7 @@
|
||||
# List of providers and their preference orders (see above):
|
||||
#
|
||||
#ifdef solaris
|
||||
security.provider.tbd=com.oracle.security.ucrypto.UcryptoProvider ${java.home}/conf/security/ucrypto-solaris.cfg
|
||||
security.provider.tbd=com.oracle.security.ucrypto.UcryptoProvider
|
||||
security.provider.tbd=sun.security.pkcs11.SunPKCS11 ${java.home}/conf/security/sunpkcs11-solaris.cfg
|
||||
#endif
|
||||
security.provider.tbd=sun.security.provider.Sun
|
||||
@ -79,12 +79,17 @@ security.provider.tbd=com.sun.security.sasl.Provider
|
||||
security.provider.tbd=org.jcp.xml.dsig.internal.dom.XMLDSigRI
|
||||
security.provider.tbd=sun.security.smartcardio.SunPCSC
|
||||
security.provider.tbd=sun.security.provider.certpath.ldap.JdkLDAP
|
||||
security.provider.tbd=com.sun.security.sasl.gsskerb.JdkSASL
|
||||
#ifdef windows
|
||||
security.provider.tbd=sun.security.mscapi.SunMSCAPI
|
||||
#endif
|
||||
#ifdef macosx
|
||||
security.provider.tbd=apple.security.AppleProvider
|
||||
#endif
|
||||
#ifndef solaris
|
||||
security.provider.tbd=sun.security.pkcs11.SunPKCS11
|
||||
#endif
|
||||
|
||||
|
||||
#
|
||||
# Sun Provider SecureRandom seed source.
|
||||
|
@ -52,6 +52,8 @@
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<!-- Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
|
||||
|
@ -351,8 +351,8 @@ java_props_t *
|
||||
GetJavaProperties(JNIEnv* env)
|
||||
{
|
||||
static java_props_t sprops = {0};
|
||||
|
||||
OSVERSIONINFOEX ver;
|
||||
int majorVersion;
|
||||
int minorVersion;
|
||||
|
||||
if (sprops.line_separator) {
|
||||
return &sprops;
|
||||
@ -383,21 +383,67 @@ GetJavaProperties(JNIEnv* env)
|
||||
/* OS properties */
|
||||
{
|
||||
char buf[100];
|
||||
SYSTEM_INFO si;
|
||||
PGNSI pGNSI;
|
||||
boolean is_workstation;
|
||||
boolean is_64bit;
|
||||
DWORD platformId;
|
||||
{
|
||||
OSVERSIONINFOEX ver;
|
||||
ver.dwOSVersionInfoSize = sizeof(ver);
|
||||
GetVersionEx((OSVERSIONINFO *) &ver);
|
||||
majorVersion = ver.dwMajorVersion;
|
||||
minorVersion = ver.dwMinorVersion;
|
||||
is_workstation = (ver.wProductType == VER_NT_WORKSTATION);
|
||||
platformId = ver.dwPlatformId;
|
||||
sprops.patch_level = _strdup(ver.szCSDVersion);
|
||||
}
|
||||
|
||||
ver.dwOSVersionInfoSize = sizeof(ver);
|
||||
GetVersionEx((OSVERSIONINFO *) &ver);
|
||||
{
|
||||
SYSTEM_INFO si;
|
||||
ZeroMemory(&si, sizeof(SYSTEM_INFO));
|
||||
GetNativeSystemInfo(&si);
|
||||
|
||||
ZeroMemory(&si, sizeof(SYSTEM_INFO));
|
||||
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
|
||||
pGNSI = (PGNSI) GetProcAddress(
|
||||
GetModuleHandle(TEXT("kernel32.dll")),
|
||||
"GetNativeSystemInfo");
|
||||
if(NULL != pGNSI)
|
||||
pGNSI(&si);
|
||||
else
|
||||
GetSystemInfo(&si);
|
||||
is_64bit = (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64);
|
||||
}
|
||||
do {
|
||||
// Read the major and minor version number from kernel32.dll
|
||||
VS_FIXEDFILEINFO *file_info;
|
||||
WCHAR kernel32_path[MAX_PATH];
|
||||
DWORD version_size;
|
||||
LPTSTR version_info;
|
||||
UINT len, ret;
|
||||
|
||||
// Get the full path to \Windows\System32\kernel32.dll and use that for
|
||||
// determining what version of Windows we're running on.
|
||||
len = MAX_PATH - (UINT)strlen("\\kernel32.dll") - 1;
|
||||
ret = GetSystemDirectoryW(kernel32_path, len);
|
||||
if (ret == 0 || ret > len) {
|
||||
break;
|
||||
}
|
||||
wcsncat(kernel32_path, L"\\kernel32.dll", MAX_PATH - ret);
|
||||
|
||||
version_size = GetFileVersionInfoSizeW(kernel32_path, NULL);
|
||||
if (version_size == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
version_info = (LPTSTR)malloc(version_size);
|
||||
if (version_info == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!GetFileVersionInfoW(kernel32_path, 0, version_size, version_info)) {
|
||||
free(version_info);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!VerQueryValueW(version_info, L"\\", (LPVOID*)&file_info, &len)) {
|
||||
free(version_info);
|
||||
break;
|
||||
}
|
||||
majorVersion = HIWORD(file_info->dwProductVersionMS);
|
||||
minorVersion = LOWORD(file_info->dwProductVersionMS);
|
||||
free(version_info);
|
||||
} while (0);
|
||||
|
||||
/*
|
||||
* From msdn page on OSVERSIONINFOEX, current as of this
|
||||
@ -423,17 +469,15 @@ GetJavaProperties(JNIEnv* env)
|
||||
* Windows Server 2008 R2 6 1 (!VER_NT_WORKSTATION)
|
||||
* Windows 8 6 2 (VER_NT_WORKSTATION)
|
||||
* Windows Server 2012 6 2 (!VER_NT_WORKSTATION)
|
||||
* Windows 10 10 0 (VER_NT_WORKSTATION)
|
||||
*
|
||||
* This mapping will presumably be augmented as new Windows
|
||||
* versions are released.
|
||||
*/
|
||||
switch (ver.dwPlatformId) {
|
||||
case VER_PLATFORM_WIN32s:
|
||||
sprops.os_name = "Windows 3.1";
|
||||
break;
|
||||
switch (platformId) {
|
||||
case VER_PLATFORM_WIN32_WINDOWS:
|
||||
if (ver.dwMajorVersion == 4) {
|
||||
switch (ver.dwMinorVersion) {
|
||||
if (majorVersion == 4) {
|
||||
switch (minorVersion) {
|
||||
case 0: sprops.os_name = "Windows 95"; break;
|
||||
case 10: sprops.os_name = "Windows 98"; break;
|
||||
case 90: sprops.os_name = "Windows Me"; break;
|
||||
@ -444,10 +488,10 @@ GetJavaProperties(JNIEnv* env)
|
||||
}
|
||||
break;
|
||||
case VER_PLATFORM_WIN32_NT:
|
||||
if (ver.dwMajorVersion <= 4) {
|
||||
if (majorVersion <= 4) {
|
||||
sprops.os_name = "Windows NT";
|
||||
} else if (ver.dwMajorVersion == 5) {
|
||||
switch (ver.dwMinorVersion) {
|
||||
} else if (majorVersion == 5) {
|
||||
switch (minorVersion) {
|
||||
case 0: sprops.os_name = "Windows 2000"; break;
|
||||
case 1: sprops.os_name = "Windows XP"; break;
|
||||
case 2:
|
||||
@ -462,8 +506,7 @@ GetJavaProperties(JNIEnv* env)
|
||||
* If it is, the operating system is Windows XP 64 bit;
|
||||
* otherwise, it is Windows Server 2003."
|
||||
*/
|
||||
if(ver.wProductType == VER_NT_WORKSTATION &&
|
||||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
|
||||
if (is_workstation && is_64bit) {
|
||||
sprops.os_name = "Windows XP"; /* 64 bit */
|
||||
} else {
|
||||
sprops.os_name = "Windows 2003";
|
||||
@ -471,12 +514,12 @@ GetJavaProperties(JNIEnv* env)
|
||||
break;
|
||||
default: sprops.os_name = "Windows NT (unknown)"; break;
|
||||
}
|
||||
} else if (ver.dwMajorVersion == 6) {
|
||||
} else if (majorVersion == 6) {
|
||||
/*
|
||||
* See table in MSDN OSVERSIONINFOEX documentation.
|
||||
*/
|
||||
if (ver.wProductType == VER_NT_WORKSTATION) {
|
||||
switch (ver.dwMinorVersion) {
|
||||
if (is_workstation) {
|
||||
switch (minorVersion) {
|
||||
case 0: sprops.os_name = "Windows Vista"; break;
|
||||
case 1: sprops.os_name = "Windows 7"; break;
|
||||
case 2: sprops.os_name = "Windows 8"; break;
|
||||
@ -484,7 +527,7 @@ GetJavaProperties(JNIEnv* env)
|
||||
default: sprops.os_name = "Windows NT (unknown)";
|
||||
}
|
||||
} else {
|
||||
switch (ver.dwMinorVersion) {
|
||||
switch (minorVersion) {
|
||||
case 0: sprops.os_name = "Windows Server 2008"; break;
|
||||
case 1: sprops.os_name = "Windows Server 2008 R2"; break;
|
||||
case 2: sprops.os_name = "Windows Server 2012"; break;
|
||||
@ -492,6 +535,17 @@ GetJavaProperties(JNIEnv* env)
|
||||
default: sprops.os_name = "Windows NT (unknown)";
|
||||
}
|
||||
}
|
||||
} else if (majorVersion == 10) {
|
||||
if (is_workstation) {
|
||||
switch (minorVersion) {
|
||||
case 0: sprops.os_name = "Windows 10"; break;
|
||||
default: sprops.os_name = "Windows NT (unknown)";
|
||||
}
|
||||
} else {
|
||||
switch (minorVersion) {
|
||||
default: sprops.os_name = "Windows NT (unknown)";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sprops.os_name = "Windows NT (unknown)";
|
||||
}
|
||||
@ -500,7 +554,7 @@ GetJavaProperties(JNIEnv* env)
|
||||
sprops.os_name = "Windows (unknown)";
|
||||
break;
|
||||
}
|
||||
sprintf(buf, "%d.%d", ver.dwMajorVersion, ver.dwMinorVersion);
|
||||
sprintf(buf, "%d.%d", majorVersion, minorVersion);
|
||||
sprops.os_version = _strdup(buf);
|
||||
#if _M_IA64
|
||||
sprops.os_arch = "ia64";
|
||||
@ -511,9 +565,6 @@ GetJavaProperties(JNIEnv* env)
|
||||
#else
|
||||
sprops.os_arch = "unknown";
|
||||
#endif
|
||||
|
||||
sprops.patch_level = _strdup(ver.szCSDVersion);
|
||||
|
||||
sprops.desktop = "windows";
|
||||
}
|
||||
|
||||
@ -624,7 +675,7 @@ GetJavaProperties(JNIEnv* env)
|
||||
&display_encoding);
|
||||
|
||||
sprops.sun_jnu_encoding = getEncodingInternal(systemDefaultLCID);
|
||||
if (LANGIDFROMLCID(userDefaultLCID) == 0x0c04 && ver.dwMajorVersion == 6) {
|
||||
if (LANGIDFROMLCID(userDefaultLCID) == 0x0c04 && majorVersion == 6) {
|
||||
// MS claims "Vista has built-in support for HKSCS-2004.
|
||||
// All of the HKSCS-2004 characters have Unicode 4.1.
|
||||
// PUA code point assignments". But what it really means
|
||||
|
@ -27,11 +27,7 @@ package sun.security.provider.certpath.ldap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.security.Provider;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.ProviderException;
|
||||
import java.security.*;
|
||||
import java.security.cert.CertStoreParameters;
|
||||
|
||||
/**
|
||||
@ -75,16 +71,22 @@ public final class JdkLDAP extends Provider {
|
||||
public JdkLDAP() {
|
||||
super("JdkLDAP", 1.9d, "JdkLDAP Provider (implements LDAP CertStore)");
|
||||
|
||||
HashMap<String, String> attrs = new HashMap<>(2);
|
||||
attrs.put("LDAPSchema", "RFC2587");
|
||||
attrs.put("ImplementedIn", "Software");
|
||||
final Provider p = this;
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
HashMap<String, String> attrs = new HashMap<>(2);
|
||||
attrs.put("LDAPSchema", "RFC2587");
|
||||
attrs.put("ImplementedIn", "Software");
|
||||
|
||||
/*
|
||||
* CertStore
|
||||
* attrs: LDAPSchema, ImplementedIn
|
||||
*/
|
||||
putService(new ProviderService(this, "CertStore",
|
||||
"LDAP", "sun.security.provider.certpath.ldap.LDAPCertStore",
|
||||
null, attrs));
|
||||
/*
|
||||
* CertStore
|
||||
* attrs: LDAPSchema, ImplementedIn
|
||||
*/
|
||||
putService(new ProviderService(p, "CertStore",
|
||||
"LDAP", "sun.security.provider.certpath.ldap.LDAPCertStore",
|
||||
null, attrs));
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -140,37 +140,32 @@ public final class DelegationPermission extends BasicPermission
|
||||
*/
|
||||
@Override
|
||||
public boolean implies(Permission p) {
|
||||
if (!(p instanceof DelegationPermission))
|
||||
return false;
|
||||
|
||||
DelegationPermission that = (DelegationPermission) p;
|
||||
if (this.subordinate.equals(that.subordinate) &&
|
||||
this.service.equals(that.service))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return equals(p);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks two DelegationPermission objects for equality.
|
||||
*
|
||||
* @param obj the object to test for equality with this object.
|
||||
*
|
||||
* @return true if {@code obj} is a DelegationPermission, and
|
||||
* has the same subordinate and service principal as this.
|
||||
* has the same subordinate and service principal as this
|
||||
* DelegationPermission object.
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj == this)
|
||||
if (obj == this) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (! (obj instanceof DelegationPermission))
|
||||
if (!(obj instanceof DelegationPermission)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
DelegationPermission that = (DelegationPermission) obj;
|
||||
return implies(that);
|
||||
|
||||
return this.subordinate.equals(that.subordinate) &&
|
||||
this.service.equals(that.service);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -180,7 +175,7 @@ public final class DelegationPermission extends BasicPermission
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getName().hashCode();
|
||||
return 17 * subordinate.hashCode() + 31 * service.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -223,42 +218,6 @@ public final class DelegationPermission extends BasicPermission
|
||||
init(getName());
|
||||
}
|
||||
|
||||
/*
|
||||
public static void main(String args[]) throws Exception {
|
||||
DelegationPermission this_ =
|
||||
new DelegationPermission(args[0]);
|
||||
DelegationPermission that_ =
|
||||
new DelegationPermission(args[1]);
|
||||
System.out.println("-----\n");
|
||||
System.out.println("this.implies(that) = " + this_.implies(that_));
|
||||
System.out.println("-----\n");
|
||||
System.out.println("this = "+this_);
|
||||
System.out.println("-----\n");
|
||||
System.out.println("that = "+that_);
|
||||
System.out.println("-----\n");
|
||||
|
||||
KrbDelegationPermissionCollection nps =
|
||||
new KrbDelegationPermissionCollection();
|
||||
nps.add(this_);
|
||||
nps.add(new DelegationPermission("\"host/foo.example.com@EXAMPLE.COM\" \"CN=Gary Ellison/OU=JSN/O=SUNW/L=Palo Alto/ST=CA/C=US\""));
|
||||
try {
|
||||
nps.add(new DelegationPermission("host/foo.example.com@EXAMPLE.COM \"CN=Gary Ellison/OU=JSN/O=SUNW/L=Palo Alto/ST=CA/C=US\""));
|
||||
} catch (Exception e) {
|
||||
System.err.println(e);
|
||||
}
|
||||
|
||||
System.out.println("nps.implies(that) = " + nps.implies(that_));
|
||||
System.out.println("-----\n");
|
||||
|
||||
Enumeration e = nps.elements();
|
||||
|
||||
while (e.hasMoreElements()) {
|
||||
DelegationPermission x =
|
||||
(DelegationPermission) e.nextElement();
|
||||
System.out.println("nps.e = " + x);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2015, 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
|
||||
@ -27,6 +27,12 @@ package sun.security.jgss;
|
||||
|
||||
import java.security.Provider;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.ProviderException;
|
||||
import sun.security.jgss.krb5.Krb5MechFactory;
|
||||
import sun.security.jgss.spnego.SpNegoMechFactory;
|
||||
|
||||
/**
|
||||
* Defines the Sun JGSS provider.
|
||||
@ -58,23 +64,54 @@ public final class SunProvider extends Provider {
|
||||
"(Kerberos v5, SPNEGO)";
|
||||
// "(Kerberos v5, Dummy GSS-API Mechanism)";
|
||||
|
||||
private static final class ProviderService extends Provider.Service {
|
||||
ProviderService(Provider p, String type, String algo, String cn) {
|
||||
super(p, type, algo, cn, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object newInstance(Object ctrParamObj)
|
||||
throws NoSuchAlgorithmException {
|
||||
String type = getType();
|
||||
if (ctrParamObj != null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter not used with " + type +
|
||||
" engines");
|
||||
}
|
||||
String algo = getAlgorithm();
|
||||
try {
|
||||
if (type.equals("GssApiMechanism")) {
|
||||
if (algo.equals("1.2.840.113554.1.2.2")) {
|
||||
return new Krb5MechFactory();
|
||||
} else if (algo.equals("1.3.6.1.5.5.2")) {
|
||||
return new SpNegoMechFactory();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new NoSuchAlgorithmException
|
||||
("Error constructing " + type + " for " +
|
||||
algo + " using SunJGSS", ex);
|
||||
}
|
||||
throw new ProviderException("No impl for " + algo +
|
||||
" " + type);
|
||||
}
|
||||
}
|
||||
|
||||
public static final SunProvider INSTANCE = new SunProvider();
|
||||
|
||||
public SunProvider() {
|
||||
/* We are the Sun JGSS provider */
|
||||
super("SunJGSS", 1.9d, INFO);
|
||||
|
||||
AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<Void>() {
|
||||
final Provider p = this;
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
put("GssApiMechanism.1.2.840.113554.1.2.2",
|
||||
"sun.security.jgss.krb5.Krb5MechFactory");
|
||||
put("GssApiMechanism.1.3.6.1.5.5.2",
|
||||
"sun.security.jgss.spnego.SpNegoMechFactory");
|
||||
/*
|
||||
put("GssApiMechanism.1.3.6.1.4.1.42.2.26.1.2",
|
||||
"sun.security.jgss.dummy.DummyMechFactory");
|
||||
*/
|
||||
putService(new ProviderService(p, "GssApiMechanism",
|
||||
"1.2.840.113554.1.2.2",
|
||||
"sun.security.jgss.krb5.Krb5MechFactory"));
|
||||
putService(new ProviderService(p, "GssApiMechanism",
|
||||
"1.3.6.1.5.5.2",
|
||||
"sun.security.jgss.spnego.SpNegoMechFactory"));
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, 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
|
||||
@ -26,6 +26,9 @@ package com.sun.security.sasl;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.ProviderException;
|
||||
|
||||
/**
|
||||
* The SASL provider.
|
||||
@ -34,12 +37,10 @@ import java.security.PrivilegedAction;
|
||||
* - PLAIN
|
||||
* - CRAM-MD5
|
||||
* - DIGEST-MD5
|
||||
* - GSSAPI/Kerberos v5
|
||||
* - NTLM
|
||||
* And server support for
|
||||
* - CRAM-MD5
|
||||
* - DIGEST-MD5
|
||||
* - GSSAPI/Kerberos v5
|
||||
* - NTLM
|
||||
*/
|
||||
|
||||
@ -49,38 +50,78 @@ public final class Provider extends java.security.Provider {
|
||||
|
||||
private static final String info = "Sun SASL provider" +
|
||||
"(implements client mechanisms for: " +
|
||||
"DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM;" +
|
||||
" server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)";
|
||||
"DIGEST-MD5, EXTERNAL, PLAIN, CRAM-MD5, NTLM;" +
|
||||
" server mechanisms for: DIGEST-MD5, CRAM-MD5, NTLM)";
|
||||
|
||||
private static final class ProviderService
|
||||
extends java.security.Provider.Service {
|
||||
ProviderService(java.security.Provider p, String type, String algo,
|
||||
String cn) {
|
||||
super(p, type, algo, cn, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object newInstance(Object ctrParamObj)
|
||||
throws NoSuchAlgorithmException {
|
||||
String type = getType();
|
||||
if (ctrParamObj != null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter not used with " + type + " engines");
|
||||
}
|
||||
|
||||
String algo = getAlgorithm();
|
||||
try {
|
||||
// DIGEST-MD5, NTLM uses same impl class for client and server
|
||||
if (algo.equals("DIGEST-MD5")) {
|
||||
return new com.sun.security.sasl.digest.FactoryImpl();
|
||||
}
|
||||
if (algo.equals("NTLM")) {
|
||||
return new com.sun.security.sasl.ntlm.FactoryImpl();
|
||||
}
|
||||
if (type.equals("SaslClientFactory")) {
|
||||
if (algo.equals("EXTERNAL") || algo.equals("PLAIN") ||
|
||||
algo.equals("CRAM-MD5")) {
|
||||
return new com.sun.security.sasl.ClientFactoryImpl();
|
||||
}
|
||||
} else if (type.equals("SaslServerFactory")) {
|
||||
if (algo.equals("CRAM-MD5")) {
|
||||
return new com.sun.security.sasl.ServerFactoryImpl();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new NoSuchAlgorithmException("Error constructing " +
|
||||
type + " for " + algo + " using SunSASL", ex);
|
||||
}
|
||||
throw new ProviderException("No impl for " + algo +
|
||||
" " + type);
|
||||
}
|
||||
}
|
||||
|
||||
public Provider() {
|
||||
super("SunSASL", 1.9d, info);
|
||||
|
||||
final Provider p = this;
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
// Client mechanisms
|
||||
put("SaslClientFactory.DIGEST-MD5",
|
||||
"com.sun.security.sasl.digest.FactoryImpl");
|
||||
put("SaslClientFactory.NTLM",
|
||||
"com.sun.security.sasl.ntlm.FactoryImpl");
|
||||
put("SaslClientFactory.GSSAPI",
|
||||
"com.sun.security.sasl.gsskerb.FactoryImpl");
|
||||
|
||||
put("SaslClientFactory.EXTERNAL",
|
||||
"com.sun.security.sasl.ClientFactoryImpl");
|
||||
put("SaslClientFactory.PLAIN",
|
||||
"com.sun.security.sasl.ClientFactoryImpl");
|
||||
put("SaslClientFactory.CRAM-MD5",
|
||||
"com.sun.security.sasl.ClientFactoryImpl");
|
||||
putService(new ProviderService(p, "SaslClientFactory",
|
||||
"DIGEST-MD5", "com.sun.security.sasl.digest.FactoryImpl"));
|
||||
putService(new ProviderService(p, "SaslClientFactory",
|
||||
"NTLM", "com.sun.security.sasl.ntlm.FactoryImpl"));
|
||||
putService(new ProviderService(p, "SaslClientFactory",
|
||||
"EXTERNAL", "com.sun.security.sasl.ClientFactoryImpl"));
|
||||
putService(new ProviderService(p, "SaslClientFactory",
|
||||
"PLAIN", "com.sun.security.sasl.ClientFactoryImpl"));
|
||||
putService(new ProviderService(p, "SaslClientFactory",
|
||||
"CRAM-MD5", "com.sun.security.sasl.ClientFactoryImpl"));
|
||||
|
||||
// Server mechanisms
|
||||
put("SaslServerFactory.CRAM-MD5",
|
||||
"com.sun.security.sasl.ServerFactoryImpl");
|
||||
put("SaslServerFactory.GSSAPI",
|
||||
"com.sun.security.sasl.gsskerb.FactoryImpl");
|
||||
put("SaslServerFactory.DIGEST-MD5",
|
||||
"com.sun.security.sasl.digest.FactoryImpl");
|
||||
put("SaslServerFactory.NTLM",
|
||||
"com.sun.security.sasl.ntlm.FactoryImpl");
|
||||
putService(new ProviderService(p, "SaslServerFactory",
|
||||
"CRAM-MD5", "com.sun.security.sasl.ServerFactoryImpl"));
|
||||
putService(new ProviderService(p, "SaslServerFactory",
|
||||
"DIGEST-MD5", "com.sun.security.sasl.digest.FactoryImpl"));
|
||||
putService(new ProviderService(p, "SaslServerFactory",
|
||||
"NTLM", "com.sun.security.sasl.ntlm.FactoryImpl"));
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2015, 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,7 +33,10 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.Collections;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.Provider;
|
||||
import java.security.Provider.Service;
|
||||
import java.security.Security;
|
||||
|
||||
/**
|
||||
@ -360,7 +363,7 @@ public class Sasl {
|
||||
|
||||
SaslClient mech = null;
|
||||
SaslClientFactory fac;
|
||||
String className;
|
||||
Service service;
|
||||
String mechName;
|
||||
|
||||
for (int i = 0; i < mechanisms.length; i++) {
|
||||
@ -370,31 +373,32 @@ public class Sasl {
|
||||
} else if (mechName.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
String mechFilter = "SaslClientFactory." + mechName;
|
||||
Provider[] provs = Security.getProviders(mechFilter);
|
||||
for (int j = 0; provs != null && j < provs.length; j++) {
|
||||
className = provs[j].getProperty(mechFilter);
|
||||
if (className == null) {
|
||||
// Case is ignored
|
||||
continue;
|
||||
}
|
||||
String type = "SaslClientFactory";
|
||||
Provider[] provs = Security.getProviders(type + "." + mechName);
|
||||
if (provs != null) {
|
||||
for (Provider p : provs) {
|
||||
service = p.getService(type, mechName);
|
||||
if (service == null) {
|
||||
// no such service exists
|
||||
continue;
|
||||
}
|
||||
|
||||
fac = (SaslClientFactory) loadFactory(provs[j], className);
|
||||
if (fac != null) {
|
||||
mech = fac.createSaslClient(
|
||||
new String[]{mechanisms[i]}, authorizationId,
|
||||
protocol, serverName, props, cbh);
|
||||
if (mech != null) {
|
||||
return mech;
|
||||
fac = (SaslClientFactory) loadFactory(service);
|
||||
if (fac != null) {
|
||||
mech = fac.createSaslClient(
|
||||
new String[]{mechanisms[i]}, authorizationId,
|
||||
protocol, serverName, props, cbh);
|
||||
if (mech != null) {
|
||||
return mech;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Object loadFactory(Provider p, String className)
|
||||
private static Object loadFactory(Service service)
|
||||
throws SaslException {
|
||||
try {
|
||||
/*
|
||||
@ -406,18 +410,9 @@ public class Sasl {
|
||||
* have "getClassLoader" permission, or a SecurityException
|
||||
* will be thrown.
|
||||
*/
|
||||
ClassLoader cl = p.getClass().getClassLoader();
|
||||
Class<?> implClass;
|
||||
implClass = Class.forName(className, true, cl);
|
||||
return implClass.newInstance();
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new SaslException("Cannot load class " + className, e);
|
||||
} catch (InstantiationException e) {
|
||||
throw new SaslException("Cannot instantiate class " + className, e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new SaslException("Cannot access class " + className, e);
|
||||
} catch (SecurityException e) {
|
||||
throw new SaslException("Cannot access class " + className, e);
|
||||
return service.newInstance(null);
|
||||
} catch (InvalidParameterException | NoSuchAlgorithmException e) {
|
||||
throw new SaslException("Cannot instantiate service " + service, e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -503,7 +498,7 @@ public class Sasl {
|
||||
|
||||
SaslServer mech = null;
|
||||
SaslServerFactory fac;
|
||||
String className;
|
||||
Service service;
|
||||
|
||||
if (mechanism == null) {
|
||||
throw new NullPointerException("Mechanism name cannot be null");
|
||||
@ -511,24 +506,25 @@ public class Sasl {
|
||||
return null;
|
||||
}
|
||||
|
||||
String mechFilter = "SaslServerFactory." + mechanism;
|
||||
Provider[] provs = Security.getProviders(mechFilter);
|
||||
for (int j = 0; provs != null && j < provs.length; j++) {
|
||||
className = provs[j].getProperty(mechFilter);
|
||||
if (className == null) {
|
||||
throw new SaslException("Provider does not support " +
|
||||
mechFilter);
|
||||
}
|
||||
fac = (SaslServerFactory) loadFactory(provs[j], className);
|
||||
if (fac != null) {
|
||||
mech = fac.createSaslServer(
|
||||
mechanism, protocol, serverName, props, cbh);
|
||||
if (mech != null) {
|
||||
return mech;
|
||||
String type = "SaslServerFactory";
|
||||
Provider[] provs = Security.getProviders(type + "." + mechanism);
|
||||
if (provs != null) {
|
||||
for (Provider p : provs) {
|
||||
service = p.getService(type, mechanism);
|
||||
if (service == null) {
|
||||
throw new SaslException("Provider does not support " +
|
||||
mechanism + " " + type);
|
||||
}
|
||||
fac = (SaslServerFactory) loadFactory(service);
|
||||
if (fac != null) {
|
||||
mech = fac.createSaslServer(
|
||||
mechanism, protocol, serverName, props, cbh);
|
||||
if (mech != null) {
|
||||
return mech;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -582,36 +578,21 @@ public class Sasl {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Provider[] providers = Security.getProviders();
|
||||
HashSet<String> classes = new HashSet<String>();
|
||||
Provider[] provs = Security.getProviders();
|
||||
Object fac;
|
||||
|
||||
for (int i = 0; i < providers.length; i++) {
|
||||
classes.clear();
|
||||
for (Provider p : provs) {
|
||||
|
||||
// Check the keys for each provider.
|
||||
for (Enumeration<Object> e = providers[i].keys(); e.hasMoreElements(); ) {
|
||||
String currentKey = (String)e.nextElement();
|
||||
if (currentKey.startsWith(serviceName)) {
|
||||
// We should skip the currentKey if it contains a
|
||||
// whitespace. The reason is: such an entry in the
|
||||
// provider property contains attributes for the
|
||||
// implementation of an algorithm. We are only interested
|
||||
// in entries which lead to the implementation
|
||||
// classes.
|
||||
if (currentKey.indexOf(' ') < 0) {
|
||||
String className = providers[i].getProperty(currentKey);
|
||||
if (!classes.contains(className)) {
|
||||
classes.add(className);
|
||||
try {
|
||||
fac = loadFactory(providers[i], className);
|
||||
if (fac != null) {
|
||||
result.add(fac);
|
||||
}
|
||||
}catch (Exception ignore) {
|
||||
}
|
||||
Iterator<Service> iter = p.getServices().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Service s = iter.next();
|
||||
if (s.getType().equals(serviceName)) {
|
||||
try {
|
||||
fac = loadFactory(s);
|
||||
if (fac != null) {
|
||||
result.add(fac);
|
||||
}
|
||||
} catch (Exception ignore) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, 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
|
||||
@ -39,11 +39,39 @@ public final class SunPCSC extends Provider {
|
||||
|
||||
private static final long serialVersionUID = 6168388284028876579L;
|
||||
|
||||
private static final class ProviderService extends Provider.Service {
|
||||
|
||||
ProviderService(Provider p, String type, String algo, String cn) {
|
||||
super(p, type, algo, cn, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object newInstance(Object ctrParamObj)
|
||||
throws NoSuchAlgorithmException {
|
||||
String type = getType();
|
||||
String algo = getAlgorithm();
|
||||
try {
|
||||
if (type.equals("TerminalFactory") &&
|
||||
algo.equals("PC/SC")) {
|
||||
return new SunPCSC.Factory(ctrParamObj);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new NoSuchAlgorithmException("Error constructing " +
|
||||
type + " for " + algo + " using SunPCSC", ex);
|
||||
}
|
||||
throw new ProviderException("No impl for " + algo +
|
||||
" " + type);
|
||||
}
|
||||
}
|
||||
|
||||
public SunPCSC() {
|
||||
super("SunPCSC", 1.9d, "Sun PC/SC provider");
|
||||
|
||||
final Provider p = this;
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
put("TerminalFactory.PC/SC", "sun.security.smartcardio.SunPCSC$Factory");
|
||||
putService(new ProviderService(p, "TerminalFactory",
|
||||
"PC/SC", "sun.security.smartcardio.SunPCSC$Factory"));
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
@ -28,7 +28,7 @@
|
||||
* ===========================================================================
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005, 2014 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015 Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* $Id: XMLDSigRI.java 1400021 2012-10-19 10:16:04Z coheigea $
|
||||
@ -59,102 +59,156 @@ public final class XMLDSigRI extends Provider {
|
||||
"C14N 1.0, C14N 1.1, Exclusive C14N, Base64, Enveloped, XPath, " +
|
||||
"XPath2, XSLT TransformServices)";
|
||||
|
||||
private static final class ProviderService extends Provider.Service {
|
||||
|
||||
ProviderService(Provider p, String type, String algo, String cn) {
|
||||
super(p, type, algo, cn, null, null);
|
||||
}
|
||||
|
||||
ProviderService(Provider p, String type, String algo, String cn,
|
||||
String[] aliases) {
|
||||
super(p, type, algo, cn,
|
||||
(aliases == null? null : Arrays.asList(aliases)), null);
|
||||
}
|
||||
|
||||
ProviderService(Provider p, String type, String algo, String cn,
|
||||
String[] aliases, HashMap<String, String> attrs) {
|
||||
super(p, type, algo, cn,
|
||||
(aliases == null? null : Arrays.asList(aliases)), attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object newInstance(Object ctrParamObj)
|
||||
throws NoSuchAlgorithmException {
|
||||
String type = getType();
|
||||
if (ctrParamObj != null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter not used with " + type + " engines");
|
||||
}
|
||||
|
||||
String algo = getAlgorithm();
|
||||
try {
|
||||
if (type.equals("XMLSignatureFactory")) {
|
||||
if (algo.equals("DOM")) {
|
||||
return new DOMXMLSignatureFactory();
|
||||
}
|
||||
} else if (type.equals("KeyInfoFactory")) {
|
||||
if (algo.equals("DOM")) {
|
||||
return new DOMKeyInfoFactory();
|
||||
}
|
||||
} else if (type.equals("TransformService")) {
|
||||
if (algo.equals(CanonicalizationMethod.INCLUSIVE) ||
|
||||
algo.equals(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS)) {
|
||||
return new DOMCanonicalXMLC14NMethod();
|
||||
} else if (algo.equals("http://www.w3.org/2006/12/xml-c14n11") ||
|
||||
algo.equals("http://www.w3.org/2006/12/xml-c14n11#WithComments")) {
|
||||
return new DOMCanonicalXMLC14N11Method();
|
||||
} else if (algo.equals(CanonicalizationMethod.EXCLUSIVE) ||
|
||||
algo.equals(CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS)) {
|
||||
return new DOMExcC14NMethod();
|
||||
} else if (algo.equals(Transform.BASE64)) {
|
||||
return new DOMBase64Transform();
|
||||
} else if (algo.equals(Transform.ENVELOPED)) {
|
||||
return new DOMEnvelopedTransform();
|
||||
} else if (algo.equals(Transform.XPATH2)) {
|
||||
return new DOMXPathFilter2Transform();
|
||||
} else if (algo.equals(Transform.XPATH)) {
|
||||
return new DOMXPathTransform();
|
||||
} else if (algo.equals(Transform.XSLT)) {
|
||||
return new DOMXSLTTransform();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new NoSuchAlgorithmException("Error constructing " +
|
||||
type + " for " + algo + " using XMLDSig", ex);
|
||||
}
|
||||
throw new ProviderException("No impl for " + algo +
|
||||
" " + type);
|
||||
}
|
||||
}
|
||||
|
||||
public XMLDSigRI() {
|
||||
/* We are the XMLDSig provider */
|
||||
super("XMLDSig", 1.9d, INFO);
|
||||
|
||||
final Map<Object, Object> map = new HashMap<Object, Object>();
|
||||
map.put("XMLSignatureFactory.DOM",
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory");
|
||||
map.put("KeyInfoFactory.DOM",
|
||||
"org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory");
|
||||
|
||||
|
||||
// Inclusive C14N
|
||||
map.put("TransformService." + CanonicalizationMethod.INCLUSIVE,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod");
|
||||
map.put("Alg.Alias.TransformService.INCLUSIVE",
|
||||
CanonicalizationMethod.INCLUSIVE);
|
||||
map.put("TransformService." + CanonicalizationMethod.INCLUSIVE +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// InclusiveWithComments C14N
|
||||
map.put("TransformService." +
|
||||
CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod");
|
||||
map.put("Alg.Alias.TransformService.INCLUSIVE_WITH_COMMENTS",
|
||||
CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS);
|
||||
map.put("TransformService." +
|
||||
CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// Inclusive C14N 1.1
|
||||
map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11",
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method");
|
||||
map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11" +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// InclusiveWithComments C14N 1.1
|
||||
map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11#WithComments",
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method");
|
||||
map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11#WithComments" +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// Exclusive C14N
|
||||
map.put("TransformService." + CanonicalizationMethod.EXCLUSIVE,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod");
|
||||
map.put("Alg.Alias.TransformService.EXCLUSIVE",
|
||||
CanonicalizationMethod.EXCLUSIVE);
|
||||
map.put("TransformService." + CanonicalizationMethod.EXCLUSIVE +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// ExclusiveWithComments C14N
|
||||
map.put("TransformService." +
|
||||
CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod");
|
||||
map.put("Alg.Alias.TransformService.EXCLUSIVE_WITH_COMMENTS",
|
||||
CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS);
|
||||
map.put("TransformService." +
|
||||
CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// Base64 Transform
|
||||
map.put("TransformService." + Transform.BASE64,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMBase64Transform");
|
||||
map.put("Alg.Alias.TransformService.BASE64", Transform.BASE64);
|
||||
map.put("TransformService." + Transform.BASE64 +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// Enveloped Transform
|
||||
map.put("TransformService." + Transform.ENVELOPED,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform");
|
||||
map.put("Alg.Alias.TransformService.ENVELOPED", Transform.ENVELOPED);
|
||||
map.put("TransformService." + Transform.ENVELOPED +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// XPath2 Transform
|
||||
map.put("TransformService." + Transform.XPATH2,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform");
|
||||
map.put("Alg.Alias.TransformService.XPATH2", Transform.XPATH2);
|
||||
map.put("TransformService." + Transform.XPATH2 +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// XPath Transform
|
||||
map.put("TransformService." + Transform.XPATH,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXPathTransform");
|
||||
map.put("Alg.Alias.TransformService.XPATH", Transform.XPATH);
|
||||
map.put("TransformService." + Transform.XPATH +
|
||||
" MechanismType", "DOM");
|
||||
|
||||
// XSLT Transform
|
||||
map.put("TransformService." + Transform.XSLT,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXSLTTransform");
|
||||
map.put("Alg.Alias.TransformService.XSLT", Transform.XSLT);
|
||||
map.put("TransformService." + Transform.XSLT + " MechanismType", "DOM");
|
||||
|
||||
final Provider p = this;
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
putAll(map);
|
||||
HashMap<String, String> MECH_TYPE = new HashMap<>();
|
||||
MECH_TYPE.put("MechanismType", "DOM");
|
||||
|
||||
putService(new ProviderService(p, "XMLSignatureFactory",
|
||||
"DOM", "org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory"));
|
||||
|
||||
putService(new ProviderService(p, "KeyInfoFactory",
|
||||
"DOM", "org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory"));
|
||||
|
||||
|
||||
// Inclusive C14N
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
CanonicalizationMethod.INCLUSIVE,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod",
|
||||
new String[] {"INCLUSIVE"}, MECH_TYPE));
|
||||
|
||||
// InclusiveWithComments C14N
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod",
|
||||
new String[] {"INCLUSIVE_WITH_COMMENTS"}, MECH_TYPE));
|
||||
|
||||
// Inclusive C14N 1.1
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
"http://www.w3.org/2006/12/xml-c14n11",
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method",
|
||||
null, MECH_TYPE));
|
||||
|
||||
// InclusiveWithComments C14N 1.1
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
"http://www.w3.org/2006/12/xml-c14n11#WithComments",
|
||||
"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method",
|
||||
null, MECH_TYPE));
|
||||
|
||||
// Exclusive C14N
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
CanonicalizationMethod.EXCLUSIVE,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod",
|
||||
new String[] {"EXCLUSIVE"}, MECH_TYPE));
|
||||
|
||||
// ExclusiveWithComments C14N
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod",
|
||||
new String[] {"EXCLUSIVE_WITH_COMMENTS"}, MECH_TYPE));
|
||||
|
||||
// Base64 Transform
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
Transform.BASE64,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMBase64Transform",
|
||||
new String[] {"BASE64"}, MECH_TYPE));
|
||||
|
||||
// Enveloped Transform
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
Transform.ENVELOPED,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform",
|
||||
new String[] {"ENVELOPED"}, MECH_TYPE));
|
||||
|
||||
// XPath2 Transform
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
Transform.XPATH2,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform",
|
||||
new String[] {"XPATH2"}, MECH_TYPE));
|
||||
|
||||
// XPath Transform
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
Transform.XPATH,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXPathTransform",
|
||||
new String[] {"XPATH"}, MECH_TYPE));
|
||||
|
||||
// XSLT Transform
|
||||
putService(new ProviderService(p, "TransformService",
|
||||
Transform.XSLT,
|
||||
"org.jcp.xml.dsig.internal.dom.DOMXSLTTransform",
|
||||
new String[] {"XSLT"}, MECH_TYPE));
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 2015, 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
|
||||
@ -27,7 +27,10 @@ package sun.security.ec;
|
||||
|
||||
import java.util.*;
|
||||
import java.security.*;
|
||||
import sun.security.action.PutAllAction;
|
||||
import java.util.regex.Pattern;
|
||||
import sun.security.util.CurveDB;
|
||||
import sun.security.util.NamedCurve;
|
||||
import sun.security.util.ECParameters;
|
||||
|
||||
/**
|
||||
* Provider class for the Elliptic Curve provider.
|
||||
@ -65,19 +68,206 @@ public final class SunEC extends Provider {
|
||||
}
|
||||
}
|
||||
|
||||
public SunEC() {
|
||||
super("SunEC", 1.9d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)");
|
||||
private static class ProviderService extends Provider.Service {
|
||||
|
||||
// if there is no security manager installed, put directly into
|
||||
// the provider. Otherwise, create a temporary map and use a
|
||||
// doPrivileged() call at the end to transfer the contents
|
||||
if (System.getSecurityManager() == null) {
|
||||
SunECEntries.putEntries(this, useFullImplementation);
|
||||
} else {
|
||||
Map<Object, Object> map = new HashMap<Object, Object>();
|
||||
SunECEntries.putEntries(map, useFullImplementation);
|
||||
AccessController.doPrivileged(new PutAllAction(this, map));
|
||||
ProviderService(Provider p, String type, String algo, String cn) {
|
||||
super(p, type, algo, cn, null, null);
|
||||
}
|
||||
|
||||
ProviderService(Provider p, String type, String algo, String cn,
|
||||
String[] aliases, HashMap<String, String> attrs) {
|
||||
super(p, type, algo, cn,
|
||||
(aliases == null? null : Arrays.asList(aliases)), attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object newInstance(Object ctrParamObj)
|
||||
throws NoSuchAlgorithmException {
|
||||
String type = getType();
|
||||
if (ctrParamObj != null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter not used with " + type + " engines");
|
||||
}
|
||||
|
||||
String algo = getAlgorithm();
|
||||
try {
|
||||
if (type.equals("Signature")) {
|
||||
boolean inP1363 = algo.endsWith("inP1363Format");
|
||||
if (inP1363) {
|
||||
algo = algo.substring(0, algo.length() - 13);
|
||||
}
|
||||
if (algo.equals("SHA1withECDSA")) {
|
||||
return (inP1363? new ECDSASignature.SHA1inP1363Format() :
|
||||
new ECDSASignature.SHA1());
|
||||
} else if (algo.equals("SHA224withECDSA")) {
|
||||
return (inP1363? new ECDSASignature.SHA224inP1363Format() :
|
||||
new ECDSASignature.SHA224());
|
||||
} else if (algo.equals("SHA256withECDSA")) {
|
||||
return (inP1363? new ECDSASignature.SHA256inP1363Format() :
|
||||
new ECDSASignature.SHA256());
|
||||
} else if (algo.equals("SHA384withECDSA")) {
|
||||
return (inP1363? new ECDSASignature.SHA384inP1363Format() :
|
||||
new ECDSASignature.SHA384());
|
||||
} else if (algo.equals("SHA512withECDSA")) {
|
||||
return (inP1363? new ECDSASignature.SHA512inP1363Format() :
|
||||
new ECDSASignature.SHA512());
|
||||
} else if (algo.equals("NONEwithECDSA")) {
|
||||
return (inP1363? new ECDSASignature.RawinP1363Format() :
|
||||
new ECDSASignature.Raw());
|
||||
}
|
||||
} else if (type.equals("KeyFactory")) {
|
||||
if (algo.equals("EC")) {
|
||||
return new ECKeyFactory();
|
||||
}
|
||||
} else if (type.equals("AlgorithmParameters")) {
|
||||
if (algo.equals("EC")) {
|
||||
return new sun.security.util.ECParameters();
|
||||
}
|
||||
} else if (type.equals("KeyPairGenerator")) {
|
||||
if (algo.equals("EC")) {
|
||||
return new ECKeyPairGenerator();
|
||||
}
|
||||
} else if (type.equals("KeyAgreement")) {
|
||||
if (algo.equals("ECDH")) {
|
||||
return new ECDHKeyAgreement();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new NoSuchAlgorithmException("Error constructing " +
|
||||
type + " for " + algo + " using SunEC", ex);
|
||||
}
|
||||
throw new ProviderException("No impl for " + algo +
|
||||
" " + type);
|
||||
}
|
||||
}
|
||||
|
||||
public SunEC() {
|
||||
super("SunEC", 1.9d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)");
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
putEntries(useFullImplementation);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void putEntries(boolean useFullImplementation) {
|
||||
HashMap<String, String> ATTRS = new HashMap<>(3);
|
||||
ATTRS.put("ImplementedIn", "Software");
|
||||
String ecKeyClasses = "java.security.interfaces.ECPublicKey" +
|
||||
"|java.security.interfaces.ECPrivateKey";
|
||||
ATTRS.put("SupportedKeyClasses", ecKeyClasses);
|
||||
ATTRS.put("KeySize", "256");
|
||||
|
||||
/*
|
||||
* Key Factory engine
|
||||
*/
|
||||
putService(new ProviderService(this, "KeyFactory",
|
||||
"EC", "sun.security.ec.ECKeyFactory",
|
||||
new String[] { "EllipticCurve" }, ATTRS));
|
||||
|
||||
/*
|
||||
* Algorithm Parameter engine
|
||||
*/
|
||||
// "AlgorithmParameters.EC SupportedCurves" prop used by unit test
|
||||
boolean firstCurve = true;
|
||||
StringBuilder names = new StringBuilder();
|
||||
Pattern nameSplitPattern = Pattern.compile(CurveDB.SPLIT_PATTERN);
|
||||
|
||||
Collection<? extends NamedCurve> supportedCurves =
|
||||
CurveDB.getSupportedCurves();
|
||||
for (NamedCurve namedCurve : supportedCurves) {
|
||||
if (!firstCurve) {
|
||||
names.append("|");
|
||||
} else {
|
||||
firstCurve = false;
|
||||
}
|
||||
|
||||
names.append("[");
|
||||
|
||||
String[] commonNames = nameSplitPattern.split(namedCurve.getName());
|
||||
for (String commonName : commonNames) {
|
||||
names.append(commonName.trim());
|
||||
names.append(",");
|
||||
}
|
||||
|
||||
names.append(namedCurve.getObjectId());
|
||||
names.append("]");
|
||||
}
|
||||
|
||||
HashMap<String, String> apAttrs = new HashMap<>(ATTRS);
|
||||
apAttrs.put("SupportedCurves", names.toString());
|
||||
|
||||
putService(new ProviderService(this, "AlgorithmParameters",
|
||||
"EC", "sun.security.util.ECParameters",
|
||||
new String[] { "EllipticCurve", "1.2.840.10045.2.1", "OID.1.2.840.10045.2.1" },
|
||||
apAttrs));
|
||||
|
||||
/*
|
||||
* Register the algorithms below only when the full ECC implementation
|
||||
* is available
|
||||
*/
|
||||
if (!useFullImplementation) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Signature engines
|
||||
*/
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"NONEwithECDSA", "sun.security.ec.ECDSASignature$Raw",
|
||||
null, ATTRS));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA1withECDSA", "sun.security.ec.ECDSASignature$SHA1",
|
||||
new String[] { "1.2.840.10045.4.1", "OID.1.2.840.10045.4.1" },
|
||||
ATTRS));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA224withECDSA", "sun.security.ec.ECDSASignature$SHA224",
|
||||
new String[] { "1.2.840.10045.4.3.1", "OID.1.2.840.10045.4.3.1"},
|
||||
ATTRS));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA256withECDSA", "sun.security.ec.ECDSASignature$SHA256",
|
||||
new String[] { "1.2.840.10045.4.3.2", "OID.1.2.840.10045.4.3.2"},
|
||||
ATTRS));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA384withECDSA", "sun.security.ec.ECDSASignature$SHA384",
|
||||
new String[] { "1.2.840.10045.4.3.3", "OID.1.2.840.10045.4.3.3" },
|
||||
ATTRS));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA512withECDSA", "sun.security.ec.ECDSASignature$SHA512",
|
||||
new String[] { "1.2.840.10045.4.3.4", "OID.1.2.840.10045.4.3.4" },
|
||||
ATTRS));
|
||||
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"NONEwithECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$RawinP1363Format"));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA1withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA1inP1363Format"));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA224withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA224inP1363Format"));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA256withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA256inP1363Format"));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA384withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA384inP1363Format"));
|
||||
putService(new ProviderService(this, "Signature",
|
||||
"SHA512withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA512inP1363Format"));
|
||||
|
||||
/*
|
||||
* Key Pair Generator engine
|
||||
*/
|
||||
putService(new ProviderService(this, "KeyPairGenerator",
|
||||
"EC", "sun.security.ec.ECKeyPairGenerator",
|
||||
new String[] { "EllipticCurve" }, ATTRS));
|
||||
|
||||
/*
|
||||
* Key Agreement engine
|
||||
*/
|
||||
putService(new ProviderService(this, "KeyAgreement",
|
||||
"ECDH", "sun.security.ec.ECDHKeyAgreement", null, ATTRS));
|
||||
}
|
||||
}
|
||||
|
@ -1,184 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2015, 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.
|
||||
*/
|
||||
|
||||
package sun.security.ec;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
import sun.security.util.CurveDB;
|
||||
import sun.security.util.NamedCurve;
|
||||
|
||||
/**
|
||||
* Defines the entries of the SunEC provider.
|
||||
*
|
||||
* @since 1.7
|
||||
*/
|
||||
final class SunECEntries {
|
||||
|
||||
private SunECEntries() {
|
||||
// empty
|
||||
}
|
||||
|
||||
static void putEntries(Map<Object, Object> map,
|
||||
boolean useFullImplementation) {
|
||||
|
||||
/*
|
||||
* Key Factory engine
|
||||
*/
|
||||
map.put("KeyFactory.EC", "sun.security.ec.ECKeyFactory");
|
||||
map.put("Alg.Alias.KeyFactory.EllipticCurve", "EC");
|
||||
|
||||
map.put("KeyFactory.EC ImplementedIn", "Software");
|
||||
|
||||
/*
|
||||
* Algorithm Parameter engine
|
||||
*/
|
||||
map.put("AlgorithmParameters.EC", "sun.security.util.ECParameters");
|
||||
map.put("Alg.Alias.AlgorithmParameters.EllipticCurve", "EC");
|
||||
map.put("Alg.Alias.AlgorithmParameters.1.2.840.10045.2.1", "EC");
|
||||
|
||||
map.put("AlgorithmParameters.EC KeySize", "256");
|
||||
|
||||
map.put("AlgorithmParameters.EC ImplementedIn", "Software");
|
||||
|
||||
// "AlgorithmParameters.EC SupportedCurves" prop used by unit test
|
||||
boolean firstCurve = true;
|
||||
StringBuilder names = new StringBuilder();
|
||||
Pattern nameSplitPattern = Pattern.compile(CurveDB.SPLIT_PATTERN);
|
||||
|
||||
Collection<? extends NamedCurve> supportedCurves =
|
||||
CurveDB.getSupportedCurves();
|
||||
for (NamedCurve namedCurve : supportedCurves) {
|
||||
if (!firstCurve) {
|
||||
names.append("|");
|
||||
} else {
|
||||
firstCurve = false;
|
||||
}
|
||||
|
||||
names.append("[");
|
||||
|
||||
String[] commonNames = nameSplitPattern.split(namedCurve.getName());
|
||||
for (String commonName : commonNames) {
|
||||
names.append(commonName.trim());
|
||||
names.append(",");
|
||||
}
|
||||
|
||||
names.append(namedCurve.getObjectId());
|
||||
names.append("]");
|
||||
}
|
||||
|
||||
map.put("AlgorithmParameters.EC SupportedCurves", names.toString());
|
||||
|
||||
/*
|
||||
* Register the algorithms below only when the full ECC implementation
|
||||
* is available
|
||||
*/
|
||||
if (!useFullImplementation) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Signature engines
|
||||
*/
|
||||
map.put("Signature.NONEwithECDSA",
|
||||
"sun.security.ec.ECDSASignature$Raw");
|
||||
map.put("Signature.SHA1withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA1");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.1", "SHA1withECDSA");
|
||||
map.put("Alg.Alias.Signature.1.2.840.10045.4.1", "SHA1withECDSA");
|
||||
|
||||
map.put("Signature.SHA224withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA224");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.1", "SHA224withECDSA");
|
||||
map.put("Alg.Alias.Signature.1.2.840.10045.4.3.1", "SHA224withECDSA");
|
||||
|
||||
map.put("Signature.SHA256withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA256");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.2", "SHA256withECDSA");
|
||||
map.put("Alg.Alias.Signature.1.2.840.10045.4.3.2", "SHA256withECDSA");
|
||||
|
||||
map.put("Signature.SHA384withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA384");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.3", "SHA384withECDSA");
|
||||
map.put("Alg.Alias.Signature.1.2.840.10045.4.3.3", "SHA384withECDSA");
|
||||
|
||||
map.put("Signature.SHA512withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA512");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.4", "SHA512withECDSA");
|
||||
map.put("Alg.Alias.Signature.1.2.840.10045.4.3.4", "SHA512withECDSA");
|
||||
|
||||
map.put("Signature.NONEwithECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$RawinP1363Format");
|
||||
map.put("Signature.SHA1withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA1inP1363Format");
|
||||
map.put("Signature.SHA224withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA224inP1363Format");
|
||||
map.put("Signature.SHA256withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA256inP1363Format");
|
||||
map.put("Signature.SHA384withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA384inP1363Format");
|
||||
map.put("Signature.SHA512withECDSAinP1363Format",
|
||||
"sun.security.ec.ECDSASignature$SHA512inP1363Format");
|
||||
|
||||
String ecKeyClasses = "java.security.interfaces.ECPublicKey" +
|
||||
"|java.security.interfaces.ECPrivateKey";
|
||||
map.put("Signature.NONEwithECDSA SupportedKeyClasses", ecKeyClasses);
|
||||
map.put("Signature.SHA1withECDSA SupportedKeyClasses", ecKeyClasses);
|
||||
map.put("Signature.SHA224withECDSA SupportedKeyClasses", ecKeyClasses);
|
||||
map.put("Signature.SHA256withECDSA SupportedKeyClasses", ecKeyClasses);
|
||||
map.put("Signature.SHA384withECDSA SupportedKeyClasses", ecKeyClasses);
|
||||
map.put("Signature.SHA512withECDSA SupportedKeyClasses", ecKeyClasses);
|
||||
|
||||
map.put("Signature.SHA1withECDSA KeySize", "256");
|
||||
|
||||
map.put("Signature.NONEwithECDSA ImplementedIn", "Software");
|
||||
map.put("Signature.SHA1withECDSA ImplementedIn", "Software");
|
||||
map.put("Signature.SHA224withECDSA ImplementedIn", "Software");
|
||||
map.put("Signature.SHA256withECDSA ImplementedIn", "Software");
|
||||
map.put("Signature.SHA384withECDSA ImplementedIn", "Software");
|
||||
map.put("Signature.SHA512withECDSA ImplementedIn", "Software");
|
||||
|
||||
/*
|
||||
* Key Pair Generator engine
|
||||
*/
|
||||
map.put("KeyPairGenerator.EC", "sun.security.ec.ECKeyPairGenerator");
|
||||
map.put("Alg.Alias.KeyPairGenerator.EllipticCurve", "EC");
|
||||
|
||||
map.put("KeyPairGenerator.EC KeySize", "256");
|
||||
|
||||
map.put("KeyPairGenerator.EC ImplementedIn", "Software");
|
||||
|
||||
/*
|
||||
* Key Agreement engine
|
||||
*/
|
||||
map.put("KeyAgreement.ECDH", "sun.security.ec.ECDHKeyAgreement");
|
||||
|
||||
map.put("KeyAgreement.ECDH SupportedKeyClasses", ecKeyClasses);
|
||||
|
||||
map.put("KeyAgreement.ECDH ImplementedIn", "Software");
|
||||
}
|
||||
}
|
@ -42,12 +42,7 @@ import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.interfaces.RSAPrivateCrtKey;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Implementation of key store for Windows using the Microsoft Crypto API.
|
||||
@ -141,7 +136,7 @@ abstract class KeyStore extends KeyStoreSpi {
|
||||
key.getPrimeExponentQ().toByteArray(),
|
||||
key.getCrtCoefficient().toByteArray());
|
||||
|
||||
privateKey = storePrivateKey(keyBlob,
|
||||
privateKey = storePrivateKey(Objects.requireNonNull(keyBlob),
|
||||
"{" + UUID.randomUUID().toString() + "}", keyBitLength);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, 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
|
||||
@ -28,8 +28,11 @@ package sun.security.mscapi;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.Provider;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.ProviderException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* A Cryptographic Service Provider for the Microsoft Crypto API.
|
||||
@ -52,97 +55,153 @@ public final class SunMSCAPI extends Provider {
|
||||
});
|
||||
}
|
||||
|
||||
private static final class ProviderService extends Provider.Service {
|
||||
ProviderService(Provider p, String type, String algo, String cn) {
|
||||
super(p, type, algo, cn, null, null);
|
||||
}
|
||||
|
||||
ProviderService(Provider p, String type, String algo, String cn,
|
||||
String[] aliases, HashMap<String, String> attrs) {
|
||||
super(p, type, algo, cn,
|
||||
(aliases == null? null : Arrays.asList(aliases)), attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object newInstance(Object ctrParamObj)
|
||||
throws NoSuchAlgorithmException {
|
||||
String type = getType();
|
||||
if (ctrParamObj != null) {
|
||||
throw new InvalidParameterException
|
||||
("constructorParameter not used with " + type +
|
||||
" engines");
|
||||
}
|
||||
String algo = getAlgorithm();
|
||||
try {
|
||||
if (type.equals("SecureRandom")) {
|
||||
if (algo.equals("Windows-PRNG")) {
|
||||
return new PRNG();
|
||||
}
|
||||
} else if (type.equals("KeyStore")) {
|
||||
if (algo.equals("Windows-MY")) {
|
||||
return new KeyStore.MY();
|
||||
} else if (algo.equals("Windows-ROOT")) {
|
||||
return new KeyStore.ROOT();
|
||||
}
|
||||
} else if (type.equals("Signature")) {
|
||||
if (algo.equals("NONEwithRSA")) {
|
||||
return new RSASignature.Raw();
|
||||
} else if (algo.equals("SHA1withRSA")) {
|
||||
return new RSASignature.SHA1();
|
||||
} else if (algo.equals("SHA256withRSA")) {
|
||||
return new RSASignature.SHA256();
|
||||
} else if (algo.equals("SHA384withRSA")) {
|
||||
return new RSASignature.SHA384();
|
||||
} else if (algo.equals("SHA512withRSA")) {
|
||||
return new RSASignature.SHA512();
|
||||
} else if (algo.equals("MD5withRSA")) {
|
||||
return new RSASignature.MD5();
|
||||
} else if (algo.equals("MD2withRSA")) {
|
||||
return new RSASignature.MD2();
|
||||
}
|
||||
} else if (type.equals("KeyPairGenerator")) {
|
||||
if (algo.equals("RSA")) {
|
||||
return new RSAKeyPairGenerator();
|
||||
}
|
||||
} else if (type.equals("Cipher")) {
|
||||
if (algo.equals("RSA") ||
|
||||
algo.equals("RSA/ECB/PKCS1Padding")) {
|
||||
return new RSACipher();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new NoSuchAlgorithmException
|
||||
("Error constructing " + type + " for " +
|
||||
algo + " using SunMSCAPI", ex);
|
||||
}
|
||||
throw new ProviderException("No impl for " + algo +
|
||||
" " + type);
|
||||
}
|
||||
}
|
||||
|
||||
public SunMSCAPI() {
|
||||
super("SunMSCAPI", 1.9d, INFO);
|
||||
|
||||
// if there is no security manager installed, put directly into
|
||||
// the provider. Otherwise, create a temporary map and use a
|
||||
// doPrivileged() call at the end to transfer the contents
|
||||
final Map<Object, Object> map =
|
||||
(System.getSecurityManager() == null)
|
||||
? this : new HashMap<Object, Object>();
|
||||
final Provider p = this;
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
public Void run() {
|
||||
/*
|
||||
* Secure random
|
||||
*/
|
||||
putService(new ProviderService(p, "SecureRandom",
|
||||
"Windows-PRNG", "sun.security.mscapi.PRNG"));
|
||||
|
||||
/*
|
||||
* Secure random
|
||||
*/
|
||||
map.put("SecureRandom.Windows-PRNG", "sun.security.mscapi.PRNG");
|
||||
/*
|
||||
* Key store
|
||||
*/
|
||||
putService(new ProviderService(p, "KeyStore",
|
||||
"Windows-MY", "sun.security.mscapi.KeyStore$MY"));
|
||||
putService(new ProviderService(p, "KeyStore",
|
||||
"Windows-ROOT", "sun.security.mscapi.KeyStore$ROOT"));
|
||||
|
||||
/*
|
||||
* Key store
|
||||
*/
|
||||
map.put("KeyStore.Windows-MY", "sun.security.mscapi.KeyStore$MY");
|
||||
map.put("KeyStore.Windows-ROOT", "sun.security.mscapi.KeyStore$ROOT");
|
||||
/*
|
||||
* Signature engines
|
||||
*/
|
||||
HashMap<String, String> attrs = new HashMap<>(1);
|
||||
attrs.put("SupportedKeyClasses", "sun.security.mscapi.Key");
|
||||
|
||||
/*
|
||||
* Signature engines
|
||||
*/
|
||||
// NONEwithRSA must be supplied with a pre-computed message digest.
|
||||
// Only the following digest algorithms are supported: MD5, SHA-1,
|
||||
// SHA-256, SHA-384, SHA-512 and a special-purpose digest
|
||||
// algorithm which is a concatenation of SHA-1 and MD5 digests.
|
||||
map.put("Signature.NONEwithRSA",
|
||||
"sun.security.mscapi.RSASignature$Raw");
|
||||
map.put("Signature.SHA1withRSA",
|
||||
"sun.security.mscapi.RSASignature$SHA1");
|
||||
map.put("Signature.SHA256withRSA",
|
||||
"sun.security.mscapi.RSASignature$SHA256");
|
||||
map.put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA256withRSA");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.11", "SHA256withRSA");
|
||||
map.put("Signature.SHA384withRSA",
|
||||
"sun.security.mscapi.RSASignature$SHA384");
|
||||
map.put("Alg.Alias.Signature.1.2.840.113549.1.1.12", "SHA384withRSA");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.12", "SHA384withRSA");
|
||||
// NONEwithRSA must be supplied with a pre-computed message digest.
|
||||
// Only the following digest algorithms are supported: MD5, SHA-1,
|
||||
// SHA-256, SHA-384, SHA-512 and a special-purpose digest
|
||||
// algorithm which is a concatenation of SHA-1 and MD5 digests.
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"NONEwithRSA", "sun.security.mscapi.RSASignature$Raw",
|
||||
null, attrs));
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"SHA1withRSA", "sun.security.mscapi.RSASignature$SHA1",
|
||||
null, attrs));
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"SHA256withRSA", "sun.security.mscapi.RSASignature$SHA256",
|
||||
new String[] { "1.2.840.113549.1.1.11", "OID.1.2.840.113549.1.1.11" },
|
||||
attrs));
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"SHA384withRSA", "sun.security.mscapi.RSASignature$SHA384",
|
||||
new String[] { "1.2.840.113549.1.1.12", "OID.1.2.840.113549.1.1.12" },
|
||||
attrs));
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"SHA512withRSA", "sun.security.mscapi.RSASignature$SHA512",
|
||||
new String[] { "1.2.840.113549.1.1.13", "OID.1.2.840.113549.1.1.13" },
|
||||
attrs));
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"MD5withRSA", "sun.security.mscapi.RSASignature$MD5",
|
||||
null, attrs));
|
||||
putService(new ProviderService(p, "Signature",
|
||||
"MD2withRSA", "sun.security.mscapi.RSASignature$MD2",
|
||||
null, attrs));
|
||||
|
||||
map.put("Signature.SHA512withRSA",
|
||||
"sun.security.mscapi.RSASignature$SHA512");
|
||||
map.put("Alg.Alias.Signature.1.2.840.113549.1.1.13", "SHA512withRSA");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.13", "SHA512withRSA");
|
||||
/*
|
||||
* Key Pair Generator engines
|
||||
*/
|
||||
attrs.clear();
|
||||
attrs.put("KeySize", "1024");
|
||||
putService(new ProviderService(p, "KeyPairGenerator",
|
||||
"RSA", "sun.security.mscapi.RSAKeyPairGenerator",
|
||||
null, attrs));
|
||||
|
||||
map.put("Signature.MD5withRSA",
|
||||
"sun.security.mscapi.RSASignature$MD5");
|
||||
map.put("Signature.MD2withRSA",
|
||||
"sun.security.mscapi.RSASignature$MD2");
|
||||
|
||||
// supported key classes
|
||||
map.put("Signature.NONEwithRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
map.put("Signature.SHA1withRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
map.put("Signature.SHA256withRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
map.put("Signature.SHA384withRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
map.put("Signature.SHA512withRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
map.put("Signature.MD5withRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
map.put("Signature.MD2withRSA SupportedKeyClasses",
|
||||
"sun.security.mscapi.Key");
|
||||
|
||||
/*
|
||||
* Key Pair Generator engines
|
||||
*/
|
||||
map.put("KeyPairGenerator.RSA",
|
||||
"sun.security.mscapi.RSAKeyPairGenerator");
|
||||
map.put("KeyPairGenerator.RSA KeySize", "1024");
|
||||
|
||||
/*
|
||||
* Cipher engines
|
||||
*/
|
||||
map.put("Cipher.RSA", "sun.security.mscapi.RSACipher");
|
||||
map.put("Cipher.RSA/ECB/PKCS1Padding",
|
||||
"sun.security.mscapi.RSACipher");
|
||||
map.put("Cipher.RSA SupportedModes", "ECB");
|
||||
map.put("Cipher.RSA SupportedPaddings", "PKCS1PADDING");
|
||||
map.put("Cipher.RSA SupportedKeyClasses", "sun.security.mscapi.Key");
|
||||
|
||||
if (map != this) {
|
||||
final Provider provider = this;
|
||||
PrivilegedAction<Void> putAllAction = () -> {
|
||||
provider.putAll(map);
|
||||
/*
|
||||
* Cipher engines
|
||||
*/
|
||||
attrs.clear();
|
||||
attrs.put("SupportedModes", "ECB");
|
||||
attrs.put("SupportedPaddings", "PKCS1PADDING");
|
||||
attrs.put("SupportedKeyClasses", "sun.security.mscapi.Key");
|
||||
putService(new ProviderService(p, "Cipher",
|
||||
"RSA", "sun.security.mscapi.RSACipher",
|
||||
null, attrs));
|
||||
putService(new ProviderService(p, "Cipher",
|
||||
"RSA/ECB/PKCS1Padding", "sun.security.mscapi.RSACipher",
|
||||
null, attrs));
|
||||
return null;
|
||||
};
|
||||
AccessController.doPrivileged(putAllAction);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1659,29 +1659,36 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_mscapi_RSAPublicKey_getModulus
|
||||
int convertToLittleEndian(JNIEnv *env, jbyteArray source, jbyte* destination,
|
||||
int destinationLength) {
|
||||
|
||||
int count = 0;
|
||||
int sourceLength = env->GetArrayLength(source);
|
||||
|
||||
if (sourceLength < destinationLength) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
jbyte* sourceBytes = env->GetByteArrayElements(source, 0);
|
||||
if (sourceBytes == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int copyLen = sourceLength;
|
||||
if (sourceLength > destinationLength) {
|
||||
// source might include an extra sign byte
|
||||
if (sourceLength == destinationLength + 1 && sourceBytes[0] == 0) {
|
||||
copyLen--;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Copy bytes from the end of the source array to the beginning of the
|
||||
// destination array (until the destination array is full).
|
||||
// This ensures that the sign byte from the source array will be excluded.
|
||||
for (int i = 0; i < destinationLength; i++) {
|
||||
destination[i] = sourceBytes[sourceLength - i - 1];
|
||||
count++;
|
||||
for (int i = 0; i < copyLen; i++) {
|
||||
destination[i] = sourceBytes[sourceLength - 1 - i];
|
||||
}
|
||||
if (copyLen < destinationLength) {
|
||||
memset(destination + copyLen, 0, destinationLength - copyLen);
|
||||
}
|
||||
if (sourceBytes)
|
||||
env->ReleaseByteArrayElements(source, sourceBytes, JNI_ABORT);
|
||||
|
||||
return count;
|
||||
env->ReleaseByteArrayElements(source, sourceBytes, JNI_ABORT);
|
||||
|
||||
return destinationLength;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2015, 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
|
||||
@ -69,30 +69,6 @@ final class Config {
|
||||
}
|
||||
}
|
||||
|
||||
// temporary storage for configurations
|
||||
// needed because the SunPKCS11 needs to call the superclass constructor
|
||||
// in provider before accessing any instance variables
|
||||
private final static Map<String,Config> configMap =
|
||||
new HashMap<String,Config>();
|
||||
|
||||
static Config getConfig(final String name, final InputStream stream) {
|
||||
Config config = configMap.get(name);
|
||||
if (config != null) {
|
||||
return config;
|
||||
}
|
||||
try {
|
||||
config = new Config(name, stream);
|
||||
configMap.put(name, config);
|
||||
return config;
|
||||
} catch (Exception e) {
|
||||
throw new ProviderException("Error parsing configuration", e);
|
||||
}
|
||||
}
|
||||
|
||||
static Config removeConfig(String name) {
|
||||
return configMap.remove(name);
|
||||
}
|
||||
|
||||
private final static boolean DEBUG = false;
|
||||
|
||||
private static void debug(Object o) {
|
||||
@ -101,6 +77,9 @@ final class Config {
|
||||
}
|
||||
}
|
||||
|
||||
// file name containing this configuration
|
||||
private String filename;
|
||||
|
||||
// Reader and StringTokenizer used during parsing
|
||||
private Reader reader;
|
||||
|
||||
@ -201,18 +180,15 @@ final class Config {
|
||||
// memory footprint (true).
|
||||
private boolean nssOptimizeSpace = false;
|
||||
|
||||
private Config(String filename, InputStream in) throws IOException {
|
||||
if (in == null) {
|
||||
if (filename.startsWith("--")) {
|
||||
// inline config
|
||||
String config = filename.substring(2).replace("\\n", "\n");
|
||||
reader = new StringReader(config);
|
||||
} else {
|
||||
in = new FileInputStream(expand(filename));
|
||||
}
|
||||
}
|
||||
if (reader == null) {
|
||||
reader = new BufferedReader(new InputStreamReader(in));
|
||||
Config(String fn) throws IOException {
|
||||
this.filename = fn;
|
||||
if (filename.startsWith("--")) {
|
||||
// inline config
|
||||
String config = filename.substring(2).replace("\\n", "\n");
|
||||
reader = new StringReader(config);
|
||||
} else {
|
||||
reader = new BufferedReader(new InputStreamReader
|
||||
(new FileInputStream(expand(filename))));
|
||||
}
|
||||
parsedKeywords = new HashSet<String>();
|
||||
st = new StreamTokenizer(reader);
|
||||
@ -220,6 +196,10 @@ final class Config {
|
||||
parse();
|
||||
}
|
||||
|
||||
String getFileName() {
|
||||
return filename;
|
||||
}
|
||||
|
||||
String getName() {
|
||||
return name;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, 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
|
||||
@ -514,8 +514,7 @@ public final class Secmod {
|
||||
|
||||
private SunPKCS11 newProvider() {
|
||||
try {
|
||||
InputStream in = new ByteArrayInputStream(config.getBytes("UTF8"));
|
||||
return new SunPKCS11(in);
|
||||
return new SunPKCS11(new Config("--" + config));
|
||||
} catch (Exception e) {
|
||||
// XXX
|
||||
throw new ProviderException(e);
|
||||
|
@ -63,14 +63,9 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
|
||||
static final Debug debug = Debug.getInstance("sunpkcs11");
|
||||
|
||||
private static int dummyConfigId;
|
||||
|
||||
// the PKCS11 object through which we make the native calls
|
||||
final PKCS11 p11;
|
||||
|
||||
// name of the configuration file
|
||||
private final String configName;
|
||||
|
||||
// configuration information
|
||||
final Config config;
|
||||
|
||||
@ -95,17 +90,33 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
}
|
||||
|
||||
public SunPKCS11() {
|
||||
super("SunPKCS11-Dummy", 1.9d, "SunPKCS11-Dummy");
|
||||
throw new ProviderException
|
||||
("SunPKCS11 requires configuration file argument");
|
||||
super("SunPKCS11", 1.9d, "Unconfigured and unusable PKCS11 provider");
|
||||
p11 = null;
|
||||
config = null;
|
||||
slotID = 0;
|
||||
pHandler = null;
|
||||
removable = false;
|
||||
nssModule = null;
|
||||
nssUseSecmodTrust = false;
|
||||
token = null;
|
||||
poller = null;
|
||||
}
|
||||
|
||||
public SunPKCS11(String configName) {
|
||||
this(checkNull(configName), null);
|
||||
}
|
||||
|
||||
public SunPKCS11(InputStream configStream) {
|
||||
this(getDummyConfigName(), checkNull(configStream));
|
||||
@Override
|
||||
public Provider configure(String configArg) throws InvalidParameterException {
|
||||
final String newConfigName = checkNull(configArg);
|
||||
try {
|
||||
return AccessController.doPrivileged(new PrivilegedExceptionAction<Provider>() {
|
||||
@Override
|
||||
public Provider run() throws Exception {
|
||||
return new SunPKCS11(new Config(newConfigName));
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException pae) {
|
||||
InvalidParameterException ipe =
|
||||
new InvalidParameterException("Error configuring SunPKCS11 provider");
|
||||
throw (InvalidParameterException) ipe.initCause(pae.getException());
|
||||
}
|
||||
}
|
||||
|
||||
private static <T> T checkNull(T obj) {
|
||||
@ -115,25 +126,13 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
return obj;
|
||||
}
|
||||
|
||||
private static synchronized String getDummyConfigName() {
|
||||
int id = ++dummyConfigId;
|
||||
return "---DummyConfig-" + id + "---";
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream)
|
||||
* instead
|
||||
*/
|
||||
@Deprecated
|
||||
public SunPKCS11(String configName, InputStream configStream) {
|
||||
super("SunPKCS11-" +
|
||||
Config.getConfig(configName, configStream).getName(),
|
||||
1.9d, Config.getConfig(configName, configStream).getDescription());
|
||||
this.configName = configName;
|
||||
this.config = Config.removeConfig(configName);
|
||||
// Used by Secmod
|
||||
SunPKCS11(Config c) {
|
||||
super("SunPKCS11-" + c.getName(), 1.9d, c.getDescription());
|
||||
this.config = c;
|
||||
|
||||
if (debug != null) {
|
||||
System.out.println("SunPKCS11 loading " + configName);
|
||||
System.out.println("SunPKCS11 loading " + config.getFileName());
|
||||
}
|
||||
|
||||
String library = config.getLibrary();
|
||||
@ -811,7 +810,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
if (poller != null) {
|
||||
return;
|
||||
}
|
||||
TokenPoller poller = new TokenPoller(this);
|
||||
final TokenPoller poller = new TokenPoller(this);
|
||||
Thread t = new ManagedLocalsThread(poller, "Poller " + getName());
|
||||
t.setDaemon(true);
|
||||
t.setPriority(Thread.MIN_PRIORITY);
|
||||
@ -1456,7 +1455,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
|
||||
SunPKCS11Rep(SunPKCS11 provider) throws NotSerializableException {
|
||||
providerName = provider.getName();
|
||||
configName = provider.configName;
|
||||
configName = provider.config.getFileName();
|
||||
if (Security.getProvider(providerName) != provider) {
|
||||
throw new NotSerializableException("Only SunPKCS11 providers "
|
||||
+ "installed in java.security.Security can be serialized");
|
||||
@ -1465,7 +1464,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
|
||||
private Object readResolve() throws ObjectStreamException {
|
||||
SunPKCS11 p = (SunPKCS11)Security.getProvider(providerName);
|
||||
if ((p == null) || (p.configName.equals(configName) == false)) {
|
||||
if ((p == null) || (p.config.getFileName().equals(configName) == false)) {
|
||||
throw new NotSerializableException("Could not find "
|
||||
+ providerName + " in installed providers");
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, 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
|
||||
@ -55,11 +55,17 @@ class NativeCipher extends CipherSpi {
|
||||
public AesEcbNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_ECB);
|
||||
}
|
||||
public AesEcbNoPadding(int keySize) throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_ECB, keySize);
|
||||
}
|
||||
}
|
||||
public static final class AesCbcNoPadding extends NativeCipher {
|
||||
public AesCbcNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_CBC);
|
||||
}
|
||||
public AesCbcNoPadding(int keySize) throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_CBC, keySize);
|
||||
}
|
||||
}
|
||||
public static final class AesCtrNoPadding extends NativeCipher {
|
||||
public AesCtrNoPadding() throws NoSuchAlgorithmException {
|
||||
@ -72,38 +78,6 @@ class NativeCipher extends CipherSpi {
|
||||
}
|
||||
}
|
||||
|
||||
// public implementation classes with fixed key sizes
|
||||
public static final class Aes128EcbNoPadding extends NativeCipher {
|
||||
public Aes128EcbNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_ECB, 16);
|
||||
}
|
||||
}
|
||||
public static final class Aes128CbcNoPadding extends NativeCipher {
|
||||
public Aes128CbcNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_CBC, 16);
|
||||
}
|
||||
}
|
||||
public static final class Aes192EcbNoPadding extends NativeCipher {
|
||||
public Aes192EcbNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_ECB, 24);
|
||||
}
|
||||
}
|
||||
public static final class Aes192CbcNoPadding extends NativeCipher {
|
||||
public Aes192CbcNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_CBC, 24);
|
||||
}
|
||||
}
|
||||
public static final class Aes256EcbNoPadding extends NativeCipher {
|
||||
public Aes256EcbNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_ECB, 32);
|
||||
}
|
||||
}
|
||||
public static final class Aes256CbcNoPadding extends NativeCipher {
|
||||
public Aes256CbcNoPadding() throws NoSuchAlgorithmException {
|
||||
super(UcryptoMech.CRYPTO_AES_CBC, 32);
|
||||
}
|
||||
}
|
||||
|
||||
// ok as constants since AES is all we support
|
||||
public static final int AES_BLOCK_SIZE = 16;
|
||||
public static final String AES_KEY_ALGO = "AES";
|
||||
|
@ -48,20 +48,8 @@ class NativeGCMCipher extends NativeCipher {
|
||||
public AesGcmNoPadding() throws NoSuchAlgorithmException {
|
||||
super(-1);
|
||||
}
|
||||
}
|
||||
public static final class Aes128GcmNoPadding extends NativeGCMCipher {
|
||||
public Aes128GcmNoPadding() throws NoSuchAlgorithmException {
|
||||
super(16);
|
||||
}
|
||||
}
|
||||
public static final class Aes192GcmNoPadding extends NativeGCMCipher {
|
||||
public Aes192GcmNoPadding() throws NoSuchAlgorithmException {
|
||||
super(24);
|
||||
}
|
||||
}
|
||||
public static final class Aes256GcmNoPadding extends NativeGCMCipher {
|
||||
public Aes256GcmNoPadding() throws NoSuchAlgorithmException {
|
||||
super(32);
|
||||
public AesGcmNoPadding(int keySize) throws NoSuchAlgorithmException {
|
||||
super(keySize);
|
||||
}
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user