# HG changeset patch # User prr # Date 1470423838 25200 # Node ID 592a43ff92cdf7c56b60fdbbb916aa8d71e87ef3 # Parent 8b413b0e064c3ffe8506e88deb02f9eb746eec3a# Parent 1c3f804fff32f1f4fede75973cac6775e2e994fc Merge diff -r 8b413b0e064c -r 592a43ff92cd .hgtags --- a/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -371,3 +371,4 @@ 03e7b2c5ae345be3caf981d76ceb3efe5ff447f8 jdk-9+126 8e45018bde9de4ad15b972ae62874bba52dba2d5 jdk-9+127 5bf88dce615f6804f9e101a96ffa7c9dfb4fbbbe jdk-9+128 +e8373543a3f0f60589b7d72b1f9b172721124caf jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd .hgtags-top-repo --- a/.hgtags-top-repo Fri Aug 05 16:20:02 2016 +0300 +++ b/.hgtags-top-repo Fri Aug 05 12:03:58 2016 -0700 @@ -371,3 +371,4 @@ 3a58466296d36944454756ef01e7513ac5e14a16 jdk-9+126 8fa686245bd2a072ece3392743460030f0854520 jdk-9+127 b30ae794d974d7dd3eb4e84203f70021823fa6c6 jdk-9+128 +f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd common/autoconf/spec.gmk.in --- a/common/autoconf/spec.gmk.in Fri Aug 05 16:20:02 2016 +0300 +++ b/common/autoconf/spec.gmk.in Fri Aug 05 12:03:58 2016 -0700 @@ -175,8 +175,8 @@ VERSION_STRING := @VERSION_STRING@ # The short version string, without trailing zeroes and just PRE, if present. VERSION_SHORT := @VERSION_SHORT@ -# The Java specification version. It should be equal to version number. -VERSION_SPECIFICATION := @VERSION_NUMBER@ +# The Java specification version. It usually equals to the major version number. +VERSION_SPECIFICATION := @VERSION_MAJOR@ # A GA version is defined by the PRE string being empty. Rather than testing for # that, this variable defines it with true/false. VERSION_IS_GA := @VERSION_IS_GA@ diff -r 8b413b0e064c -r 592a43ff92cd corba/.hgtags --- a/corba/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/corba/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -371,3 +371,4 @@ c7f5ba08fcd4b8416e62c21229f9a07c95498919 jdk-9+126 8fab452b6f4710762ba1d8e55fd62db00b1355fe jdk-9+127 1f093d3f8cd99cd37c3b0af4cf5c3bffaa9c8b98 jdk-9+128 +c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd hotspot/.hgtags --- a/hotspot/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/hotspot/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -531,3 +531,4 @@ adc8c84b7cf8c540d920182f78a2bc982366432a jdk-9+126 352357128f602dcf0426b1cbe011a4685a4d9f97 jdk-9+127 22bf6db9767b1b3a1994cbf32eb3331f31ae2093 jdk-9+128 +e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd jaxp/.hgtags --- a/jaxp/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -371,3 +371,4 @@ 15722f71281f034bc696d8b96136da2ef34da44f jdk-9+126 bdc3c0b737efbf899709eb3121ce760dcfb51151 jdk-9+127 8a7681a9d70640ac7fbf05c28f53c1d51d8d00a1 jdk-9+128 +74241304e87b0d463391a8ecab40979b5af86dc2 jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/XalanConstants.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/XalanConstants.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/XalanConstants.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, 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 @@ -223,12 +223,6 @@ public static final String XML_SECURITY_PROPERTY_MANAGER = ORACLE_JAXP_PROPERTY_PREFIX + "xmlSecurityPropertyManager"; - /** - * Feature enableExtensionFunctions - */ - public static final String ORACLE_ENABLE_EXTENSION_FUNCTION = - ORACLE_JAXP_PROPERTY_PREFIX + "enableExtensionFunctions"; - public static final String SP_ORACLE_ENABLE_EXTENSION_FUNCTION = "javax.xml.enableExtensionFunctions"; /** * Values for a feature diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FeatureManager.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FeatureManager.java Fri Aug 05 16:20:02 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2011, 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. - */ - -package com.sun.org.apache.xalan.internal.utils; - - -import com.sun.org.apache.xalan.internal.XalanConstants; - -/** - * This class manages security related properties - * - */ -public final class FeatureManager extends FeaturePropertyBase { - - /** - * States of the settings of a property, in the order: default value, value - * set by FEATURE_SECURE_PROCESSING, jaxp.properties file, jaxp system - * properties, and jaxp api properties - */ - public static enum State { - //this order reflects the overriding order - DEFAULT, FSP, JAXPDOTPROPERTIES, SYSTEMPROPERTY, APIPROPERTY - } - - /** - * Xalan Features - */ - public static enum Feature { - ORACLE_ENABLE_EXTENSION_FUNCTION(XalanConstants.ORACLE_ENABLE_EXTENSION_FUNCTION, - "true"); - - final String name; - final String defaultValue; - - Feature(String name, String value) { - this.name = name; - this.defaultValue = value; - } - - public boolean equalsName(String propertyName) { - return (propertyName == null) ? false : name.equals(propertyName); - } - - String defaultValue() { - return defaultValue; - } - } - - /** - * Default constructor. Establishes default values - */ - public FeatureManager() { - values = new String[Feature.values().length]; - for (Feature feature : Feature.values()) { - values[feature.ordinal()] = feature.defaultValue(); - } - //read system properties or jaxp.properties - readSystemProperties(); - } - - - /** - * Check if the feature is enabled - * @param feature name of the feature - * @return true if enabled, false otherwise - */ - public boolean isFeatureEnabled(Feature feature) { - return Boolean.parseBoolean(values[feature.ordinal()]); - } - - /** - * Check if the feature is enabled - * @param propertyName name of the feature - * @return true if enabled, false otherwise - */ - public boolean isFeatureEnabled(String propertyName) { - return Boolean.parseBoolean(values[getIndex(propertyName)]); - } - - /** - * Get the index by property name - * @param propertyName property name - * @return the index of the property if found; return -1 if not - */ - public int getIndex(String propertyName){ - for (Feature feature : Feature.values()) { - if (feature.equalsName(propertyName)) { - return feature.ordinal(); - } - } - return -1; - } - - /** - * Read from system properties, or those in jaxp.properties - */ - private void readSystemProperties() { - getSystemProperty(Feature.ORACLE_ENABLE_EXTENSION_FUNCTION, - XalanConstants.SP_ORACLE_ENABLE_EXTENSION_FUNCTION); - } - -} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java Fri Aug 05 12:03:58 2016 -0700 @@ -33,7 +33,6 @@ import com.sun.org.apache.bcel.internal.generic.LocalVariableGen; import com.sun.org.apache.bcel.internal.generic.NEW; import com.sun.org.apache.bcel.internal.generic.PUSH; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; import com.sun.org.apache.xalan.internal.utils.ObjectFactory; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.BooleanType; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; @@ -55,6 +54,7 @@ import java.util.Map; import java.util.Objects; import java.util.Vector; +import jdk.xml.internal.JdkXmlFeatures; /** * @author Jacek Ambroziak @@ -741,7 +741,7 @@ final InstructionList il = methodGen.getInstructionList(); final boolean isSecureProcessing = classGen.getParser().getXSLTC().isSecureProcessing(); final boolean isExtensionFunctionEnabled = classGen.getParser().getXSLTC() - .getFeature(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION); + .getFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION); int index; // Translate calls to methods in the BasisLibrary @@ -971,7 +971,7 @@ if (_clazz == null) { final boolean isSecureProcessing = getXSLTC().isSecureProcessing(); final boolean isExtensionFunctionEnabled = getXSLTC() - .getFeature(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION); + .getFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION); //Check if FSP and SM - only then process with loading if (namespace != null && isSecureProcessing diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -9,7 +9,7 @@ * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,9 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: LiteralElement.java,v 1.2.4.1 2005/09/13 12:38:33 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.compiler; @@ -58,8 +55,6 @@ // names are not known at compile time. private boolean _allAttributesUnique = false; - private final static String XMLNS_STRING = "xmlns"; - /** * Returns the QName for this literal element */ @@ -140,8 +135,8 @@ // Treat default namespace as "" and not null if (prefix == null) prefix = Constants.EMPTYSTRING; - else if (prefix.equals(XMLNS_STRING)) - return(XMLNS_STRING); + else if (prefix.equals(XMLNS_PREFIX)) + return(XMLNS_PREFIX); // Check if we must translate the prefix final String alternative = stable.lookupPrefixAlias(prefix); @@ -264,7 +259,7 @@ // Ignore special attributes (e.g. xmlns:prefix and xmlns) final String prefix = qname.getPrefix(); if (prefix != null && prefix.equals(XMLNS_PREFIX) || - prefix == null && qname.getLocalPart().equals("xmlns") || + prefix == null && qname.getLocalPart().equals(XMLNS_PREFIX) || uri != null && uri.equals(XSLT_URI)) { continue; @@ -337,9 +332,9 @@ il.append(methodGen.startElement()); // The value of an attribute may depend on a (sibling) variable - int j=0; + int j = 0; while (j < elementCount()) { - final SyntaxTreeNode item = (SyntaxTreeNode) elementAt(j); + final SyntaxTreeNode item = elementAt(j); if (item instanceof Variable) { item.translate(classGen, methodGen); } @@ -348,35 +343,12 @@ // Compile code to emit namespace attributes if (_accessedPrefixes != null) { - boolean declaresDefaultNS = false; - for (Map.Entry entry : _accessedPrefixes.entrySet()) { final String prefix = entry.getKey(); final String uri = entry.getValue(); - - if (uri != Constants.EMPTYSTRING || - prefix != Constants.EMPTYSTRING) - { - if (prefix == Constants.EMPTYSTRING) { - declaresDefaultNS = true; - } - il.append(methodGen.loadHandler()); - il.append(new PUSH(cpg,prefix)); - il.append(new PUSH(cpg,uri)); - il.append(methodGen.namespace()); - } - } - - /* - * If our XslElement parent redeclares the default NS, and this - * element doesn't, it must be redeclared one more time. - */ - if (!declaresDefaultNS && (_parent instanceof XslElement) - && ((XslElement) _parent).declaresDefaultNS()) - { il.append(methodGen.loadHandler()); - il.append(new PUSH(cpg, Constants.EMPTYSTRING)); - il.append(new PUSH(cpg, Constants.EMPTYSTRING)); + il.append(new PUSH(cpg, prefix)); + il.append(new PUSH(cpg, uri)); il.append(methodGen.namespace()); } } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -17,9 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: Parser.java,v 1.2.4.1 2005/09/13 12:14:32 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.compiler; @@ -37,6 +34,7 @@ import java.io.File; import java.io.IOException; import java.io.StringReader; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -44,17 +42,20 @@ import java.util.Properties; import java.util.Stack; import java.util.StringTokenizer; -import java.util.Vector; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; @@ -68,20 +69,20 @@ */ public class Parser implements Constants, ContentHandler { - private static final String XSL = "xsl"; // standard prefix + private static final String XSL = "xsl"; // standard prefix private static final String TRANSLET = "translet"; // extension prefix private Locator _locator = null; - private XSLTC _xsltc; // Reference to the compiler object. - private XPathParser _xpathParser; // Reference to the XPath parser. - private Vector _errors; // Contains all compilation errors - private Vector _warnings; // Contains all compilation errors + private XSLTC _xsltc; // Reference to the compiler object. + private XPathParser _xpathParser; // Reference to the XPath parser. + private ArrayList _errors; // Contains all compilation errors + private ArrayList _warnings; // Contains all compilation warnings private Map _instructionClasses; // Maps instructions to classes private Map _instructionAttrs; // reqd and opt attrs - private Map _qNames; - private Map _namespaces; + private Map _qNames; + private Map> _namespaces; private QName _useAttributeSets; private QName _excludeResultPrefixes; private QName _extensionElementPrefixes; @@ -113,8 +114,8 @@ _instructionAttrs = new HashMap<>(); _variableScope = new HashMap<>(); _template = null; - _errors = new Vector(); - _warnings = new Vector(); + _errors = new ArrayList<>(); + _warnings = new ArrayList<>(); _symbolTable = new SymbolTable(); _xpathParser = new XPathParser(this); _currentStylesheet = null; @@ -139,7 +140,6 @@ public void setOutput(Output output) { if (_output != null) { if (_output.getImportPrecedence() <= output.getImportPrecedence()) { - String cdata = _output.getCdata(); output.mergeOutput(_output); _output.disable(); _output = output; @@ -173,12 +173,13 @@ Object existing = _variableScope.get(var.getName().getStringRep()); if (existing != null) { if (existing instanceof Stack) { - Stack stack = (Stack)existing; + @SuppressWarnings("unchecked") + Stack stack = (Stack)existing; stack.push(var); } else if (existing instanceof VariableBase) { - Stack stack = new Stack(); - stack.push(existing); + Stack stack = new Stack<>(); + stack.push((VariableBase)existing); stack.push(var); _variableScope.put(var.getName().getStringRep(), stack); } @@ -191,7 +192,8 @@ public void removeVariable(QName name) { Object existing = _variableScope.get(name.getStringRep()); if (existing instanceof Stack) { - Stack stack = (Stack)existing; + @SuppressWarnings("unchecked") + Stack stack = (Stack)existing; if (!stack.isEmpty()) stack.pop(); if (!stack.isEmpty()) return; } @@ -201,13 +203,14 @@ public VariableBase lookupVariable(QName name) { Object existing = _variableScope.get(name.getStringRep()); if (existing instanceof VariableBase) { - return((VariableBase)existing); + return (VariableBase)existing; } else if (existing instanceof Stack) { - Stack stack = (Stack)existing; - return((VariableBase)stack.peek()); + @SuppressWarnings("unchecked") + Stack stack = (Stack)existing; + return stack.peek(); } - return(null); + return null; } public void setXSLTC(XSLTC xsltc) { @@ -397,10 +400,9 @@ try { if (stylesheet != null) { stylesheet.parseContents(this); - final int precedence = stylesheet.getImportPrecedence(); final Iterator elements = stylesheet.elements(); while (elements.hasNext()) { - Object child = elements.next(); + SyntaxTreeNode child = elements.next(); if (child instanceof Text) { final int l = getLineNumber(); ErrorMsg err = @@ -475,9 +477,10 @@ try { factory.setFeature(Constants.NAMESPACE_FEATURE,true); } - catch (Exception e) { + catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { factory.setNamespaceAware(true); } + final SAXParser parser = factory.newSAXParser(); try { parser.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, @@ -488,6 +491,28 @@ reportError(WARNING, err); } + boolean supportCatalog = true; + boolean useCatalog = _xsltc.getFeature(JdkXmlFeatures.XmlFeature.USE_CATALOG); + try { + factory.setFeature(JdkXmlUtils.USE_CATALOG,useCatalog); + } + catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + supportCatalog = false; + } + + if (supportCatalog && useCatalog) { + try { + CatalogFeatures cf = (CatalogFeatures)_xsltc.getProperty(JdkXmlFeatures.CATALOG_FEATURES); + if (cf != null) { + for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + parser.setProperty(f.getPropertyName(), cf.get(f)); + } + } + } catch (SAXNotRecognizedException e) { + //shall not happen for internal settings + } + } + final XMLReader reader = parser.getXMLReader(); String lastProperty = ""; try { @@ -704,8 +729,6 @@ new String[] {"stylesheet-prefix", "result-prefix"}); } - - /** * Initialize the _instructionClasses map, which maps XSL element * names to Java classes in this package. @@ -779,6 +802,7 @@ /** * Add primops and base functions to the symbol table. */ + @SuppressWarnings("unused") private void initSymbolTable() { MethodType I_V = new MethodType(Type.Int, Type.Void); MethodType I_R = new MethodType(Type.Int, Type.Real); @@ -971,12 +995,12 @@ String local, Attributes attributes) { SyntaxTreeNode node = null; - QName qname = getQName(uri, prefix, local); + QName qname = getQName(uri, prefix, local); String className = _instructionClasses.get(qname.getStringRep()); if (className != null) { try { - final Class clazz = ObjectFactory.findProviderClass(className, true); + final Class clazz = ObjectFactory.findProviderClass(className, true); node = (SyntaxTreeNode)clazz.newInstance(); node.setQName(qname); node.setParser(this); @@ -1023,7 +1047,7 @@ else { Stylesheet sheet = _xsltc.getStylesheet(); if ((sheet != null) && (sheet.isExtension(uri))) { - if (sheet != (SyntaxTreeNode)_parentStack.peek()) { + if (sheet != _parentStack.peek()) { node = new UnsupportedElement(uri, prefix, local, true); UnsupportedElement elem = (UnsupportedElement)node; ErrorMsg msg = @@ -1156,7 +1180,6 @@ node.setParser(this); node.setParent(parent); node.setLineNumber(line); -// System.out.println("e = " + text + " " + node); return node; } } @@ -1191,7 +1214,7 @@ if (size > 0) { System.err.println(new ErrorMsg(ErrorMsg.COMPILER_ERROR_KEY)); for (int i = 0; i < size; i++) { - System.err.println(" " + _errors.elementAt(i)); + System.err.println(" " + _errors.get(i)); } } } @@ -1204,7 +1227,7 @@ if (size > 0) { System.err.println(new ErrorMsg(ErrorMsg.COMPILER_WARNING_KEY)); for (int i = 0; i < size; i++) { - System.err.println(" " + _warnings.elementAt(i)); + System.err.println(" " + _warnings.get(i)); } } } @@ -1217,42 +1240,42 @@ case Constants.INTERNAL: // Unexpected internal errors, such as null-ptr exceptions, etc. // Immediately terminates compilation, no translet produced - _errors.addElement(error); + _errors.add(error); break; case Constants.UNSUPPORTED: // XSLT elements that are not implemented and unsupported ext. // Immediately terminates compilation, no translet produced - _errors.addElement(error); + _errors.add(error); break; case Constants.FATAL: // Fatal error in the stylesheet input (parsing or content) // Immediately terminates compilation, no translet produced - _errors.addElement(error); + _errors.add(error); break; case Constants.ERROR: // Other error in the stylesheet input (parsing or content) // Does not terminate compilation, no translet produced - _errors.addElement(error); + _errors.add(error); break; case Constants.WARNING: // Other error in the stylesheet input (content errors only) // Does not terminate compilation, a translet is produced - _warnings.addElement(error); + _warnings.add(error); break; } } - public Vector getErrors() { + public ArrayList getErrors() { return _errors; } - public Vector getWarnings() { + public ArrayList getWarnings() { return _warnings; } /************************ SAX2 ContentHandler INTERFACE *****************/ - private Stack _parentStack = null; + private Stack _parentStack = null; private Map _prefixMapping = null; /** @@ -1262,7 +1285,7 @@ _root = null; _target = null; _prefixMapping = null; - _parentStack = new Stack(); + _parentStack = new Stack<>(); } /** @@ -1318,7 +1341,7 @@ _root = element; } else { - SyntaxTreeNode parent = (SyntaxTreeNode)_parentStack.peek(); + SyntaxTreeNode parent = _parentStack.peek(); parent.addElement(element); element.setParent(parent); } @@ -1349,7 +1372,7 @@ */ public void characters(char[] ch, int start, int length) { String string = new String(ch, start, length); - SyntaxTreeNode parent = (SyntaxTreeNode)_parentStack.peek(); + SyntaxTreeNode parent = _parentStack.peek(); if (string.length() == 0) return; diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SyntaxTreeNode.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SyntaxTreeNode.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SyntaxTreeNode.java Fri Aug 05 12:03:58 2016 -0700 @@ -73,7 +73,7 @@ protected QName _qname; // The element QName private int _line; // Source file line number protected AttributesImpl _attributes = null; // Attributes of this element - private Map _prefixMapping = null; // Namespace declarations + private Map _prefixMapping = null; // Namespace declarations // Sentinel - used to denote unrecognised syntaxt tree nodes. protected static final SyntaxTreeNode Dummy = new AbsolutePathPattern(null); @@ -828,7 +828,7 @@ * @param pos The child node's position. * @return The child node. */ - protected final Object elementAt(int pos) { + protected final SyntaxTreeNode elementAt(int pos) { return _contents.get(pos); } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -17,16 +17,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: XSLTC.java,v 1.2.4.1 2005/09/05 09:51:38 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.compiler; import com.sun.org.apache.bcel.internal.classfile.JavaClass; import com.sun.org.apache.xalan.internal.XalanConstants; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; -import com.sun.org.apache.xalan.internal.utils.FeatureManager.Feature; import com.sun.org.apache.xalan.internal.utils.SecuritySupport; import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; @@ -39,20 +34,21 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Properties; -import java.util.Objects; import java.util.Vector; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import jdk.xml.internal.JdkXmlFeatures; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; @@ -101,7 +97,7 @@ // All literal text in the stylesheet - private Vector m_characterData; + private ArrayList m_characterData; // These define the various methods for outputting the translet public static final int FILE_OUTPUT = 0; @@ -152,26 +148,31 @@ private XMLSecurityManager _xmlSecurityManager; - private final FeatureManager _featureManager; + private final JdkXmlFeatures _xmlFeatures; /** * Extension function class loader variables */ - /* Class loader reference that will be used to external extension functions loading */ + /* Class loader reference that will be used for external extension functions loading */ private ClassLoader _extensionClassLoader; /** - * HashSet with the loaded classes + * HashMap with the loaded classes */ private final Map _externalExtensionFunctions; /** + * Catalog features + */ + CatalogFeatures _catalogFeatures; + + /** * XSLTC compiler constructor */ - public XSLTC(boolean useServicesMechanism, FeatureManager featureManager) { + public XSLTC(boolean useServicesMechanism, JdkXmlFeatures featureManager) { _parser = new Parser(this, useServicesMechanism); - _featureManager = featureManager; + _xmlFeatures = featureManager; _extensionClassLoader = null; _externalExtensionFunctions = new HashMap<>(); } @@ -208,12 +209,14 @@ * @param name name of the feature * @return true if the feature is enabled, false otherwise */ - public boolean getFeature(Feature name) { - return _featureManager.isFeatureEnabled(name); + public boolean getFeature(JdkXmlFeatures.XmlFeature name) { + return _xmlFeatures.getFeature(name); } /** * Return allowed protocols for accessing external stylesheet. + * @param name the name of the property + * @return the value of the property */ public Object getProperty(String name) { if (name.equals(XMLConstants.ACCESS_EXTERNAL_STYLESHEET)) { @@ -225,12 +228,16 @@ return _xmlSecurityManager; } else if (name.equals(XalanConstants.JDK_EXTENSION_CLASSLOADER)) { return _extensionClassLoader; + } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) { + return _catalogFeatures; } return null; } /** * Set allowed protocols for accessing external stylesheet. + * @param name the name of the property + * @param value the value of the property */ public void setProperty(String name, Object value) { if (name.equals(XMLConstants.ACCESS_EXTERNAL_STYLESHEET)) { @@ -245,6 +252,8 @@ /* Clear the external extension functions HashMap if extension class loader was changed */ _externalExtensionFunctions.clear(); + } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) { + _catalogFeatures = (CatalogFeatures)value; } } @@ -286,7 +295,7 @@ } /* - * Function loads an external external extension functions. + * Function loads an external extension function. * The filtering of function types (external,internal) takes place in FunctionCall class * */ @@ -601,18 +610,18 @@ } /** - * Get a Vector containing all compile error messages - * @return A Vector containing all compile error messages + * Get a list of all compile error messages + * @return A List containing all compile error messages */ - public Vector getErrors() { + public ArrayList getErrors() { return _parser.getErrors(); } /** - * Get a Vector containing all compile warning messages - * @return A Vector containing all compile error messages + * Get a list of all compile warning messages + * @return A List containing all compile error messages */ - public Vector getWarnings() { + public ArrayList getWarnings() { return _parser.getWarnings(); } @@ -991,7 +1000,7 @@ * char[]. */ public String getCharacterData(int index) { - return ((StringBuffer) m_characterData.elementAt(index)).toString(); + return (m_characterData.get(index)).toString(); } /** @@ -1010,14 +1019,13 @@ * @return int offset at which character data will be stored */ public int addCharacterData(String newData) { - StringBuffer currData; + StringBuilder currData; if (m_characterData == null) { - m_characterData = new Vector(); - currData = new StringBuffer(); - m_characterData.addElement(currData); + m_characterData = new ArrayList<>(); + currData = new StringBuilder(); + m_characterData.add(currData); } else { - currData = (StringBuffer) m_characterData - .elementAt(m_characterData.size()-1); + currData = m_characterData.get(m_characterData.size()-1); } // Character data could take up to three-times as much space when @@ -1025,8 +1033,8 @@ // constant is 65535/3. If we exceed that, // (We really should use some "bin packing".) if (newData.length() + currData.length() > 21845) { - currData = new StringBuffer(); - m_characterData.addElement(currData); + currData = new StringBuilder(); + m_characterData.add(currData); } int newDataOffset = currData.length(); diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XslElement.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XslElement.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XslElement.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -17,16 +17,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: XslElement.java,v 1.2.4.1 2005/09/12 11:39:55 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.compiler; import com.sun.org.apache.bcel.internal.generic.ALOAD; import com.sun.org.apache.bcel.internal.generic.ASTORE; import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; -import com.sun.org.apache.bcel.internal.generic.ICONST; import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC; import com.sun.org.apache.bcel.internal.generic.InstructionList; import com.sun.org.apache.bcel.internal.generic.LocalVariableGen; @@ -61,14 +57,6 @@ displayContents(indent + IndentIncrement); } - /** - * This method is now deprecated. The new implemation of this class - * never declares the default NS. - */ - public boolean declaresDefaultNS() { - return false; - } - public void parseContents(Parser parser) { final SymbolTable stable = parser.getSymbolTable(); @@ -211,7 +199,6 @@ * on the handler (vii) evaluates the contents (viii) calls endElement(). */ public void translate(ClassGenerator classGen, MethodGenerator methodGen) { - LocalVariableGen local = null; final ConstantPoolGen cpg = classGen.getConstantPool(); final InstructionList il = methodGen.getInstructionList(); diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -17,18 +17,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: TemplatesHandlerImpl.java,v 1.2.4.1 2005/09/06 12:09:03 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.trax; -import javax.xml.XMLConstants; -import javax.xml.transform.Source; -import javax.xml.transform.Templates; -import javax.xml.transform.TransformerException; -import javax.xml.transform.URIResolver; -import javax.xml.transform.sax.TemplatesHandler; import com.sun.org.apache.xalan.internal.XalanConstants; import com.sun.org.apache.xalan.internal.xsltc.compiler.CompilerException; import com.sun.org.apache.xalan.internal.xsltc.compiler.Parser; @@ -37,14 +28,20 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.SyntaxTreeNode; import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; - +import java.util.ArrayList; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.transform.Source; +import javax.xml.transform.Templates; +import javax.xml.transform.TransformerException; +import javax.xml.transform.URIResolver; +import javax.xml.transform.sax.TemplatesHandler; +import jdk.xml.internal.JdkXmlFeatures; +import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; -import org.xml.sax.Attributes; - -import java.util.Vector; /** * Implementation of a JAXP1.1 TemplatesHandler @@ -85,6 +82,12 @@ */ private TemplatesImpl _templates = null; + // Catalog features + CatalogFeatures _catalogFeatures; + + // Catalog is enabled by default + boolean _useCatalog = true; + /** * Default constructor */ @@ -95,7 +98,7 @@ _tfactory = tfactory; // Instantiate XSLTC and get reference to parser object - XSLTC xsltc = new XSLTC(tfactory.useServicesMechnism(), tfactory.getFeatureManager()); + XSLTC xsltc = new XSLTC(tfactory.useServicesMechnism(), tfactory.getJdkXmlFeatures()); if (tfactory.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING)) xsltc.setSecureProcessing(true); @@ -112,6 +115,10 @@ else xsltc.setTemplateInlining(false); + _useCatalog = tfactory.getFeature(XMLConstants.USE_CATALOG); + _catalogFeatures = (CatalogFeatures)tfactory.getAttribute(JdkXmlFeatures.CATALOG_FEATURES); + xsltc.setProperty(JdkXmlFeatures.CATALOG_FEATURES, _catalogFeatures); + _parser = xsltc.getParser(); } @@ -229,7 +236,8 @@ stylesheet.setTemplateInlining(false); // Set a document loader (for xsl:include/import) if defined - if (_uriResolver != null) { + if (_uriResolver != null || (_useCatalog && + _catalogFeatures.get(CatalogFeatures.Feature.FILES) != null)) { stylesheet.setSourceLoader(this); } @@ -268,13 +276,13 @@ } } else { - StringBuffer errorMessage = new StringBuffer(); - Vector errors = _parser.getErrors(); + StringBuilder errorMessage = new StringBuilder(); + ArrayList errors = _parser.getErrors(); final int count = errors.size(); for (int i = 0; i < count; i++) { if (errorMessage.length() > 0) errorMessage.append('\n'); - errorMessage.append(errors.elementAt(i).toString()); + errorMessage.append(errors.get(i).toString()); } throw new SAXException(ErrorMsg.JAXP_COMPILE_ERR, new TransformerException(errorMessage.toString())); } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -17,17 +17,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: TransformerFactoryImpl.java,v 1.8 2007/04/09 21:30:41 joehw Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.trax; import com.sun.org.apache.xalan.internal.XalanConstants; import com.sun.org.apache.xalan.internal.utils.FactoryImpl; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; import com.sun.org.apache.xalan.internal.utils.FeaturePropertyBase; -import com.sun.org.apache.xalan.internal.utils.FeaturePropertyBase.State; import com.sun.org.apache.xalan.internal.utils.ObjectFactory; import com.sun.org.apache.xalan.internal.utils.SecuritySupport; import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager; @@ -48,6 +43,7 @@ import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.Enumeration; import java.util.Map; import java.util.Properties; @@ -55,6 +51,10 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogFeatures.Feature; +import javax.xml.catalog.CatalogManager; +import javax.xml.catalog.CatalogUriResolver; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.ErrorListener; @@ -75,6 +75,8 @@ import javax.xml.transform.stax.*; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; +import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.xml.sax.InputSource; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; @@ -86,6 +88,7 @@ * @author Morten Jorgensen * @author Santiago Pericas-Geertsen */ +@SuppressWarnings("deprecation") //org.xml.sax.helpers.XMLReaderFactory public class TransformerFactoryImpl extends SAXTransformerFactory implements SourceLoader, ErrorListener { @@ -229,7 +232,7 @@ private XMLSecurityPropertyManager _xmlSecurityPropertyMgr; private XMLSecurityManager _xmlSecurityManager; - private final FeatureManager _featureManager; + private final JdkXmlFeatures _xmlFeatures; private ClassLoader _extensionClassLoader = null; @@ -238,6 +241,15 @@ // type checking private Map _xsltcExtensionFunctions; + CatalogUriResolver _catalogUriResolver; + CatalogFeatures _catalogFeatures; + CatalogFeatures.Builder cfBuilder = CatalogFeatures.builder(); + // Catalog features + String _catalogFiles = null; + String _catalogDefer = null; + String _catalogPrefer = null; + String _catalogResolve = null; + /** * javax.xml.transform.sax.TransformerFactory implementation. */ @@ -251,15 +263,13 @@ private TransformerFactoryImpl(boolean useServicesMechanism) { this._useServicesMechanism = useServicesMechanism; - _featureManager = new FeatureManager(); if (System.getSecurityManager() != null) { _isSecureMode = true; _isNotSecureProcessing = false; - _featureManager.setValue(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION, - FeaturePropertyBase.State.FSP, XalanConstants.FEATURE_FALSE); } + _xmlFeatures = new JdkXmlFeatures(!_isNotSecureProcessing); _xmlSecurityPropertyMgr = new XMLSecurityPropertyManager(); _accessExternalDTD = _xmlSecurityPropertyMgr.getValue( Property.ACCESS_EXTERNAL_DTD); @@ -332,10 +342,10 @@ return _transletName; } else if (name.equals(GENERATE_TRANSLET)) { - return new Boolean(_generateTranslet); + return _generateTranslet; } else if (name.equals(AUTO_TRANSLET)) { - return new Boolean(_autoTranslet); + return _autoTranslet; } else if (name.equals(ENABLE_INLINING)) { if (_enableInlining) @@ -346,6 +356,16 @@ return _xmlSecurityManager; } else if (name.equals(XalanConstants.JDK_EXTENSION_CLASSLOADER)) { return _extensionClassLoader; + } else if (JdkXmlUtils.CATALOG_FILES.equals(name)) { + return _catalogFiles; + } else if (JdkXmlUtils.CATALOG_DEFER.equals(name)) { + return _catalogDefer; + } else if (JdkXmlUtils.CATALOG_PREFER.equals(name)) { + return _catalogPrefer; + } else if (JdkXmlUtils.CATALOG_RESOLVE.equals(name)) { + return _catalogResolve; + } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) { + return buildCatalogFeatures(); } /** Check to see if the property is managed by the security manager **/ @@ -398,7 +418,7 @@ } else if (name.equals(GENERATE_TRANSLET)) { if (value instanceof Boolean) { - _generateTranslet = ((Boolean) value).booleanValue(); + _generateTranslet = ((Boolean) value); return; } else if (value instanceof String) { @@ -408,7 +428,7 @@ } else if (name.equals(AUTO_TRANSLET)) { if (value instanceof Boolean) { - _autoTranslet = ((Boolean) value).booleanValue(); + _autoTranslet = ((Boolean) value); return; } else if (value instanceof String) { @@ -418,7 +438,7 @@ } else if (name.equals(USE_CLASSPATH)) { if (value instanceof Boolean) { - _useClasspath = ((Boolean) value).booleanValue(); + _useClasspath = ((Boolean) value); return; } else if (value instanceof String) { @@ -428,7 +448,7 @@ } else if (name.equals(DEBUG)) { if (value instanceof Boolean) { - _debug = ((Boolean) value).booleanValue(); + _debug = ((Boolean) value); return; } else if (value instanceof String) { @@ -438,7 +458,7 @@ } else if (name.equals(ENABLE_INLINING)) { if (value instanceof Boolean) { - _enableInlining = ((Boolean) value).booleanValue(); + _enableInlining = ((Boolean) value); return; } else if (value instanceof String) { @@ -457,7 +477,7 @@ } } else if (value instanceof Integer) { - _indentNumber = ((Integer) value).intValue(); + _indentNumber = ((Integer) value); return; } } @@ -470,6 +490,22 @@ = new ErrorMsg(ErrorMsg.JAXP_INVALID_ATTR_VALUE_ERR, "Extension Functions ClassLoader"); throw new IllegalArgumentException(err.toString()); } + } else if (JdkXmlUtils.CATALOG_FILES.equals(name)) { + _catalogFiles = (String) value; + cfBuilder = CatalogFeatures.builder().with(Feature.FILES, _catalogFiles); + return; + } else if (JdkXmlUtils.CATALOG_DEFER.equals(name)) { + _catalogDefer = (String) value; + cfBuilder = CatalogFeatures.builder().with(Feature.DEFER, _catalogDefer); + return; + } else if (JdkXmlUtils.CATALOG_PREFER.equals(name)) { + _catalogPrefer = (String) value; + cfBuilder = CatalogFeatures.builder().with(Feature.PREFER, _catalogPrefer); + return; + } else if (JdkXmlUtils.CATALOG_RESOLVE.equals(name)) { + _catalogResolve = (String) value; + cfBuilder = CatalogFeatures.builder().with(Feature.RESOLVE, _catalogResolve); + return; } if (_xmlSecurityManager != null && @@ -534,18 +570,18 @@ // set external access restriction when FSP is explicitly set if (value) { _xmlSecurityPropertyMgr.setValue(Property.ACCESS_EXTERNAL_DTD, - State.FSP, XalanConstants.EXTERNAL_ACCESS_DEFAULT_FSP); + FeaturePropertyBase.State.FSP, XalanConstants.EXTERNAL_ACCESS_DEFAULT_FSP); _xmlSecurityPropertyMgr.setValue(Property.ACCESS_EXTERNAL_STYLESHEET, - State.FSP, XalanConstants.EXTERNAL_ACCESS_DEFAULT_FSP); + FeaturePropertyBase.State.FSP, XalanConstants.EXTERNAL_ACCESS_DEFAULT_FSP); _accessExternalDTD = _xmlSecurityPropertyMgr.getValue( Property.ACCESS_EXTERNAL_DTD); _accessExternalStylesheet = _xmlSecurityPropertyMgr.getValue( Property.ACCESS_EXTERNAL_STYLESHEET); } - if (value && _featureManager != null) { - _featureManager.setValue(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION, - FeaturePropertyBase.State.FSP, XalanConstants.FEATURE_FALSE); + if (value && _xmlFeatures != null) { + _xmlFeatures.setFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION, + JdkXmlFeatures.State.FSP, false); } } else if (name.equals(XalanConstants.ORACLE_FEATURE_SERVICE_MECHANISM)) { @@ -554,8 +590,8 @@ _useServicesMechanism = value; } else { - if (_featureManager != null && - _featureManager.setValue(name, State.APIPROPERTY, value)) { + if (_xmlFeatures != null && + _xmlFeatures.setFeature(name, JdkXmlFeatures.State.APIPROPERTY, value)) { return; } @@ -598,21 +634,20 @@ } // Inefficient, but array is small - for (int i =0; i < features.length; i++) { + for (int i = 0; i < features.length; i++) { if (name.equals(features[i])) { return true; } } - // secure processing? + if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) { - return !_isNotSecureProcessing; + return !_isNotSecureProcessing; } - /** Check to see if the property is managed by the security manager **/ - String propertyValue = (_featureManager != null) ? - _featureManager.getValueAsString(name) : null; - if (propertyValue != null) { - return Boolean.parseBoolean(propertyValue); + /** Check to see if the property is managed by the JdkXmlFeatues **/ + int index = _xmlFeatures.getIndex(name); + if (index > -1) { + return _xmlFeatures.getFeature(index); } // Feature not supported @@ -628,8 +663,8 @@ /** * @return the feature manager */ - public FeatureManager getFeatureManager() { - return _featureManager; + public JdkXmlFeatures getJdkXmlFeatures() { + return _xmlFeatures; } /** @@ -736,21 +771,9 @@ } catch (StopParseException e ) { // startElement encountered so do not parse further - } catch (javax.xml.parsers.ParserConfigurationException e) { - + } catch (javax.xml.parsers.ParserConfigurationException | org.xml.sax.SAXException | IOException e) { throw new TransformerConfigurationException( "getAssociatedStylesheets failed", e); - - } catch (org.xml.sax.SAXException se) { - - throw new TransformerConfigurationException( - "getAssociatedStylesheets failed", se); - - - } catch (IOException ioe ) { - throw new TransformerConfigurationException( - "getAssociatedStylesheets failed", ioe); - } return _stylesheetPIHandler.getAssociatedStylesheet(); @@ -768,6 +791,9 @@ public Transformer newTransformer() throws TransformerConfigurationException { + // create CatalogFeatures that is accessible by the Transformer + // through the factory instance + buildCatalogFeatures(); TransformerImpl result = new TransformerImpl(new Properties(), _indentNumber, this); if (_uriResolver != null) { @@ -805,7 +831,7 @@ /** * Pass warning messages from the compiler to the error listener */ - private void passWarningsToListener(Vector messages) + private void passWarningsToListener(ArrayList messages) throws TransformerException { if (_errorListener == null || messages == null) { @@ -814,7 +840,7 @@ // Pass messages to listener, one by one final int count = messages.size(); for (int pos = 0; pos < count; pos++) { - ErrorMsg msg = (ErrorMsg)messages.elementAt(pos); + ErrorMsg msg = messages.get(pos); // Workaround for the TCK failure ErrorListener.errorTests.error001. if (msg.isWarningError()) _errorListener.error( @@ -828,7 +854,7 @@ /** * Pass error messages from the compiler to the error listener */ - private void passErrorsToListener(Vector messages) { + private void passErrorsToListener(ArrayList messages) { try { if (_errorListener == null || messages == null) { return; @@ -836,7 +862,7 @@ // Pass messages to listener, one by one final int count = messages.size(); for (int pos = 0; pos < count; pos++) { - String message = messages.elementAt(pos).toString(); + String message = messages.get(pos).toString(); _errorListener.error(new TransformerException(message)); } } @@ -858,6 +884,7 @@ public Templates newTemplates(Source source) throws TransformerConfigurationException { + TemplatesImpl templates; // If the _useClasspath attribute is true, try to load the translet from // the CLASSPATH and create a template object using the loaded // translet. @@ -871,7 +898,11 @@ final Class clazz = ObjectFactory.findProviderClass(transletName, true); resetTransientAttributes(); - return new TemplatesImpl(new Class[]{clazz}, transletName, null, _indentNumber, this); + templates = new TemplatesImpl(new Class[]{clazz}, transletName, null, _indentNumber, this); + if (_uriResolver != null) { + templates.setURIResolver(_uriResolver); + } + return templates; } catch (ClassNotFoundException cnfe) { ErrorMsg err = new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR, transletName); @@ -892,7 +923,7 @@ String transletClassName = getTransletBaseName(source); if (_packageName != null) - transletClassName = _packageName + "." + transletClassName; + transletClassName = _packageName + "." + transletClassName; if (_jarFileName != null) bytecodes = getBytecodesFromJar(source, transletClassName); @@ -912,12 +943,16 @@ // Reset the per-session attributes to their default values // after each newTemplates() call. resetTransientAttributes(); - return new TemplatesImpl(bytecodes, transletClassName, null, _indentNumber, this); + templates = new TemplatesImpl(bytecodes, transletClassName, null, _indentNumber, this); + if (_uriResolver != null) { + templates.setURIResolver(_uriResolver); + } + return templates; } } // Create and initialize a stylesheet compiler - final XSLTC xsltc = new XSLTC(_useServicesMechanism, _featureManager); + final XSLTC xsltc = new XSLTC(_useServicesMechanism, _xmlFeatures); if (_debug) xsltc.setDebug(true); if (_enableInlining) xsltc.setTemplateInlining(true); @@ -929,11 +964,17 @@ xsltc.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, _accessExternalDTD); xsltc.setProperty(XalanConstants.SECURITY_MANAGER, _xmlSecurityManager); xsltc.setProperty(XalanConstants.JDK_EXTENSION_CLASSLOADER, _extensionClassLoader); + + // set Catalog features + buildCatalogFeatures(); + xsltc.setProperty(JdkXmlFeatures.CATALOG_FEATURES, _catalogFeatures); + xsltc.init(); if (!_isNotSecureProcessing) _xsltcExtensionFunctions = xsltc.getExternalExtensionFunctions(); // Set a document loader (for xsl:include/import) if defined - if (_uriResolver != null) { + if (_uriResolver != null || ( _catalogFiles != null + && _xmlFeatures.getFeature(JdkXmlFeatures.XmlFeature.USE_CATALOG))) { xsltc.setSourceLoader(this); } @@ -1010,43 +1051,47 @@ } // Check that the transformation went well before returning - if (bytecodes == null) { - Vector errs = xsltc.getErrors(); - ErrorMsg err; - if (errs != null) { - err = (ErrorMsg)errs.elementAt(errs.size()-1); - } else { - err = new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR); - } - Throwable cause = err.getCause(); - TransformerConfigurationException exc; - if (cause != null) { - exc = new TransformerConfigurationException(cause.getMessage(), cause); - } else { - exc = new TransformerConfigurationException(err.toString()); + if (bytecodes == null) { + ArrayList errs = xsltc.getErrors(); + ErrorMsg err; + if (errs != null) { + err = errs.get(errs.size()-1); + } else { + err = new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR); + } + Throwable cause = err.getCause(); + TransformerConfigurationException exc; + if (cause != null) { + exc = new TransformerConfigurationException(cause.getMessage(), cause); + } else { + exc = new TransformerConfigurationException(err.toString()); + } + + // Pass compiler errors to the error listener + if (_errorListener != null) { + passErrorsToListener(xsltc.getErrors()); + + // As required by TCK 1.2, send a fatalError to the + // error listener because compilation of the stylesheet + // failed and no further processing will be possible. + try { + _errorListener.fatalError(exc); + } catch (TransformerException te) { + // well, we tried. + } + } + else { + xsltc.printErrors(); + } + throw exc; } - // Pass compiler errors to the error listener - if (_errorListener != null) { - passErrorsToListener(xsltc.getErrors()); - - // As required by TCK 1.2, send a fatalError to the - // error listener because compilation of the stylesheet - // failed and no further processing will be possible. - try { - _errorListener.fatalError(exc); - } catch (TransformerException te) { - // well, we tried. - } + templates = new TemplatesImpl(bytecodes, transletName, xsltc.getOutputProperties(), + _indentNumber, this); + if (_uriResolver != null) { + templates.setURIResolver(_uriResolver); } - else { - xsltc.printErrors(); - } - throw exc; - } - - return new TemplatesImpl(bytecodes, transletName, - xsltc.getOutputProperties(), _indentNumber, this); + return templates; } /** @@ -1061,6 +1106,9 @@ public TemplatesHandler newTemplatesHandler() throws TransformerConfigurationException { + // create CatalogFeatures that is accessible by the Handler + // through the factory instance + buildCatalogFeatures(); final TemplatesHandlerImpl handler = new TemplatesHandlerImpl(_indentNumber, this); if (_uriResolver != null) { @@ -1272,11 +1320,19 @@ @Override public InputSource loadSource(String href, String context, XSLTC xsltc) { try { + Source source = null; if (_uriResolver != null) { - final Source source = _uriResolver.resolve(href, context); - if (source != null) { - return Util.getInputSource(xsltc, source); + source = _uriResolver.resolve(href, context); + } + if (source == null && _catalogFiles != null && + _xmlFeatures.getFeature(JdkXmlFeatures.XmlFeature.USE_CATALOG)) { + if (_catalogUriResolver == null) { + _catalogUriResolver = CatalogManager.catalogUriResolver(_catalogFeatures); } + source = _catalogUriResolver.resolve(href, context); + } + if (source != null) { + return Util.getInputSource(xsltc, source); } } catch (TransformerException e) { @@ -1289,6 +1345,26 @@ } /** + * Build the CatalogFeatures object when a newTemplates or newTransformer is + * created. This will read any System Properties for the CatalogFeatures that + * may have been set. + */ + private CatalogFeatures buildCatalogFeatures() { + // build will cause the CatalogFeatures to read SPs for those not set through the API + if (_catalogFeatures == null) { + _catalogFeatures = cfBuilder.build(); + } + + // update fields + _catalogFiles = _catalogFeatures.get(Feature.FILES); + _catalogDefer = _catalogFeatures.get(Feature.DEFER); + _catalogPrefer = _catalogFeatures.get(Feature.PREFER); + _catalogResolve = _catalogFeatures.get(Feature.RESOLVE); + + return _catalogFeatures; + } + + /** * Reset the per-session attributes to their default values */ private void resetTransientAttributes() { diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -60,6 +60,9 @@ import java.util.Properties; import java.util.StringTokenizer; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogManager; +import javax.xml.catalog.CatalogUriResolver; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -80,6 +83,8 @@ import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; +import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -217,6 +222,14 @@ */ private Map _parameters = null; + // Catalog features + CatalogFeatures _catalogFeatures; + CatalogUriResolver _catalogUriResolver; + + // Catalog is enabled by default + boolean _useCatalog = true; + + /** * This class wraps an ErrorListener into a MessageHandler in order to * capture messages reported via xsl:message. @@ -270,6 +283,16 @@ _readerManager.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, _accessExternalDTD); _readerManager.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, _isSecureProcessing); _readerManager.setProperty(XalanConstants.SECURITY_MANAGER, _securityManager); + + _useCatalog = _tfactory.getFeature(XMLConstants.USE_CATALOG); + if (_useCatalog) { + _catalogFeatures = (CatalogFeatures)_tfactory.getAttribute(JdkXmlFeatures.CATALOG_FEATURES); + String catalogFiles = _catalogFeatures.get(CatalogFeatures.Feature.DEFER); + if (catalogFiles != null) { + _readerManager.setFeature(XMLConstants.USE_CATALOG, _useCatalog); + _readerManager.setProperty(JdkXmlFeatures.CATALOG_FEATURES, _catalogFeatures); + } + } //_isIncremental = tfactory._incremental; } @@ -339,7 +362,8 @@ throw new TransformerException(err.toString()); } - if (_uriResolver != null && !_isIdentity) { + if (!_isIdentity && (_uriResolver != null || (_tfactory.getFeature(XMLConstants.USE_CATALOG) + && _tfactory.getAttribute(JdkXmlUtils.CATALOG_FILES) != null))) { _translet.setDOMCache(this); } @@ -723,15 +747,33 @@ ((SAXSource)source).getXMLReader()==null )|| (source instanceof DOMSource && ((DOMSource)source).getNode()==null)){ - DocumentBuilderFactory builderF = FactoryImpl.getDOMFactory(_useServicesMechanism); - DocumentBuilder builder = builderF.newDocumentBuilder(); - String systemID = source.getSystemId(); - source = new DOMSource(builder.newDocument()); + + boolean supportCatalog = true; + + DocumentBuilderFactory builderF = FactoryImpl.getDOMFactory(_useServicesMechanism); + try { + builderF.setFeature(XMLConstants.USE_CATALOG, _useCatalog); + } catch (ParserConfigurationException e) { + supportCatalog = false; + } - // Copy system ID from original, empty Source to new - if (systemID != null) { - source.setSystemId(systemID); + if (supportCatalog && _useCatalog) { + CatalogFeatures cf = (CatalogFeatures)_tfactory.getAttribute(JdkXmlFeatures.CATALOG_FEATURES); + if (cf != null) { + for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + builderF.setAttribute(f.getPropertyName(), cf.get(f)); } + } + } + + DocumentBuilder builder = builderF.newDocumentBuilder(); + String systemID = source.getSystemId(); + source = new DOMSource(builder.newDocument()); + + // Copy system ID from original, empty Source to new + if (systemID != null) { + source.setSystemId(systemID); + } } if (_isIdentity) { transformIdentity(source, handler); @@ -1287,7 +1329,19 @@ * com.sun.org.apache.xalan.internal.xsltc.dom.LoadDocument * */ - Source resolvedSource = _uriResolver.resolve(href, baseURI); + Source resolvedSource = null; + if (_uriResolver != null) { + resolvedSource = _uriResolver.resolve(href, baseURI); + } + + if (resolvedSource == null && _useCatalog && + _catalogFeatures.get(CatalogFeatures.Feature.FILES) != null) { + if (_catalogUriResolver == null) { + _catalogUriResolver = CatalogManager.catalogUriResolver(_catalogFeatures); + } + resolvedSource = _catalogUriResolver.resolve(href, baseURI); + } + if (resolvedSource == null) { StreamSource streamSource = new StreamSource( SystemIDResolver.getAbsoluteURI(href, baseURI)); diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/Util.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/Util.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/Util.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -17,37 +17,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: Util.java,v 1.2.4.1 2005/09/14 09:37:34 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.trax; import com.sun.org.apache.xalan.internal.XalanConstants; +import com.sun.org.apache.xalan.internal.utils.FactoryImpl; +import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager; +import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC; +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; import java.io.InputStream; import java.io.Reader; - import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogFeatures.Feature; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; - import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLStreamReader; - import javax.xml.transform.Source; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamSource; - -import com.sun.org.apache.xalan.internal.utils.FactoryImpl; -import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager; -import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC; -import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; - +import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.w3c.dom.Document; - import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; @@ -57,6 +52,8 @@ /** * @author Santiago Pericas-Geertsen + * + * Added Catalog Support for URI resolution */ public final class Util { @@ -72,9 +69,6 @@ return com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util.toJavaName(name); } - - - /** * Creates a SAX2 InputSource object from a TrAX Source object */ @@ -169,6 +163,29 @@ } catch (SAXException se) { XMLSecurityManager.printWarning(reader.getClass().getName(), lastProperty, se); } + + boolean supportCatalog = true; + boolean useCatalog = xsltc.getFeature(JdkXmlFeatures.XmlFeature.USE_CATALOG); + try { + reader.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog); + } + catch (SAXNotRecognizedException | SAXNotSupportedException e) { + supportCatalog = false; + } + + if (supportCatalog & useCatalog) { + try { + CatalogFeatures cf = (CatalogFeatures)xsltc.getProperty(JdkXmlFeatures.CATALOG_FEATURES); + if (cf != null) { + for (Feature f : CatalogFeatures.Feature.values()) { + reader.setProperty(f.getPropertyName(), cf.get(f)); + } + } + } catch (SAXNotRecognizedException e) { + //shall not happen for internal settings + } + } + xsltc.setXMLReader(reader); }catch (SAXNotRecognizedException snre ) { throw new TransformerConfigurationException diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -51,6 +51,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import jdk.xml.internal.JdkXmlUtils; +import jdk.xml.internal.SecuritySupport; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.DOMErrorHandler; import org.w3c.dom.DOMException; @@ -191,7 +195,7 @@ protected SymbolTable fSymbolTable; /** Components. */ - protected ArrayList fComponents; + protected ArrayList fComponents; protected ValidationManager fValidationManager; @@ -253,7 +257,8 @@ NORMALIZE_DATA, SEND_PSVI, NAMESPACE_GROWTH, - TOLERATE_DUPLICATES + TOLERATE_DUPLICATES, + XMLConstants.USE_CATALOG }; addRecognizedFeatures(recognizedFeatures); @@ -266,6 +271,7 @@ setFeature(XERCES_NAMESPACES, true); setFeature(SEND_PSVI, true); setFeature(NAMESPACE_GROWTH, false); + setFeature(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); // add default recognized properties final String[] recognizedProperties = { @@ -282,7 +288,11 @@ DTD_VALIDATOR_FACTORY_PROPERTY, SCHEMA_DV_FACTORY, SECURITY_MANAGER, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; addRecognizedProperties(recognizedProperties); @@ -300,7 +310,7 @@ } fSymbolTable = symbolTable; - fComponents = new ArrayList(); + fComponents = new ArrayList<>(); setProperty(SYMBOL_TABLE, fSymbolTable); fErrorReporter = new XMLErrorReporter(); @@ -354,7 +364,10 @@ // REVISIT: What is the right thing to do? -Ac } - + // Initialize Catalog features + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + setProperty(f.getPropertyName(), null); + } } // (SymbolTable) @@ -1027,7 +1040,7 @@ int count = fComponents.size(); for (int i = 0; i < count; i++) { - XMLComponent c = (XMLComponent) fComponents.get(i); + XMLComponent c = fComponents.get(i); c.reset(this); } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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,13 @@ import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager; import com.sun.xml.internal.stream.StaxEntityResolverWrapper; import java.util.HashMap; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLResolver; +import jdk.xml.internal.JdkXmlUtils; +import jdk.xml.internal.SecuritySupport; /** * This class manages different properties related to Stax specification and its implementation. @@ -58,7 +62,7 @@ private static final String XML_SECURITY_PROPERTY_MANAGER = Constants.XML_SECURITY_PROPERTY_MANAGER; - HashMap supportedProps = new HashMap(); + HashMap supportedProps = new HashMap<>(); private XMLSecurityManager fSecurityManager; private XMLSecurityPropertyManager fSecurityPropertyMgr; @@ -85,13 +89,13 @@ */ public PropertyManager(PropertyManager propertyManager){ - HashMap properties = propertyManager.getProperties(); + HashMap properties = propertyManager.getProperties(); supportedProps.putAll(properties); fSecurityManager = (XMLSecurityManager)getProperty(SECURITY_MANAGER); fSecurityPropertyMgr = (XMLSecurityPropertyManager)getProperty(XML_SECURITY_PROPERTY_MANAGER); } - private HashMap getProperties(){ + private HashMap getProperties(){ return supportedProps ; } @@ -117,30 +121,36 @@ //zephyr (implementation) specific properties which can be set by the application. //interning is always done - supportedProps.put(Constants.SAX_FEATURE_PREFIX + Constants.STRING_INTERNING_FEATURE , new Boolean(true)); + supportedProps.put(Constants.SAX_FEATURE_PREFIX + Constants.STRING_INTERNING_FEATURE , true); //recognizing java encoding names by default - supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.ALLOW_JAVA_ENCODINGS_FEATURE, new Boolean(true)) ; + supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.ALLOW_JAVA_ENCODINGS_FEATURE, true) ; //in stax mode, namespace declarations are not added as attributes supportedProps.put(Constants.ADD_NAMESPACE_DECL_AS_ATTRIBUTE , Boolean.FALSE) ; - supportedProps.put(Constants.READER_IN_DEFINED_STATE, new Boolean(true)); - supportedProps.put(Constants.REUSE_INSTANCE, new Boolean(true)); - supportedProps.put(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.STAX_REPORT_CDATA_EVENT , new Boolean(false)); + supportedProps.put(Constants.READER_IN_DEFINED_STATE, true); + supportedProps.put(Constants.REUSE_INSTANCE, true); + supportedProps.put(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.STAX_REPORT_CDATA_EVENT , false); supportedProps.put(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD, Boolean.FALSE); - supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ATTDEF_FEATURE, new Boolean(false)); - supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ENTITYDEF_FEATURE, new Boolean(false)); - supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_UNDECLARED_ELEMDEF_FEATURE, new Boolean(false)); + supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ATTDEF_FEATURE, false); + supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_DUPLICATE_ENTITYDEF_FEATURE, false); + supportedProps.put(Constants.XERCES_FEATURE_PREFIX + Constants.WARN_ON_UNDECLARED_ELEMDEF_FEATURE, false); fSecurityManager = new XMLSecurityManager(true); supportedProps.put(SECURITY_MANAGER, fSecurityManager); fSecurityPropertyMgr = new XMLSecurityPropertyManager(); supportedProps.put(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr); + + // Initialize Catalog features + supportedProps.put(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + supportedProps.put(f.getPropertyName(), null); + } } private void initWriterProps(){ supportedProps.put(XMLOutputFactory.IS_REPAIRING_NAMESPACES , Boolean.FALSE); //default value of escaping characters is 'true' supportedProps.put(Constants.ESCAPE_CHARACTERS , Boolean.TRUE); - supportedProps.put(Constants.REUSE_INSTANCE, new Boolean(true)); + supportedProps.put(Constants.REUSE_INSTANCE, true); } /** @@ -160,20 +170,20 @@ public void setProperty(String property, Object value){ String equivalentProperty = null ; - if(property == XMLInputFactory.IS_NAMESPACE_AWARE || property.equals(XMLInputFactory.IS_NAMESPACE_AWARE)){ + if(property.equals(XMLInputFactory.IS_NAMESPACE_AWARE)){ equivalentProperty = Constants.XERCES_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE ; } - else if(property == XMLInputFactory.IS_VALIDATING || property.equals(XMLInputFactory.IS_VALIDATING)){ + else if(property.equals(XMLInputFactory.IS_VALIDATING)){ if( (value instanceof Boolean) && ((Boolean)value).booleanValue()){ throw new java.lang.IllegalArgumentException("true value of isValidating not supported") ; } } - else if(property == STRING_INTERNING || property.equals(STRING_INTERNING)){ + else if(property.equals(STRING_INTERNING)){ if( (value instanceof Boolean) && !((Boolean)value).booleanValue()){ throw new java.lang.IllegalArgumentException("false value of " + STRING_INTERNING + "feature is not supported") ; } } - else if(property == XMLInputFactory.RESOLVER || property.equals(XMLInputFactory.RESOLVER)){ + else if(property.equals(XMLInputFactory.RESOLVER)){ //add internal stax property supportedProps.put( Constants.XERCES_PROPERTY_PREFIX + Constants.STAX_ENTITY_RESOLVER_PROPERTY , new StaxEntityResolverWrapper((XMLResolver)value)) ; } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -48,9 +48,11 @@ import com.sun.xml.internal.stream.dtd.DTDGrammarUtil; import java.io.EOFException; import java.io.IOException; +import javax.xml.XMLConstants; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.events.XMLEvent; +import jdk.xml.internal.JdkXmlUtils; /** * @@ -175,7 +177,8 @@ VALIDATION, NOTIFY_BUILTIN_REFS, NOTIFY_CHAR_REFS, - Constants.STAX_REPORT_CDATA_EVENT + Constants.STAX_REPORT_CDATA_EVENT, + XMLConstants.USE_CATALOG }; /** Feature defaults. */ @@ -184,15 +187,20 @@ null, Boolean.FALSE, Boolean.FALSE, - Boolean.TRUE + Boolean.TRUE, + JdkXmlUtils.USE_CATALOG_DEFAULT }; /** Recognized properties. */ private static final String[] RECOGNIZED_PROPERTIES = { - SYMBOL_TABLE, + SYMBOL_TABLE, ERROR_REPORTER, ENTITY_MANAGER, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; /** Property defaults. */ @@ -200,9 +208,14 @@ null, null, null, + null, + null, + null, + null, null }; + private static final char [] cdata = {'[','C','D','A','T','A','['}; static final char [] xmlDecl = {'<','?','x','m','l'}; // private static final char [] endTag = {'<','/'}; diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java Fri Aug 05 12:03:58 2016 -0700 @@ -53,7 +53,17 @@ import java.util.Map; import java.util.Stack; import java.util.StringTokenizer; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogFeatures.Feature; +import javax.xml.catalog.CatalogManager; +import javax.xml.catalog.CatalogResolver; +import javax.xml.catalog.CatalogUriResolver; import javax.xml.stream.XMLInputFactory; +import javax.xml.transform.Source; +import jdk.xml.internal.JdkXmlUtils; +import org.xml.sax.InputSource; /** @@ -184,7 +194,8 @@ EXTERNAL_PARAMETER_ENTITIES, ALLOW_JAVA_ENCODINGS, WARN_ON_DUPLICATE_ENTITYDEF, - STANDARD_URI_CONFORMANT + STANDARD_URI_CONFORMANT, + XMLConstants.USE_CATALOG }; /** Feature defaults. */ @@ -194,7 +205,8 @@ Boolean.TRUE, Boolean.TRUE, Boolean.FALSE, - Boolean.FALSE + Boolean.FALSE, + JdkXmlUtils.USE_CATALOG_DEFAULT }; /** Recognized properties. */ @@ -205,7 +217,11 @@ VALIDATION_MANAGER, BUFFER_SIZE, SECURITY_MANAGER, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; /** Property defaults. */ @@ -214,7 +230,11 @@ null, null, null, - new Integer(DEFAULT_BUFFER_SIZE), + DEFAULT_BUFFER_SIZE, + null, + null, + null, + null, null, null }; @@ -396,6 +416,17 @@ /** Pool of character buffers. */ private CharacterBufferPool fBufferPool = new CharacterBufferPool(fBufferSize, DEFAULT_INTERNAL_BUFFER_SIZE); + /** indicate whether Catalog should be used for resolving external resources */ + private boolean fUseCatalog = true; + CatalogFeatures fCatalogFeatures; + CatalogResolver fCatalogResolver; + CatalogUriResolver fCatalogUriResolver; + + private String fCatalogFile; + private String fDefer; + private String fPrefer; + private String fResolve; + // // Constructors // @@ -1007,6 +1038,22 @@ staxInputSource = new StaxXMLInputSource(xmlInputSource, fISCreatedByResolver); } + if (staxInputSource == null) { + if (fCatalogFeatures == null) { + fCatalogFeatures = JdkXmlUtils.getCatalogFeatures(fDefer, fCatalogFile, fPrefer, fResolve); + } + fCatalogFile = fCatalogFeatures.get(Feature.FILES); + if (fUseCatalog && fCatalogFile != null) { + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); + } + InputSource is = fCatalogResolver.resolveEntity(publicId, literalSystemId); + if (is != null && !is.isEmpty()) { + staxInputSource = new StaxXMLInputSource(new XMLInputSource(is, true), true); + } + } + } + // do default resolution //this works for both stax & Xerces, if staxInputSource is null, //it means parser need to revert to default resolution @@ -1085,6 +1132,41 @@ xmlInputSource = fEntityResolver.resolveEntity(resourceIdentifier); } + if (xmlInputSource == null) { + if (fCatalogFeatures == null) { + fCatalogFeatures = JdkXmlUtils.getCatalogFeatures(fDefer, fCatalogFile, fPrefer, fResolve); + } + fCatalogFile = fCatalogFeatures.get(Feature.FILES); + if (fUseCatalog && fCatalogFile != null) { + /* + since the method can be called from various processors, both + CatalogResolver and CatalogUriResolver are used to attempt to find + a match + */ + InputSource is = null; + try { + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); + } + String pid = (publicId != null? publicId : resourceIdentifier.getNamespace()); + if (pid != null || literalSystemId != null) { + is = fCatalogResolver.resolveEntity(pid, literalSystemId); + } + } catch (CatalogException e) {} + if (is != null && !is.isEmpty()) { + xmlInputSource = new XMLInputSource(is, true); + } else if (literalSystemId != null) { + if (fCatalogUriResolver == null) { + fCatalogUriResolver = CatalogManager.catalogUriResolver(fCatalogFeatures); + } + Source source = fCatalogUriResolver.resolve(literalSystemId, baseSystemId); + if (source != null && !source.isEmpty()) { + xmlInputSource = new XMLInputSource(publicId, source.getSystemId(), baseSystemId, true); + } + } + } + } + // do default resolution // REVISIT: what's the correct behavior if the user provided an entity // resolver (fEntityResolver != null), but resolveEntity doesn't return @@ -1442,12 +1524,19 @@ fStaxEntityResolver = null; } - fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)).booleanValue(); - fReplaceEntityReferences = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)).booleanValue(); - fSupportExternalEntities = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)).booleanValue(); + fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)); + fReplaceEntityReferences = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)); + fSupportExternalEntities = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)); // Zephyr feature ignore-external-dtd is the opposite of Xerces' load-external-dtd - fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)).booleanValue(); + fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)); + + //Use Catalog + fUseCatalog = (Boolean)propertyManager.getProperty(XMLConstants.USE_CATALOG); + fCatalogFile = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_FILES); + fDefer = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_DEFER); + fPrefer = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_PREFER); + fResolve = (String)propertyManager.getProperty(JdkXmlUtils.CATALOG_RESOLVE); // JAXP 1.5 feature XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager) propertyManager.getProperty(XML_SECURITY_PROPERTY_MANAGER); @@ -1535,6 +1624,13 @@ } fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD); + //Use Catalog + fUseCatalog = componentManager.getFeature(XMLConstants.USE_CATALOG, true); + fCatalogFile = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_FILES); + fDefer = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_DEFER); + fPrefer = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_PREFER); + fResolve = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_RESOLVE); + //reset general state reset(); @@ -1631,6 +1727,8 @@ fLoadExternalDTD = state; return; } + } else if (featureId.equals(XMLConstants.USE_CATALOG)) { + fUseCatalog = state; } } // setFeature(String,boolean) @@ -1691,6 +1789,18 @@ { XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager)value; fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD); + return; + } + + //Catalog properties + if (propertyId.equals(JdkXmlUtils.CATALOG_FILES)) { + fCatalogFile = (String)value; + } else if (propertyId.equals(JdkXmlUtils.CATALOG_DEFER)) { + fDefer = (String)value; + } else if (propertyId.equals(JdkXmlUtils.CATALOG_PREFER)) { + fPrefer = (String)value; + } else if (propertyId.equals(JdkXmlUtils.CATALOG_RESOLVE)) { + fResolve = (String)value; } } @@ -2066,7 +2176,6 @@ // system id has to be a valid URI if (strict) { - try { // if it's already an absolute one, return it new URI(systemId); diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_ko.properties --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_ko.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_ko.properties Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2016, 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,7 +28,7 @@ # # The messages are arranged in key and value tuples in a ListResourceBundle. # -# @version $Id: DOMMessages_ko.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 02:40:33 gmolloy Exp $ +# @version $Id: DOMMessages_ko.properties /st_wptg_1.9.dev.jdk/3 2016/07/14 00:25:31 gmolloy Exp $ BadMessageKey = \uBA54\uC2DC\uC9C0 \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC624\uB958 \uBA54\uC2DC\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. FormatFailed = \uB2E4\uC74C \uBA54\uC2DC\uC9C0\uC758 \uD615\uC2DD\uC744 \uC9C0\uC815\uD558\uB294 \uC911 \uB0B4\uBD80 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\n @@ -82,7 +82,7 @@ jaxp-null-input-source = \uC9C0\uC815\uB41C \uC18C\uC2A4\uB294 \uB110\uC77C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. #Ranges -BAD_BOUNDARYPOINTS_ERR = \uBC94\uC704\uC758 \uACBD\uACC4 \uC9C0\uC810\uC774 \uD2B9\uC815 \uC694\uAD6C \uC0AC\uD56D\uC744 \uCDA9\uC871\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +BAD_BOUNDARYPOINTS_ERR = \uBC94\uC704\uC758 \uACBD\uACC4 \uC9C0\uC810\uC774 \uD2B9\uC815 \uC694\uAD6C\uC0AC\uD56D\uC744 \uCDA9\uC871\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. INVALID_NODE_TYPE_ERR = \uBC94\uC704\uC758 \uACBD\uACC4 \uC9C0\uC810 \uCEE8\uD14C\uC774\uB108\uAC00 \uBD80\uC801\uD569\uD55C \uC720\uD615\uC758 \uB178\uB4DC \uB610\uB294 \uBD80\uC801\uD569\uD55C \uC720\uD615\uC758 \uC870\uC0C1\uC744 \uAC00\uC9C4 \uB178\uB4DC\uB85C \uC124\uC815\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ko.properties --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ko.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ko.properties Fri Aug 05 12:03:58 2016 -0700 @@ -26,7 +26,7 @@ # This file contains error and warning messages related to XML Schema # The messages are arranged in key and value tuples in a ListResourceBundle. # -# @version $Id: XMLSchemaMessages_ko.properties /st_wptg_1.9.0.0.0jdk/2 2016/04/12 02:39:51 gmolloy Exp $ +# @version $Id: XMLSchemaMessages_ko.properties /st_wptg_1.9.dev.jdk/3 2016/07/14 00:25:31 gmolloy Exp $ BadMessageKey = \uBA54\uC2DC\uC9C0 \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC624\uB958 \uBA54\uC2DC\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. FormatFailed = \uB2E4\uC74C \uBA54\uC2DC\uC9C0\uC758 \uD615\uC2DD\uC744 \uC9C0\uC815\uD558\uB294 \uC911 \uB0B4\uBD80 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\n @@ -159,9 +159,9 @@ src-redefine.7.1 = src-redefine.7.1: \uC694\uC18C\uC758 attributeGroup \uD558\uC704\uC5D0 \uC790\uC2E0\uC744 \uCC38\uC870\uD558\uB294 attributeGroup\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC744 \uACBD\uC6B0 \uC815\uD655\uD788 1\uC774 \uC0AC\uC6A9\uB418\uC5B4\uC57C \uD558\uC9C0\uB9CC {0}\uC774(\uAC00) \uC0AC\uC6A9\uB429\uB2C8\uB2E4. src-redefine.7.2.1 = src-redefine.7.2.1: \uC7AC\uC815\uC758\uB41C \uC2A4\uD0A4\uB9C8\uC5D0 \uC774\uB984\uC774 ''{0}''\uC778 attributeGroup\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. src-redefine.7.2.2 = src-redefine.7.2.2: AttributeGroup ''{0}''\uC740(\uB294) \uC7AC\uC815\uC758\uD558\uB294 attributeGroup\uC744 \uC81C\uB300\uB85C \uC81C\uD55C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC704\uBC18\uB41C \uC81C\uC57D \uC870\uAC74: ''{1}''. - src-resolve = src-resolve: ''{0}'' \uC774\uB984\uC744 ''{1}'' \uAD6C\uC131 \uC694\uC18C\uB85C \uBD84\uC11D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. - src-resolve.4.1 = src-resolve.4.1: ''{2}'' \uAD6C\uC131 \uC694\uC18C\uB97C \uBD84\uC11D\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. ''{2}''\uC5D0 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uB294 \uAC83\uC73C\uB85C \uD655\uC778\uB418\uC5C8\uC9C0\uB9CC \uC2A4\uD0A4\uB9C8 \uBB38\uC11C ''{0}''\uC5D0\uC11C \uB300\uC0C1 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uB294 \uAD6C\uC131 \uC694\uC18C\uB97C \uCC38\uC870\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. ''{2}''\uC5D0 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC788\uC5B4\uC57C \uD560 \uACBD\uC6B0 \uC811\uB450\uC5B4\uB97C \uC81C\uACF5\uD574\uC57C \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. ''{2}''\uC5D0 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uC5B4\uC57C \uD560 \uACBD\uC6B0 "namespace" \uC18D\uC131 \uC5C6\uC774 ''import''\uB97C ''{0}''\uC5D0 \uCD94\uAC00\uD574\uC57C \uD569\uB2C8\uB2E4. - src-resolve.4.2 = src-resolve.4.2: ''{2}'' \uAD6C\uC131 \uC694\uC18C\uB97C \uBD84\uC11D\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. ''{2}''\uC774(\uAC00) ''{1}'' \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC5D0 \uC788\uB294 \uAC83\uC73C\uB85C \uD655\uC778\uB418\uC5C8\uC9C0\uB9CC \uC2A4\uD0A4\uB9C8 \uBB38\uC11C ''{0}''\uC5D0\uC11C \uC774 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC758 \uAD6C\uC131 \uC694\uC18C\uB97C \uCC38\uC870\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC77C \uACBD\uC6B0 \uC811\uB450\uC5B4\uC778 ''{2}''\uC744(\uB97C) \uBCC0\uACBD\uD574\uC57C \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC62C\uBC14\uB978 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC77C \uACBD\uC6B0 \uC801\uD569\uD55C ''import'' \uD0DC\uADF8\uB97C ''{0}''\uC5D0 \uCD94\uAC00\uD574\uC57C \uD569\uB2C8\uB2E4. + src-resolve = src-resolve: ''{0}'' \uC774\uB984\uC744 ''{1}'' \uAD6C\uC131\uC694\uC18C\uB85C \uBD84\uC11D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + src-resolve.4.1 = src-resolve.4.1: ''{2}'' \uAD6C\uC131\uC694\uC18C\uB97C \uBD84\uC11D\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. ''{2}''\uC5D0 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uB294 \uAC83\uC73C\uB85C \uD655\uC778\uB418\uC5C8\uC9C0\uB9CC \uC2A4\uD0A4\uB9C8 \uBB38\uC11C ''{0}''\uC5D0\uC11C \uB300\uC0C1 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uB294 \uAD6C\uC131\uC694\uC18C\uB97C \uCC38\uC870\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. ''{2}''\uC5D0 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC788\uC5B4\uC57C \uD560 \uACBD\uC6B0 \uC811\uB450\uC5B4\uB97C \uC81C\uACF5\uD574\uC57C \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. ''{2}''\uC5D0 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC5C6\uC5B4\uC57C \uD560 \uACBD\uC6B0 "namespace" \uC18D\uC131 \uC5C6\uC774 ''import''\uB97C ''{0}''\uC5D0 \uCD94\uAC00\uD574\uC57C \uD569\uB2C8\uB2E4. + src-resolve.4.2 = src-resolve.4.2: ''{2}'' \uAD6C\uC131\uC694\uC18C\uB97C \uBD84\uC11D\uD558\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. ''{2}''\uC774(\uAC00) ''{1}'' \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC5D0 \uC788\uB294 \uAC83\uC73C\uB85C \uD655\uC778\uB418\uC5C8\uC9C0\uB9CC \uC2A4\uD0A4\uB9C8 \uBB38\uC11C ''{0}''\uC5D0\uC11C \uC774 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC758 \uAD6C\uC131\uC694\uC18C\uB97C \uCC38\uC870\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC77C \uACBD\uC6B0 \uC811\uB450\uC5B4\uC778 ''{2}''\uC744(\uB97C) \uBCC0\uACBD\uD574\uC57C \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC62C\uBC14\uB978 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC77C \uACBD\uC6B0 \uC801\uD569\uD55C ''import'' \uD0DC\uADF8\uB97C ''{0}''\uC5D0 \uCD94\uAC00\uD574\uC57C \uD569\uB2C8\uB2E4. src-simple-type.2.a = src-simple-type.2.a: \uD574\uB2F9 [children] \uC911 base [attribute]\uC640 \uC694\uC18C\uAC00 \uBAA8\uB450 \uC788\uB294 \uC694\uC18C\uAC00 \uBC1C\uACAC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uD558\uB098\uB9CC \uD5C8\uC6A9\uB429\uB2C8\uB2E4. src-simple-type.2.b = src-simple-type.2.b: \uD574\uB2F9 [children] \uC911 base [attribute]\uC640 \uC694\uC18C\uAC00 \uBAA8\uB450 \uC5C6\uB294 \uC694\uC18C\uAC00 \uBC1C\uACAC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uD558\uB098\uB9CC \uD544\uC694\uD569\uB2C8\uB2E4. src-simple-type.3.a = src-simple-type.3.a: \uD574\uB2F9 [children] \uC911 itemType [attribute]\uC640 \uC694\uC18C\uAC00 \uBAA8\uB450 \uC788\uB294 \uC694\uC18C\uAC00 \uBC1C\uACAC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uD558\uB098\uB9CC \uD5C8\uC6A9\uB429\uB2C8\uB2E4. @@ -190,8 +190,8 @@ cos-particle-restrict.2 = cos-particle-restrict.2: \uAE08\uC9C0\uB41C \uC870\uAC01 \uC81C\uD55C \uC0AC\uD56D: ''{0}''. cos-st-restricts.1.1 = cos-st-restricts.1.1: ''{1}'' \uC720\uD615\uC774 \uAE30\uBCF8 \uB2E8\uC704\uC774\uBBC0\uB85C \uD574\uB2F9 '{'base type definition'}' ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uB2E8\uC21C \uC720\uD615 \uC815\uC758 \uB610\uB294 \uB0B4\uC7A5\uB41C \uAE30\uBCF8 \uB370\uC774\uD130 \uC720\uD615\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. cos-st-restricts.2.1 = cos-st-restricts.2.1: \uBAA9\uB85D \uC720\uD615 ''{0}''\uC758 \uC815\uC758\uC5D0\uC11C ''{1}'' \uC720\uD615\uC740 \uBAA9\uB85D \uC720\uD615\uC774\uAC70\uB098 \uBAA9\uB85D\uC744 \uD3EC\uD568\uD558\uB294 \uD569\uC9D1\uD569 \uC720\uD615\uC774\uBBC0\uB85C \uBD80\uC801\uD569\uD55C \uD56D\uBAA9 \uC720\uD615\uC785\uB2C8\uB2E4. - cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: '{'item type definition'}' ''{0}''\uC758 '{'final'}' \uAD6C\uC131 \uC694\uC18C\uC5D0 ''list''\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uBAA9\uB85D \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uD56D\uBAA9 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. - cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: '{'member type definitions'}' ''{0}''\uC758 '{'final'}' \uAD6C\uC131 \uC694\uC18C\uC5D0 ''union''\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uD569\uC9D1\uD569 \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uBA64\uBC84 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: '{'item type definition'}' ''{0}''\uC758 '{'final'}' \uAD6C\uC131\uC694\uC18C\uC5D0 ''list''\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uBAA9\uB85D \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uD56D\uBAA9 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: '{'member type definitions'}' ''{0}''\uC758 '{'final'}' \uAD6C\uC131\uC694\uC18C\uC5D0 ''union''\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uD569\uC9D1\uD569 \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uBA64\uBC84 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. cos-valid-default.2.1 = cos-valid-default.2.1: ''{0}'' \uC694\uC18C\uC5D0 \uAC12 \uC81C\uC57D \uC870\uAC74\uC774 \uC788\uC73C\uBBC0\uB85C \uD63C\uD569 \uB610\uB294 \uB2E8\uC21C \uCF58\uD150\uCE20 \uBAA8\uB378\uC774 \uD3EC\uD568\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4. cos-valid-default.2.2.2 = cos-valid-default.2.2.2: ''{0}'' \uC694\uC18C\uC5D0 '{'value constraint'}'\uAC00 \uC788\uC73C\uBA70 \uD574\uB2F9 \uC720\uD615 \uC815\uC758\uC5D0 \uD63C\uD569 '{'content type'}'\uC774 \uC788\uC73C\uBBC0\uB85C '{'content type'}'\uC758 \uC870\uAC01\uC744 \uBE44\uC6B8 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4. c-props-correct.2 = c-props-correct.2: keyref ''{0}''\uACFC(\uC640) \uD0A4 ''{1}''\uC5D0 \uB300\uD55C \uD544\uB4DC \uAE30\uC218\uB294 \uC11C\uB85C \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4. @@ -282,7 +282,7 @@ rcase-RecurseUnordered.2 = rcase-RecurseUnordered.2: \uC870\uAC01 \uAC04 \uC804\uCCB4 \uAE30\uB2A5 \uB9E4\uD551\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. # We're using sch-props-correct.2 instead of the old src-redefine.1 # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. - sch-props-correct.2 = sch-props-correct.2: \uC2A4\uD0A4\uB9C8\uC5D0\uB294 \uB3D9\uC77C\uD55C \uC774\uB984\uC744 \uAC00\uC9C4 \uB450 \uAC1C\uC758 \uC804\uC5ED \uAD6C\uC131 \uC694\uC18C\uAC00 \uD3EC\uD568\uB420 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uC2A4\uD0A4\uB9C8\uC5D0\uB294 \uB450 \uAC1C\uC758 ''{0}''\uC774(\uAC00) \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. + sch-props-correct.2 = sch-props-correct.2: \uC2A4\uD0A4\uB9C8\uC5D0\uB294 \uB3D9\uC77C\uD55C \uC774\uB984\uC744 \uAC00\uC9C4 \uB450 \uAC1C\uC758 \uC804\uC5ED \uAD6C\uC131\uC694\uC18C\uAC00 \uD3EC\uD568\uB420 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uC2A4\uD0A4\uB9C8\uC5D0\uB294 \uB450 \uAC1C\uC758 ''{0}''\uC774(\uAC00) \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. st-props-correct.2 = st-props-correct.2: \uB2E8\uC21C \uC720\uD615 ''{0}''\uC5D0 \uB300\uD55C \uC21C\uD658 \uC815\uC758\uAC00 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC740(\uB294) \uACE0\uC720\uD55C \uC720\uD615 \uACC4\uCE35\uC5D0 \uD3EC\uD568\uB41C \uAC83\uC774\uBA70 \uC774\uB294 \uC624\uB958\uC785\uB2C8\uB2E4. st-props-correct.3 = st-props-correct.3: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. '{'base type definition'}' ''{1}''\uC758 '{'final'}' \uAC12\uC740 \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD55C \uD30C\uC0DD\uC744 \uAE08\uC9C0\uD569\uB2C8\uB2E4. totalDigits-valid-restriction = totalDigits-valid-restriction: {2}\uC758 \uC815\uC758\uC5D0\uC11C ''totalDigits'' \uBA74\uC5D0 \uB300\uD55C ''{0}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC774 \uAC12\uC740 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''{1}''(\uC73C)\uB85C \uC124\uC815\uB41C ''totalDigits''\uC5D0 \uB300\uD55C \uAC12\uBCF4\uB2E4 \uC791\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java Fri Aug 05 12:03:58 2016 -0700 @@ -76,6 +76,7 @@ import java.util.StringTokenizer; import java.util.WeakHashMap; import javax.xml.XMLConstants; +import jdk.xml.internal.JdkXmlUtils; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.DOMError; import org.w3c.dom.DOMErrorHandler; @@ -173,7 +174,8 @@ HONOUR_ALL_SCHEMALOCATIONS, NAMESPACE_GROWTH, TOLERATE_DUPLICATES, - USE_SERVICE_MECHANISM + USE_SERVICE_MECHANISM, + XMLConstants.USE_CATALOG }; // property identifiers @@ -187,7 +189,7 @@ Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY; /** Property identifier: error handler. */ - protected static final String ERROR_HANDLER = + public static final String ERROR_HANDLER = Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_HANDLER_PROPERTY; /** Property identifier: entity resolver. */ @@ -244,7 +246,11 @@ SECURITY_MANAGER, LOCALE, SCHEMA_DV_FACTORY, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; // Data @@ -813,7 +819,7 @@ // InputSource also, apart from [] of type Object. Object[] objArr = (Object[]) fJAXPSource; // make local array for storing target namespaces of schemasources specified in object arrays. - ArrayList jaxpSchemaSourceNamespaces = new ArrayList(); + ArrayList jaxpSchemaSourceNamespaces = new ArrayList<>(); for (int i = 0; i < objArr.length; i++) { if (objArr[i] instanceof InputStream || objArr[i] instanceof InputSource) { @@ -1280,7 +1286,7 @@ */ public DOMStringList getParameterNames() { if (fRecognizedParameters == null){ - ArrayList v = new ArrayList(); + ArrayList v = new ArrayList<>(); v.add(Constants.DOM_VALIDATE); v.add(Constants.DOM_ERROR_HANDLER); v.add(Constants.DOM_RESOURCE_RESOLVER); @@ -1381,7 +1387,7 @@ } - XMLInputSource dom2xmlInputSource(LSInput is) { + XMLInputSource dom2xmlInputSource(LSInput is) { // need to wrap the LSInput with an XMLInputSource XMLInputSource xis = null; diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -86,6 +86,8 @@ import java.util.Stack; import java.util.Vector; import javax.xml.XMLConstants; +import jdk.xml.internal.JdkXmlUtils; +import jdk.xml.internal.SecuritySupport; /** * The XML Schema validator. The validator implements a document @@ -264,6 +266,8 @@ protected static final String USE_SERVICE_MECHANISM = Constants.ORACLE_FEATURE_SERVICE_MECHANISM; + protected static final String USE_CATALOG = XMLConstants.USE_CATALOG; + // recognized features and properties /** Recognized features. */ @@ -286,7 +290,8 @@ UNPARSED_ENTITY_CHECKING, NAMESPACE_GROWTH, TOLERATE_DUPLICATES, - USE_SERVICE_MECHANISM + USE_SERVICE_MECHANISM, + USE_CATALOG }; /** Feature defaults. */ @@ -317,7 +322,8 @@ null, null, null, - Boolean.TRUE + Boolean.TRUE, + JdkXmlUtils.USE_CATALOG_DEFAULT }; /** Recognized properties. */ @@ -334,12 +340,17 @@ ROOT_TYPE_DEF, ROOT_ELEMENT_DECL, SCHEMA_DV_FACTORY, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; /** Property defaults. */ private static final Object[] PROPERTY_DEFAULTS = - { null, null, null, null, null, null, null, null, null, null, null, null}; + { null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null}; // this is the number of valuestores of each kind // we expect an element to have. It's almost diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -39,7 +39,6 @@ import com.sun.org.apache.xerces.internal.parsers.BasicParserConfiguration; import com.sun.org.apache.xerces.internal.util.FeatureState; import com.sun.org.apache.xerces.internal.util.PropertyState; -import com.sun.org.apache.xerces.internal.util.Status; import com.sun.org.apache.xerces.internal.util.SymbolTable; import com.sun.org.apache.xerces.internal.xni.XMLLocator; import com.sun.org.apache.xerces.internal.xni.XNIException; @@ -51,6 +50,9 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentScanner; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration; +import javax.xml.XMLConstants; +import jdk.xml.internal.JdkXmlUtils; +import jdk.xml.internal.SecuritySupport; /** * @xerces.internal @@ -301,7 +303,8 @@ PARSER_SETTINGS, WARN_ON_DUPLICATE_ATTDEF, WARN_ON_UNDECLARED_ELEMDEF, ALLOW_JAVA_ENCODINGS, CONTINUE_AFTER_FATAL_ERROR, LOAD_EXTERNAL_DTD, NOTIFY_BUILTIN_REFS, - NOTIFY_CHAR_REFS, GENERATE_SYNTHETIC_ANNOTATIONS + NOTIFY_CHAR_REFS, GENERATE_SYNTHETIC_ANNOTATIONS, + XMLConstants.USE_CATALOG }; addRecognizedFeatures(recognizedFeatures); fFeatures.put(PARSER_SETTINGS, Boolean.TRUE); @@ -315,6 +318,7 @@ fFeatures.put(NOTIFY_BUILTIN_REFS, Boolean.FALSE); fFeatures.put(NOTIFY_CHAR_REFS, Boolean.FALSE); fFeatures.put(GENERATE_SYNTHETIC_ANNOTATIONS, Boolean.FALSE); + fFeatures.put(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); // add default recognized properties final String[] recognizedProperties = { @@ -328,7 +332,11 @@ DATATYPE_VALIDATOR_FACTORY, VALIDATION_MANAGER, GENERATE_SYNTHETIC_ANNOTATIONS, - LOCALE + LOCALE, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; addRecognizedProperties(recognizedProperties); diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java Fri Aug 05 12:03:58 2016 -0700 @@ -102,9 +102,11 @@ import java.util.Stack; import java.util.Vector; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import jdk.xml.internal.JdkXmlUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -391,7 +393,7 @@ private Locale fLocale; // the XMLEntityManager - private XMLEntityResolver fEntityManager; + private XMLEntityManager fEntityManager; // the XSAttributeChecker private XSAttributeChecker fAttributeChecker; @@ -411,6 +413,13 @@ // the security property manager private XMLSecurityPropertyManager fSecurityPropertyMgr = null; + /** indicate whether Catalog should be used for resolving external resources */ + private boolean fUseCatalog = true; + private String fCatalogFile; + private String fDefer; + private String fPrefer; + private String fResolve; + //************ Traversers ********** XSDAttributeGroupTraverser fAttributeGroupTraverser; XSDAttributeTraverser fAttributeTraverser; @@ -710,6 +719,13 @@ fAnnotationValidator.setProperty(ERROR_HANDLER, (fErrorHandler != null) ? fErrorHandler : new DefaultErrorHandler()); /** Set locale. **/ fAnnotationValidator.setProperty(LOCALE, fLocale); + + // Passing on the Catalog settings + fAnnotationValidator.setFeature(XMLConstants.USE_CATALOG, fUseCatalog); + fAnnotationValidator.setProperty(JdkXmlUtils.CATALOG_FILES, fCatalogFile); + fAnnotationValidator.setProperty(JdkXmlUtils.CATALOG_DEFER, fDefer); + fAnnotationValidator.setProperty(JdkXmlUtils.CATALOG_PREFER, fPrefer); + fAnnotationValidator.setProperty(JdkXmlUtils.CATALOG_RESOLVE, fResolve); } /** @@ -3514,7 +3530,7 @@ fSecurityManager = (XMLSecurityManager) componentManager.getProperty(SECURITY_MANAGER, null); //set entity manager - fEntityManager = (XMLEntityResolver) componentManager.getProperty(ENTITY_MANAGER); + fEntityManager = (XMLEntityManager) componentManager.getProperty(ENTITY_MANAGER); //set entity resolver XMLEntityResolver er = (XMLEntityResolver)componentManager.getProperty(ENTITY_RESOLVER); @@ -3593,6 +3609,20 @@ fAccessExternalDTD = fSecurityPropertyMgr.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD); fAccessExternalSchema = fSecurityPropertyMgr.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_SCHEMA); + // Passing the Catalog settings to the parser + fUseCatalog = componentManager.getFeature(XMLConstants.USE_CATALOG); + fSchemaParser.setFeature(XMLConstants.USE_CATALOG, fUseCatalog); + fEntityManager.setFeature(XMLConstants.USE_CATALOG, fUseCatalog); + + fCatalogFile = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_FILES); + fDefer = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_DEFER); + fPrefer = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_PREFER); + fResolve = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_RESOLVE); + + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + fSchemaParser.setProperty(f.getPropertyName(), componentManager.getProperty(f.getPropertyName())); + fEntityManager.setProperty(f.getPropertyName(), componentManager.getProperty(f.getPropertyName())); + } } // reset(XMLComponentManager) diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -32,6 +32,7 @@ import java.io.IOException; import java.lang.ref.SoftReference; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.TransformerConfigurationException; @@ -41,6 +42,8 @@ import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; +import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.xml.sax.SAXException; /** @@ -190,6 +193,10 @@ fComponentManager.getProperty(Constants.XML_SECURITY_PROPERTY_MANAGER)); config.setProperty(Constants.SECURITY_MANAGER, fComponentManager.getProperty(Constants.SECURITY_MANAGER)); + + // Passing on the CatalogFeatures settings + JdkXmlUtils.catalogFeaturesConfig2Config(fComponentManager, config); + fConfiguration = new SoftReference(config); return config; } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -71,6 +71,8 @@ import com.sun.org.apache.xerces.internal.xs.ItemPSVI; import com.sun.org.apache.xerces.internal.xs.PSVIProvider; import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition; +import javax.xml.catalog.CatalogFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.w3c.dom.TypeInfo; import org.w3c.dom.ls.LSInput; import org.w3c.dom.ls.LSResourceResolver; @@ -701,6 +703,9 @@ XMLConstants.ACCESS_EXTERNAL_DTD, exc); } } + + // Passing on the CatalogFeatures settings from a configuration object to the reader + JdkXmlUtils.catalogFeaturesConfig2Reader(fComponentManager, reader); } catch( Exception e ) { // this is impossible, but better safe than sorry throw new FactoryConfigurationError(e); @@ -1046,7 +1051,7 @@ */ InputSource inputSource = new InputSource(); inputSource.setPublicId(pubId); - inputSource.setSystemId((baseSystemId != null) ? resolveSystemId(systemId, baseSystemId) : systemId); + inputSource.setSystemId((baseSystemId != null) ? resolveSystemId(sysId, baseSystemId) : sysId); if (charStream != null) { inputSource.setCharacterStream(charStream); diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -22,12 +22,10 @@ import java.io.IOException; -import javax.xml.XMLConstants; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stax.StAXResult; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Validator; @@ -83,7 +81,8 @@ private boolean fResourceResolverChanged = false; /** Support current-element-node property */ - private static final String CURRENT_ELEMENT_NODE = Constants.XERCES_PROPERTY_PREFIX + Constants.CURRENT_ELEMENT_NODE_PROPERTY; + private static final String CURRENT_ELEMENT_NODE = + Constants.XERCES_PROPERTY_PREFIX + Constants.CURRENT_ELEMENT_NODE_PROPERTY; public ValidatorImpl(XSGrammarPoolContainer grammarContainer) { fComponentManager = new XMLSchemaValidatorComponentManager(grammarContainer); @@ -91,6 +90,7 @@ setResourceResolver(null); } + @Override public void validate(Source source, Result result) throws SAXException, IOException { if (source instanceof SAXSource) { @@ -133,24 +133,29 @@ } } + @Override public void setErrorHandler(ErrorHandler errorHandler) { fErrorHandlerChanged = (errorHandler != null); fComponentManager.setErrorHandler(errorHandler); } + @Override public ErrorHandler getErrorHandler() { return fComponentManager.getErrorHandler(); } + @Override public void setResourceResolver(LSResourceResolver resourceResolver) { fResourceResolverChanged = (resourceResolver != null); fComponentManager.setResourceResolver(resourceResolver); } + @Override public LSResourceResolver getResourceResolver() { return fComponentManager.getResourceResolver(); } + @Override public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { if (name == null) { @@ -169,6 +174,7 @@ } } + @Override public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { if (name == null) { @@ -197,6 +203,7 @@ fConfigurationChanged = true; } + @Override public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { if (name == null) { @@ -219,6 +226,7 @@ } } + @Override public void setProperty(String name, Object object) throws SAXNotRecognizedException, SAXNotSupportedException { if (name == null) { @@ -238,6 +246,7 @@ fConfigurationChanged = true; } + @Override public void reset() { // avoid resetting features and properties if the state the validator // is currently in, is the same as it will be after reset. @@ -265,14 +274,17 @@ * PSVIProvider methods */ + @Override public ElementPSVI getElementPSVI() { return (fSAXValidatorHelper != null) ? fSAXValidatorHelper.getElementPSVI() : null; } + @Override public AttributePSVI getAttributePSVI(int index) { return (fSAXValidatorHelper != null) ? fSAXValidatorHelper.getAttributePSVI(index) : null; } + @Override public AttributePSVI getAttributePSVIByName(String uri, String localname) { return (fSAXValidatorHelper != null) ? fSAXValidatorHelper.getAttributePSVIByName(uri, localname) : null; } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,3 +1,6 @@ +/* + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + */ /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -17,20 +20,6 @@ package com.sun.org.apache.xerces.internal.jaxp.validation; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; - -import javax.xml.XMLConstants; -import javax.xml.stream.XMLEventReader; -import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stax.StAXSource; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; - import com.sun.org.apache.xerces.internal.impl.Constants; import com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader; import com.sun.org.apache.xerces.internal.util.DOMEntityResolverWrapper; @@ -49,6 +38,20 @@ import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool; import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures.Feature; +import javax.xml.stream.XMLEventReader; +import javax.xml.transform.Source; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import jdk.xml.internal.JdkXmlUtils; import org.w3c.dom.Node; import org.w3c.dom.ls.LSResourceResolver; import org.xml.sax.ErrorHandler; @@ -156,6 +159,12 @@ fSecurityPropertyMgr = new XMLSecurityPropertyManager(); fXMLSchemaLoader.setProperty(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr); + + // use catalog + fXMLSchemaLoader.setFeature(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); + for (Feature f : Feature.values()) { + fXMLSchemaLoader.setProperty(f.getPropertyName(), null); + } } /** diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.Locale; -import java.util.Iterator; import java.util.Map; import javax.xml.XMLConstants; @@ -48,6 +47,7 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLComponent; import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; +import javax.xml.catalog.CatalogFeatures; import org.w3c.dom.ls.LSResourceResolver; import org.xml.sax.ErrorHandler; @@ -176,7 +176,7 @@ private boolean fUseGrammarPoolOnly; /** Lookup map for components required for validation. **/ - private final HashMap fComponents = new HashMap(); + private final HashMap fComponents = new HashMap<>(); // // Components @@ -202,10 +202,10 @@ // /** Stores initial feature values for validator reset. */ - private final HashMap fInitFeatures = new HashMap(); + private final HashMap fInitFeatures = new HashMap<>(); /** Stores initial property values for validator reset. */ - private final HashMap fInitProperties = new HashMap(); + private final HashMap fInitProperties = new HashMap<>(); /** Stores the initial security manager. */ private XMLSecurityManager fInitSecurityManager; @@ -262,13 +262,15 @@ DISALLOW_DOCTYPE_DECL_FEATURE, NORMALIZE_DATA, SCHEMA_ELEMENT_DEFAULT, - SCHEMA_AUGMENT_PSVI + SCHEMA_AUGMENT_PSVI, + XMLConstants.USE_CATALOG }; addRecognizedFeatures(recognizedFeatures); fFeatures.put(DISALLOW_DOCTYPE_DECL_FEATURE, Boolean.FALSE); fFeatures.put(NORMALIZE_DATA, Boolean.FALSE); fFeatures.put(SCHEMA_ELEMENT_DEFAULT, Boolean.FALSE); fFeatures.put(SCHEMA_AUGMENT_PSVI, Boolean.TRUE); + fFeatures.put(XMLConstants.USE_CATALOG, grammarContainer.getFeature(XMLConstants.USE_CATALOG)); addRecognizedParamsAndSetDefaults(fEntityManager, grammarContainer); addRecognizedParamsAndSetDefaults(fErrorReporter, grammarContainer); @@ -304,6 +306,11 @@ fSecurityPropertyMgr = (XMLSecurityPropertyManager) grammarContainer.getProperty(Constants.XML_SECURITY_PROPERTY_MANAGER); setProperty(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr); + + //initialize Catalog properties + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + setProperty(f.getPropertyName(), grammarContainer.getProperty(f.getPropertyName())); + } } /** @@ -541,20 +548,16 @@ // Reset feature and property values to their initial values if (!fInitFeatures.isEmpty()) { - Iterator iter = fInitFeatures.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = (Map.Entry) iter.next(); - String name = (String) entry.getKey(); - boolean value = ((Boolean) entry.getValue()).booleanValue(); + for (Map.Entry entry : fInitFeatures.entrySet()) { + String name = entry.getKey(); + boolean value = entry.getValue(); super.setFeature(name, value); } fInitFeatures.clear(); } if (!fInitProperties.isEmpty()) { - Iterator iter = fInitProperties.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = (Map.Entry) iter.next(); - String name = (String) entry.getKey(); + for (Map.Entry entry : fInitProperties.entrySet()) { + String name = entry.getKey(); Object value = entry.getValue(); super.setProperty(name, value); } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.impl.validation.ValidationManager; import com.sun.org.apache.xerces.internal.util.FeatureState; import com.sun.org.apache.xerces.internal.util.PropertyState; -import com.sun.org.apache.xerces.internal.util.Status; import com.sun.org.apache.xerces.internal.util.SymbolTable; import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager; import com.sun.org.apache.xerces.internal.xni.XMLLocator; @@ -49,6 +48,9 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentScanner; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import jdk.xml.internal.JdkXmlUtils; /** * This is the DTD-only parser configuration. It extends the basic @@ -308,6 +310,7 @@ //NOTIFY_BUILTIN_REFS, // from XMLDocumentFragmentScannerImpl //NOTIFY_CHAR_REFS, // from XMLDocumentFragmentScannerImpl //WARN_ON_DUPLICATE_ENTITYDEF, // from XMLEntityManager + XMLConstants.USE_CATALOG }; addRecognizedFeatures(recognizedFeatures); @@ -320,6 +323,7 @@ //setFeature(NOTIFY_BUILTIN_REFS, false); // from XMLDocumentFragmentScannerImpl //setFeature(NOTIFY_CHAR_REFS, false); // from XMLDocumentFragmentScannerImpl //setFeature(WARN_ON_DUPLICATE_ENTITYDEF, false); // from XMLEntityManager + fFeatures.put(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); // add default recognized properties final String[] recognizedProperties = { @@ -337,7 +341,11 @@ JAXP_SCHEMA_LANGUAGE, LOCALE, SECURITY_MANAGER, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; addRecognizedProperties(recognizedProperties); @@ -416,6 +424,11 @@ } setProperty(XML_SECURITY_PROPERTY_MANAGER, new XMLSecurityPropertyManager()); + + // Initialize Catalog features + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + setProperty(f.getPropertyName(), null); + } } // (SymbolTable,XMLGrammarPool) // diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -47,6 +47,9 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentScanner; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import jdk.xml.internal.JdkXmlUtils; /** * This is the non validating parser configuration. It extends the basic @@ -281,8 +284,8 @@ // add default recognized features final String[] recognizedFeatures = { - PARSER_SETTINGS, - NAMESPACES, + PARSER_SETTINGS, + NAMESPACES, //WARN_ON_DUPLICATE_ATTDEF, // from XMLDTDScannerImpl //WARN_ON_UNDECLARED_ELEMDEF, // from XMLDTDScannerImpl //ALLOW_JAVA_ENCODINGS, // from XMLEntityManager @@ -291,6 +294,7 @@ //NOTIFY_BUILTIN_REFS, // from XMLDocumentFragmentScannerImpl //NOTIFY_CHAR_REFS, // from XMLDocumentFragmentScannerImpl //WARN_ON_DUPLICATE_ENTITYDEF // from XMLEntityManager + XMLConstants.USE_CATALOG }; addRecognizedFeatures(recognizedFeatures); @@ -299,12 +303,13 @@ //setFeature(WARN_ON_UNDECLARED_ELEMDEF, false); // from XMLDTDScannerImpl //setFeature(ALLOW_JAVA_ENCODINGS, false); // from XMLEntityManager fFeatures.put(CONTINUE_AFTER_FATAL_ERROR, Boolean.FALSE); - fFeatures.put(PARSER_SETTINGS, Boolean.TRUE); - fFeatures.put(NAMESPACES, Boolean.TRUE); + fFeatures.put(PARSER_SETTINGS, Boolean.TRUE); + fFeatures.put(NAMESPACES, Boolean.TRUE); //setFeature(LOAD_EXTERNAL_DTD, true); // from XMLDTDScannerImpl //setFeature(NOTIFY_BUILTIN_REFS, false); // from XMLDocumentFragmentScannerImpl //setFeature(NOTIFY_CHAR_REFS, false); // from XMLDocumentFragmentScannerImpl //setFeature(WARN_ON_DUPLICATE_ENTITYDEF, false); // from XMLEntityManager + fFeatures.put(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); // add default recognized properties final String[] recognizedProperties = { @@ -319,7 +324,11 @@ VALIDATION_MANAGER, LOCALE, SECURITY_MANAGER, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; addRecognizedProperties(recognizedProperties); @@ -377,6 +386,11 @@ } setProperty(XML_SECURITY_PROPERTY_MANAGER, new XMLSecurityPropertyManager()); + + // Initialize Catalog features + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + setProperty(f.getPropertyName(), null); + } } // (SymbolTable,XMLGrammarPool) // diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java Fri Aug 05 12:03:58 2016 -0700 @@ -20,12 +20,6 @@ package com.sun.org.apache.xerces.internal.parsers; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Locale; -import javax.xml.XMLConstants; - import com.sun.org.apache.xerces.internal.impl.Constants; import com.sun.org.apache.xerces.internal.impl.XML11DTDScannerImpl; import com.sun.org.apache.xerces.internal.impl.XML11DocumentScannerImpl; @@ -52,7 +46,6 @@ import com.sun.org.apache.xerces.internal.util.ParserConfigurationSettings; import com.sun.org.apache.xerces.internal.util.PropertyState; import com.sun.org.apache.xerces.internal.util.SymbolTable; -import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager; import com.sun.org.apache.xerces.internal.xni.XMLDTDContentModelHandler; import com.sun.org.apache.xerces.internal.xni.XMLDTDHandler; import com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler; @@ -69,6 +62,13 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLErrorHandler; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Locale; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import jdk.xml.internal.JdkXmlUtils; +import jdk.xml.internal.SecuritySupport; /** * This class is the configuration used to parse XML 1.0 and XML 1.1 documents. @@ -478,10 +478,6 @@ // Common components for XML 1.1. and XML 1.0 fCommonComponents = new ArrayList<>(); - // create table for features and properties - fFeatures = new HashMap<>(); - fProperties = new HashMap<>(); - // add default recognized features final String[] recognizedFeatures = { @@ -503,7 +499,8 @@ EXTERNAL_GENERAL_ENTITIES, EXTERNAL_PARAMETER_ENTITIES, PARSER_SETTINGS, - XMLConstants.FEATURE_SECURE_PROCESSING + XMLConstants.FEATURE_SECURE_PROCESSING, + XMLConstants.USE_CATALOG }; addRecognizedFeatures(recognizedFeatures); // set state for default features @@ -528,6 +525,7 @@ fFeatures.put(USE_GRAMMAR_POOL_ONLY, Boolean.FALSE); fFeatures.put(PARSER_SETTINGS, Boolean.TRUE); fFeatures.put(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); + fFeatures.put(XMLConstants.USE_CATALOG, JdkXmlUtils.USE_CATALOG_DEFAULT); // add default recognized properties final String[] recognizedProperties = @@ -559,7 +557,11 @@ LOCALE, SCHEMA_DV_FACTORY, SECURITY_MANAGER, - XML_SECURITY_PROPERTY_MANAGER + XML_SECURITY_PROPERTY_MANAGER, + JdkXmlUtils.CATALOG_DEFER, + JdkXmlUtils.CATALOG_FILES, + JdkXmlUtils.CATALOG_PREFER, + JdkXmlUtils.CATALOG_RESOLVE }; addRecognizedProperties(recognizedProperties); @@ -622,6 +624,11 @@ // REVISIT: What is the right thing to do? -Ac } + // Initialize Catalog features + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + fProperties.put(f.getPropertyName(), null); + } + fConfigUpdated = false; } // (SymbolTable,XMLGrammarPool) diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2001, 2002,2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -20,16 +20,15 @@ package com.sun.org.apache.xerces.internal.util; +import com.sun.org.apache.xerces.internal.impl.Constants; +import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; +import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.sun.org.apache.xerces.internal.impl.Constants; -import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; -import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; - /** * This class implements the basic operations for managing parser * configuration features and properties. This utility class can @@ -87,12 +86,12 @@ public ParserConfigurationSettings(XMLComponentManager parent) { // create storage for recognized features and properties - fRecognizedFeatures = new HashSet(); - fRecognizedProperties = new HashSet(); + fRecognizedFeatures = new HashSet<>(); + fRecognizedProperties = new HashSet<>(); // create table for features and properties - fFeatures = new HashMap(); - fProperties = new HashMap(); + fFeatures = new HashMap<>(); + fProperties = new HashMap<>(); // save parent fParentSettings = parent; @@ -195,6 +194,7 @@ * it is really * a critical error. */ + @Override public final boolean getFeature(String featureId) throws XMLConfigurationException { @@ -205,6 +205,7 @@ return state.state; } // getFeature(String):boolean + @Override public final boolean getFeature(String featureId, boolean defaultValue) { FeatureState state = getFeatureState(featureId); if (state.isExceptional()) { @@ -213,8 +214,9 @@ return state.state; } + @Override public FeatureState getFeatureState(String featureId) { - Boolean state = (Boolean) fFeatures.get(featureId); + Boolean state = fFeatures.get(featureId); if (state == null) { FeatureState checkState = checkFeature(featureId); @@ -238,6 +240,7 @@ * it is really * a critical error. */ + @Override public final Object getProperty(String propertyId) throws XMLConfigurationException { @@ -249,6 +252,7 @@ return state.state; } // getProperty(String):Object + @Override public final Object getProperty(String propertyId, Object defaultValue) { PropertyState state = getPropertyState(propertyId); if (state.isExceptional()) { @@ -258,6 +262,7 @@ return state.state; } + @Override public PropertyState getPropertyState(String propertyId) { Object propertyValue = fProperties.get(propertyId); @@ -307,6 +312,7 @@ * * @param propertyId The unique identifier (URI) of the property * being set. + * @return the PropertyState * @exception com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException If the * requested feature is not known. */ diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,21 +1,26 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! - */ -/* - * Copyright 2002,2004 The Apache Software Foundation. + * Copyright (c) 2012, 2016, 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. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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). * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * 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 com.sun.org.apache.xerces.internal.utils; @@ -48,72 +53,57 @@ /** * Return an instance of this class. + * @return an instance of this class */ public static SecuritySupport getInstance() { return securitySupport; } static ClassLoader getContextClassLoader() { - return (ClassLoader) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - ClassLoader cl = null; - try { - cl = Thread.currentThread().getContextClassLoader(); - } catch (SecurityException ex) { } - return cl; - } + return AccessController.doPrivileged((PrivilegedAction) () -> { + ClassLoader cl = null; + try { + cl = Thread.currentThread().getContextClassLoader(); + } catch (SecurityException ex) { } + return cl; }); } static ClassLoader getSystemClassLoader() { - return (ClassLoader) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - ClassLoader cl = null; - try { - cl = ClassLoader.getSystemClassLoader(); - } catch (SecurityException ex) {} - return cl; - } + return AccessController.doPrivileged((PrivilegedAction) () -> { + ClassLoader cl = null; + try { + cl = ClassLoader.getSystemClassLoader(); + } catch (SecurityException ex) {} + return cl; }); } static ClassLoader getParentClassLoader(final ClassLoader cl) { - return (ClassLoader) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - ClassLoader parent = null; - try { - parent = cl.getParent(); - } catch (SecurityException ex) {} + return AccessController.doPrivileged((PrivilegedAction) () -> { + ClassLoader parent = null; + try { + parent = cl.getParent(); + } catch (SecurityException ex) {} - // eliminate loops in case of the boot - // ClassLoader returning itself as a parent - return (parent == cl) ? null : parent; - } + // eliminate loops in case of the boot + // ClassLoader returning itself as a parent + return (parent == cl) ? null : parent; }); } public static String getSystemProperty(final String propName) { - return (String) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return System.getProperty(propName); - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> + System.getProperty(propName)); } static FileInputStream getFileInputStream(final File file) throws FileNotFoundException { try { - return (FileInputStream) - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws FileNotFoundException { - return new FileInputStream(file); - } - }); + return AccessController.doPrivileged( + (PrivilegedExceptionAction)() -> + new FileInputStream(file)); } catch (PrivilegedActionException e) { throw (FileNotFoundException)e.getException(); } @@ -135,38 +125,28 @@ * @return a resource bundle for the given base name and locale */ public static ResourceBundle getResourceBundle(final String bundle, final Locale locale) { - return AccessController.doPrivileged(new PrivilegedAction() { - public ResourceBundle run() { + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + return PropertyResourceBundle.getBundle(bundle, locale); + } catch (MissingResourceException e) { try { - return PropertyResourceBundle.getBundle(bundle, locale); - } catch (MissingResourceException e) { - try { - return PropertyResourceBundle.getBundle(bundle, new Locale("en", "US")); - } catch (MissingResourceException e2) { - throw new MissingResourceException( - "Could not load any resource bundle by " + bundle, bundle, ""); - } + return PropertyResourceBundle.getBundle(bundle, new Locale("en", "US")); + } catch (MissingResourceException e2) { + throw new MissingResourceException( + "Could not load any resource bundle by " + bundle, bundle, ""); } } }); } static boolean getFileExists(final File f) { - return ((Boolean) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return f.exists() ? Boolean.TRUE : Boolean.FALSE; - } - })).booleanValue(); + return (AccessController.doPrivileged((PrivilegedAction) () -> + f.exists())); } static long getLastModified(final File f) { - return ((Long) - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return new Long(f.lastModified()); - } - })).longValue(); + return (AccessController.doPrivileged((PrivilegedAction) () -> + f.lastModified())); } /** @@ -193,6 +173,7 @@ * @param allowedProtocols a list of allowed protocols separated by comma * @param accessAny keyword to indicate allowing any protocol * @return the name of the protocol if rejected, null otherwise + * @throws java.io.IOException */ public static String checkAccess(String systemId, String allowedProtocols, String accessAny) throws IOException { if (systemId == null || (allowedProtocols != null && @@ -201,7 +182,7 @@ } String protocol; - if (systemId.indexOf(":")==-1) { + if (!systemId.contains(":")) { protocol = "file"; } else { URL url = new URL(systemId); @@ -249,15 +230,15 @@ * Read JAXP system property in this order: system property, * $java.home/conf/jaxp.properties if the system property is not specified * - * @param propertyId the Id of the property + * @param sysPropertyId the Id of the property * @return the value of the property */ public static String getJAXPSystemProperty(String sysPropertyId) { - String accessExternal = getSystemProperty(sysPropertyId); - if (accessExternal == null) { - accessExternal = readJAXPProperty(sysPropertyId); + String value = getSystemProperty(sysPropertyId); + if (value == null) { + value = readJAXPProperty(sysPropertyId); } - return accessExternal; + return value; } /** @@ -288,7 +269,7 @@ value = cacheProps.getProperty(propertyId); } - catch (Exception ex) {} + catch (IOException ex) {} finally { if (is != null) { try { diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 2003-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -17,6 +17,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.sun.org.apache.xerces.internal.xinclude; import java.io.CharConversionException; @@ -70,6 +71,14 @@ import com.sun.org.apache.xerces.internal.utils.ObjectFactory; import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager; import java.util.Objects; +import javax.xml.catalog.CatalogException; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogManager; +import javax.xml.catalog.CatalogResolver; +import javax.xml.catalog.CatalogUriResolver; +import javax.xml.transform.Source; +import jdk.xml.internal.JdkXmlUtils; +import org.xml.sax.InputSource; /** *

@@ -247,7 +256,7 @@ { ERROR_REPORTER, ENTITY_RESOLVER, SECURITY_MANAGER, BUFFER_SIZE }; /** Property defaults. */ - private static final Object[] PROPERTY_DEFAULTS = { null, null, null, new Integer(XMLEntityManager.DEFAULT_BUFFER_SIZE) }; + private static final Object[] PROPERTY_DEFAULTS = { null, null, null, XMLEntityManager.DEFAULT_BUFFER_SIZE}; // instance variables @@ -335,8 +344,8 @@ private int[] fState = new int[INITIAL_SIZE]; // buffering the necessary DTD events - private ArrayList fNotations; - private ArrayList fUnparsedEntities; + private final ArrayList fNotations; + private final ArrayList fUnparsedEntities; // flags which control whether base URI or language fixup is performed. private boolean fFixupBaseURIs = true; @@ -358,6 +367,17 @@ // track whether the child config needs its features refreshed private boolean fNeedCopyFeatures = true; + /** indicate whether Catalog should be used for resolving external resources */ + private boolean fUseCatalog = true; + CatalogFeatures fCatalogFeatures; + CatalogResolver fCatalogResolver; + CatalogUriResolver fCatalogUriResolver; + + private String fCatalogFile; + private String fDefer; + private String fPrefer; + private String fResolve; + // Constructors public XIncludeHandler() { @@ -366,8 +386,8 @@ fSawFallback[fDepth] = false; fSawInclude[fDepth] = false; fState[fDepth] = STATE_NORMAL_PROCESSING; - fNotations = new ArrayList(); - fUnparsedEntities = new ArrayList(); + fNotations = new ArrayList<>(); + fUnparsedEntities = new ArrayList<>(); fBaseURIScope = new IntStack(); fBaseURI = new Stack(); @@ -534,24 +554,31 @@ fSecurityPropertyMgr = (XMLSecurityPropertyManager) componentManager.getProperty(Constants.XML_SECURITY_PROPERTY_MANAGER); + //Use Catalog + fUseCatalog = componentManager.getFeature(XMLConstants.USE_CATALOG); + fCatalogFile = (String)componentManager.getProperty(CatalogFeatures.Feature.FILES.getPropertyName()); + fDefer = (String)componentManager.getProperty(CatalogFeatures.Feature.DEFER.getPropertyName()); + fPrefer = (String)componentManager.getProperty(CatalogFeatures.Feature.PREFER.getPropertyName()); + fResolve = (String)componentManager.getProperty(CatalogFeatures.Feature.RESOLVE.getPropertyName()); + // Get buffer size. try { Integer value = (Integer)componentManager.getProperty( BUFFER_SIZE); - if (value != null && value.intValue() > 0) { - fBufferSize = value.intValue(); + if (value != null && value > 0) { + fBufferSize = value; if (fChildConfig != null) { fChildConfig.setProperty(BUFFER_SIZE, value); } } else { - fBufferSize = ((Integer)getPropertyDefault(BUFFER_SIZE)).intValue(); + fBufferSize = ((Integer)getPropertyDefault(BUFFER_SIZE)); } } catch (XMLConfigurationException e) { - fBufferSize = ((Integer)getPropertyDefault(BUFFER_SIZE)).intValue(); + fBufferSize = ((Integer)getPropertyDefault(BUFFER_SIZE)); } // Reset XML 1.0 text reader. @@ -1599,6 +1626,39 @@ includedSource = fEntityResolver.resolveEntity(resourceIdentifier); + if (includedSource == null) { + if (fCatalogFeatures == null) { + fCatalogFeatures = JdkXmlUtils.getCatalogFeatures(fDefer, fCatalogFile, fPrefer, fResolve); + } + fCatalogFile = fCatalogFeatures.get(CatalogFeatures.Feature.FILES); + if (fUseCatalog && fCatalogFile != null) { + /* + Although URI entry is preferred for resolving XInclude, system entry + is allowed as well. + */ + Source source = null; + try { + if (fCatalogUriResolver == null) { + fCatalogUriResolver = CatalogManager.catalogUriResolver(fCatalogFeatures); + } + source = fCatalogUriResolver.resolve(href, fCurrentBaseURI.getExpandedSystemId()); + } catch (CatalogException e) {} + + if (source != null && !source.isEmpty()) { + includedSource = new XMLInputSource(null, source.getSystemId(), + fCurrentBaseURI.getExpandedSystemId(), true); + } else { + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); + } + InputSource is = fCatalogResolver.resolveEntity(href, href); + if (is != null && !is.isEmpty()) { + includedSource = new XMLInputSource(is, true); + } + } + } + } + if (includedSource != null && !(includedSource instanceof HTTPInputSource) && (accept != null || acceptLanguage != null) && diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xni/parser/XMLInputSource.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xni/parser/XMLInputSource.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xni/parser/XMLInputSource.java Fri Aug 05 12:03:58 2016 -0700 @@ -21,9 +21,9 @@ package com.sun.org.apache.xerces.internal.xni.parser; import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier; - import java.io.InputStream; import java.io.Reader; +import org.xml.sax.InputSource; /** * This class represents an input source for an XML document. The @@ -108,6 +108,23 @@ } // (XMLResourceIdentifier) /** + * Constructs an input source from a SAX InputSource + * object. + * + * @param inputSource a SAX InputSource + * @param isCreatedByResolver a flag to indicate whether the source is + * created by a resolver + */ + public XMLInputSource(InputSource inputSource, boolean isCreatedByResolver) { + fPublicId = inputSource.getPublicId(); + fSystemId = inputSource.getSystemId(); + fByteStream = inputSource.getByteStream(); + fCharStream = inputSource.getCharacterStream(); + fEncoding = inputSource.getEncoding(); + fIsCreatedByResolver = isCreatedByResolver; + } + + /** * Constructs an input source from a byte stream. * * @param publicId The public identifier, if known. diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -17,9 +17,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: XMLReaderManager.java,v 1.2.4.1 2005/09/15 08:16:02 suresh_emailid Exp $ - */ + package com.sun.org.apache.xml.internal.utils; import com.sun.org.apache.xalan.internal.XalanConstants; @@ -27,13 +25,16 @@ import com.sun.org.apache.xalan.internal.utils.SecuritySupport; import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager; import java.util.HashMap; - import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; +import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.JdkXmlUtils; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; @@ -41,6 +42,7 @@ * Creates XMLReader objects and caches them for re-use. * This class follows the singleton pattern. */ +@SuppressWarnings("deprecation") //org.xml.sax.helpers.XMLReaderFactory public class XMLReaderManager { private static final String NAMESPACES_FEATURE = @@ -58,12 +60,12 @@ /** * Cache of XMLReader objects */ - private ThreadLocal m_readers; + private ThreadLocal m_readers; /** * Keeps track of whether an XMLReader object is in use. */ - private HashMap m_inUse; + private HashMap m_inUse; private boolean m_useServicesMechanism = true; @@ -75,6 +77,10 @@ private XMLSecurityManager _xmlSecurityManager; + //Catalog Feature + private boolean _useCatalog; + private CatalogFeatures _catalogFeatures; + /** * Hidden constructor */ @@ -101,17 +107,17 @@ if (m_readers == null) { // When the m_readers.get() method is called for the first time // on a thread, a new XMLReader will automatically be created. - m_readers = new ThreadLocal(); + m_readers = new ThreadLocal<>(); } if (m_inUse == null) { - m_inUse = new HashMap(); + m_inUse = new HashMap<>(); } // If the cached reader for this thread is in use, construct a new // one; otherwise, return the cached reader unless it isn't an // instance of the class set in the 'org.xml.sax.driver' property - reader = (XMLReader) m_readers.get(); + reader = m_readers.get(); boolean threadHasReader = (reader != null); String factory = SecuritySupport.getSystemProperty(property); if (threadHasReader && m_inUse.get(reader) != Boolean.TRUE && @@ -131,7 +137,7 @@ XMLSecurityManager.printWarning(reader.getClass().getName(), XMLConstants.FEATURE_SECURE_PROCESSING, e); } - } catch (Exception e) { + } catch (SAXException e) { try { // If unable to create an instance, let's try to use // the XMLReader from JAXP @@ -156,8 +162,7 @@ throw new SAXException(ex); } catch (FactoryConfigurationError ex1) { throw new SAXException(ex1.toString()); - } catch (NoSuchMethodError ex2) { - } catch (AbstractMethodError ame) { + } catch (NoSuchMethodError | AbstractMethodError ex2) { } // Cache the XMLReader if this is the first time we've created @@ -193,6 +198,23 @@ XMLSecurityManager.printWarning(reader.getClass().getName(), lastProperty, se); } + boolean supportCatalog = true; + try { + reader.setFeature(JdkXmlUtils.USE_CATALOG, _useCatalog); + } + catch (SAXNotRecognizedException | SAXNotSupportedException e) { + supportCatalog = false; + } + + if (supportCatalog && _useCatalog && _catalogFeatures != null) { + try { + for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + reader.setProperty(f.getPropertyName(), _catalogFeatures.get(f)); + } + } catch (SAXNotRecognizedException e) { + //shall not happen for internal settings + } + } return reader; } @@ -229,6 +251,8 @@ public void setFeature(String name, boolean value) { if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) { _secureProcessing = value; + } else if (XMLConstants.USE_CATALOG.equals(name)) { + _useCatalog = value; } } @@ -252,6 +276,9 @@ _accessExternalDTD = (String)value; } else if (name.equals(XalanConstants.SECURITY_MANAGER)) { _xmlSecurityManager = (XMLSecurityManager)value; + } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) { + _catalogFeatures = (CatalogFeatures)value; } + } } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/JAXPExtensionsProvider.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/JAXPExtensionsProvider.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/JAXPExtensionsProvider.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,15 +1,15 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -18,27 +18,21 @@ * limitations under the License. */ -// $Id: JAXPExtensionsProvider.java,v 1.1.2.1 2005/08/01 01:30:17 jeffsuttor Exp $ - package com.sun.org.apache.xpath.internal.jaxp; -import javax.xml.transform.TransformerException; -import javax.xml.xpath.XPathFunctionResolver; +import com.sun.org.apache.xalan.internal.res.XSLMessages; +import com.sun.org.apache.xpath.internal.ExtensionsProvider; +import com.sun.org.apache.xpath.internal.functions.FuncExtFunction; +import com.sun.org.apache.xpath.internal.objects.XNodeSet; +import com.sun.org.apache.xpath.internal.objects.XObject; +import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; +import java.util.ArrayList; +import java.util.Vector; +import javax.xml.namespace.QName; import javax.xml.xpath.XPathFunction; import javax.xml.xpath.XPathFunctionException; - -import com.sun.org.apache.xpath.internal.ExtensionsProvider; -import com.sun.org.apache.xpath.internal.XPathContext; -import com.sun.org.apache.xpath.internal.objects.XObject; -import com.sun.org.apache.xpath.internal.objects.XNodeSet; -import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; -import com.sun.org.apache.xalan.internal.res.XSLMessages; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; - -import com.sun.org.apache.xpath.internal.functions.FuncExtFunction; -import java.util.Vector; -import java.util.ArrayList; -import javax.xml.namespace.QName; +import javax.xml.xpath.XPathFunctionResolver; +import jdk.xml.internal.JdkXmlFeatures; /** * @@ -55,10 +49,10 @@ } public JAXPExtensionsProvider(XPathFunctionResolver resolver, - boolean featureSecureProcessing, FeatureManager featureManager ) { + boolean featureSecureProcessing, JdkXmlFeatures featureManager ) { this.resolver = resolver; if (featureSecureProcessing && - !featureManager.isFeatureEnabled(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION)) { + !featureManager.getFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION)) { this.extensionInvocationDisabled = true; } } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -20,7 +20,6 @@ package com.sun.org.apache.xpath.internal.jaxp; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; import com.sun.org.apache.xpath.internal.objects.XObject; import javax.xml.namespace.QName; import javax.xml.transform.TransformerException; @@ -30,6 +29,7 @@ import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFunctionResolver; import javax.xml.xpath.XPathVariableResolver; +import jdk.xml.internal.JdkXmlFeatures; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.InputSource; @@ -48,7 +48,7 @@ */ protected XPathExpressionImpl() { this(null, null, null, null, - false, true, new FeatureManager()); + false, true, new JdkXmlFeatures(false)); }; protected XPathExpressionImpl(com.sun.org.apache.xpath.internal.XPath xpath, @@ -56,13 +56,13 @@ XPathFunctionResolver functionResolver, XPathVariableResolver variableResolver) { this(xpath, prefixResolver, functionResolver, variableResolver, - false, true, new FeatureManager()); + false, true, new JdkXmlFeatures(false)); }; protected XPathExpressionImpl(com.sun.org.apache.xpath.internal.XPath xpath, JAXPPrefixResolver prefixResolver,XPathFunctionResolver functionResolver, XPathVariableResolver variableResolver, boolean featureSecureProcessing, - boolean useServiceMechanism, FeatureManager featureManager) { + boolean useServiceMechanism, JdkXmlFeatures featureManager) { this.xpath = xpath; this.prefixResolver = prefixResolver; this.functionResolver = functionResolver; diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -22,16 +22,14 @@ package com.sun.org.apache.xpath.internal.jaxp; import com.sun.org.apache.xalan.internal.XalanConstants; +import com.sun.org.apache.xalan.internal.res.XSLMessages; import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; -import com.sun.org.apache.xalan.internal.res.XSLMessages; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; -import com.sun.org.apache.xalan.internal.utils.FeaturePropertyBase; - import javax.xml.XMLConstants; import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathFactoryConfigurationException; import javax.xml.xpath.XPathFunctionResolver; import javax.xml.xpath.XPathVariableResolver; +import jdk.xml.internal.JdkXmlFeatures; /** * The XPathFactory builds XPaths. @@ -69,7 +67,7 @@ private boolean _useServicesMechanism = true; - private final FeatureManager _featureManager; + private final JdkXmlFeatures _featureManager; public XPathFactoryImpl() { this(true); @@ -80,13 +78,11 @@ } public XPathFactoryImpl(boolean useServicesMechanism) { - _featureManager = new FeatureManager(); if (System.getSecurityManager() != null) { _isSecureMode = true; _isNotSecureProcessing = false; - _featureManager.setValue(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION, - FeaturePropertyBase.State.FSP, XalanConstants.FEATURE_FALSE); } + _featureManager = new JdkXmlFeatures(!_isNotSecureProcessing); this._useServicesMechanism = useServicesMechanism; } /** @@ -189,8 +185,8 @@ _isNotSecureProcessing = !value; if (value && _featureManager != null) { - _featureManager.setValue(FeatureManager.Feature.ORACLE_ENABLE_EXTENSION_FUNCTION, - FeaturePropertyBase.State.FSP, XalanConstants.FEATURE_FALSE); + _featureManager.setFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION, + JdkXmlFeatures.State.FSP, false); } // all done processing feature @@ -204,7 +200,7 @@ } if (_featureManager != null && - _featureManager.setValue(name, FeaturePropertyBase.State.APIPROPERTY, value)) { + _featureManager.setFeature(name, JdkXmlFeatures.State.APIPROPERTY, value)) { return; } @@ -257,11 +253,10 @@ return _useServicesMechanism; } - /** Check to see if the property is managed by the security manager **/ - String propertyValue = (_featureManager != null) ? - _featureManager.getValueAsString(name) : null; - if (propertyValue != null) { - return _featureManager.isFeatureEnabled(name); + /** Check to see if the property is managed by the feature manager **/ + int index = _featureManager.getIndex(name); + if (index > -1) { + return _featureManager.getFeature(index); } // unknown feature diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java Fri Aug 05 12:03:58 2016 -0700 @@ -20,20 +20,20 @@ package com.sun.org.apache.xpath.internal.jaxp; -import javax.xml.namespace.QName; +import com.sun.org.apache.xpath.internal.*; +import com.sun.org.apache.xpath.internal.objects.XObject; import javax.xml.namespace.NamespaceContext; +import javax.xml.namespace.QName; +import javax.xml.transform.TransformerException; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathEvaluationResult; +import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFunctionResolver; import javax.xml.xpath.XPathVariableResolver; -import javax.xml.xpath.XPathExpression; -import com.sun.org.apache.xpath.internal.*; -import com.sun.org.apache.xpath.internal.objects.XObject; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; +import jdk.xml.internal.JdkXmlFeatures; import org.w3c.dom.Document; import org.xml.sax.InputSource; -import javax.xml.transform.TransformerException; -import javax.xml.xpath.XPathEvaluationResult; /** * The XPathImpl class provides implementation for the methods defined in @@ -54,12 +54,12 @@ private NamespaceContext namespaceContext=null; XPathImpl(XPathVariableResolver vr, XPathFunctionResolver fr) { - this(vr, fr, false, true, new FeatureManager()); + this(vr, fr, false, true, new JdkXmlFeatures(false)); } XPathImpl(XPathVariableResolver vr, XPathFunctionResolver fr, boolean featureSecureProcessing, boolean useServiceMechanism, - FeatureManager featureManager) { + JdkXmlFeatures featureManager) { this.origVariableResolver = this.variableResolver = vr; this.origFunctionResolver = this.functionResolver = fr; this.featureSecureProcessing = featureSecureProcessing; diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 @@ import com.sun.org.apache.xalan.internal.res.XSLMessages; import com.sun.org.apache.xalan.internal.utils.FactoryImpl; -import com.sun.org.apache.xalan.internal.utils.FeatureManager; import com.sun.org.apache.xml.internal.dtm.DTM; import com.sun.org.apache.xpath.internal.objects.XObject; import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; @@ -42,6 +41,7 @@ import javax.xml.xpath.XPathFunctionResolver; import javax.xml.xpath.XPathNodes; import javax.xml.xpath.XPathVariableResolver; +import jdk.xml.internal.JdkXmlFeatures; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.traversal.NodeIterator; @@ -61,7 +61,7 @@ // Secure Processing Feature is set on XPathFactory then the invocation of // extensions function need to throw XPathFunctionException boolean featureSecureProcessing = false; - FeatureManager featureManager; + JdkXmlFeatures featureManager; /** * Evaluate an XPath context using the internal XPath engine diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/javax/xml/XMLConstants.java --- a/jaxp/src/java.xml/share/classes/javax/xml/XMLConstants.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/javax/xml/XMLConstants.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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 @@ -381,4 +381,42 @@ */ public static final String ACCESS_EXTERNAL_STYLESHEET = "http://javax.xml.XMLConstants/property/accessExternalStylesheet"; + + /** + * Feature: useCatalog + * + *

+ * Instructs XML processors to use XML Catalogs to resolve entity references. + * Catalogs may be set through JAXP factories, system properties, or + * jaxp.properties by using the {@code javax.xml.catalog.files} property + * defined in {@link javax.xml.catalog.CatalogFeatures}. + * The following code enables Catalog on SAX parser: + *

{@code
+         *      SAXParserFactory spf = SAXParserFactory.newInstance();
+         *      spf.setFeature(XMLConstants.USE_CATALOG, true);
+         *      SAXParser parser = spf.newSAXParser();
+         *      parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), "catalog.xml");
+         * }
+ * + *

+ * Value: a boolean. If the value is true, and a catalog is set, + * the XML parser will resolve external references using + * {@link javax.xml.catalog.CatalogResolver}. If the value is false, + * XML Catalog is ignored even if one is set. The default value is true. + * + *

+ * System Property: The value of this property can be set or overridden by + * system property {@code javax.xml.useCatalog} + * + *

+ * jaxp.properties: This configuration file is in standard + * {@link java.util.Properties} format and typically located in the {@code conf} + * directory of the Java installation. If the file exists and the system + * property is specified, its value will be used to override the default + * value of the property. + * + * @since 9 + */ + public static final String USE_CATALOG = "http://javax.xml.XMLConstants/feature/useCatalog"; + } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java Fri Aug 05 12:03:58 2016 -0700 @@ -195,29 +195,184 @@ .build(); * } * + *

+ *

JAXP XML Processor Support

+ * The Catalog Features are supported throughout the JAXP processors, including + * SAX and DOM ({@link javax.xml.parsers}), and StAX parsers ({@link javax.xml.stream}), + * Schema Validation ({@link javax.xml.validation}), and XML Transformation + * ({@link javax.xml.transform}). The features described above can be set through JAXP + * factories or processors that define a setProperty or setAttribute interface. + * For example, the following code snippet sets a path to a catalog file on a SAX + * parser through the {@code javax.xml.catalog.files} property: + *

+ *

{@code
+ *      SAXParserFactory spf = SAXParserFactory.newInstance();
+ *      spf.setFeature(XMLConstants.USE_CATALOG, true); [1]
+ *      SAXParser parser = spf.newSAXParser();
+ *      parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), "catalog.xml");
+ * }
+ *

+ * [1] Note that this statement is not required since the default value of + * {@link javax.xml.XMLConstants#USE_CATALOG USE_CATALOG} is true. + * + *

+ * The JAXP Processors' support for Catalog depends on both the + * {@link javax.xml.XMLConstants#USE_CATALOG USE_CATALOG} feature and the + * existence of valid Catalog file(s). A JAXP processor will use the Catalog + * only when the feature is true and valid Catalog file(s) are specified through + * the {@code javax.xml.catalog.files} property. It will make no attempt to use + * the Catalog if either {@link javax.xml.XMLConstants#USE_CATALOG USE_CATALOG} + * is set to false, or there is no Catalog file specified. + * + *

+ * The JAXP processors will observe the default settings of the + * {@link javax.xml.catalog.CatalogFeatures}. The processors, for example, will + * report an Exception by default when no matching entry is found since the + * default value of the {@code javax.xml.catalog.resolve} property is strict. + * + *

+ * The JAXP processors give preference to user-specified custom resolvers. If such + * a resolver is registered, it will be used over the CatalogResolver. If it returns + * null however, the processors will continue resolving with the CatalogResolver. + * If it returns an empty source, no attempt will be made by the CatalogResolver. + * + *

+ * The Catalog support is available for any process in the JAXP library that + * supports a resolver. The following table lists all such processes. + * + *

+ *

Processes with Catalog Support

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ProcessCatalog Entry TypeExample
DTDs and external entitiespublic, system + *
{@literal
+   The following DTD reference:
+   
+
+   Can be resolved using the following Catalog entry:
+   
+   or
+   
+ * }
+ *
XIncludeuri + *
{@literal
+   The following XInclude element:
+   
+
+   can be resolved using an uri entry:
+   
+   or
+   
+ * }
+ *
XSD importuri + *
{@literal
+   The following import element:
+    
+
+   can be resolved using an uri entry:
+   
+   or
+   
+   or
+   
+ * }
+ *
XSD includeuri + *
{@literal
+   The following include element:
+   
+
+   can be resolved using an uri entry:
+   
+   or
+   
+ * }
+ *
XSL import and includeuri + *
{@literal
+   The following include element:
+   
+
+   can be resolved using an uri entry:
+   
+   or
+   
+ * }
+ *
XSL document functionuri + *
{@literal
+   The document in the following element:
+   
+
+   can be resolved using an uri entry:
+   
+   or
+   
+ * }
+ *
+ * * @since 9 */ public class CatalogFeatures { /** - * The constant name of the javax.xml.catalog.files property. See the property table for more details. + * The constant name of the javax.xml.catalog.files property as described + * in the property table above. */ static final String CATALOG_FILES = "javax.xml.catalog.files"; /** - * The javax.xml.catalog.prefer property. See the property table for more details. + * The javax.xml.catalog.prefer property as described + * in the property table above. */ static final String CATALOG_PREFER = "javax.xml.catalog.prefer"; /** - * Determines whether or not delegated catalogs and nextCatalog will be read - * when the current catalog is loaded. + * The javax.xml.catalog.defer property as described + * in the property table above. */ static final String CATALOG_DEFER = "javax.xml.catalog.defer"; /** - * Determines the action if there is no matching entry found after - * all of the specified catalogs are exhausted. + * The javax.xml.catalog.resolve property as described + * in the property table above. */ static final String CATALOG_RESOLVE = "javax.xml.catalog.resolve"; @@ -305,7 +460,7 @@ * Returns the default value of the property. * @return the default value of the property */ - String defaultValue() { + public String defaultValue() { return defaultValue; } diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/javax/xml/datatype/XMLGregorianCalendar.java --- a/jaxp/src/java.xml/share/classes/javax/xml/datatype/XMLGregorianCalendar.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/javax/xml/datatype/XMLGregorianCalendar.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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 @@ -181,78 +181,78 @@ public abstract class XMLGregorianCalendar implements Cloneable { - /** - * Default no-arg constructor. - * - *

Note: Always use the {@link DatatypeFactory} to - * construct an instance of {@code XMLGregorianCalendar}. - * The constructor on this class cannot be guaranteed to - * produce an object with a consistent state and may be - * removed in the future. - */ - public XMLGregorianCalendar() { - } + /** + * Default no-arg constructor. + * + *

Note: Always use the {@link DatatypeFactory} to + * construct an instance of {@code XMLGregorianCalendar}. + * The constructor on this class cannot be guaranteed to + * produce an object with a consistent state and may be + * removed in the future. + */ + public XMLGregorianCalendar() { + } - /** - * Unset all fields to undefined. - * - *

Set all int fields to {@link DatatypeConstants#FIELD_UNDEFINED} and reference fields - * to null. - */ - public abstract void clear(); + /** + * Unset all fields to undefined. + * + *

Set all int fields to {@link DatatypeConstants#FIELD_UNDEFINED} and reference fields + * to null. + */ + public abstract void clear(); - /** - * Reset this {@code XMLGregorianCalendar} to its original values. - * - *

{@code XMLGregorianCalendar} is reset to the same values as when it was created with - * {@link DatatypeFactory#newXMLGregorianCalendar()}, - * {@link DatatypeFactory#newXMLGregorianCalendar(String lexicalRepresentation)}, - * {@link DatatypeFactory#newXMLGregorianCalendar( - * BigInteger year, - * int month, - * int day, - * int hour, - * int minute, - * int second, - * BigDecimal fractionalSecond, - * int timezone)}, - * {@link DatatypeFactory#newXMLGregorianCalendar( - * int year, - * int month, - * int day, - * int hour, - * int minute, - * int second, - * int millisecond, - * int timezone)}, - * {@link DatatypeFactory#newXMLGregorianCalendar(GregorianCalendar cal)}, - * {@link DatatypeFactory#newXMLGregorianCalendarDate( - * int year, - * int month, - * int day, - * int timezone)}, - * {@link DatatypeFactory#newXMLGregorianCalendarTime( - * int hours, - * int minutes, - * int seconds, - * int timezone)}, - * {@link DatatypeFactory#newXMLGregorianCalendarTime( - * int hours, - * int minutes, - * int seconds, - * BigDecimal fractionalSecond, - * int timezone)} or - * {@link DatatypeFactory#newXMLGregorianCalendarTime( - * int hours, - * int minutes, - * int seconds, - * int milliseconds, - * int timezone)}. - * - *

{@code reset()} is designed to allow the reuse of existing {@code XMLGregorianCalendar}s - * thus saving resources associated with the creation of new {@code XMLGregorianCalendar}s. - */ - public abstract void reset(); + /** + * Reset this {@code XMLGregorianCalendar} to its original values. + * + *

{@code XMLGregorianCalendar} is reset to the same values as when it was created with + * {@link DatatypeFactory#newXMLGregorianCalendar()}, + * {@link DatatypeFactory#newXMLGregorianCalendar(String lexicalRepresentation)}, + * {@link DatatypeFactory#newXMLGregorianCalendar( + * BigInteger year, + * int month, + * int day, + * int hour, + * int minute, + * int second, + * BigDecimal fractionalSecond, + * int timezone)}, + * {@link DatatypeFactory#newXMLGregorianCalendar( + * int year, + * int month, + * int day, + * int hour, + * int minute, + * int second, + * int millisecond, + * int timezone)}, + * {@link DatatypeFactory#newXMLGregorianCalendar(GregorianCalendar cal)}, + * {@link DatatypeFactory#newXMLGregorianCalendarDate( + * int year, + * int month, + * int day, + * int timezone)}, + * {@link DatatypeFactory#newXMLGregorianCalendarTime( + * int hours, + * int minutes, + * int seconds, + * int timezone)}, + * {@link DatatypeFactory#newXMLGregorianCalendarTime( + * int hours, + * int minutes, + * int seconds, + * BigDecimal fractionalSecond, + * int timezone)} or + * {@link DatatypeFactory#newXMLGregorianCalendarTime( + * int hours, + * int minutes, + * int seconds, + * int milliseconds, + * int timezone)}. + * + *

{@code reset()} is designed to allow the reuse of existing {@code XMLGregorianCalendar}s + * thus saving resources associated with the creation of new {@code XMLGregorianCalendar}s. + */ + public abstract void reset(); /** * Set low and high order component of XSD {@code dateTime} year field. @@ -340,75 +340,75 @@ */ public void setTime(int hour, int minute, int second) { - setTime( - hour, - minute, - second, - null // fractional - ); + setTime( + hour, + minute, + second, + null // fractional + ); } - /** - * Set hours. - * - *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. - * - * @param hour value constraints summarized in hour field of date/time field mapping table. - * - * @throws IllegalArgumentException if {@code hour} parameter is outside value constraints for the field as specified in - * date/time field mapping table. - */ - public abstract void setHour(int hour); + /** + * Set hours. + * + *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. + * + * @param hour value constraints summarized in hour field of date/time field mapping table. + * + * @throws IllegalArgumentException if {@code hour} parameter is outside value constraints for the field as specified in + * date/time field mapping table. + */ + public abstract void setHour(int hour); - /** - * Set minutes. - * - *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. - * - * @param minute value constraints summarized in minute field of date/time field mapping table. - * - * @throws IllegalArgumentException if {@code minute} parameter is outside value constraints for the field as specified in - * date/time field mapping table. - */ - public abstract void setMinute(int minute); + /** + * Set minutes. + * + *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. + * + * @param minute value constraints summarized in minute field of date/time field mapping table. + * + * @throws IllegalArgumentException if {@code minute} parameter is outside value constraints for the field as specified in + * date/time field mapping table. + */ + public abstract void setMinute(int minute); - /** - * Set seconds. - * - *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. - * - * @param second value constraints summarized in second field of date/time field mapping table. - * - * @throws IllegalArgumentException if {@code second} parameter is outside value constraints for the field as specified in - * date/time field mapping table. - */ - public abstract void setSecond(int second); + /** + * Set seconds. + * + *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. + * + * @param second value constraints summarized in second field of date/time field mapping table. + * + * @throws IllegalArgumentException if {@code second} parameter is outside value constraints for the field as specified in + * date/time field mapping table. + */ + public abstract void setSecond(int second); - /** - * Set milliseconds. - * - *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. - * - * @param millisecond value constraints summarized in - * second field of date/time field mapping table. - * - * @throws IllegalArgumentException if {@code millisecond} parameter is outside value constraints for the field as specified - * in date/time field mapping table. - */ - public abstract void setMillisecond(int millisecond); + /** + * Set milliseconds. + * + *

Unset this field by invoking the setter with a parameter value of {@link DatatypeConstants#FIELD_UNDEFINED}. + * + * @param millisecond value constraints summarized in + * second field of date/time field mapping table. + * + * @throws IllegalArgumentException if {@code millisecond} parameter is outside value constraints for the field as specified + * in date/time field mapping table. + */ + public abstract void setMillisecond(int millisecond); - /** - * Set fractional seconds. - * - *

Unset this field by invoking the setter with a parameter value of {@code null}. - * - * @param fractional value constraints summarized in - * second field of date/time field mapping table. - * - * @throws IllegalArgumentException if {@code fractional} parameter is outside value constraints for the field as specified - * in date/time field mapping table. - */ - public abstract void setFractionalSecond(BigDecimal fractional); + /** + * Set fractional seconds. + * + *

Unset this field by invoking the setter with a parameter value of {@code null}. + * + * @param fractional value constraints summarized in + * second field of date/time field mapping table. + * + * @throws IllegalArgumentException if {@code fractional} parameter is outside value constraints for the field as specified + * in date/time field mapping table. + */ + public abstract void setFractionalSecond(BigDecimal fractional); /** @@ -429,12 +429,12 @@ * date/time field mapping table. */ public void setTime( - int hour, - int minute, - int second, - BigDecimal fractional) { + int hour, + int minute, + int second, + BigDecimal fractional) { - setHour(hour); + setHour(hour); setMinute(minute); setSecond(second); setFractionalSecond(fractional); @@ -465,173 +465,182 @@ setMillisecond(millisecond); } - /** - * Return high order component for XML Schema 1.0 dateTime datatype field for - * {@code year}. - * {@code null} if this optional part of the year field is not defined. - * - *

Value constraints for this value are summarized in - * year field of date/time field mapping table. - * @return eon of this {@code XMLGregorianCalendar}. The value - * returned is an integer multiple of 10^9. - * - * @see #getYear() - * @see #getEonAndYear() - */ - public abstract BigInteger getEon(); + /** + * Returns the high order component for XML Schema 1.0 dateTime datatype field for + * {@code year}. + * {@code null} if this optional part of the year field is not defined. + * + *

Value constraints for this value are summarized in + * year field of date/time field mapping table. + * @return The eon of this {@code XMLGregorianCalendar}. The value + * returned is an integer multiple of 10^9. + * + * @see #getYear() + * @see #getEonAndYear() + */ + public abstract BigInteger getEon(); - /** - * Return low order component for XML Schema 1.0 dateTime datatype field for - * {@code year} or {@link DatatypeConstants#FIELD_UNDEFINED}. - * - *

Value constraints for this value are summarized in - * year field of date/time field mapping table. - * - * @return year of this {@code XMLGregorianCalendar}. - * - * @see #getEon() - * @see #getEonAndYear() - */ - public abstract int getYear(); + /** + * Returns the low order component for XML Schema 1.0 dateTime datatype field for + * {@code year} or {@link DatatypeConstants#FIELD_UNDEFINED}. + * + *

Value constraints for this value are summarized in + * year field of date/time field mapping table. + * + * @return The year of this {@code XMLGregorianCalendar}. + * + * @see #getEon() + * @see #getEonAndYear() + */ + public abstract int getYear(); - /** - * Return XML Schema 1.0 dateTime datatype field for - * {@code year}. - * - *

Value constraints for this value are summarized in - * year field of date/time field mapping table. - * - * @return sum of {@code eon} and {@code BigInteger.valueOf(year)} - * when both fields are defined. When only {@code year} is defined, - * return it. When both {@code eon} and {@code year} are not - * defined, return {@code null}. - * - * @see #getEon() - * @see #getYear() - */ - public abstract BigInteger getEonAndYear(); + /** + * Returns the XML Schema 1.0 dateTime datatype field for + * {@code year}. + * + *

Value constraints for this value are summarized in + * year field of date/time field mapping table. + * + * @return sum of {@code eon} and {@code BigInteger.valueOf(year)} + * when both fields are defined. When only {@code year} is defined, + * return it. When both {@code eon} and {@code year} are not + * defined, return {@code null}. + * + * @see #getEon() + * @see #getYear() + */ + public abstract BigInteger getEonAndYear(); - /** - * Return number of month or {@link DatatypeConstants#FIELD_UNDEFINED}. - * - *

Value constraints for this value are summarized in - * month field of date/time field mapping table. - * - * @return year of this {@code XMLGregorianCalendar}. - * - */ - public abstract int getMonth(); + /** + * Returns the month of this calendar or {@link DatatypeConstants#FIELD_UNDEFINED}. + * + *

Value constraints for this value are summarized in + * month field of date/time field mapping table. + * + * @return The month of this {@code XMLGregorianCalendar}, from 1 to 12. + * + */ + public abstract int getMonth(); - /** - * Return day in month or {@link DatatypeConstants#FIELD_UNDEFINED}. - * - *

Value constraints for this value are summarized in - * day field of date/time field mapping table. - * - * @see #setDay(int) - */ - public abstract int getDay(); + /** + * Returns the day of month or {@link DatatypeConstants#FIELD_UNDEFINED}. + * + *

Value constraints for this value are summarized in + * day field of date/time field mapping table. + * + * @return The day of month of this {@code XMLGregorianCalendar}, from 1 to 31. + * + * @see #setDay(int) + */ + public abstract int getDay(); - /** - * Return timezone offset in minutes or - * {@link DatatypeConstants#FIELD_UNDEFINED} if this optional field is not defined. - * - *

Value constraints for this value are summarized in - * timezone field of date/time field mapping table. - * - * @see #setTimezone(int) - */ - public abstract int getTimezone(); + /** + * Returns the Timezone offset in minutes or + * {@link DatatypeConstants#FIELD_UNDEFINED} if this optional field is not defined. + * + *

Value constraints for this value are summarized in + * timezone field of date/time field mapping table. + * + * @return The Timezone offset in minutes of this {@code XMLGregorianCalendar}. + * + * @see #setTimezone(int) + */ + public abstract int getTimezone(); - /** - * Return hours or {@link DatatypeConstants#FIELD_UNDEFINED}. - * Returns {@link DatatypeConstants#FIELD_UNDEFINED} if this field is not defined. - * - *

Value constraints for this value are summarized in - * hour field of date/time field mapping table. - * @see #setTime(int, int, int) - */ - public abstract int getHour(); + /** + * Returns the hour of day or + * {@link DatatypeConstants#FIELD_UNDEFINED} if this field is not defined. + * + *

Value constraints for this value are summarized in + * hour field of date/time field mapping table. + * + * @return The hour of day of this {@code XMLGregorianCalendar}, from 0 to 23. + * + * @see #setTime(int, int, int) + */ + public abstract int getHour(); - /** - * Return minutes or {@link DatatypeConstants#FIELD_UNDEFINED}. - * Returns {@link DatatypeConstants#FIELD_UNDEFINED} if this field is not defined. - * - *

Value constraints for this value are summarized in - * minute field of date/time field mapping table. - * @see #setTime(int, int, int) - */ - public abstract int getMinute(); + /** + * Returns the minute of hour or + * {@link DatatypeConstants#FIELD_UNDEFINED} if this field is not defined. + * + *

Value constraints for this value are summarized in + * minute field of date/time field mapping table. + * + * @return The minute of hour of this {@code XMLGregorianCalendar}, from 0 to 59. + * + * @see #setTime(int, int, int) + */ + public abstract int getMinute(); - /** - * Return seconds or {@link DatatypeConstants#FIELD_UNDEFINED}. - * - *

Returns {@link DatatypeConstants#FIELD_UNDEFINED} if this field is not defined. - * When this field is not defined, the optional xs:dateTime - * fractional seconds field, represented by - * {@link #getFractionalSecond()} and {@link #getMillisecond()}, - * must not be defined. - * - *

Value constraints for this value are summarized in - * second field of date/time field mapping table. - * - * @return Second of this {@code XMLGregorianCalendar}. - * - * @see #getFractionalSecond() - * @see #getMillisecond() - * @see #setTime(int, int, int) - */ - public abstract int getSecond(); + /** + * Returns the second of minute or + * {@link DatatypeConstants#FIELD_UNDEFINED} if this field is not defined. + * When this field is not defined, the optional xs:dateTime + * fractional seconds field, represented by + * {@link #getFractionalSecond()} and {@link #getMillisecond()}, + * must not be defined. + * + *

Value constraints for this value are summarized in + * second field of date/time field mapping table. + * + * @return The second of minute of this {@code XMLGregorianCalendar}, from 0 to 59. + * + * @see #getFractionalSecond() + * @see #getMillisecond() + * @see #setTime(int, int, int) + */ + public abstract int getSecond(); - /** - * Return millisecond precision of {@link #getFractionalSecond()}. - * - *

This method represents a convenience accessor to infinite - * precision fractional second value returned by - * {@link #getFractionalSecond()}. The returned value is the rounded - * down to milliseconds value of - * {@link #getFractionalSecond()}. When {@link #getFractionalSecond()} - * returns {@code null}, this method must return - * {@link DatatypeConstants#FIELD_UNDEFINED}. - * - *

Value constraints for this value are summarized in - * second field of date/time field mapping table. - * - * @return Millisecond of this {@code XMLGregorianCalendar}. - * - * @see #getFractionalSecond() - * @see #setTime(int, int, int) - */ - public int getMillisecond() { + /** + * Returns the millisecond precision of {@link #getFractionalSecond()}. + * + *

This method represents a convenience accessor to infinite + * precision fractional second value returned by + * {@link #getFractionalSecond()}. The returned value is the rounded + * down to milliseconds value of + * {@link #getFractionalSecond()}. When {@link #getFractionalSecond()} + * returns {@code null}, this method must return + * {@link DatatypeConstants#FIELD_UNDEFINED}. + * + *

Value constraints for this value are summarized in + * second field of date/time field mapping table. + * + * @return The millisecond precision of this {@code XMLGregorianCalendar}. + * + * @see #getFractionalSecond() + * @see #setTime(int, int, int) + */ + public int getMillisecond() { - BigDecimal fractionalSeconds = getFractionalSecond(); + BigDecimal fractionalSeconds = getFractionalSecond(); - // is field undefined? - if (fractionalSeconds == null) { - return DatatypeConstants.FIELD_UNDEFINED; - } - - return getFractionalSecond().movePointRight(3).intValue(); + // is field undefined? + if (fractionalSeconds == null) { + return DatatypeConstants.FIELD_UNDEFINED; } - /** - * Return fractional seconds. - * - *

{@code null} is returned when this optional field is not defined. - * - *

Value constraints are detailed in - * second field of date/time field mapping table. - * - *

This optional field can only have a defined value when the - * xs:dateTime second field, represented by {@link #getSecond()}, - * does not return {@link DatatypeConstants#FIELD_UNDEFINED}. - * - * @return fractional seconds of this {@code XMLGregorianCalendar}. - * - * @see #getSecond() - * @see #setTime(int, int, int, BigDecimal) - */ - public abstract BigDecimal getFractionalSecond(); + return getFractionalSecond().movePointRight(3).intValue(); + } + + /** + * Returns fractional seconds. + * + *

{@code null} is returned when this optional field is not defined. + * + *

Value constraints are detailed in + * second field of date/time field mapping table. + * + *

This optional field can only have a defined value when the + * xs:dateTime second field, represented by {@link #getSecond()}, + * does not return {@link DatatypeConstants#FIELD_UNDEFINED}. + * + * @return Fractional seconds of this {@code XMLGregorianCalendar}. + * + * @see #getSecond() + * @see #setTime(int, int, int, BigDecimal) + */ + public abstract BigDecimal getFractionalSecond(); // comparisons /** @@ -681,10 +690,11 @@ * returns {@link DatatypeConstants#EQUAL}, * otherwise {@code false}. */ + @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof XMLGregorianCalendar)) { - return false; + return false; } return compare((XMLGregorianCalendar) obj) == DatatypeConstants.EQUAL; } @@ -694,6 +704,7 @@ * * @return hash code of this object. */ + @Override public int hashCode() { // Following two dates compare to EQUALS since in different timezones. @@ -846,18 +857,19 @@ */ public abstract QName getXMLSchemaType(); - /** - * Returns a {@code String} representation of this {@code XMLGregorianCalendar} {@code Object}. - * - *

The result is a lexical representation generated by {@link #toXMLFormat()}. - * - * @return A non-{@code null} valid {@code String} representation of this {@code XMLGregorianCalendar}. - * + /** + * Returns a {@code String} representation of this {@code XMLGregorianCalendar} {@code Object}. + * + *

The result is a lexical representation generated by {@link #toXMLFormat()}. + * + * @return A non-{@code null} valid {@code String} representation of this {@code XMLGregorianCalendar}. + * * @throws IllegalStateException if the combination of set fields * does not match one of the eight defined XML Schema builtin date/time datatypes. * * @see #toXMLFormat() - */ + */ + @Override public String toString() { return toXMLFormat(); @@ -970,6 +982,8 @@ * {@code Calendar.set(int,int)} * * + * @return An instance of {@link java.util.GregorianCalendar}. + * * @see #toGregorianCalendar(java.util.TimeZone, java.util.Locale, XMLGregorianCalendar) */ public abstract GregorianCalendar toGregorianCalendar(); @@ -1026,9 +1040,9 @@ * @return a java.util.GregorianCalendar conversion of this instance. */ public abstract GregorianCalendar toGregorianCalendar( - java.util.TimeZone timezone, - java.util.Locale aLocale, - XMLGregorianCalendar defaults); + java.util.TimeZone timezone, + java.util.Locale aLocale, + XMLGregorianCalendar defaults); /** * Returns a {@code java.util.TimeZone} for this class. @@ -1055,5 +1069,7 @@ * * @return copy of this {@code Object} */ - public abstract Object clone(); + @Override + public abstract Object clone(); } + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/jdk/xml/internal/JdkXmlFeatures.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/src/java.xml/share/classes/jdk/xml/internal/JdkXmlFeatures.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2016, 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 jdk.xml.internal; + +import javax.xml.XMLConstants; +import static jdk.xml.internal.JdkXmlUtils.SP_USE_CATALOG; + +/** + * This class manages JDK's XML Features. Previously added features and properties + * may be gradually moved to this class. + */ +public class JdkXmlFeatures { + public static final String ORACLE_JAXP_PROPERTY_PREFIX = + "http://www.oracle.com/xml/jaxp/properties/"; + /** + * Feature enableExtensionFunctions + */ + public static final String ORACLE_ENABLE_EXTENSION_FUNCTION = + ORACLE_JAXP_PROPERTY_PREFIX + "enableExtensionFunctions"; + public static final String SP_ENABLE_EXTENSION_FUNCTION = + "javax.xml.enableExtensionFunctions"; + public static final String CATALOG_FEATURES = "javax.xml.catalog.catalogFeatures"; + + public final static String PROPERTY_USE_CATALOG = XMLConstants.USE_CATALOG; + + public static enum XmlFeature { + /** + * Feature enableExtensionFunctions + * FSP: extension function is enforced by FSP. When FSP is on, entension + * function is disabled. + */ + ENABLE_EXTENSION_FUNCTION(ORACLE_ENABLE_EXTENSION_FUNCTION, + SP_ENABLE_EXTENSION_FUNCTION, true, false, true, true), + /** + * The {@link javax.xml.XMLConstants.USE_CATALOG} feature. + * FSP: USE_CATALOG is not enforced by FSP. + */ + USE_CATALOG(PROPERTY_USE_CATALOG, SP_USE_CATALOG, true, false, true, false); + + private final String name; + private final String nameSP; + private final boolean valueDefault; + private final boolean valueEnforced; + private final boolean hasSystem; + private final boolean enforced; + + /** + * Constructs an XmlFeature instance. + * @param name the name of the feature + * @param nameSP the name of the System Property + * @param value the value of the feature + * @param hasSystem a flag to indicate whether the feature is supported + * @param enforced a flag indicating whether the feature is + * FSP (Feature_Secure_Processing) enforced + * with a System property + */ + XmlFeature(String name, String nameSP, boolean value, boolean valueEnforced, boolean hasSystem, boolean enforced) { + this.name = name; + this.nameSP = nameSP; + this.valueDefault = value; + this.valueEnforced = valueEnforced; + this.hasSystem = hasSystem; + this.enforced = enforced; + } + + /** + * Checks whether the specified property is equal to the current property. + * @param propertyName the name of a property + * @return true if the specified property is the current property, false + * otherwise + */ + boolean equalsPropertyName(String propertyName) { + return name.equals(propertyName); + } + + /** + * Returns the name of the property. + * + * @return the name of the property + */ + public String apiProperty() { + return name; + } + + /** + * Returns the name of the corresponding System Property. + * + * @return the name of the System Property + */ + String systemProperty() { + return nameSP; + } + + /** + * Returns the default value of the property. + * @return the default value of the property + */ + public boolean defaultValue() { + return valueDefault; + } + + /** + * Returns the FSP-enforced value. + * @return the FSP-enforced value + */ + public boolean enforcedValue() { + return valueEnforced; + } + + /** + * Checks whether System property is supported for the feature. + * @return true it is supported, false otherwise + */ + boolean hasSystemProperty() { + return hasSystem; + } + + /** + * Checks whether the property is enforced by FSP + * @return true it is, false otherwise + */ + boolean enforced() { + return enforced; + } + + } + + /** + * States of the settings of a property, in the order: default value, value + * set by FEATURE_SECURE_PROCESSING, jaxp.properties file, jaxp system + * properties, and jaxp api properties + */ + public static enum State { + //this order reflects the overriding order + + DEFAULT("default"), FSP("FEATURE_SECURE_PROCESSING"), + JAXPDOTPROPERTIES("jaxp.properties"), SYSTEMPROPERTY("system property"), + APIPROPERTY("property"); + + final String literal; + State(String literal) { + this.literal = literal; + } + + String literal() { + return literal; + } + } + + /** + * Values of the features + */ + private boolean[] featureValues; + + /** + * States of the settings for each property + */ + private State[] states; + + /** + * Flag indicating if secure processing is set + */ + boolean secureProcessing; + + /** + * Instantiate JdkXmlFeatures and initialize the fields + * @param secureProcessing + */ + public JdkXmlFeatures(boolean secureProcessing) { + featureValues = new boolean[XmlFeature.values().length]; + states = new State[XmlFeature.values().length]; + this.secureProcessing = secureProcessing; + for (XmlFeature f : XmlFeature.values()) { + if (secureProcessing && f.enforced()) { + featureValues[f.ordinal()] = f.enforcedValue(); + states[f.ordinal()] = State.FSP; + } else { + featureValues[f.ordinal()] = f.defaultValue(); + states[f.ordinal()] = State.DEFAULT; + } + } + //read system properties or jaxp.properties + readSystemProperties(); + } + + /** + * Updates the JdkXmlFeatures instance by reading the system properties again. + * This will become necessary in case the system properties are set after + * the instance has been created. + */ + public void update() { + readSystemProperties(); + } + + /** + * Set feature by property name and state + * @param propertyName property name + * @param state the state of the property + * @param value the value of the property + * @return true if the property is managed by the JdkXmlFeatures instance; + * false otherwise. + */ + public boolean setFeature(String propertyName, State state, Object value) { + int index = getIndex(propertyName); + if (index > -1) { + setFeature(index, state, value); + return true; + } + return false; + } + + /** + * Set the value for a specific feature. + * + * @param feature the feature + * @param state the state of the property + * @param value the value of the property + */ + public void setFeature(XmlFeature feature, State state, boolean value) { + setFeature(feature.ordinal(), state, value); + } + + /** + * Return the value of the specified property + * + * @param feature the property + * @return the value of the property + */ + public boolean getFeature(XmlFeature feature) { + return featureValues[feature.ordinal()]; + } + + /** + * Return the value of a feature by its index (the Feature's ordinal) + * @param index the index of a feature + * @return value of a feature + */ + public boolean getFeature(int index) { + return featureValues[index]; + } + + /** + * Set the value of a property by its index + * + * @param index the index of the property + * @param state the state of the property + * @param value the value of the property + */ + public void setFeature(int index, State state, Object value) { + boolean temp; + if (Boolean.class.isAssignableFrom(value.getClass())) { + temp = (Boolean)value; + } else { + temp = Boolean.parseBoolean((String) value); + } + setFeature(index, state, temp); + } + + /** + * Set the value of a property by its index + * + * @param index the index of the property + * @param state the state of the property + * @param value the value of the property + */ + public void setFeature(int index, State state, boolean value) { + //only update if it shall override + if (state.compareTo(states[index]) >= 0) { + featureValues[index] = value; + states[index] = state; + } + } + + /** + * Get the index by property name + * + * @param propertyName property name + * @return the index of the property if found; return -1 if not + */ + public int getIndex(String propertyName) { + for (XmlFeature feature : XmlFeature.values()) { + if (feature.equalsPropertyName(propertyName)) { + //internally, ordinal is used as index + return feature.ordinal(); + } + } + return -1; + } + + /** + * Read from system properties, or those in jaxp.properties + */ + private void readSystemProperties() { + for (XmlFeature feature : XmlFeature.values()) { + getSystemProperty(feature, feature.systemProperty()); + } + } + + /** + * Read from system properties, or those in jaxp.properties + * + * @param property the type of the property + * @param sysPropertyName the name of system property + */ + private boolean getSystemProperty(XmlFeature feature, String sysPropertyName) { + try { + String value = SecuritySupport.getSystemProperty(sysPropertyName); + if (value != null && !value.equals("")) { + setFeature(feature, State.SYSTEMPROPERTY, Boolean.parseBoolean(value)); + return true; + } + + value = SecuritySupport.readJAXPProperty(sysPropertyName); + if (value != null && !value.equals("")) { + setFeature(feature, State.JAXPDOTPROPERTIES, Boolean.parseBoolean(value)); + return true; + } + } catch (NumberFormatException e) { + //invalid setting + throw new NumberFormatException("Invalid setting for system property: " + feature.systemProperty()); + } + return false; + } + +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2016, 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 jdk.xml.internal; + +import com.sun.org.apache.xerces.internal.util.ParserConfigurationSettings; +import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; +import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.catalog.CatalogFeatures.Feature; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.XMLReader; + +/** + * Constants for use across JAXP processors. + */ +public class JdkXmlUtils { + /** + * Catalog features + */ + public final static String USE_CATALOG = XMLConstants.USE_CATALOG; + public final static String SP_USE_CATALOG = "javax.xml.useCatalog"; + public final static String CATALOG_FILES = CatalogFeatures.Feature.FILES.getPropertyName(); + public final static String CATALOG_DEFER = CatalogFeatures.Feature.DEFER.getPropertyName(); + public final static String CATALOG_PREFER = CatalogFeatures.Feature.PREFER.getPropertyName(); + public final static String CATALOG_RESOLVE = CatalogFeatures.Feature.RESOLVE.getPropertyName(); + + /** + * Values for a feature + */ + public static final String FEATURE_TRUE = "true"; + public static final String FEATURE_FALSE = "false"; + + /** + * Default value of USE_CATALOG. This will read the System property + */ + public static final boolean USE_CATALOG_DEFAULT = + SecuritySupport.getJAXPSystemProperty(SP_USE_CATALOG, true); + + /** + * Returns the value of a Catalog feature by the property name. + * @param features a CatalogFeatures instance + * @param name the name of a Catalog feature + * @return the value of a Catalog feature, null if the name does not match + * any feature supported by the Catalog. + */ + public static String getCatalogFeature(CatalogFeatures features, String name) { + for (Feature feature : Feature.values()) { + if (feature.getPropertyName().equals(name)) { + return features.get(feature); + } + } + return null; + } + + /** + * Creates an instance of a CatalogFeatures. + * + * @param defer the defer property defined in CatalogFeatures + * @param file the file path to a catalog + * @param prefer the prefer property defined in CatalogFeatures + * @param resolve the resolve property defined in CatalogFeatures + * @return a {@link javax.xml.transform.Source} object + */ + public static CatalogFeatures getCatalogFeatures(String defer, String file, + String prefer, String resolve) { + + CatalogFeatures.Builder builder = CatalogFeatures.builder(); + if (file != null) { + builder = builder.with(CatalogFeatures.Feature.FILES, file); + } + if (prefer != null) { + builder = builder.with(CatalogFeatures.Feature.PREFER, prefer); + } + if (defer != null) { + builder = builder.with(CatalogFeatures.Feature.DEFER, defer); + } + if (resolve != null) { + builder = builder.with(CatalogFeatures.Feature.RESOLVE, resolve); + } + + return builder.build(); + } + + + /** + * Passing on the CatalogFeatures settings from one Xerces configuration object + * to another. + * + * @param config1 a Xerces configuration object + * @param config2 a Xerces configuration object + */ + public static void catalogFeaturesConfig2Config(XMLComponentManager config1, + ParserConfigurationSettings config2) { + boolean supportCatalog = true; + boolean useCatalog = config1.getFeature(XMLConstants.USE_CATALOG); + try { + config2.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog); + } + catch (XMLConfigurationException e) { + supportCatalog = false; + } + + if (supportCatalog && useCatalog) { + try { + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + config2.setProperty(f.getPropertyName(), config1.getProperty(f.getPropertyName())); + } + } catch (XMLConfigurationException e) { + //shall not happen for internal settings + } + } + } + + /** + * Passing on the CatalogFeatures settings from a Xerces configuration object + * to an XMLReader. + * + * @param config a Xerces configuration object + * @param reader an XMLReader + */ + public static void catalogFeaturesConfig2Reader(XMLComponentManager config, XMLReader reader) { + boolean supportCatalog = true; + boolean useCatalog = config.getFeature(XMLConstants.USE_CATALOG); + try { + reader.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog); + } + catch (SAXNotRecognizedException | SAXNotSupportedException e) { + supportCatalog = false; + } + + if (supportCatalog && useCatalog) { + try { + for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) { + reader.setProperty(f.getPropertyName(), config.getProperty(f.getPropertyName())); + } + } catch (SAXNotRecognizedException | SAXNotSupportedException e) { + //shall not happen for internal settings + } + } + } +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/src/java.xml/share/classes/jdk/xml/internal/SecuritySupport.java --- a/jaxp/src/java.xml/share/classes/jdk/xml/internal/SecuritySupport.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/src/java.xml/share/classes/jdk/xml/internal/SecuritySupport.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -83,6 +83,22 @@ } /** + * Reads boolean type system property. + * + * @param propName the name of the property + * @param defValue the default value + * @return the value of the property, or the default value of no system + * property is found + */ + public static boolean getJAXPSystemProperty(String propName, boolean defValue) { + String value = getJAXPSystemProperty(propName); + if (value == null) { + return defValue; + } + return Boolean.parseBoolean(value); + } + + /** * Reads JAXP system property in this order: system property, * $java.home/conf/jaxp.properties if the system property is not specified * diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/TEST.ROOT --- a/jaxp/test/TEST.ROOT Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/test/TEST.ROOT Fri Aug 05 12:03:58 2016 -0700 @@ -15,7 +15,7 @@ othervm.dirs=javax/xml/jaxp # Group definitions -groups=TEST.groups +groups=TEST.groups # Minimum jtreg version requiredVersion=4.2 b02 diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,321 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package catalog; + +import java.io.File; +import java.io.StringReader; +import javax.xml.transform.Source; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamSource; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.InputSource; + +/** + * @bug 8158084 8162438 8162442 + * @summary verifies the use of Catalog in SAX/DOM/StAX/Validation/Transform. + * The two main scenarios for all processors are: + * A custom resolver is used whether or not there's a Catalog; + * A Catalog is used when there's no custom resolver, and the USE_CATALOG + * is true (which is the case by default). + */ + +/** + * Support Catalog: + * With this patch, the Catalog features are supported by all of the JAXP processors. + * The support is enabled by default. Using Catalog is as simple as setting a + * path to a catalog, through the API, or System property, or jaxp.properties. + * + * Test notes: + * For all DataProviders, the 1st and 2nd columns determine whether to set USE_CATALOG + * through the API and to use Catalog. When a custom resolver is specified, these + * settings should not affect the operation, thus the tests are repeated for both + * false and true. + * + * @author huizhe.wang@oracle.com + */ +public class CatalogSupport extends CatalogSupportBase { + /* + * Initializing fields + */ + @BeforeClass + public void setUpClass() throws Exception { + setUp(); + } + + /* + Verifies the Catalog support on SAXParser. + */ + @Test(dataProvider = "data_SAXA") + public void testSAXA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testSAX(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XMLReader. + */ + @Test(dataProvider = "data_SAXA") + public void testXMLReaderA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXMLReader(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XInclude. + */ + @Test(dataProvider = "data_XIA") + public void testXIncludeA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXInclude(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on DOM parser. + */ + @Test(dataProvider = "data_DOMA") + public void testDOMA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testDOM(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on resolving DTD, xsd import and include in + Schema files. + */ + @Test(dataProvider = "data_SchemaA") + public void testValidationA(boolean setUseCatalog, boolean useCatalog, + String catalog, String xsd, LSResourceResolver resolver) + throws Exception { + + testValidation(setUseCatalog, useCatalog, catalog, xsd, resolver) ; + } + + /* + @bug 8158084 8162438 these tests also verifies the fix for 8162438 + Verifies the Catalog support on the Schema Validator. + */ + @Test(dataProvider = "data_ValidatorA") + public void testValidatorA(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog, + Source source, LSResourceResolver resolver1, LSResourceResolver resolver2, + String catalog1, String catalog2) + throws Exception { + testValidator(setUseCatalog1, setUseCatalog2, useCatalog, source, + resolver1, resolver2, catalog1, catalog2); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLA") + public void testXSLImportA(boolean setUseCatalog, boolean useCatalog, String catalog, + SAXSource xsl, StreamSource xml, URIResolver resolver, String expected) + throws Exception { + + testXSLImport(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + @bug 8158084 8162442 + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLA") + public void testXSLImportWTemplatesA(boolean setUseCatalog, boolean useCatalog, + String catalog, SAXSource xsl, StreamSource xml, URIResolver resolver, String expected) + throws Exception { + testXSLImportWTemplates(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + DataProvider: for testing the SAX parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_SAXA") + Object[][] getDataSAX() { + String[] systemIds = {"system.xsd"}; + InputSource[] returnValues = {new InputSource(new StringReader(dtd_systemResolved))}; + MyEntityHandler entityHandler = new MyEntityHandler(systemIds, returnValues, elementInSystem); + return new Object[][]{ + {false, true, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog}, + {false, true, xml_catalog, xml_system, entityHandler, expectedWResolver}, + {true, true, xml_catalog, xml_system, entityHandler, expectedWResolver} + }; + } + + /* + DataProvider: for testing XInclude + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_XIA") + Object[][] getDataXI() { + String[] systemIds = {"XI_simple.xml"}; + InputSource[] returnValues = {new InputSource(xml_xIncludeSimple)}; + MyEntityHandler entityHandler = new MyEntityHandler(systemIds, returnValues, elementInXISimple); + return new Object[][]{ + {false, true, xml_catalog, xml_xInclude, new MyHandler(elementInXISimple), contentInUIutf8Catalog}, + {false, true, xml_catalog, xml_xInclude, entityHandler, contentInXIutf8}, + {true, true, xml_catalog, xml_xInclude, entityHandler, contentInXIutf8} + }; + } + + /* + DataProvider: for testing DOM parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_DOMA") + Object[][] getDataDOM() { + String[] systemIds = {"system.xsd"}; + InputSource[] returnValues = {new InputSource(new StringReader(dtd_systemResolved))}; + MyEntityHandler entityHandler = new MyEntityHandler(systemIds, returnValues, elementInSystem); + return new Object[][]{ + {false, true, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog}, + {false, true, xml_catalog, xml_system, getMyEntityHandler(elementInSystem, systemIds, + new InputSource(new StringReader(dtd_systemResolved))), expectedWResolver}, + {true, true, xml_catalog, xml_system, getMyEntityHandler(elementInSystem, systemIds, + new InputSource(new StringReader(dtd_systemResolved))), expectedWResolver} + }; + } + + MyEntityHandler getMyEntityHandler(String elementName, String[] systemIds, InputSource... returnValues) { + return new MyEntityHandler(systemIds, returnValues, elementName); + } + + /* + DataProvider: for testing Schema validation + Data: set use_catalog, use_catalog, catalog file, xsd file, a LSResourceResolver + */ + @DataProvider(name = "data_SchemaA") + Object[][] getDataSchema() { + String[] systemIds = {"pathto/XMLSchema.dtd", "datatypes.dtd"}; + XmlInput[] returnValues = {new XmlInput(null, dtd_xmlSchema, null), new XmlInput(null, dtd_datatypes, null)}; + LSResourceResolver resolver = new SourceResolver(null, systemIds, returnValues); + + String[] systemIds1 = {"xml.xsd"}; + XmlInput[] returnValues1 = {new XmlInput(null, xsd_xml, null)}; + LSResourceResolver resolverImport = new SourceResolver(null, systemIds1, returnValues1); + + String[] systemIds2 = {"XSDInclude_person.xsd", "XSDInclude_product.xsd"}; + XmlInput[] returnValues2 = {new XmlInput(null, xsd_include_person, null), + new XmlInput(null, xsd_include_product, null)}; + LSResourceResolver resolverInclude = new SourceResolver(null, systemIds2, returnValues2); + + return new Object[][]{ + // for resolving DTD in xsd + {false, true, xml_catalog, xsd_xmlSchema, null}, + {false, true, xml_bogus_catalog, xsd_xmlSchema, resolver}, + {true, true, xml_bogus_catalog, xsd_xmlSchema, resolver}, + // for resolving xsd import + {false, true, xml_catalog, xsd_xmlSchema_import, null}, + {false, true, xml_bogus_catalog, xsd_xmlSchema_import, resolverImport}, + {true, true, xml_bogus_catalog, xsd_xmlSchema_import, resolverImport}, + // for resolving xsd include + {false, true, xml_catalog, xsd_include_company, null}, + {false, true, xml_bogus_catalog, xsd_include_company, resolverInclude}, + {true, true, xml_bogus_catalog, xsd_include_company, resolverInclude} + }; + } + + /* + DataProvider: for testing Schema Validator + Data: source, resolver1, resolver2, catalog1, a catalog2 + */ + @DataProvider(name = "data_ValidatorA") + Object[][] getDataValidator() { + DOMSource ds = getDOMSource(xml_val_test, xml_val_test_id, false, true, xml_catalog); + + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + StAXSource stax = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax1 = getStaxSource(xml_val_test, xml_val_test_id); + + StreamSource source = new StreamSource(new File(xml_val_test)); + + String[] systemIds = {"system.dtd", "val_test.xsd"}; + XmlInput[] returnValues = {new XmlInput(null, dtd_system, null), new XmlInput(null, xsd_val_test, null)}; + LSResourceResolver resolver = new SourceResolver(null, systemIds, returnValues); + + StAXSource stax2 = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax3 = getStaxSource(xml_val_test, xml_val_test_id); + + return new Object[][]{ + // use catalog + {false, false, true, ds, null, null, xml_catalog, null}, + {false, false, true, ds, null, null, null, xml_catalog}, + {false, false, true, ss, null, null, xml_catalog, null}, + {false, false, true, ss, null, null, null, xml_catalog}, + {false, false, true, stax, null, null, xml_catalog, null}, + {false, false, true, stax1, null, null, null, xml_catalog}, + {false, false, true, source, null, null, xml_catalog, null}, + {false, false, true, source, null, null, null, xml_catalog}, + // use resolver + {false, false, true, ds, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog}, + {false, false, true, ss, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog}, + {false, false, true, stax2, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog}, + {false, false, true, source, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog} + }; + } + + /* + DataProvider: for testing XSL import and include + Data: set use_catalog, use_catalog, catalog file, xsl file, xml file, a URIResolver, expected result + */ + @DataProvider(name = "data_XSLA") + Object[][] getDataXSL() { + // XSLInclude.xsl has one import XSLImport_html.xsl and two includes, + // XSLInclude_header.xsl and XSLInclude_footer.xsl; + String[] hrefs = {"XSLImport_html.xsl", "XSLInclude_header.xsl", "XSLInclude_footer.xsl"}; + Source[] returnValues = {new StreamSource(xsl_import_html), + new StreamSource(xsl_include_header), + new StreamSource(xsl_include_footer)}; + URIResolver resolver = new XslResolver(hrefs, returnValues); + SAXSource xslSourceDTD = new SAXSource(new InputSource(new StringReader(xsl_includeDTD))); + StreamSource xmlSourceDTD = new StreamSource(new StringReader(xml_xslDTD)); + + String[] hrefs1 = {"pathto/DocFunc2.xml"}; + Source[] returnValues1 = {new StreamSource(xml_doc2)}; + URIResolver docResolver = new XslResolver(hrefs1, returnValues1); + SAXSource xslDocSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())); + StreamSource xmlDocSource = new StreamSource(new File(xml_doc)); + return new Object[][]{ + // for resolving DTD, import and include in xsl + {false, true, xml_catalog, xslSourceDTD, xmlSourceDTD, null, ""}, + {false, true, xml_bogus_catalog, new SAXSource(new InputSource(new StringReader(xsl_include))), + new StreamSource(new StringReader(xml_xsl)), resolver, ""}, + {true, true, xml_bogus_catalog, new SAXSource(new InputSource(new StringReader(xsl_include))), + new StreamSource(new StringReader(xml_xsl)), resolver, ""}, + // for resolving reference by the document function + {false, true, xml_catalog, xslDocSource, xmlDocSource, null, "Resolved by a catalog"}, + {false, true, xml_bogus_catalog, xslDocSource, xmlDocSource, docResolver, "Resolved by a resolver"}, + {true, true, xml_bogus_catalog, xslDocSource, xmlDocSource, docResolver, "Resolved by a resolver"} + }; + } +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport1.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package catalog; + +import java.io.File; +import java.io.StringReader; +import javax.xml.catalog.CatalogFeatures.Feature; +import javax.xml.transform.Source; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamSource; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.InputSource; + +/* + * @bug 8158084 8162438 8162442 + * @summary extends CatalogSupport, verifies that the catalog file can be set + * using the System property. + */ + +/** + * The name of a System property in javax.xml.catalog is the same as that of the + * property, and can be read through CatalogFeatures.Feature. + * + * @author huizhe.wang@oracle.com + */ +public class CatalogSupport1 extends CatalogSupportBase { + /* + * Initializing fields + */ + @BeforeClass + public void setUpClass() throws Exception { + setUp(); + System.setProperty(Feature.FILES.getPropertyName(), xml_catalog); + } + + @AfterClass + public void tearDownClass() throws Exception { + System.clearProperty(Feature.FILES.getPropertyName()); + } + + /* + Verifies the Catalog support on SAXParser. + */ + @Test(dataProvider = "data_SAXC") + public void testSAXC(boolean setUseCatalog, boolean useCatalog, String catalog, String xml, MyHandler handler, String expected) throws Exception { + testSAX(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XMLReader. + */ + @Test(dataProvider = "data_SAXC") + public void testXMLReaderC(boolean setUseCatalog, boolean useCatalog, String catalog, String xml, MyHandler handler, String expected) throws Exception { + testXMLReader(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XInclude. + */ + @Test(dataProvider = "data_XIC") + public void testXIncludeC(boolean setUseCatalog, boolean useCatalog, String catalog, String xml, MyHandler handler, String expected) throws Exception { + testXInclude(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on DOM parser. + */ + @Test(dataProvider = "data_DOMC") + public void testDOMC(boolean setUseCatalog, boolean useCatalog, String catalog, String xml, MyHandler handler, String expected) throws Exception { + testDOM(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on resolving DTD, xsd import and include in + Schema files. + */ + @Test(dataProvider = "data_SchemaC") + public void testValidationC(boolean setUseCatalog, boolean useCatalog, String catalog, String xsd, LSResourceResolver resolver) + throws Exception { + + testValidation(setUseCatalog, useCatalog, catalog, xsd, resolver) ; + } + + /* + @bug 8158084 8162438 these tests also verifies the fix for 8162438 + Verifies the Catalog support on the Schema Validator. + */ + @Test(dataProvider = "data_ValidatorC") + public void testValidatorA(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog, + Source source, LSResourceResolver resolver1, LSResourceResolver resolver2, + String catalog1, String catalog2) + throws Exception { + testValidator(setUseCatalog1, setUseCatalog2, useCatalog, source, + resolver1, resolver2, catalog1, catalog2); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLC") + public void testXSLImportC(boolean setUseCatalog, boolean useCatalog, String catalog, SAXSource xsl, StreamSource xml, + URIResolver resolver, String expected) throws Exception { + + testXSLImport(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + @bug 8158084 8162442 + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLC") + public void testXSLImportWTemplatesC(boolean setUseCatalog, boolean useCatalog, String catalog, SAXSource xsl, StreamSource xml, + URIResolver resolver, String expected) throws Exception { + testXSLImportWTemplates(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + DataProvider: for testing the SAX parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_SAXC") + Object[][] getDataSAXC() { + return new Object[][]{ + {false, true, null, xml_system, new MyHandler(elementInSystem), expectedWCatalog} + + }; + } + + /* + DataProvider: for testing XInclude + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_XIC") + Object[][] getDataXIC() { + return new Object[][]{ + {false, true, null, xml_xInclude, new MyHandler(elementInXISimple), contentInUIutf8Catalog}, + }; + } + + /* + DataProvider: for testing DOM parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_DOMC") + Object[][] getDataDOMC() { + return new Object[][]{ + {false, true, null, xml_system, new MyHandler(elementInSystem), expectedWCatalog} + }; + } + + /* + DataProvider: for testing Schema validation + Data: set use_catalog, use_catalog, catalog file, xsd file, a LSResourceResolver + */ + @DataProvider(name = "data_SchemaC") + Object[][] getDataSchemaC() { + + return new Object[][]{ + // for resolving DTD in xsd + {false, true, null, xsd_xmlSchema, null}, + // for resolving xsd import + {false, true, null, xsd_xmlSchema_import, null}, + // for resolving xsd include + {false, true, null, xsd_include_company, null} + }; + } + + + /* + DataProvider: for testing Schema Validator + Data: source, resolver1, resolver2, catalog1, a catalog2 + */ + @DataProvider(name = "data_ValidatorC") + Object[][] getDataValidator() { + DOMSource ds = getDOMSource(xml_val_test, xml_val_test_id, false, true, null); + + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + StAXSource stax = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax1 = getStaxSource(xml_val_test, xml_val_test_id); + + StreamSource source = new StreamSource(new File(xml_val_test)); + + String[] systemIds = {"system.dtd", "val_test.xsd"}; + XmlInput[] returnValues = {new XmlInput(null, dtd_system, null), new XmlInput(null, xsd_val_test, null)}; + LSResourceResolver resolver = new SourceResolver(null, systemIds, returnValues); + + StAXSource stax2 = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax3 = getStaxSource(xml_val_test, xml_val_test_id); + + return new Object[][]{ + // use catalog + {false, false, true, ds, null, null, null, null}, + {false, false, true, ds, null, null, null, null}, + {false, false, true, ss, null, null, null, null}, + {false, false, true, ss, null, null, null, null}, + {false, false, true, stax, null, null, null, null}, + {false, false, true, stax1, null, null, null, null}, + {false, false, true, source, null, null, null, null}, + {false, false, true, source, null, null, null, null}, + // use resolver + {false, false, true, ds, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog}, + {false, false, true, ss, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog}, + {false, false, true, stax2, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog}, + {false, false, true, source, resolver, resolver, xml_bogus_catalog, xml_bogus_catalog} + }; + } + + /* + DataProvider: for testing XSL import and include + Data: set use_catalog, use_catalog, catalog file, xsl file, xml file, a URIResolver, expected + */ + @DataProvider(name = "data_XSLC") + Object[][] getDataXSLC() { + SAXSource xslSourceDTD = new SAXSource(new InputSource(new StringReader(xsl_includeDTD))); + StreamSource xmlSourceDTD = new StreamSource(new StringReader(xml_xslDTD)); + + SAXSource xslDocSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())); + StreamSource xmlDocSource = new StreamSource(new File(xml_doc)); + return new Object[][]{ + // for resolving DTD, import and include in xsl + {false, true, null, xslSourceDTD, xmlSourceDTD, null, ""}, + // for resolving reference by the document function + {false, true, null, xslDocSource, xmlDocSource, null, "Resolved by a catalog"}, + }; + } + +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport2.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package catalog; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.StringReader; +import java.net.SocketTimeoutException; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerException; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamSource; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +/* + * @bug 8158084 8162438 8162442 + * @summary extends CatalogSupport tests, verifies that the use of the Catalog may + * be disabled through the System property. + */ + +/** + * For all of the JAXP processors that support the Catalog, the use of the Catalog + * is turned on by default. It can then be turned off through the API and the + * System property. + * + * @author huizhe.wang@oracle.com + */ +public class CatalogSupport2 extends CatalogSupportBase { + static final String TTIMEOUTREAD = "sun.net.client.defaultReadTimeout"; + static final String TIMEOUTCONNECT = "sun.net.client.defaultConnectTimeout"; + static String timeoutRead = System.getProperty(TTIMEOUTREAD); + static String timeoutConnect = System.getProperty(TIMEOUTCONNECT); + + /* + * Initializing fields + */ + @BeforeClass + public void setUpClass() throws Exception { + setUp(); + System.setProperty(SP_USE_CATALOG, "false"); + timeoutRead = System.getProperty(TTIMEOUTREAD); + timeoutConnect = System.getProperty(TIMEOUTCONNECT); + System.setProperty(TTIMEOUTREAD, "1000"); + System.setProperty(TIMEOUTCONNECT, "1000"); + } + + @AfterClass + public void tearDownClass() throws Exception { + System.clearProperty(SP_USE_CATALOG); + System.setProperty(TIMEOUTCONNECT, "-1"); + System.setProperty(TTIMEOUTREAD, "-1"); + } + + /* + Verifies the Catalog support on SAXParser. + */ + @Test(dataProvider = "data_SAXC", expectedExceptions = FileNotFoundException.class) + public void testSAXC(boolean setUseCatalog, boolean useCatalog, String catalog, String + xml, MyHandler handler, String expected) throws Exception { + testSAX(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XMLReader. + */ + @Test(dataProvider = "data_SAXC", expectedExceptions = FileNotFoundException.class) + public void testXMLReaderC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXMLReader(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XInclude. + */ + @Test(dataProvider = "data_XIC", expectedExceptions = SAXParseException.class) + public void testXIncludeC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXInclude(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on DOM parser. + */ + @Test(dataProvider = "data_DOMC", expectedExceptions = {FileNotFoundException.class, SocketTimeoutException.class}) + public void testDOMC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testDOM(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on resolving DTD, xsd import and include in + Schema files. + */ + @Test(dataProvider = "data_SchemaC", expectedExceptions = SAXParseException.class) + public void testValidationC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xsd, LSResourceResolver resolver) + throws Exception { + testValidation(setUseCatalog, useCatalog, catalog, xsd, resolver) ; + } + + @Test(dataProvider = "data_ValidatorC", expectedExceptions = {SAXException.class, FileNotFoundException.class}) + public void testValidatorC(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog, + Source source, LSResourceResolver resolver1, LSResourceResolver resolver2, + String catalog1, String catalog2) + throws Exception { + testValidator(setUseCatalog1, setUseCatalog2, useCatalog, source, + resolver1, resolver2, catalog1, catalog2); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLC", expectedExceptions = TransformerException.class) + public void testXSLImportC(boolean setUseCatalog, boolean useCatalog, String catalog, + SAXSource xsl, StreamSource xml, URIResolver resolver, String expected) throws Exception { + + testXSLImport(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + @bug 8158084 8162442 + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLC", expectedExceptions = TransformerException.class) + public void testXSLImportWTemplatesC(boolean setUseCatalog, boolean useCatalog, String catalog, + SAXSource xsl, StreamSource xml, URIResolver resolver, String expected) throws Exception { + testXSLImportWTemplates(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + DataProvider: for testing the SAX parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_SAXC") + Object[][] getDataSAXC() { + return new Object[][]{ + {false, true, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog} + + }; + } + + /* + DataProvider: for testing XInclude + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_XIC") + Object[][] getDataXIC() { + return new Object[][]{ + {false, true, xml_catalog, xml_xInclude, new MyHandler(elementInXISimple), contentInUIutf8Catalog}, + }; + } + + /* + DataProvider: for testing DOM parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_DOMC") + Object[][] getDataDOMC() { + return new Object[][]{ + {false, true, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog} + }; + } + + /* + DataProvider: for testing Schema validation + Data: set use_catalog, use_catalog, catalog file, xsd file, a LSResourceResolver + */ + @DataProvider(name = "data_SchemaC") + Object[][] getDataSchemaC() { + + return new Object[][]{ + // for resolving DTD in xsd + {false, true, xml_catalog, xsd_xmlSchema, null}, + // for resolving xsd import + {false, true, xml_catalog, xsd_xmlSchema_import, null}, + // for resolving xsd include + {false, true, xml_catalog, xsd_include_company, null} + }; + } + + + /* + DataProvider: for testing Schema Validator + Data: source, resolver1, resolver2, catalog1, a catalog2 + */ + @DataProvider(name = "data_ValidatorC") + Object[][] getDataValidator() { + DOMSource ds = getDOMSource(xml_val_test, xml_val_test_id, true, true, xml_catalog); + + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + StAXSource stax = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax1 = getStaxSource(xml_val_test, xml_val_test_id); + + StreamSource source = new StreamSource(new File(xml_val_test)); + + return new Object[][]{ + // use catalog + {false, false, true, ds, null, null, xml_catalog, null}, + {false, false, true, ds, null, null, null, xml_catalog}, + {false, false, true, ss, null, null, xml_catalog, null}, + {false, false, true, ss, null, null, null, xml_catalog}, + {false, false, true, stax, null, null, xml_catalog, null}, + {false, false, true, stax1, null, null, null, xml_catalog}, + {false, false, true, source, null, null, xml_catalog, null}, + {false, false, true, source, null, null, null, xml_catalog}, + }; + } + + /* + DataProvider: for testing XSL import and include + Data: set use_catalog, use_catalog, catalog file, xsl file, xml file, a URIResolver, expected + */ + @DataProvider(name = "data_XSLC") + Object[][] getDataXSLC() { + SAXSource xslSourceDTD = new SAXSource(new InputSource(new StringReader(xsl_includeDTD))); + StreamSource xmlSourceDTD = new StreamSource(new StringReader(xml_xslDTD)); + + SAXSource xslDocSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())); + StreamSource xmlDocSource = new StreamSource(new File(xml_doc)); + return new Object[][]{ + // for resolving DTD, import and include in xsl + {false, true, xml_catalog, xslSourceDTD, xmlSourceDTD, null, ""}, + // for resolving reference by the document function + {false, true, xml_catalog, xslDocSource, xmlDocSource, null, "Resolved by a catalog"}, + }; + } +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport3.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport3.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package catalog; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.StringReader; +import java.net.SocketTimeoutException; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerException; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamSource; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +/* + * @bug 8158084 8162438 8162442 + * @summary extends CatalogSupport tests, verifies that the use of the Catalog may + * be disabled through the API property. + */ + +/** + * For all of the JAXP processors that support the Catalog, the use of the Catalog + * is turned on by default. It can then be turned off through the API and the + * System property. + * + * @author huizhe.wang@oracle.com + */ +public class CatalogSupport3 extends CatalogSupportBase { + static final String TTIMEOUTREAD = "sun.net.client.defaultReadTimeout"; + static final String TIMEOUTCONNECT = "sun.net.client.defaultConnectTimeout"; + static String timeoutRead = System.getProperty(TTIMEOUTREAD); + static String timeoutConnect = System.getProperty(TIMEOUTCONNECT); + /* + * Initializing fields + */ + @BeforeClass + public void setUpClass() throws Exception { + setUp(); + timeoutRead = System.getProperty(TTIMEOUTREAD); + timeoutConnect = System.getProperty(TIMEOUTCONNECT); + System.setProperty(TTIMEOUTREAD, "1000"); + System.setProperty(TIMEOUTCONNECT, "1000"); + } + + @AfterClass + public void tearDownClass() throws Exception { + System.setProperty(TIMEOUTCONNECT, "-1"); + System.setProperty(TTIMEOUTREAD, "-1"); + } + + /* + Verifies the Catalog support on SAXParser. + */ + @Test(dataProvider = "data_SAXC", expectedExceptions = FileNotFoundException.class) + public void testSAXC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testSAX(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XMLReader. + */ + @Test(dataProvider = "data_SAXC", expectedExceptions = FileNotFoundException.class) + public void testXMLReaderC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXMLReader(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XInclude. + */ + @Test(dataProvider = "data_XIC", expectedExceptions = SAXParseException.class) + public void testXIncludeC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXInclude(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on DOM parser. + */ + @Test(dataProvider = "data_DOMC", expectedExceptions = {FileNotFoundException.class, SocketTimeoutException.class}) + public void testDOMC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testDOM(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on resolving DTD, xsd import and include in + Schema files. + */ + @Test(dataProvider = "data_SchemaC", expectedExceptions = SAXParseException.class) + public void testValidationC(boolean setUseCatalog, boolean useCatalog, String catalog, + String xsd, LSResourceResolver resolver) + throws Exception { + testValidation(setUseCatalog, useCatalog, catalog, xsd, resolver) ; + } + + /* + @bug 8158084 8162438 these tests also verifies the fix for 8162438 + Verifies the Catalog support on the Schema Validator. + */ + @Test(dataProvider = "data_ValidatorC", expectedExceptions = {SAXException.class, FileNotFoundException.class}) + public void testValidatorC(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog, + Source source, LSResourceResolver resolver1, LSResourceResolver resolver2, + String catalog1, String catalog2) + throws Exception { + testValidator(setUseCatalog1, setUseCatalog2, useCatalog, source, + resolver1, resolver2, catalog1, catalog2); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLC", expectedExceptions = TransformerException.class) + public void testXSLImportC(boolean setUseCatalog, boolean useCatalog, String catalog, SAXSource xsl, StreamSource xml, + URIResolver resolver, String expected) throws Exception { + + testXSLImport(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + @bug 8158084 8162442 + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLC", expectedExceptions = TransformerException.class) + public void testXSLImportWTemplatesC(boolean setUseCatalog, boolean useCatalog, String catalog, + SAXSource xsl, StreamSource xml, + URIResolver resolver, String expected) throws Exception { + testXSLImportWTemplates(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + DataProvider: for testing the SAX parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_SAXC") + Object[][] getDataSAXC() { + return new Object[][]{ + {true, false, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog} + + }; + } + + /* + DataProvider: for testing XInclude + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_XIC") + Object[][] getDataXIC() { + return new Object[][]{ + {true, false, xml_catalog, xml_xInclude, new MyHandler(elementInXISimple), contentInUIutf8Catalog}, + }; + } + + /* + DataProvider: for testing DOM parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_DOMC") + Object[][] getDataDOMC() { + return new Object[][]{ + {true, false, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog} + }; + } + + /* + DataProvider: for testing Schema validation + Data: set use_catalog, use_catalog, catalog file, xsd file, a LSResourceResolver + */ + @DataProvider(name = "data_SchemaC") + Object[][] getDataSchemaC() { + + return new Object[][]{ + // for resolving DTD in xsd + {true, false, xml_catalog, xsd_xmlSchema, null}, + // for resolving xsd import + {true, false, xml_catalog, xsd_xmlSchema_import, null}, + // for resolving xsd include + {true, false, xml_catalog, xsd_include_company, null} + }; + } + + + /* + DataProvider: for testing Schema Validator + Data: source, resolver1, resolver2, catalog1, a catalog2 + */ + @DataProvider(name = "data_ValidatorC") + Object[][] getDataValidator() { + DOMSource ds = getDOMSource(xml_val_test, xml_val_test_id, false, true, xml_catalog); + + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + StAXSource stax = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax1 = getStaxSource(xml_val_test, xml_val_test_id); + + StreamSource source = new StreamSource(new File(xml_val_test)); + + return new Object[][]{ + // use catalog disabled through factory + {true, false, false, ds, null, null, xml_catalog, null}, + {true, false, false, ds, null, null, null, xml_catalog}, + {true, false, false, ss, null, null, xml_catalog, null}, + {true, false, false, ss, null, null, null, xml_catalog}, + {true, false, false, stax, null, null, xml_catalog, null}, + {true, false, false, stax1, null, null, null, xml_catalog}, + {true, false, false, source, null, null, xml_catalog, null}, + {true, false, false, source, null, null, null, xml_catalog}, + // use catalog disabled through validatory + {false, true, false, ds, null, null, xml_catalog, null}, + {false, true, false, ds, null, null, null, xml_catalog}, + {false, true, false, ss, null, null, xml_catalog, null}, + {false, true, false, ss, null, null, null, xml_catalog}, + {false, true, false, stax, null, null, xml_catalog, null}, + {false, true, false, stax1, null, null, null, xml_catalog}, + {false, true, false, source, null, null, xml_catalog, null}, + {false, true, false, source, null, null, null, xml_catalog}, + }; + } + + /* + DataProvider: for testing XSL import and include + Data: set use_catalog, use_catalog, catalog file, xsl file, xml file, a URIResolver, expected + */ + @DataProvider(name = "data_XSLC") + Object[][] getDataXSLC() { + SAXSource xslSourceDTD = new SAXSource(new InputSource(new StringReader(xsl_includeDTD))); + StreamSource xmlSourceDTD = new StreamSource(new StringReader(xml_xslDTD)); + + SAXSource xslDocSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())); + StreamSource xmlDocSource = new StreamSource(new File(xml_doc)); + return new Object[][]{ + // for resolving DTD, import and include in xsl + {true, false, xml_catalog, xslSourceDTD, xmlSourceDTD, null, ""}, + // for resolving reference by the document function + {true, false, xml_catalog, xslDocSource, xmlDocSource, null, "Resolved by a catalog"}, + }; + } +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport4.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport4.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package catalog; + +import java.io.File; +import java.io.StringReader; +import javax.xml.transform.Source; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamSource; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.InputSource; + +/** + * @bug 8158084 8162438 8162442 + * @summary verifies the overriding over of the USE_CATALOG feature. Extending + * CatalogSupport tests, the USE_CATALOG is turned off system-wide, however, + * a JAXP processor may decide to use Catalog by enabling it through the factory + * or a processor created by the factory. + */ + +/** + * + * Test notes: + * Same set of data as in CatalogSupport without the ones with resolvers. + * The set-use-catalog is set to true. + * + * @author huizhe.wang@oracle.com + */ +public class CatalogSupport4 extends CatalogSupportBase { + /* + * Initializing fields + */ + @BeforeClass + public void setUpClass() throws Exception { + setUp(); + //turn off USE_CATALOG system-wide + System.setProperty(SP_USE_CATALOG, "false"); + } + + @AfterClass + public void tearDownClass() throws Exception { + System.clearProperty(SP_USE_CATALOG); + } + + /* + Verifies the Catalog support on SAXParser. + */ + @Test(dataProvider = "data_SAXA") + public void testSAXA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testSAX(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XMLReader. + */ + @Test(dataProvider = "data_SAXA") + public void testXMLReaderA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXMLReader(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on XInclude. + */ + @Test(dataProvider = "data_XIA") + public void testXIncludeA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testXInclude(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on DOM parser. + */ + @Test(dataProvider = "data_DOMA") + public void testDOMA(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + testDOM(setUseCatalog, useCatalog, catalog, xml, handler, expected); + } + + /* + Verifies the Catalog support on resolving DTD, xsd import and include in + Schema files. + */ + @Test(dataProvider = "data_SchemaA") + public void testValidationA(boolean setUseCatalog, boolean useCatalog, + String catalog, String xsd, LSResourceResolver resolver) + throws Exception { + + testValidation(setUseCatalog, useCatalog, catalog, xsd, resolver) ; + } + + /* + @bug 8158084 8162438 these tests also verifies the fix for 8162438 + Verifies the Catalog support on the Schema Validator. + */ + @Test(dataProvider = "data_ValidatorA") + public void testValidatorA(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog, + Source source, LSResourceResolver resolver1, LSResourceResolver resolver2, + String catalog1, String catalog2) + throws Exception { + testValidator(setUseCatalog1, setUseCatalog2, useCatalog, source, + resolver1, resolver2, catalog1, catalog2); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLA") + public void testXSLImportA(boolean setUseCatalog, boolean useCatalog, String catalog, + SAXSource xsl, StreamSource xml, URIResolver resolver, String expected) + throws Exception { + + testXSLImport(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + @bug 8158084 8162442 + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + @Test(dataProvider = "data_XSLA") + public void testXSLImportWTemplatesA(boolean setUseCatalog, boolean useCatalog, + String catalog, SAXSource xsl, StreamSource xml, URIResolver resolver, String expected) + throws Exception { + testXSLImportWTemplates(setUseCatalog, useCatalog, catalog, xsl, xml, resolver, expected); + } + + /* + DataProvider: for testing the SAX parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_SAXA") + Object[][] getDataSAX() { + return new Object[][]{ + {true, true, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog}, + }; + } + + /* + DataProvider: for testing XInclude + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_XIA") + Object[][] getDataXI() { + return new Object[][]{ + {true, true, xml_catalog, xml_xInclude, new MyHandler(elementInXISimple), contentInUIutf8Catalog}, + }; + } + + /* + DataProvider: for testing DOM parser + Data: set use_catalog, use_catalog, catalog file, xml file, handler, expected result string + */ + @DataProvider(name = "data_DOMA") + Object[][] getDataDOM() { + return new Object[][]{ + {true, true, xml_catalog, xml_system, new MyHandler(elementInSystem), expectedWCatalog}, + }; + } + + MyEntityHandler getMyEntityHandler(String elementName, String[] systemIds, InputSource... returnValues) { + return new MyEntityHandler(systemIds, returnValues, elementName); + } + + /* + DataProvider: for testing Schema validation + Data: set use_catalog, use_catalog, catalog file, xsd file, a LSResourceResolver + */ + @DataProvider(name = "data_SchemaA") + Object[][] getDataSchema() { + return new Object[][]{ + // for resolving DTD in xsd + {true, true, xml_catalog, xsd_xmlSchema, null}, + // for resolving xsd import + {true, true, xml_catalog, xsd_xmlSchema_import, null}, + // for resolving xsd include + {true, true, xml_catalog, xsd_include_company, null}, + }; + } + + /* + DataProvider: for testing Schema Validator + Data: source, resolver1, resolver2, catalog1, a catalog2 + */ + @DataProvider(name = "data_ValidatorA") + Object[][] getDataValidator() { + DOMSource ds = getDOMSource(xml_val_test, xml_val_test_id, true, true, xml_catalog); + + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + StAXSource stax = getStaxSource(xml_val_test, xml_val_test_id); + StAXSource stax1 = getStaxSource(xml_val_test, xml_val_test_id); + + StreamSource source = new StreamSource(new File(xml_val_test)); + + return new Object[][]{ + // use catalog + {true, false, true, ds, null, null, xml_catalog, null}, + {false, true, true, ds, null, null, null, xml_catalog}, + {true, false, true, ss, null, null, xml_catalog, null}, + {false, true, true, ss, null, null, null, xml_catalog}, + {true, false, true, stax, null, null, xml_catalog, null}, + {false, true, true, stax1, null, null, null, xml_catalog}, + {true, false, true, source, null, null, xml_catalog, null}, + {false, true, true, source, null, null, null, xml_catalog}, + }; + } + + /* + DataProvider: for testing XSL import and include + Data: set use_catalog, use_catalog, catalog file, xsl file, xml file, a URIResolver, expected result + */ + @DataProvider(name = "data_XSLA") + Object[][] getDataXSL() { + // XSLInclude.xsl has one import XSLImport_html.xsl and two includes, + // XSLInclude_header.xsl and XSLInclude_footer.xsl; + SAXSource xslSourceDTD = new SAXSource(new InputSource(new StringReader(xsl_includeDTD))); + StreamSource xmlSourceDTD = new StreamSource(new StringReader(xml_xslDTD)); + + SAXSource xslDocSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())); + StreamSource xmlDocSource = new StreamSource(new File(xml_doc)); + return new Object[][]{ + // for resolving DTD, import and include in xsl + {true, true, xml_catalog, xslSourceDTD, xmlSourceDTD, null, ""}, + // for resolving reference by the document function + {true, true, xml_catalog, xslDocSource, xmlDocSource, null, "Resolved by a catalog"}, + }; + } +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,934 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package catalog; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogFeatures; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLResolver; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; +import org.testng.Assert; +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.ls.LSInput; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.Attributes; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.ext.DefaultHandler2; + +/** + * Base class: + * Initialized xml/xsd/xsl used for the test; + * Handler classes + * + * @author huizhe.wang@oracle.com + */ +public class CatalogSupportBase { + // the System Property for the USE_CATALOG feature + final static String SP_USE_CATALOG = "javax.xml.useCatalog"; + + boolean debug = false; + + String filepath; + String slash = ""; + + protected void setUp() { + String file1 = getClass().getResource("CatalogSupport.xml").getFile(); + if (System.getProperty("os.name").contains("Windows")) { + filepath = file1.substring(1, file1.lastIndexOf("/") + 1); + slash = "/"; + } else { + filepath = file1.substring(0, file1.lastIndexOf("/") + 1); + } + + initFiles(); + } + + String xml_catalog, xml_bogus_catalog; + + // For tests using system.xml + String xml_system, dtd_system, dtd_systemResolved; + final String elementInSystem = "catalogtest"; + final String expectedWCatalog = "Test system entry"; + final String expectedWResolver = "Test resolved by an EntityHandler, rather than a Catalog entry"; + + // For tests using XInclude.xml + String xml_xInclude, xml_xIncludeSimple; + final String elementInXISimple = "blue"; + final String contentInXIutf8 = "trjsagdkasgdhasdgashgdhsadgashdg"; + final String contentInUIutf8Catalog = "usingCatalog"; + + // For the xsd import and include + String xsd_xmlSchema, dtd_xmlSchema, dtd_datatypes; + String xsd_xmlSchema_import, xsd_xml; + String xml_val_test, xml_val_test_id, xsd_val_test; + String xsd_include_company, xsd_include_person, xsd_include_product; + String xsl_include, xsl_includeDTD, xsl_import_html, xsl_include_header, xsl_include_footer; + + // For the xsl import and include + String xml_xsl, xml_xslDTD; + + // For document function + String xml_doc, xsl_doc, xml_doc2; + + void initFiles() { + xml_system = filepath + "system.xml"; + dtd_system = filepath + "system.dtd"; + dtd_systemResolved = ""; + + xml_catalog = filepath + "CatalogSupport.xml"; + xml_bogus_catalog = filepath + "CatalogSupport_bogus.xml"; + + xml_xInclude = "\n" + + "\n"; + xml_xIncludeSimple = filepath + "XI_simple.xml"; + + xsd_xmlSchema = "" + + "" + + "" + + " " + + " " + + " Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp " + + " Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp " + + " " + + " " + + ""; + dtd_xmlSchema = filepath + "XMLSchema.dtd"; + dtd_datatypes = filepath + "datatypes.dtd"; + + xsd_xmlSchema_import = "" + + "" + + " " + + " " + + " Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp " + + " Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp " + + " " + + " " + + "" + + " " + + " " + + " " + + " Get access to the xml: attribute groups for xml:lang" + + " as declared on 'schema' and 'documentation' below" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + ""; + + xsd_xml = filepath + "xml.xsd"; + + xsd_include_company = "" + + "" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + ""; + xsd_include_person = filepath + "XSDInclude_person.xsd"; + xsd_include_product = filepath + "XSDInclude_product.xsd"; + + xsl_include = "" + + "" + + " " + + " " + + " " + + "" + + " " + + "

" + + " " + + " " + + " " + + "" + + ""; + xsl_includeDTD = "" + + "" + + "" + + " " + + " " + + " " + + "" + + " " + + "

" + + "
" + + " " + + " " + + "" + + "
"; + + xsl_import_html = filepath + "XSLImport_html.xsl"; + xsl_include_header = filepath + "XSLInclude_header.xsl"; + xsl_include_footer = filepath + "XSLInclude_footer.xsl"; + + xml_val_test = filepath + "/val_test.xml"; + xml_val_test_id = "file://" + slash + xml_val_test; + xsd_val_test = filepath + "/val_test.xsd"; + + xml_xsl = "\n" + + "\n" + + "
This is the header
\n" + + " Some content\n" + + "
footer
\n" + + "
"; + + xml_xslDTD = "\n" + + "" + + "\n" + + "
This is the header
\n" + + " Some content\n" + + "
footer
\n" + + "
"; + + xml_doc = filepath + "/DocFunc.xml"; + xsl_doc = filepath + "/DocFunc.xsl"; + xml_doc2 = filepath + "/DocFunc2.xml"; + } + + + /* + Verifies the Catalog support on SAXParser. + */ + public void testSAX(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + SAXParser parser = getSAXParser(setUseCatalog, useCatalog, catalog); + + parser.parse(xml, handler); + assertEquals(expected, handler.getResult().trim(), ""); + } + + /* + Verifies the Catalog support on XMLReader. + */ + public void testXMLReader(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + XMLReader reader = getXMLReader(setUseCatalog, useCatalog, catalog); + + reader.setContentHandler(handler); + reader.parse(xml); + assertEquals(expected, handler.getResult().trim(), ""); + } + + /* + Verifies the Catalog support on XInclude. + */ + public void testXInclude(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + SAXParser parser = getSAXParser(setUseCatalog, useCatalog, catalog); + + parser.parse(new InputSource(new StringReader(xml)), handler); + debugPrint("handler.result:" + handler.getResult()); + assertEquals(expected, handler.getResult(), "Catalog support for XInclude"); + } + + /* + Verifies the Catalog support on DOM parser. + */ + public void testDOM(boolean setUseCatalog, boolean useCatalog, String catalog, + String xml, MyHandler handler, String expected) throws Exception { + DocumentBuilder docBuilder = getDomBuilder(setUseCatalog, useCatalog, catalog); + docBuilder.setEntityResolver(handler); + Document doc = docBuilder.parse(xml); + + Node node = doc.getElementsByTagName(elementInSystem).item(0); + String result = node.getFirstChild().getTextContent(); + + assertEquals(expected, result.trim(), "Catalog support for DOM"); + } + + /* + Verifies the Catalog support on resolving DTD, xsd import and include in + Schema files. + */ + public void testValidation(boolean setUseCatalog, boolean useCatalog, String catalog, + String xsd, LSResourceResolver resolver) + throws Exception { + + SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + + // use resolver or catalog if resolver = null + if (resolver != null) { + factory.setResourceResolver(resolver); + } + if (setUseCatalog) { + factory.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + factory.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog); + + Schema schema = factory.newSchema(new StreamSource(new StringReader(xsd))); + success("XMLSchema.dtd and datatypes.dtd are resolved."); + } + + /** + * Verifies Catalog Support for the Validator. + * @param setUseCatalog1 a flag to indicate whether USE_CATALOG shall be set + * on the factory. + * @param setUseCatalog2 a flag to indicate whether USE_CATALOG shall be set + * on the Validator. + * @param source the XML source + * @param resolver1 a resolver to be set on the factory if specified + * @param resolver2 a resolver to be set on the Validator if specified + * @param catalog1 a catalog to be set on the factory if specified + * @param catalog2 a catalog to be set on the Validator if specified + */ + public void testValidator(boolean setUseCatalog1, boolean setUseCatalog2, boolean useCatalog, + Source source, LSResourceResolver resolver1, LSResourceResolver resolver2, + String catalog1, String catalog2) + throws Exception { + + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + if (setUseCatalog1) { + schemaFactory.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + if (catalog1 != null) { + schemaFactory.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog1); + } + if (resolver1 != null) { + schemaFactory.setResourceResolver(resolver1); + } + + Schema schema = schemaFactory.newSchema(); + Validator validator = schema.newValidator(); + if (setUseCatalog2) { + validator.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + if (catalog2 != null) { + validator.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog2); + } + if (resolver2 != null) { + validator.setResourceResolver(resolver2); + } + validator.validate(source); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + public void testXSLImport(boolean setUseCatalog, boolean useCatalog, String catalog, + SAXSource xsl, StreamSource xml, + URIResolver resolver, String expected) throws Exception { + + TransformerFactory factory = getTransformerFactory(setUseCatalog, useCatalog, catalog, resolver); + Transformer transformer = factory.newTransformer(xsl); + + StringWriter out = new StringWriter(); + transformer.transform(xml, new StreamResult(out)); + debugPrint("out:\n" + out.toString()); + Assert.assertTrue(out.toString().contains(expected), "testXSLImport"); + } + + /* + Verifies the Catalog support on resolving DTD, xsl import and include in + XSL files. + */ + public void testXSLImportWTemplates(boolean setUseCatalog, boolean useCatalog, + String catalog, SAXSource xsl, StreamSource xml, + URIResolver resolver, String expected) throws Exception { + + TransformerFactory factory = getTransformerFactory(setUseCatalog, useCatalog, catalog, resolver); + Transformer transformer = factory.newTemplates(xsl).newTransformer(); + StringWriter out = new StringWriter(); + transformer.transform(xml, new StreamResult(out)); + Assert.assertTrue(out.toString().contains(expected), "testXSLImportWTemplates"); + } + + /** + * Returns an instance of SAXParser with a catalog if one is provided. + * + * @param setUseCatalog a flag indicates whether USE_CATALOG shall be set + * through the factory + * @param useCatalog the value of USE_CATALOG + * @param catalog a catalog + * @return an instance of SAXParser + * @throws ParserConfigurationException + * @throws SAXException + */ + SAXParser getSAXParser(boolean setUseCatalog, boolean useCatalog, String catalog) + throws ParserConfigurationException, SAXException { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + spf.setXIncludeAware(true); + if (setUseCatalog) { + spf.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + + SAXParser parser = spf.newSAXParser(); + parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog); + return parser; + } + + /** + * Returns an instance of XMLReader with a catalog if one is provided. + * + * @param setUseCatalog a flag indicates whether USE_CATALOG shall be set + * through the factory + * @param useCatalog the value of USE_CATALOG + * @param catalog a catalog + * @return an instance of XMLReader + * @throws ParserConfigurationException + * @throws SAXException + */ + XMLReader getXMLReader(boolean setUseCatalog, boolean useCatalog, String catalog) + throws ParserConfigurationException, SAXException { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + XMLReader reader = spf.newSAXParser().getXMLReader(); + if (setUseCatalog) { + reader.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + reader.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog); + return reader; + } + + /** + * Returns an instance of DocumentBuilder that may have set a Catalog. + * + * @param setUseCatalog a flag indicates whether USE_CATALOG shall be set + * through the factory + * @param useCatalog the value of USE_CATALOG + * @param catalog a catalog + * @return an instance of DocumentBuilder + * @throws ParserConfigurationException + */ + DocumentBuilder getDomBuilder(boolean setUseCatalog, boolean useCatalog, String catalog) + throws ParserConfigurationException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + if (setUseCatalog) { + dbf.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + dbf.setAttribute(CatalogFeatures.Feature.FILES.getPropertyName(), catalog); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + return docBuilder; + } + + /** + * Creates a DOMSource. + * + * @param uri the URI to the XML source file + * @param systemId the systemId of the source + * @param setUseCatalog a flag indicates whether USE_CATALOG shall be set + * through the factory + * @param useCatalog the value of USE_CATALOG + * @param catalog a catalog + * @return a DOMSource + * @throws Exception + */ + DOMSource getDOMSource(String uri, String systemId, boolean setUseCatalog, + boolean useCatalog, String catalog) { + DOMSource ds = null; + try { + DocumentBuilder builder = getDomBuilder(setUseCatalog, useCatalog, catalog); + Document doc = builder.parse(new File(uri)); + ds = new DOMSource(doc, systemId); + } catch (Exception e) {} + + return ds; + } + + /** + * Creates a StAXSource. + * + * @param xmlFile the XML source file + * @param xmlFileId the systemId of the source + * @return a StAXSource + * @throws XMLStreamException + * @throws FileNotFoundException + */ + StAXSource getStaxSource(String xmlFile, String xmlFileId) { + StAXSource ss = null; + try { + ss = new StAXSource( + XMLInputFactory.newFactory().createXMLEventReader( + xmlFileId, new FileInputStream(xmlFile))); + } catch (Exception e) {} + + return ss; + } + + /** + * Creates an XMLStreamReader. + * @param catalog the path to a catalog + * @param xml the xml to be parsed + * @param resolver a resolver to be set on the reader + * @return an instance of the XMLStreamReader + * @throws FileNotFoundException + * @throws XMLStreamException + */ + XMLStreamReader getStreamReader(boolean setUseCatalog, boolean useCatalog, + String catalog, String xml, XMLResolver resolver) + throws FileNotFoundException, XMLStreamException { + XMLInputFactory factory = XMLInputFactory.newInstance(); + factory.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), catalog); + factory.setProperty(XMLInputFactory.IS_COALESCING, true); + factory.setProperty(XMLInputFactory.RESOLVER, resolver); + if (setUseCatalog) { + factory.setProperty(XMLConstants.USE_CATALOG, useCatalog); + } + + InputStream entityxml = new FileInputStream(xml); + XMLStreamReader streamReader = factory.createXMLStreamReader(xml, entityxml); + return streamReader; + } + + /** + * Returns the text of the first element found by the reader. + * @param streamReader the XMLStreamReader + * @return the text of the first element + * @throws XMLStreamException + */ + String getText(XMLStreamReader streamReader) throws XMLStreamException { + while(streamReader.hasNext()){ + int eventType = streamReader.next() ; + if(eventType == XMLStreamConstants.START_ELEMENT){ + eventType = streamReader.next() ; + if(eventType == XMLStreamConstants.CHARACTERS){ + return streamReader.getText() ; + } + } + } + return null; + } + + /** + * Returns an instance of TransformerFactory with either a custom URIResolver + * or Catalog. + * + * @param setUseCatalog a flag indicates whether USE_CATALOG shall be set + * through the factory + * @param useCatalog the value of USE_CATALOG + * @param catalog a catalog + * @param resolver a custom resolver + * @return an instance of TransformerFactory + * @throws Exception + */ + TransformerFactory getTransformerFactory(boolean setUseCatalog, boolean useCatalog, + String catalog, URIResolver resolver) + throws Exception { + + TransformerFactory factory = TransformerFactory.newInstance(); + if (setUseCatalog) { + factory.setFeature(XMLConstants.USE_CATALOG, useCatalog); + } + if (catalog != null) { + factory.setAttribute(CatalogFeatures.Feature.FILES.getPropertyName(), catalog); + } + + // use resolver or catalog if resolver = null + if (resolver != null) { + factory.setURIResolver(resolver); + } + + return factory; + } + + void assertNotNull(Object obj, String msg) { + if (obj == null) { + debugPrint("Test failed: " + msg); + } else { + debugPrint("Test passed: " + obj + " is not null"); + } + } + + void assertEquals(String expected, String actual, String msg) { + if (!expected.equals(actual)) { + debugPrint("Test failed: " + msg); + } else { + debugPrint("Test passed: "); + } + debugPrint("Expected: " + expected); + debugPrint("Actual: " + actual); + } + + void fail(String msg) { + System.out.println("Test failed:"); + System.out.println(msg); + } + + void success(String msg) { + System.out.println("Test succeded:"); + System.out.println(msg); + } + + void debugPrint(String msg) { + if (debug) { + System.out.println(msg); + } + } + + /** + * Extends MyStaxResolver to override resolveEntity + */ + class MyStaxEntityResolver implements XMLResolver { + + public MyStaxEntityResolver() { + + } + + public Object resolveEntity(String publicId, String systemId, String baseURI, + String namespace) + throws javax.xml.stream.XMLStreamException { + try { + return new ByteArrayInputStream( + "".getBytes("UTF-8")); + } catch (UnsupportedEncodingException ex) { + return null; + } + } + + } + + /** + * A custom XMLResolver + */ + class MyStaxResolver implements XMLResolver { + + public MyStaxResolver() { + } + + public Object resolveEntity(String publicId, String systemId, String baseURI, + String namespace) throws javax.xml.stream.XMLStreamException { + return null; + } + + } + + /** + * Extends MyHandler and overrides resolveEntity + */ + class MyEntityHandler extends MyHandler { + String[] systemIds; + InputSource[] returnValues; + public MyEntityHandler(String[] systemIds, InputSource[] returnValues, String elementName) { + super(elementName); + this.systemIds = systemIds; + this.returnValues = returnValues; + } + + @Override + public InputSource resolveEntity(String name, String publicId, + String baseURI, String systemId) { + for (int i = 0; i < systemIds.length; i++) { + if (systemId.endsWith(systemIds[i])) { + return returnValues[i]; + } + } + + return null; + } + } + + /** + * SAX handler + */ + public class MyHandler extends DefaultHandler2 implements ErrorHandler { + + String elementName, currentElementName, result; + StringBuilder textContent = new StringBuilder(); + + /** + * + * @param elementName the name of the element from which the content + * is to be captured + */ + MyHandler(String elementName) { + textContent.setLength(0); + this.elementName = elementName; + } + + String getResult() { + return result.trim(); + } + + public void startDocument() throws SAXException { + } + + public void endDocument() throws SAXException { + } + + public void startElement(String uri, String localName, String qName, Attributes attributes) + throws SAXException { + currentElementName = localName; + textContent.delete(0, textContent.length()); + try { + debugPrint("Element: " + uri + ":" + localName + " " + qName); + } catch (Exception e) { + throw new SAXException(e); + } + + } + + public void endElement(String uri, String localName, String qName) throws SAXException { + debugPrint("Text: " + textContent.toString() + ""); + debugPrint("End Element: " + uri + ":" + localName + " " + qName); + if (currentElementName.equals(elementName)) { + result = textContent.toString(); + } + } + + public void characters(char ch[], int start, int length) throws SAXException { + if (currentElementName.equals(elementName)) { + textContent.append(ch, start, length); + } + } + + public void internalEntityDecl(String name, String value) throws SAXException { + super.internalEntityDecl(name, value); + debugPrint("internalEntityDecl() is invoked for entity : " + name); + } + + public void externalEntityDecl(String name, String publicId, String systemId) + throws SAXException { + super.externalEntityDecl(name, publicId, systemId); + debugPrint("externalEntityDecl() is invoked for entity : " + name); + } + + public void startEntity(String name) throws SAXException { + super.startEntity(name); +// debugPrint("startEntity() is invoked for entity : " + name) ; + } + + public void endEntity(String name) throws SAXException { + super.endEntity(name); +// debugPrint("endEntity() is invoked for entity : " + name) ; + } + + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + debugPrint("resolveEntity(publicId, systemId) is invoked"); + return super.resolveEntity(publicId, systemId); + } + + /** + * public InputSource resolveEntity(String name, String publicId, String + * baseURI, String systemId) throws SAXException, IOException { + * System.out.println("resolveEntity(name, publicId, baseURI, systemId) + * is invoked"); return super.resolveEntity(name, publicId, baseURI, + * systemId); } + */ + public InputSource getExternalSubset(String name, String baseURI) + throws SAXException, IOException { + debugPrint("getExternalSubset() is invoked"); + return super.getExternalSubset(name, baseURI); + } + } + + /** + * The purpose of this class, vs an anonymous class, is to show clearly what + * we're testing by passing the parameters to the constructor. + */ + class SourceResolver implements LSResourceResolver { + + String publicId; + String[] systemIds; + XmlInput[] returnValues; + + public SourceResolver(String publicId, String[] systemIds, XmlInput[] returnValues) { + this.publicId = publicId; + this.systemIds = systemIds; + this.returnValues = returnValues; + } + + @Override + public LSInput resolveResource(String type, String namespaceURI, String publicId, + String systemId, String baseURI) { + for (int i = 0; i < systemIds.length; i++) { + if (systemId.endsWith(systemIds[i])) { + return returnValues[i]; + } + } + + return null; + } + } + + class XmlInput implements LSInput { + + private InputStream inputStream; + private String systemId; + private String baseUri; + + public XmlInput(InputStream inputStream, String systemId, String baseUri) { + this.inputStream = inputStream; + this.systemId = systemId; + this.baseUri = baseUri; + } + + @Override + public Reader getCharacterStream() { + return null; + } + + @Override + public void setCharacterStream(Reader characterStream) { + } + + @Override + public InputStream getByteStream() { + return inputStream; + } + + @Override + public void setByteStream(InputStream byteStream) { + this.inputStream = byteStream; + } + + @Override + public String getStringData() { + return null; + } + + @Override + public void setStringData(String stringData) { + } + + @Override + public String getSystemId() { + return systemId; + } + + @Override + public void setSystemId(String systemId) { + this.systemId = systemId; + } + + @Override + public String getPublicId() { + return null; + } + + @Override + public void setPublicId(String publicId) { + } + + @Override + public String getBaseURI() { + return baseUri; + } + + @Override + public void setBaseURI(String baseURI) { + this.baseUri = baseURI; + } + + @Override + public String getEncoding() { + return null; + } + + @Override + public void setEncoding(String encoding) { + } + + @Override + public boolean getCertifiedText() { + return false; + } + + @Override + public void setCertifiedText(boolean certifiedText) { + } + } + + class XslResolver implements URIResolver { + + String[] hrefs; + Source[] returnValues; + + public XslResolver(String[] href, Source[] returnValues) { + this.hrefs = href; + this.returnValues = returnValues; + } + + @Override + public Source resolve(String href, String base) throws TransformerException { + for (int i = 0; i < hrefs.length; i++) { + if (href.endsWith(hrefs[i])) { + return returnValues[i]; + } + } + return null; + } + } +} diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport_bogus.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport_bogus.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/DocFunc.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/DocFunc.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,4 @@ + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/DocFunc.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/DocFunc.xsl Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/DocFunc2.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/DocFunc2.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,5 @@ + + + + Resolved by a resolver + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/DocFuncCatalog.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/DocFuncCatalog.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,5 @@ + + + + Resolved by a catalog + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XI_red.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XI_red.dtd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,4 @@ + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XI_simple.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XI_simple.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,18 @@ + + + + + + + + text + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XI_simple4Catalog.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XI_simple4Catalog.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,18 @@ + + + + + + + + text + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XI_test2.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XI_test2.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,10 @@ + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XI_utf8.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XI_utf8.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,1 @@ +trjsagdkasgdhasdgashgdhsadgashdg diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XI_utf8Catalog.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XI_utf8Catalog.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,1 @@ +usingCatalog diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XMLSchema.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XMLSchema.dtd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +%xs-datatypes; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XMLSchema.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XMLSchema.xsd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]> + + + + Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp + Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp + + + + + + The schema corresponding to this document is normative, + with respect to the syntactic constraints it expresses in the + XML Schema language. The documentation (within <documentation> elements) + below, is not normative, but rather highlights important aspects of + the W3C Recommendation of which this is a part + + + + + The simpleType element and all of its members are defined + towards the end of this schema document + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSDInclude_company.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSDInclude_company.xsd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSDInclude_person.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSDInclude_person.xsd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSDInclude_product.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSDInclude_product.xsd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSLDTD.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSLDTD.dtd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSLDTD.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSLDTD.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,7 @@ + + + +
This is the header
+ Some content +
footer
+
diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSLImport_html.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSLImport_html.xsl Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSLInclude_footer.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSLInclude_footer.xsl Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/XSLInclude_header.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/XSLInclude_header.xsl Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,8 @@ + + + + +

+
+ +
\ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/datatypes.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/datatypes.dtd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/include.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/include.dtd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,3 @@ + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/val_test.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/val_test.xml Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,9 @@ + + + + has a &system; entry + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/val_test.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/val_test.xsd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/catalog/xml.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/xml.xsd Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,287 @@ + + + + + + +
+

About the XML namespace

+ +
+

+ This schema document describes the XML namespace, in a form + suitable for import by other schema documents. +

+

+ See + http://www.w3.org/XML/1998/namespace.html and + + http://www.w3.org/TR/REC-xml for information + about this namespace. +

+

+ Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance. +

+

+ See further below in this document for more information about how to refer to this schema document from your own + XSD schema documents and about the + namespace-versioning policy governing this schema document. +

+
+
+
+
+ + + + +
+ +

lang (as an attribute name)

+

+ denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.

+ +
+
+

Notes

+

+ Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. +

+

+ See BCP 47 at + http://www.rfc-editor.org/rfc/bcp/bcp47.txt + and the IANA language subtag registry at + + http://www.iana.org/assignments/language-subtag-registry + for further information. +

+

+ The union allows for the 'un-declaration' of xml:lang with + the empty string. +

+
+
+
+ + + + + + + + + +
+ + + + +
+ +

space (as an attribute name)

+

+ denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.

+ +
+
+
+ + + + + + +
+ + + +
+ +

base (as an attribute name)

+

+ denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.

+ +

+ See http://www.w3.org/TR/xmlbase/ + for information about this attribute. +

+
+
+
+
+ + + + +
+ +

id (as an attribute name)

+

+ denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.

+ +

+ See http://www.w3.org/TR/xml-id/ + for information about this attribute. +

+
+
+
+
+ + + + + + + + + + +
+ +

Father (in any context at all)

+ +
+

+ denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: +

+
+

+ In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father". +

+
+
+
+
+
+ + + +
+

About this schema document

+ +
+

+ This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow xml:base, + xml:lang, xml:space or + xml:id attributes on elements they define. +

+

+ To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows: +

+
+          <schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     
+

+ or +

+
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     
+

+ Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g. +

+
+          <type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+     
+

+ will define a type which will schema-validate an instance element + with any of those attributes. +

+
+
+
+
+ + + +
+

Versioning policy for this schema document

+
+

+ In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + + http://www.w3.org/2009/01/xml.xsd. +

+

+ At the date of issue it can also be found at + + http://www.w3.org/2001/xml.xsd. +

+

+ The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at + http://www.w3.org/2001/xml.xsd + + will change accordingly; the version at + + http://www.w3.org/2009/01/xml.xsd + + will not change. +

+

+ Previous dated (and unchanging) versions of this schema + document are at: +

+ +
+
+
+
+ +
+ diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/common/ValidationWarningsTest.java --- a/jaxp/test/javax/xml/jaxp/unittest/common/ValidationWarningsTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/test/javax/xml/jaxp/unittest/common/ValidationWarningsTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -38,8 +38,9 @@ /* * @test + * @bug 8144593 + * @key intermittent * @modules javax.xml/com.sun.org.apache.xerces.internal.jaxp - * @bug 8144593 * @summary Check that warnings about unsupported properties from SAX * parsers are suppressed during the xml validation process. */ diff -r 8b413b0e064c -r 592a43ff92cd jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java --- a/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -62,7 +62,7 @@ /* * @summary Transformer Tests - * @bug 6272879 6305029 6505031 8150704 + * @bug 6272879 6305029 6505031 8150704 8162598 */ public class TransformerTest { private Transformer createTransformer() throws TransformerException { @@ -111,6 +111,41 @@ } } + /** + * Utility method for testBug8162598(). + * Provides a convenient way to check/assert the expected namespaces + * of a Node and its siblings. + * + * @param test + * The node to check + * @param nstest + * Expected namespace of the node + * @param nsb + * Expected namespace of the first sibling + * @param nsc + * Expected namespace of the first sibling of the first sibling + */ + private void checkNodeNS8162598(Node test, String nstest, String nsb, String nsc) { + String testNodeName = test.getNodeName(); + if (nstest == null) { + Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName); + } else { + Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName); + } + Node b = test.getChildNodes().item(0); + if (nsb == null) { + Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b"); + } else { + Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b"); + } + Node c = b.getChildNodes().item(0); + if (nsc == null) { + Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c"); + } else { + Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c"); + } + } + private class XMLReaderFor6305029 implements XMLReader { private static final String NAMESPACES = "http://xml.org/sax/features/namespaces"; private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes"; @@ -249,22 +284,19 @@ " " + LINE_SEPARATOR + ""; - Document document; - Node node; - System.out.println("Stylesheet:"); - System.out.println("=================================="); + System.out.println("============================="); System.out.println(xsl); System.out.println(); - System.out.println("Source file before transformation:"); - System.out.println("=================================="); + System.out.println("Source before transformation:"); + System.out.println("============================="); System.out.println(sourceXml); System.out.println(); - System.out.println("Source file after transformation:"); - System.out.println("================================="); - document = transformInputStreamToDocument(createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())), + System.out.println("Result after transformation:"); + System.out.println("============================"); + Document document = transformInputStreamToDocument(createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())), new ByteArrayInputStream(sourceXml.getBytes())); OutputFormat format = new OutputFormat(); format.setIndenting(true); @@ -274,9 +306,8 @@ System.out.println("Node content for element valeur2:"); System.out.println("================================="); NodeList nodes = document.getElementsByTagName("valeur2"); - nodes = document.getElementsByTagName("valeur2"); for (int i = 0; i < nodes.getLength(); i++) { - node = nodes.item(i); + Node node = nodes.item(i); System.out.println(" Node value: " + node.getFirstChild().getNodeValue()); System.out.println(" Node attribute: " + node.getAttributes().item(0).getNodeValue()); @@ -341,4 +372,62 @@ Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-2.xml does not match reference"); System.out.println("Passed."); } + + /* + * @bug 8162598 + * @summary Test XSLTC handling of namespaces, especially empty namespace definitions to reset the + * default namespace + */ + @Test + public final void testBug8162598() throws IOException, TransformerException { + final String LINE_SEPARATOR = System.getProperty("line.separator"); + + final String xsl = + "" + LINE_SEPARATOR + + "" + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + " " + LINE_SEPARATOR + + ""; + + + final String sourceXml = + "" + LINE_SEPARATOR; + + System.out.println("Stylesheet:"); + System.out.println("============================="); + System.out.println(xsl); + System.out.println(); + + System.out.println("Source before transformation:"); + System.out.println("============================="); + System.out.println(sourceXml); + System.out.println(); + + System.out.println("Result after transformation:"); + System.out.println("============================"); + Document document = transformInputStreamToDocument( + createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())), + new ByteArrayInputStream(sourceXml.getBytes())); + OutputFormat format = new OutputFormat(); + format.setIndenting(true); + new XMLSerializer(System.out, format).serialize(document); + System.out.println(); + checkNodeNS8162598(document.getElementsByTagName("test1").item(0), "ns2", "ns2", null); + checkNodeNS8162598(document.getElementsByTagName("test2").item(0), "ns1", "ns2", null); + checkNodeNS8162598(document.getElementsByTagName("test3").item(0), null, null, null); + checkNodeNS8162598(document.getElementsByTagName("test4").item(0), null, null, null); + checkNodeNS8162598(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null); + Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(), "unexpected namespace for test6"); + } } diff -r 8b413b0e064c -r 592a43ff92cd jaxws/.hgtags --- a/jaxws/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/jaxws/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -374,3 +374,4 @@ 264a44128cd6286e598d5a849ceeb613c06269d0 jdk-9+126 06d706c70634775418dc79a2671780ba1c624fd2 jdk-9+127 fe4e11bd2423635dc0f5f5cb9a64eb2f2cce7f4c jdk-9+128 +46a02f57218e4a8c334dbccf656fb048f823f163 jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd jdk/.hgtags --- a/jdk/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -372,3 +372,4 @@ 7a97b89ba83077ca62e4aa5a05437adc8f315343 jdk-9+127 9446c534f0222b4eecfd9d9e25ab37c4fd4400a5 jdk-9+128 47699aa2e69ec2702542dc73eb01de3bfb61aea0 jdk-9+129 +6c827500e34587061af97ad6fef0e859280255c5 jdk-9+130 diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/lang/Runtime.java --- a/jdk/src/java.base/share/classes/java/lang/Runtime.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.base/share/classes/java/lang/Runtime.java Fri Aug 05 12:03:58 2016 -0700 @@ -1112,7 +1112,62 @@ * @return The Version of the given string */ public static Version parse(String s) { - return VersionBuilder.parse(s); + if (s == null) + throw new NullPointerException(); + + // Shortcut to avoid initializing VersionPattern when creating + // major version constants during startup + if (isSimpleNumber(s)) { + return new Version(List.of(Integer.parseInt(s)), + Optional.empty(), Optional.empty(), Optional.empty()); + } + Matcher m = VersionPattern.VSTR_PATTERN.matcher(s); + if (!m.matches()) + throw new IllegalArgumentException("Invalid version string: '" + + s + "'"); + + // $VNUM is a dot-separated list of integers of arbitrary length + List version = new ArrayList<>(); + for (String i : m.group(VersionPattern.VNUM_GROUP).split("\\.")) + version.add(Integer.parseInt(i)); + + Optional pre = Optional.ofNullable( + m.group(VersionPattern.PRE_GROUP)); + + String b = m.group(VersionPattern.BUILD_GROUP); + // $BUILD is an integer + Optional build = (b == null) + ? Optional.empty() + : Optional.of(Integer.parseInt(b)); + + Optional optional = Optional.ofNullable( + m.group(VersionPattern.OPT_GROUP)); + + // empty '+' + if ((m.group(VersionPattern.PLUS_GROUP) != null) + && !build.isPresent()) { + if (optional.isPresent()) { + if (pre.isPresent()) + throw new IllegalArgumentException("'+' found with" + + " pre-release and optional components:'" + s + + "'"); + } else { + throw new IllegalArgumentException("'+' found with neither" + + " build or optional components: '" + s + "'"); + } + } + return new Version(version, pre, build, optional); + } + + private static boolean isSimpleNumber(String s) { + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + char lowerBound = (i > 0) ? '0' : '1'; + if (c < lowerBound || c > '9') { + return false; + } + } + return true; } /** @@ -1441,86 +1496,26 @@ } } - private static class VersionBuilder { + private static class VersionPattern { // $VNUM(-$PRE)?(\+($BUILD)?(\-$OPT)?)? // RE limits the format of version strings // ([1-9][0-9]*(?:(?:\.0)*\.[1-9][0-9]*)*)(?:-([a-zA-Z0-9]+))?(?:(\+)(0|[1-9][0-9]*)?)?(?:-([-a-zA-Z0-9.]+))? private static final String VNUM = "(?[1-9][0-9]*(?:(?:\\.0)*\\.[1-9][0-9]*)*)"; - private static final String VNUM_GROUP = "VNUM"; - private static final String PRE = "(?:-(?
[a-zA-Z0-9]+))?";
-        private static final String PRE_GROUP   = "PRE";
-
         private static final String BUILD
             = "(?:(?\\+)(?0|[1-9][0-9]*)?)?";
-        private static final String PLUS_GROUP  = "PLUS";
-        private static final String BUILD_GROUP = "BUILD";
-
         private static final String OPT      = "(?:-(?[-a-zA-Z0-9.]+))?";
-        private static final String OPT_GROUP   = "OPT";
-
         private static final String VSTR_FORMAT
             = "^" + VNUM + PRE + BUILD + OPT + "$";
-        private static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
 
-        /**
-         * Constructs a valid version string containing
-         * a version number followed by pre-release and
-         * build information.
-         *
-         * @param  s
-         *         A string to be interpreted as a version
-         *
-         * @throws  IllegalArgumentException
-         *          If the given string cannot be interpreted as a valid
-         *          version
-         *
-         * @throws  NullPointerException
-         *          If {@code s} is {@code null}
-         *
-         * @throws  NumberFormatException
-         *          If an element of the version number or the build number
-         *          cannot be represented as an {@link Integer}
-         */
-        static Version parse(String s) {
-            if (s == null)
-                throw new NullPointerException();
-
-            Matcher m = VSTR_PATTERN.matcher(s);
-            if (!m.matches())
-                throw new IllegalArgumentException("Invalid version string: '"
-                                                   + s + "'");
+        static final Pattern VSTR_PATTERN = Pattern.compile(VSTR_FORMAT);
 
-            // $VNUM is a dot-separated list of integers of arbitrary length
-            List version = new ArrayList<>();
-            for (String i : m.group(VNUM_GROUP).split("\\."))
-                version.add(Integer.parseInt(i));
-
-            Optional pre = Optional.ofNullable(m.group(PRE_GROUP));
-
-            String b = m.group(BUILD_GROUP);
-            // $BUILD is an integer
-            Optional build = (b == null)
-                ? Optional.empty()
-                : Optional.of(Integer.parseInt(b));
-
-            Optional optional = Optional.ofNullable(m.group(OPT_GROUP));
-
-            // empty '+'
-            if ((m.group(PLUS_GROUP) != null) && !build.isPresent()) {
-                if (optional.isPresent()) {
-                    if (pre.isPresent())
-                        throw new IllegalArgumentException("'+' found with"
-                            + " pre-release and optional components:'" + s
-                            + "'");
-                } else {
-                    throw new IllegalArgumentException("'+' found with neither"
-                        + " build or optional components: '" + s + "'");
-                }
-            }
-            return new Version(version, pre, build, optional);
-        }
+        static final String VNUM_GROUP  = "VNUM";
+        static final String PRE_GROUP   = "PRE";
+        static final String PLUS_GROUP  = "PLUS";
+        static final String BUILD_GROUP = "BUILD";
+        static final String OPT_GROUP   = "OPT";
     }
 }
diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/net/Inet4Address.java
--- a/jdk/src/java.base/share/classes/java/net/Inet4Address.java	Fri Aug 05 16:20:02 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/net/Inet4Address.java	Fri Aug 05 12:03:58 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -164,7 +164,7 @@
     }
 
     /**
-     * Utility routine to check if the InetAddress in a wildcard address.
+     * Utility routine to check if the InetAddress is a wildcard address.
      * @return a {@code boolean} indicating if the Inetaddress is
      *         a wildcard address.
      * @since 1.4
diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/net/Inet6Address.java
--- a/jdk/src/java.base/share/classes/java/net/Inet6Address.java	Fri Aug 05 16:20:02 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/net/Inet6Address.java	Fri Aug 05 12:03:58 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -691,7 +691,7 @@
     }
 
     /**
-     * Utility routine to check if the InetAddress in a wildcard address.
+     * Utility routine to check if the InetAddress is a wildcard address.
      *
      * @return a {@code boolean} indicating if the Inetaddress is
      *         a wildcard address.
diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/net/InetAddress.java
--- a/jdk/src/java.base/share/classes/java/net/InetAddress.java	Fri Aug 05 16:20:02 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/net/InetAddress.java	Fri Aug 05 12:03:58 2016 -0700
@@ -361,7 +361,7 @@
     }
 
     /**
-     * Utility routine to check if the InetAddress in a wildcard address.
+     * Utility routine to check if the InetAddress is a wildcard address.
      * @return a {@code boolean} indicating if the Inetaddress is
      *         a wildcard address.
      * @since 1.4
diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/net/Socket.java
--- a/jdk/src/java.base/share/classes/java/net/Socket.java	Fri Aug 05 16:20:02 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/net/Socket.java	Fri Aug 05 12:03:58 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2016, 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
@@ -907,7 +907,6 @@
             throw new SocketException("Socket is not connected");
         if (isInputShutdown())
             throw new SocketException("Socket input is shutdown");
-        final Socket s = this;
         InputStream is = null;
         try {
             is = AccessController.doPrivileged(
@@ -947,7 +946,6 @@
             throw new SocketException("Socket is not connected");
         if (isOutputShutdown())
             throw new SocketException("Socket output is shutdown");
-        final Socket s = this;
         OutputStream os = null;
         try {
             os = AccessController.doPrivileged(
diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/nio/file/FileTreeWalker.java
--- a/jdk/src/java.base/share/classes/java/nio/file/FileTreeWalker.java	Fri Aug 05 16:20:02 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/nio/file/FileTreeWalker.java	Fri Aug 05 12:03:58 2016 -0700
@@ -168,7 +168,7 @@
      * @throws  IllegalArgumentException
      *          if {@code maxDepth} is negative
      * @throws  ClassCastException
-     *          if (@code options} contains an element that is not a
+     *          if {@code options} contains an element that is not a
      *          {@code FileVisitOption}
      * @throws  NullPointerException
      *          if {@code options} is {@ocde null} or the options
diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java
--- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	Fri Aug 05 16:20:02 2016 +0300
+++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	Fri Aug 05 12:03:58 2016 -0700
@@ -810,7 +810,7 @@
      * The localized decimal style is not used.
      * 

* The instant is obtained using {@link ChronoField#INSTANT_SECONDS INSTANT_SECONDS} - * and optionally (@code NANO_OF_SECOND). The value of {@code INSTANT_SECONDS} + * and optionally {@code NANO_OF_SECOND}. The value of {@code INSTANT_SECONDS} * may be outside the maximum range of {@code LocalDateTime}. *

* The {@linkplain ResolverStyle resolver style} has no effect on instant parsing. @@ -848,7 +848,7 @@ * digits from zero to nine are accepted. *

* The instant is obtained using {@link ChronoField#INSTANT_SECONDS INSTANT_SECONDS} - * and optionally (@code NANO_OF_SECOND). The value of {@code INSTANT_SECONDS} + * and optionally {@code NANO_OF_SECOND}. The value of {@code INSTANT_SECONDS} * may be outside the maximum range of {@code LocalDateTime}. *

* The {@linkplain ResolverStyle resolver style} has no effect on instant parsing. diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java --- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Fri Aug 05 12:03:58 2016 -0700 @@ -30,7 +30,7 @@ import java.lang.reflect.*; import java.io.Serializable; import java.util.*; -import java.util.stream.Collectors; +import java.util.stream.*; import java.security.AccessController; import java.security.PrivilegedAction; @@ -163,47 +163,167 @@ */ private static String memberValueToString(Object value) { Class type = value.getClass(); - if (!type.isArray()) { // primitive, string, class, enum const, - // or annotation + if (!type.isArray()) { + // primitive value, string, class, enum const, or annotation if (type == Class.class) - return classValueToString((Class) value); + return toSourceString((Class) value); + else if (type == String.class) + return toSourceString((String) value); + if (type == Character.class) + return toSourceString((char) value); + else if (type == Double.class) + return toSourceString((double) value); + else if (type == Float.class) + return toSourceString((float) value); + else if (type == Long.class) + return toSourceString((long) value); else return value.toString(); - } + } else { + Stream stringStream; + if (type == byte[].class) + stringStream = convert((byte[]) value); + else if (type == char[].class) + stringStream = convert((char[]) value); + else if (type == double[].class) + stringStream = DoubleStream.of((double[]) value) + .mapToObj(AnnotationInvocationHandler::toSourceString); + else if (type == float[].class) + stringStream = convert((float[]) value); + else if (type == int[].class) + stringStream = IntStream.of((int[]) value).mapToObj(String::valueOf); + else if (type == long[].class) { + stringStream = LongStream.of((long[]) value) + .mapToObj(AnnotationInvocationHandler::toSourceString); + } else if (type == short[].class) + stringStream = convert((short[]) value); + else if (type == boolean[].class) + stringStream = convert((boolean[]) value); + else if (type == Class[].class) + stringStream = + Arrays.stream((Class[]) value). + map(AnnotationInvocationHandler::toSourceString); + else if (type == String[].class) + stringStream = + Arrays.stream((String[])value). + map(AnnotationInvocationHandler::toSourceString); + else + stringStream = Arrays.stream((Object[])value).map(Objects::toString); - if (type == byte[].class) - return Arrays.toString((byte[]) value); - if (type == char[].class) - return Arrays.toString((char[]) value); - if (type == double[].class) - return Arrays.toString((double[]) value); - if (type == float[].class) - return Arrays.toString((float[]) value); - if (type == int[].class) - return Arrays.toString((int[]) value); - if (type == long[].class) - return Arrays.toString((long[]) value); - if (type == short[].class) - return Arrays.toString((short[]) value); - if (type == boolean[].class) - return Arrays.toString((boolean[]) value); - if (type == Class[].class) - return classArrayValueToString((Class[])value); - return Arrays.toString((Object[]) value); + return stringStreamToString(stringStream); + } } /** * Translates a Class value to a form suitable for use in the * string representation of an annotation. */ - private static String classValueToString(Class clazz) { - return clazz.getName() + ".class" ; + private static String toSourceString(Class clazz) { + Class finalComponent = clazz; + StringBuilder arrayBackets = new StringBuilder(); + + while(finalComponent.isArray()) { + finalComponent = finalComponent.getComponentType(); + arrayBackets.append("[]"); + } + + return finalComponent.getName() + arrayBackets.toString() + ".class" ; + } + + private static String toSourceString(float f) { + if (Float.isFinite(f)) + return Float.toString(f) + "f" ; + else { + if (Float.isInfinite(f)) { + return (f < 0.0f) ? "-1.0f/0.0f": "1.0f/0.0f"; + } else + return "0.0f/0.0f"; + } + } + + private static String toSourceString(double d) { + if (Double.isFinite(d)) + return Double.toString(d); + else { + if (Double.isInfinite(d)) { + return (d < 0.0f) ? "-1.0/0.0": "1.0/0.0"; + } else + return "0.0/0.0"; + } + } + + private static String toSourceString(char c) { + StringBuilder sb = new StringBuilder(); + sb.append("'"); + if (c == '\'') + sb.append("\\'"); + else + sb.append(c); + sb.append("'"); + return sb.toString(); + } + + private static String toSourceString(long ell) { + return (Math.abs(ell) <= Integer.MAX_VALUE) ? + String.valueOf(ell) : + (String.valueOf(ell) + "L"); } - private static String classArrayValueToString(Class[] classes) { - return Arrays.stream(classes) - .map(AnnotationInvocationHandler::classValueToString) - .collect(Collectors.joining(", ", "{", "}")); + /** + * Return a string suitable for use in the string representation + * of an annotation. + */ + private static String toSourceString(String s) { + StringBuilder sb = new StringBuilder(); + sb.append('"'); + // Escape embedded quote characters, if present, but don't do + // anything more heroic. + if (s.indexOf('"') != -1) { + s = s.replace("\"", "\\\""); + } + sb.append(s); + sb.append('"'); + return sb.toString(); + } + + private static Stream convert(byte[] values) { + List list = new ArrayList<>(values.length); + for (byte b : values) + list.add(Byte.toString(b)); + return list.stream(); + } + + private static Stream convert(char[] values) { + List list = new ArrayList<>(values.length); + for (char c : values) + list.add(toSourceString(c)); + return list.stream(); + } + + private static Stream convert(float[] values) { + List list = new ArrayList<>(values.length); + for (float f : values) { + list.add(toSourceString(f)); + } + return list.stream(); + } + + private static Stream convert(short[] values) { + List list = new ArrayList<>(values.length); + for (short s : values) + list.add(Short.toString(s)); + return list.stream(); + } + + private static Stream convert(boolean[] values) { + List list = new ArrayList<>(values.length); + for (boolean b : values) + list.add(Boolean.toString(b)); + return list.stream(); + } + + private static String stringStreamToString(Stream stream) { + return stream.collect(Collectors.joining(", ", "{", "}")); } /** diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java --- a/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java Fri Aug 05 12:03:58 2016 -0700 @@ -28,16 +28,12 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Locale.*; import static java.util.Locale.FilteringMode.*; import static java.util.Locale.LanguageRange.*; import java.util.Map; -import java.util.Set; /** * Implementation for BCP47 Locale matching @@ -111,10 +107,22 @@ private static List filterBasic(List priorityList, Collection tags) { + int splitIndex = splitRanges(priorityList); + List nonZeroRanges; + List zeroRanges; + if (splitIndex != -1) { + nonZeroRanges = priorityList.subList(0, splitIndex); + zeroRanges = priorityList.subList(splitIndex, priorityList.size()); + } else { + nonZeroRanges = priorityList; + zeroRanges = List.of(); + } + List list = new ArrayList<>(); - for (LanguageRange lr : priorityList) { + for (LanguageRange lr : nonZeroRanges) { String range = lr.getRange(); if (range.equals("*")) { + tags = removeTagsMatchingBasicZeroRange(zeroRanges, tags); return new ArrayList(tags); } else { for (String tag : tags) { @@ -122,7 +130,8 @@ if (tag.startsWith(range)) { int len = range.length(); if ((tag.length() == len || tag.charAt(len) == '-') - && !list.contains(tag)) { + && !list.contains(tag) + && !shouldIgnoreFilterBasicMatch(zeroRanges, tag)) { list.add(tag); } } @@ -133,12 +142,76 @@ return list; } + /** + * Removes the tag(s) which are falling in the basic exclusion range(s) i.e + * range(s) with q=0 and returns the updated collection. If the basic + * language ranges contains '*' as one of its non zero range then instead of + * returning all the tags, remove those which are matching the range with + * quality weight q=0. + */ + private static Collection removeTagsMatchingBasicZeroRange( + List zeroRange, Collection tags) { + if (zeroRange.isEmpty()) { + return tags; + } + + List matchingTags = new ArrayList<>(); + for (String tag : tags) { + tag = tag.toLowerCase(Locale.ROOT); + if (!shouldIgnoreFilterBasicMatch(zeroRange, tag)) { + matchingTags.add(tag); + } + } + + return matchingTags; + } + + /** + * The tag which is falling in the basic exclusion range(s) should not + * be considered as the matching tag. Ignores the tag matching with the + * non-zero ranges, if the tag also matches with one of the basic exclusion + * ranges i.e. range(s) having quality weight q=0 + */ + private static boolean shouldIgnoreFilterBasicMatch( + List zeroRange, String tag) { + if (zeroRange.isEmpty()) { + return false; + } + + for (LanguageRange lr : zeroRange) { + String range = lr.getRange(); + if (range.equals("*")) { + return true; + } + if (tag.startsWith(range)) { + int len = range.length(); + if ((tag.length() == len || tag.charAt(len) == '-')) { + return true; + } + } + } + + return false; + } + private static List filterExtended(List priorityList, Collection tags) { + int splitIndex = splitRanges(priorityList); + List nonZeroRanges; + List zeroRanges; + if (splitIndex != -1) { + nonZeroRanges = priorityList.subList(0, splitIndex); + zeroRanges = priorityList.subList(splitIndex, priorityList.size()); + } else { + nonZeroRanges = priorityList; + zeroRanges = List.of(); + } + List list = new ArrayList<>(); - for (LanguageRange lr : priorityList) { + for (LanguageRange lr : nonZeroRanges) { String range = lr.getRange(); if (range.equals("*")) { + tags = removeTagsMatchingExtendedZeroRange(zeroRanges, tags); return new ArrayList(tags); } String[] rangeSubtags = range.split("-"); @@ -150,33 +223,101 @@ continue; } - int rangeIndex = 1; - int tagIndex = 1; - - while (rangeIndex < rangeSubtags.length - && tagIndex < tagSubtags.length) { - if (rangeSubtags[rangeIndex].equals("*")) { - rangeIndex++; - } else if (rangeSubtags[rangeIndex].equals(tagSubtags[tagIndex])) { - rangeIndex++; - tagIndex++; - } else if (tagSubtags[tagIndex].length() == 1 - && !tagSubtags[tagIndex].equals("*")) { - break; - } else { - tagIndex++; - } - } - - if (rangeSubtags.length == rangeIndex && !list.contains(tag)) { - list.add(tag); - } + int rangeIndex = matchFilterExtendedSubtags(rangeSubtags, + tagSubtags); + if (rangeSubtags.length == rangeIndex && !list.contains(tag) + && !shouldIgnoreFilterExtendedMatch(zeroRanges, tag)) { + list.add(tag); + } } } return list; } + /** + * Removes the tag(s) which are falling in the extended exclusion range(s) + * i.e range(s) with q=0 and returns the updated collection. If the extended + * language ranges contains '*' as one of its non zero range then instead of + * returning all the tags, remove those which are matching the range with + * quality weight q=0. + */ + private static Collection removeTagsMatchingExtendedZeroRange( + List zeroRange, Collection tags) { + if (zeroRange.isEmpty()) { + return tags; + } + + List matchingTags = new ArrayList<>(); + for (String tag : tags) { + tag = tag.toLowerCase(Locale.ROOT); + if (!shouldIgnoreFilterExtendedMatch(zeroRange, tag)) { + matchingTags.add(tag); + } + } + + return matchingTags; + } + + /** + * The tag which is falling in the extended exclusion range(s) should + * not be considered as the matching tag. Ignores the tag matching with the + * non zero range(s), if the tag also matches with one of the extended + * exclusion range(s) i.e. range(s) having quality weight q=0 + */ + private static boolean shouldIgnoreFilterExtendedMatch( + List zeroRange, String tag) { + if (zeroRange.isEmpty()) { + return false; + } + + String[] tagSubtags = tag.split("-"); + for (LanguageRange lr : zeroRange) { + String range = lr.getRange(); + if (range.equals("*")) { + return true; + } + + String[] rangeSubtags = range.split("-"); + + if (!rangeSubtags[0].equals(tagSubtags[0]) + && !rangeSubtags[0].equals("*")) { + continue; + } + + int rangeIndex = matchFilterExtendedSubtags(rangeSubtags, + tagSubtags); + if (rangeSubtags.length == rangeIndex) { + return true; + } + } + + return false; + } + + private static int matchFilterExtendedSubtags(String[] rangeSubtags, + String[] tagSubtags) { + int rangeIndex = 1; + int tagIndex = 1; + + while (rangeIndex < rangeSubtags.length + && tagIndex < tagSubtags.length) { + if (rangeSubtags[rangeIndex].equals("*")) { + rangeIndex++; + } else if (rangeSubtags[rangeIndex] + .equals(tagSubtags[tagIndex])) { + rangeIndex++; + tagIndex++; + } else if (tagSubtags[tagIndex].length() == 1 + && !tagSubtags[tagIndex].equals("*")) { + break; + } else { + tagIndex++; + } + } + return rangeIndex; + } + public static Locale lookup(List priorityList, Collection locales) { if (priorityList.isEmpty() || locales.isEmpty()) { @@ -205,7 +346,18 @@ return null; } - for (LanguageRange lr : priorityList) { + int splitIndex = splitRanges(priorityList); + List nonZeroRanges; + List zeroRanges; + if (splitIndex != -1) { + nonZeroRanges = priorityList.subList(0, splitIndex); + zeroRanges = priorityList.subList(splitIndex, priorityList.size()); + } else { + nonZeroRanges = priorityList; + zeroRanges = List.of(); + } + + for (LanguageRange lr : nonZeroRanges) { String range = lr.getRange(); // Special language range ("*") is ignored in lookup. @@ -217,31 +369,83 @@ while (rangeForRegex.length() > 0) { for (String tag : tags) { tag = tag.toLowerCase(Locale.ROOT); - if (tag.matches(rangeForRegex)) { + if (tag.matches(rangeForRegex) + && !shouldIgnoreLookupMatch(zeroRanges, tag)) { return tag; } } // Truncate from the end.... - int index = rangeForRegex.lastIndexOf('-'); - if (index >= 0) { - rangeForRegex = rangeForRegex.substring(0, index); - - // if range ends with an extension key, truncate it. - index = rangeForRegex.lastIndexOf('-'); - if (index >= 0 && index == rangeForRegex.length()-2) { - rangeForRegex = - rangeForRegex.substring(0, rangeForRegex.length()-2); - } - } else { - rangeForRegex = ""; - } + rangeForRegex = truncateRange(rangeForRegex); } } return null; } + /** + * The tag which is falling in the exclusion range(s) should not be + * considered as the matching tag. Ignores the tag matching with the + * non zero range(s), if the tag also matches with one of the exclusion + * range(s) i.e. range(s) having quality weight q=0. + */ + private static boolean shouldIgnoreLookupMatch(List zeroRange, + String tag) { + for (LanguageRange lr : zeroRange) { + String range = lr.getRange(); + + // Special language range ("*") is ignored in lookup. + if (range.equals("*")) { + continue; + } + + String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*"); + while (rangeForRegex.length() > 0) { + if (tag.matches(rangeForRegex)) { + return true; + } + // Truncate from the end.... + rangeForRegex = truncateRange(rangeForRegex); + } + } + + return false; + } + + /* Truncate the range from end during the lookup match */ + private static String truncateRange(String rangeForRegex) { + int index = rangeForRegex.lastIndexOf('-'); + if (index >= 0) { + rangeForRegex = rangeForRegex.substring(0, index); + + // if range ends with an extension key, truncate it. + index = rangeForRegex.lastIndexOf('-'); + if (index >= 0 && index == rangeForRegex.length() - 2) { + rangeForRegex + = rangeForRegex.substring(0, rangeForRegex.length() - 2); + } + } else { + rangeForRegex = ""; + } + + return rangeForRegex; + } + + /* Returns the split index of the priority list, if it contains + * language range(s) with quality weight as 0 i.e. q=0, else -1 + */ + private static int splitRanges(List priorityList) { + int size = priorityList.size(); + for (int index = 0; index < size; index++) { + LanguageRange range = priorityList.get(index); + if (range.getWeight() == 0) { + return index; + } + } + + return -1; // no q=0 range exists + } + public static List parse(String ranges) { ranges = ranges.replaceAll(" ", "").toLowerCase(Locale.ROOT); if (ranges.startsWith("accept-language:")) { diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/solaris/lib/security/default.policy --- a/jdk/src/java.base/solaris/lib/security/default.policy Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.base/solaris/lib/security/default.policy Fri Aug 05 12:03:58 2016 -0700 @@ -11,6 +11,6 @@ "clearProviderProperties.OracleUcrypto"; permission java.security.SecurityPermission "removeProviderProperty.OracleUcrypto"; - permission java.io.FilePermission - "${java.home}/conf/security/ucrypto-solaris.cfg", "read"; + // Needed for reading Ucrypto config file + permission java.io.FilePermission "<>", "read"; }; diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.base/unix/native/libjava/TimeZone_md.c --- a/jdk/src/java.base/unix/native/libjava/TimeZone_md.c Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.base/unix/native/libjava/TimeZone_md.c Fri Aug 05 12:03:58 2016 -0700 @@ -44,6 +44,12 @@ #define SKIP_SPACE(p) while (*p == ' ' || *p == '\t') p++; +#define RESTARTABLE(_cmd, _result) do { \ + do { \ + _result = _cmd; \ + } while((_result == -1) && (errno == EINTR)); \ +} while(0) + #if defined(_ALLBSD_SOURCE) #define dirent64 dirent #define readdir64_r readdir_r @@ -121,6 +127,7 @@ int fd = -1; char *dbuf = NULL; char *tz = NULL; + int res; dirp = opendir(dir); if (dirp == NULL) { @@ -161,7 +168,8 @@ if (pathname == NULL) { break; } - if (stat(pathname, &statbuf) == -1) { + RESTARTABLE(stat(pathname, &statbuf), res); + if (res == -1) { break; } @@ -175,10 +183,12 @@ if (dbuf == NULL) { break; } - if ((fd = open(pathname, O_RDONLY)) == -1) { + RESTARTABLE(open(pathname, O_RDONLY), fd); + if (fd == -1) { break; } - if (read(fd, dbuf, size) != (ssize_t) size) { + RESTARTABLE(read(fd, dbuf, size), res); + if (res != (ssize_t) size) { break; } if (memcmp(buf, dbuf, size) == 0) { @@ -230,6 +240,7 @@ int fd; char *buf; size_t size; + int res; #if defined(__linux__) /* @@ -260,7 +271,8 @@ /* * Next, try /etc/localtime to find the zone ID. */ - if (lstat(DEFAULT_ZONEINFO_FILE, &statbuf) == -1) { + RESTARTABLE(lstat(DEFAULT_ZONEINFO_FILE, &statbuf), res); + if (res == -1) { return NULL; } @@ -294,10 +306,13 @@ * If initial symbolic link resolution failed, we should treat target * file as a regular file. */ - if ((fd = open(DEFAULT_ZONEINFO_FILE, O_RDONLY)) == -1) { + RESTARTABLE(open(DEFAULT_ZONEINFO_FILE, O_RDONLY), fd); + if (fd == -1) { return NULL; } - if (fstat(fd, &statbuf) == -1) { + + RESTARTABLE(fstat(fd, &statbuf), res); + if (res == -1) { (void) close(fd); return NULL; } @@ -308,7 +323,8 @@ return NULL; } - if (read(fd, buf, size) != (ssize_t) size) { + RESTARTABLE(read(fd, buf, size), res); + if (res != (ssize_t) size) { (void) close(fd); free((void *) buf); return NULL; @@ -372,7 +388,8 @@ /* * It assumes read open. */ - if ((fd = open(fname, O_RDONLY)) == -1) { + RESTARTABLE(open(fname, O_RDONLY), fd); + if (fd == -1) { return NULL; } @@ -420,7 +437,8 @@ if (iop->ptr == iop->endptr) { ssize_t len; - if ((len = read(iop->fd, (void *)iop->buffer, BUFFER_SIZE)) == -1) { + RESTARTABLE(read(iop->fd, (void *)iop->buffer, BUFFER_SIZE), len); + if (len == -1) { return NULL; } if (len == 0) { @@ -558,6 +576,7 @@ size_t size; char *buf; int fd; + int res; /* scf specific variables */ scf_handle_t *h = NULL; scf_snapshot_t *snap = NULL; @@ -593,7 +612,8 @@ } cleanupScf(h, snap, inst, pg, prop, val, tz); - if (stat(DEFAULT_ZONEINFO_FILE, &statbuf) == -1) { + RESTARTABLE(stat(DEFAULT_ZONEINFO_FILE, &statbuf), res); + if (res == -1) { return NULL; } size = (size_t) statbuf.st_size; @@ -601,12 +621,14 @@ if (buf == NULL) { return NULL; } - if ((fd = open(DEFAULT_ZONEINFO_FILE, O_RDONLY)) == -1) { + RESTARTABLE(open(DEFAULT_ZONEINFO_FILE, O_RDONLY), fd); + if (fd == -1) { free((void *) buf); return NULL; } - if (read(fd, buf, size) != (ssize_t) size) { + RESTARTABLE(read(fd, buf, size), res); + if (res != (ssize_t) size) { (void) close(fd); free((void *) buf); return NULL; diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.desktop/share/classes/javax/swing/event/TableModelEvent.java --- a/jdk/src/java.desktop/share/classes/javax/swing/event/TableModelEvent.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.desktop/share/classes/javax/swing/event/TableModelEvent.java Fri Aug 05 12:03:58 2016 -0700 @@ -177,7 +177,7 @@ * @param lastRow the last row affected by this event * @param column the column index of cells changed; {@code ALL_COLUMNS} * signifies all cells in the specified range of rows are changed. - * @param type the type of change signified by this even, @code INSERT}, + * @param type the type of change signified by this even, {@code INSERT}, * {@code DELETE } or {@code UPDATE} */ public TableModelEvent(TableModel source, int firstRow, int lastRow, int column, int type) { diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.desktop/share/classes/sun/java2d/pipe/RenderingEngine.java --- a/jdk/src/java.desktop/share/classes/sun/java2d/pipe/RenderingEngine.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.desktop/share/classes/sun/java2d/pipe/RenderingEngine.java Fri Aug 05 12:03:58 2016 -0700 @@ -297,7 +297,7 @@ * If {@code lw1} and {@code lw2} are both greater than zero, then * the parallelogram figure is doubled by both expanding and contracting * each delta vector by its corresponding {@code lw} value. - * If either (@code lw1) or {@code lw2} are also greater than 1, then + * If either {@code lw1} or {@code lw2} are also greater than 1, then * the inner (contracted) parallelogram disappears and the figure is * simply a single expanded parallelogram. * The {@code clip} parameter specifies the current clip in effect diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/java.security.jgss/share/classes/sun/security/jgss/spi/GSSContextSpi.java --- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/spi/GSSContextSpi.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/spi/GSSContextSpi.java Fri Aug 05 12:03:58 2016 -0700 @@ -395,7 +395,7 @@ public void dispose() throws GSSException; /** - * Return the mechanism-specific attribute associated with (@code type}. + * Return the mechanism-specific attribute associated with {@code type}. * * @param type the type of the attribute requested * @return the attribute diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java Fri Aug 05 12:03:58 2016 -0700 @@ -34,6 +34,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.UncheckedIOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UncheckedIOException; @@ -55,11 +56,11 @@ import java.util.Properties; import java.util.Set; import jdk.tools.jlink.internal.BasicImageWriter; -import jdk.tools.jlink.internal.plugins.FileCopierPlugin; import jdk.tools.jlink.internal.plugins.FileCopierPlugin.SymImageFile; import jdk.tools.jlink.internal.ExecutableImage; import jdk.tools.jlink.plugin.ResourcePool; import jdk.tools.jlink.plugin.ResourcePoolEntry; +import jdk.tools.jlink.plugin.ResourcePoolModule; import jdk.tools.jlink.plugin.PluginException; /** @@ -144,14 +145,12 @@ Files.createDirectories(mdir); } - private void storeFiles(Set modules, Map release) throws IOException { + private void storeFiles(Set modules, Properties release) throws IOException { if (release != null) { - Properties props = new Properties(); - props.putAll(release); - addModules(props, modules); + addModules(release, modules); File r = new File(root.toFile(), "release"); try (FileOutputStream fo = new FileOutputStream(r)) { - props.store(fo, null); + release.store(fo, null); } } } @@ -184,14 +183,10 @@ files.moduleView().modules().forEach(m -> { // Only add modules that contain packages if (!m.packages().isEmpty()) { - // Skip the fake module used by FileCopierPlugin when copying files. - if (m.name().equals(FileCopierPlugin.FAKE_MODULE)) { - return; - } modules.add(m.name()); } }); - storeFiles(modules, files.releaseProperties()); + storeFiles(modules, releaseProperties(files)); if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) { // launchers in the bin directory need execute permission @@ -219,6 +214,28 @@ } } + private Properties releaseProperties(ResourcePool pool) throws IOException { + Properties props = new Properties(); + Optional javaBase = pool.moduleView().findModule("java.base"); + javaBase.ifPresent(mod -> { + // fill release information available from transformed "java.base" module! + ModuleDescriptor desc = mod.descriptor(); + desc.osName().ifPresent(s -> props.setProperty("OS_NAME", s)); + desc.osVersion().ifPresent(s -> props.setProperty("OS_VERSION", s)); + desc.osArch().ifPresent(s -> props.setProperty("OS_ARCH", s)); + props.setProperty("JAVA_VERSION", System.getProperty("java.version")); + }); + + Optional release = pool.findEntry("/java.base/release"); + if (release.isPresent()) { + try (InputStream is = release.get().content()) { + props.load(is); + } + } + + return props; + } + /** * Generates launcher scripts. * @@ -317,6 +334,8 @@ case CONFIG: writeEntry(in, destFile("conf", filename)); break; + case TOP: + break; case OTHER: if (file instanceof SymImageFile) { SymImageFile sym = (SymImageFile) file; diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java Fri Aug 05 12:03:58 2016 -0700 @@ -279,6 +279,8 @@ private class LastModule implements ResourcePoolModule { final ResourcePoolModule module; + // lazily initialized + ModuleDescriptor descriptor; LastModule(ResourcePoolModule module) { this.module = module; @@ -297,7 +299,10 @@ @Override public ModuleDescriptor descriptor() { - return module.descriptor(); + if (descriptor == null) { + descriptor = ResourcePoolManager.readModuleDescriptor(this); + } + return descriptor; } @Override @@ -420,11 +425,6 @@ return pool.byteOrder(); } - @Override - public Map releaseProperties() { - return pool.releaseProperties(); - } - private ResourcePoolEntry getUncompressed(ResourcePoolEntry res) { if (res != null) { if (res instanceof ResourcePoolManager.CompressedModuleData) { @@ -458,18 +458,6 @@ throws Exception { Objects.requireNonNull(original); Objects.requireNonNull(transformed); - Optional javaBase = transformed.moduleView().findModule("java.base"); - javaBase.ifPresent(mod -> { - try { - Map release = transformed.releaseProperties(); - // fill release information available from transformed "java.base" module! - ModuleDescriptor desc = mod.descriptor(); - desc.osName().ifPresent(s -> release.put("OS_NAME", s)); - desc.osVersion().ifPresent(s -> release.put("OS_VERSION", s)); - desc.osArch().ifPresent(s -> release.put("OS_ARCH", s)); - } catch (Exception ignored) {} - }); - imageBuilder.storeFiles(new LastPoolManager(transformed).resourcePool()); } diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java Fri Aug 05 12:03:58 2016 -0700 @@ -50,10 +50,22 @@ * A manager for pool of resources. */ public class ResourcePoolManager { + // utility to read ModuleDescriptor of the given ResourcePoolModule + static ModuleDescriptor readModuleDescriptor(ResourcePoolModule mod) { + String p = "/" + mod.name() + "/module-info.class"; + Optional content = mod.findEntry(p); + if (!content.isPresent()) { + throw new PluginException("No module-info for " + mod.name() + + " module"); + } + ByteBuffer bb = ByteBuffer.wrap(content.get().contentBytes()); + return ModuleDescriptor.read(bb); + } class ResourcePoolModuleImpl implements ResourcePoolModule { final Map moduleContent = new LinkedHashMap<>(); + // lazily initialized private ModuleDescriptor descriptor; final String name; @@ -80,14 +92,7 @@ @Override public ModuleDescriptor descriptor() { if (descriptor == null) { - String p = "/" + name + "/module-info.class"; - Optional content = findEntry(p); - if (!content.isPresent()) { - throw new PluginException("No module-info for " + name - + " module"); - } - ByteBuffer bb = ByteBuffer.wrap(content.get().contentBytes()); - descriptor = ModuleDescriptor.read(bb); + descriptor = readModuleDescriptor(this); } return descriptor; } @@ -166,11 +171,6 @@ return ResourcePoolManager.this.byteOrder(); } - @Override - public Map releaseProperties() { - return ResourcePoolManager.this.releaseProperties(); - } - public StringTable getStringTable() { return ResourcePoolManager.this.getStringTable(); } @@ -213,8 +213,6 @@ private final Map resources = new LinkedHashMap<>(); private final Map modules = new LinkedHashMap<>(); - private final ResourcePoolModuleImpl fileCopierModule = new ResourcePoolModuleImpl(FileCopierPlugin.FAKE_MODULE); - private Map releaseProps = new HashMap<>(); private final ByteOrder order; private final StringTable table; private final ResourcePool poolImpl; @@ -273,11 +271,6 @@ } String modulename = data.moduleName(); ResourcePoolModuleImpl m = (ResourcePoolModuleImpl)modules.get(modulename); - // ## TODO: FileCopierPlugin should not add content to a module - // FAKE_MODULE is not really a module to be added in the image - if (FileCopierPlugin.FAKE_MODULE.equals(modulename)) { - m = fileCopierModule; - } if (m == null) { m = new ResourcePoolModuleImpl(modulename); modules.put(modulename, m); @@ -391,10 +384,6 @@ return order; } - public Map releaseProperties() { - return releaseProps; - } - public StringTable getStringTable() { return table; } diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java Fri Aug 05 12:03:58 2016 -0700 @@ -38,6 +38,7 @@ import jdk.tools.jlink.plugin.Plugin; import jdk.tools.jlink.plugin.ResourcePool; import jdk.tools.jlink.plugin.ResourcePoolBuilder; +import jdk.tools.jlink.plugin.ResourcePoolModule; import jdk.tools.jlink.plugin.ResourcePoolEntry; import jdk.tools.jlink.plugin.PluginException; @@ -98,9 +99,8 @@ * e.g.: /java.base/native/amd64/server/libjvm.so * /java.base/native/server/libjvm.dylib */ - private List getVMs(ResourcePool in) { - String jvmlib = jvmlib(); - List ret = in.moduleView().findModule("java.base").get().entries().filter((t) -> { + private List getVMs(ResourcePoolModule javaBase, String jvmlib) { + List ret = javaBase.entries().filter((t) -> { return t.path().endsWith("/" + jvmlib); }).collect(Collectors.toList()); return ret; @@ -108,12 +108,13 @@ @Override public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { - String jvmlib = jvmlib(); + ResourcePoolModule javaBase = in.moduleView().findModule("java.base").get(); + String jvmlib = jvmlib(javaBase.descriptor().osName().get()); TreeSet existing = new TreeSet<>(new JvmComparator()); TreeSet removed = new TreeSet<>(new JvmComparator()); if (!keepAll) { // First retrieve all available VM names and removed VM - List jvms = getVMs(in); + List jvms = getVMs(javaBase, jvmlib); for (Jvm jvm : Jvm.values()) { for (ResourcePoolEntry md : jvms) { if (md.path().endsWith("/" + jvm.getName() + "/" + jvmlib)) { @@ -247,21 +248,21 @@ return orig.copyWithContent(content); } - private static String jvmlib() { + private static String jvmlib(String osName) { String lib = "libjvm.so"; - if (isWindows()) { + if (isWindows(osName)) { lib = "jvm.dll"; - } else if (isMac()) { + } else if (isMac(osName)) { lib = "libjvm.dylib"; } return lib; } - private static boolean isWindows() { - return System.getProperty("os.name").startsWith("Windows"); + private static boolean isWindows(String osName) { + return osName.startsWith("Windows"); } - private static boolean isMac() { - return System.getProperty("os.name").startsWith("Mac OS"); + private static boolean isMac(String osName) { + return osName.startsWith("Mac OS") || osName.startsWith("Darwin"); } } diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java Fri Aug 05 12:03:58 2016 -0700 @@ -58,8 +58,6 @@ Path source; Path target; } - public static final String FAKE_MODULE = "$jlink-file-copier"; - private final List files = new ArrayList<>(); /** @@ -159,7 +157,7 @@ Objects.requireNonNull(file); Objects.requireNonNull(path); ResourcePoolEntry impl = ResourcePoolEntry.create( - "/" + FAKE_MODULE + "/other/" + path, + "/java.base/other/" + path, ResourcePoolEntry.Type.OTHER, file); try { pool.add(impl); diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Fri Aug 05 12:03:58 2016 -0700 @@ -31,6 +31,7 @@ import java.util.Locale; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import static java.util.ResourceBundle.Control; import java.util.Set; @@ -342,9 +343,8 @@ // locales from the pre-filtered list. locales.stream() .filter(l -> l.toString().equalsIgnoreCase(loc.toString())) - .findAny() - .orElse(Locale.ROOT)) - .filter(loc -> !loc.equals(Locale.ROOT)) + .findAny()) + .flatMap(Optional::stream) .flatMap(IncludeLocalesPlugin::localeToTags) .distinct() .collect(Collectors.toList()); @@ -373,40 +373,42 @@ } private static Stream localeToTags(Locale loc) { + Objects.requireNonNull(loc); + String tag = loc.toLanguageTag(); - Stream ret = null; + List tags = null; switch (loc.getLanguage()) { // ISO3166 compatibility case "iw": - ret = List.of(tag, tag.replaceFirst("^he", "iw")).stream(); + tags = List.of(tag, tag.replaceFirst("^he", "iw")); break; case "in": - ret = List.of(tag, tag.replaceFirst("^id", "in")).stream(); + tags = List.of(tag, tag.replaceFirst("^id", "in")); break; case "ji": - ret = List.of(tag, tag.replaceFirst("^yi", "ji")).stream(); + tags = List.of(tag, tag.replaceFirst("^yi", "ji")); break; // Special COMPAT provider locales case "ja": if (loc.getCountry() == "JP") { - ret = List.of(tag, jaJPJPTag).stream(); + tags = List.of(tag, jaJPJPTag); } break; case "no": case "nn": if (loc.getCountry() == "NO") { - ret = List.of(tag, noNONYTag).stream(); + tags = List.of(tag, noNONYTag); } break; case "th": if (loc.getCountry() == "TH") { - ret = List.of(tag, thTHTHTag).stream(); + tags = List.of(tag, thTHTHTag); } break; } - return ret == null ? List.of(tag).stream() : ret; + return tags == null ? List.of(tag).stream() : tags.stream(); } } diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java Fri Aug 05 12:03:58 2016 -0700 @@ -24,17 +24,23 @@ */ package jdk.tools.jlink.internal.plugins; +import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; +import java.io.UncheckedIOException; +import java.lang.module.ModuleDescriptor; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.Properties; import java.util.Set; import java.util.function.Function; import jdk.tools.jlink.internal.Utils; import jdk.tools.jlink.plugin.ResourcePool; import jdk.tools.jlink.plugin.ResourcePoolBuilder; +import jdk.tools.jlink.plugin.ResourcePoolEntry; +import jdk.tools.jlink.plugin.ResourcePoolModule; import jdk.tools.jlink.plugin.Plugin.Category; import jdk.tools.jlink.plugin.Plugin.State; import jdk.tools.jlink.plugin.Plugin; @@ -119,7 +125,23 @@ @Override public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { - in.releaseProperties().putAll(release); - return in; + in.transformAndCopy(Function.identity(), out); + + // create a TOP level ResourcePoolEntry for "release" file. + out.add(ResourcePoolEntry.create("/java.base/release", + ResourcePoolEntry.Type.TOP, releaseFileContent())); + return out.build(); + } + + private byte[] releaseFileContent() { + Properties props = new Properties(); + props.putAll(release); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + props.store(baos, ""); + return baos.toByteArray(); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } } } diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePool.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePool.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePool.java Fri Aug 05 12:03:58 2016 -0700 @@ -95,13 +95,6 @@ public ByteOrder byteOrder(); /** - * Release properties such as OS, CPU name, version etc. - * - * @return the release properties - */ - public Map releaseProperties(); - - /** * Visit each ResourcePoolEntry in this ResourcePool to transform it and copy * the transformed ResourcePoolEntry to the output ResourcePoolBuilder. * diff -r 8b413b0e064c -r 592a43ff92cd jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePoolEntry.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePoolEntry.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePoolEntry.java Fri Aug 05 12:03:58 2016 -0700 @@ -41,6 +41,7 @@ *

    *
  • For jimage content: /{module name}/{package1}/.../{packageN}/{file * name}
  • + *
  • For top-level files:/{module name}/{file name}
  • *
  • For other files (shared lib, launchers, config, ...):/{module name}/ * {@literal bin|conf|native}/{dir1}/.../{dirN}/{file name}
  • *
@@ -54,6 +55,7 @@ *
    CONFIG: A configuration file.
*
    NATIVE_CMD: A native process launcher.
*
    NATIVE_LIB: A native library.
+ *
    TOP: A top-level file in the jdk run-time image directory.
*
    OTHER: Other kind of file.
* */ @@ -62,6 +64,7 @@ CONFIG, NATIVE_CMD, NATIVE_LIB, + TOP, OTHER } diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/ProblemList.txt Fri Aug 05 12:03:58 2016 -0700 @@ -315,7 +315,7 @@ ############################################################################ -# jdk_tools +# core_tools tools/pack200/CommandLineTests.java 7143279,8059906 generic-all @@ -365,20 +365,14 @@ sun/tools/jcmd/TestJcmdSanity.java 8031482 windows-all -sun/tools/jmap/heapconfig/JMapHeapConfigTest.java 8072131,8132452 generic-all - sun/tools/jstatd/TestJstatdExternalRegistry.java 8046285 generic-all sun/tools/jps/TestJpsJar.java 8160923 generic-all sun/tools/jps/TestJpsJarRelative.java 6456333 generic-all -sun/tools/jinfo/JInfoRunningProcessFlagTest.java 6734748 generic-all - sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java 8057732 generic-all -sun/tools/jinfo/JInfoSanityTest.java 8059035 generic-all - demo/jvmti/compiledMethodLoad/CompiledMethodLoadTest.java 8151899 generic-all ############################################################################ @@ -388,9 +382,3 @@ com/sun/jndi/ldap/DeadSSLLdapTimeoutTest.java 8141370 linux-i586,macosx-all ############################################################################ - -# core_tools - -tools/jlink/JLinkOptimTest.java 8159264 generic-all - -############################################################################ diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/TEST.groups --- a/jdk/test/TEST.groups Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/TEST.groups Fri Aug 05 12:03:58 2016 -0700 @@ -27,7 +27,6 @@ tier1 = \ :jdk_lang \ - -java/lang/ProcessBuilder/Zombies.java \ :jdk_util \ -java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \ -java/util/concurrent/forkjoin/FJExceptionTableLeak.java \ @@ -38,7 +37,6 @@ tools/pack200 tier2 = \ - java/lang/ProcessBuilder/Zombies.java \ java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \ java/util/concurrent/forkjoin/FJExceptionTableLeak.java \ :jdk_io \ diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/java/lang/ProcessBuilder/Zombies.java --- a/jdk/test/java/lang/ProcessBuilder/Zombies.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/java/lang/ProcessBuilder/Zombies.java Fri Aug 05 12:03:58 2016 -0700 @@ -23,7 +23,8 @@ /* * @test - * @bug 6474073 + * @run main/othervm Zombies + * @bug 6474073 6180151 * @key intermittent * @summary Make sure zombies don't get created on Unix * @author Martin Buchholz @@ -65,22 +66,21 @@ Process p = rt.exec(TrueCommand); ProcessHandle pp = p.toHandle().parent().orElse(null); - System.out.printf("pid: %d, parent: %s%n", p.getPid(), pp); + System.out.printf("%s pid: %d, parent: %s%n", TrueCommand, p.getPid(), pp); p.waitFor(); // Count all the zombies that are children of this Java process final String[] zombieCounter = { "/usr/bin/perl", "-e", - "exit @{[`/bin/ps -eo ppid,s` =~ /^ *@{[getppid]} +Z$/mog]}" + "$a=`/bin/ps -eo ppid,pid,s,command`;" + + "print @b=$a=~/^ *@{[getppid]} +[0-9]+ +Z.*$/mog;" + + "exit @b" }; - int zombies = rt.exec(zombieCounter).waitFor(); + ProcessBuilder pb = new ProcessBuilder(zombieCounter); + pb.inheritIO(); + int zombies = pb.start().waitFor(); if (zombies != 0) { - // Log remaining processes - ProcessBuilder pb = new ProcessBuilder("/bin/ps", "-ef"); - pb.inheritIO(); - Process p2 = pb.start(); - p2.waitFor(); throw new Error(zombies + " zombies!"); } } diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/java/lang/Runtime/exec/LotsOfOutput.java --- a/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2016, 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,7 +25,6 @@ * @test * @bug 4369826 8078582 * @summary Process with lots of output should not crash VM - * @key intermittent * @author kladko */ diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/java/lang/annotation/AnnotationToStringTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/annotation/AnnotationToStringTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8162817 + * @summary Test of toString on normal annotations + */ + +import java.lang.annotation.*; +import java.lang.reflect.*; +import java.util.*; + +/** + * The expected string values are stored in @ExpectedString + * annotations. The essence of the test is comparing the toString() + * result of annotations to the corresponding ExpectedString.value(). + */ + +public class AnnotationToStringTest { + public static void main(String... args) throws Exception { + int failures = 0; + + failures += check(PrimHost.class.getAnnotation(ExpectedString.class).value(), + PrimHost.class.getAnnotation(MostlyPrimitive.class).toString()); + failures += classyTest(); + failures += arrayAnnotationTest(); + + if (failures > 0) + throw new RuntimeException(failures + " failures"); + } + + private static int check(String expected, String actual) { + if (!expected.equals(actual)) { + System.err.printf("ERROR: Expected ''%s'';%ngot ''%s''.\n", + expected, actual); + return 1; + } else + return 0; + } + + @ExpectedString( + "@MostlyPrimitive(c0='a', "+ + "c1='\\'', " + + "i0=1, " + + "i1=2, " + + "f0=1.0f, " + + "f1=0.0f/0.0f, " + + "d0=0.0, " + + "d1=1.0/0.0, " + + "l0=5, " + + "l1=9223372036854775807L, " + + "s0=\"Hello world.\", " + + "s1=\"a\\\"b\", " + + "class0=Obj[].class)") + @MostlyPrimitive( + c0='a', + c1='\'', + i0=1, + i1=2, + f0=1.0f, + f1=Float.NaN, + d0=0.0, + d1=2.0/0.0, + l0=5, + l1=Long.MAX_VALUE, + s0="Hello world.", + s1="a\"b", + class0=Obj[].class + ) + static class PrimHost{} + + private static int classyTest() { + int failures = 0; + for (Field f : AnnotationHost.class.getFields()) { + Annotation a = f.getAnnotation(Classy.class); + System.out.println(a); + failures += check(f.getAnnotation(ExpectedString.class).value(), + a.toString()); + } + return failures; + } + + static class AnnotationHost { + @ExpectedString( + "@Classy(value=Obj.class)") + @Classy(value=Obj.class) + public int f0; + + @ExpectedString( + "@Classy(value=Obj[].class)") + @Classy(value=Obj[].class) + public int f1; + + @ExpectedString( + "@Classy(value=Obj[][].class)") + @Classy(value=Obj[][].class) + public int f2; + + @ExpectedString( + "@Classy(value=Obj[][][].class)") + @Classy(value=Obj[][][].class) + public int f3; + + @ExpectedString( + "@Classy(value=int.class)") + @Classy(value=int.class) + public int f4; + + @ExpectedString( + "@Classy(value=int[][][].class)") + @Classy(value=int[][][].class) + public int f5; + } + + /** + * Each field should have two annotations, the first being + * @ExpectedString and the second the annotation under test. + */ + private static int arrayAnnotationTest() { + int failures = 0; + for (Field f : ArrayAnnotationHost.class.getFields()) { + Annotation[] annotations = f.getAnnotations(); + System.out.println(annotations[1]); + failures += check(((ExpectedString)annotations[0]).value(), + annotations[1].toString()); + } + return failures; + } + + static class ArrayAnnotationHost { + @ExpectedString( + "@BooleanArray(value={true, false, true})") + @BooleanArray(value={true, false, true}) + public boolean[] f0; + + @ExpectedString( + "@FloatArray(value={3.0f, 4.0f, 0.0f/0.0f, -1.0f/0.0f, 1.0f/0.0f})") + @FloatArray(value={3.0f, 4.0f, Float.NaN, Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY}) + public float[] f1; + + @ExpectedString( + "@DoubleArray(value={1.0, 2.0, 0.0/0.0, 1.0/0.0, -1.0/0.0})") + @DoubleArray(value={1.0, 2.0, Double.NaN, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY,}) + public double[] f2; + + @ExpectedString( + "@ByteArray(value={10, 11, 12})") + @ByteArray(value={10, 11, 12}) + public byte[] f3; + + @ExpectedString( + "@ShortArray(value={0, 4, 5})") + @ShortArray(value={0, 4, 5}) + public short[] f4; + + @ExpectedString( + "@CharArray(value={'a', 'b', 'c', '\\''})") + @CharArray(value={'a', 'b', 'c', '\''}) + public char[] f5; + + @ExpectedString( + "@IntArray(value={1})") + @IntArray(value={1}) + public int[] f6; + + @ExpectedString( + "@LongArray(value={-2147483647, 2147483648L, 9223372036854775807L})") + @LongArray(value={-Integer.MAX_VALUE, Integer.MAX_VALUE+1L, Long.MAX_VALUE}) + public long[] f7; + + @ExpectedString( + "@StringArray(value={\"A\", \"B\", \"C\", \"\\\"Quote\\\"\"})") + @StringArray(value={"A", "B", "C", "\"Quote\""}) + public String[] f8; + + @ExpectedString( + "@ClassArray(value={int.class, Obj[].class})") + @ClassArray(value={int.class, Obj[].class}) + public Class[] f9; + + @ExpectedString( + "@EnumArray(value={SOURCE})") + @EnumArray(value={RetentionPolicy.SOURCE}) + public RetentionPolicy[] f10; + } +} + +// ------------ Supporting types ------------ + +class Obj {} + +@Retention(RetentionPolicy.RUNTIME) +@interface ExpectedString { + String value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface Classy { + Class value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface BooleanArray { + boolean[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface FloatArray { + float[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface DoubleArray { + double[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface ByteArray { + byte[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface ShortArray { + short[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface CharArray { + char[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface IntArray { + int[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface LongArray { + long[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface ClassArray { + Class[] value() default {int.class, Obj[].class}; +} + +@Retention(RetentionPolicy.RUNTIME) +@interface StringArray { + String[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface EnumArray { + RetentionPolicy[] value(); +} + +@Retention(RetentionPolicy.RUNTIME) +@interface MostlyPrimitive { + char c0(); + char c1(); + int i0(); + int i1(); + float f0(); + float f1(); + double d0(); + double d1(); + long l0(); + long l1(); + String s0(); + String s1(); + Class class0(); +} diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/java/lang/annotation/ParameterAnnotations.java --- a/jdk/test/java/lang/annotation/ParameterAnnotations.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/java/lang/annotation/ParameterAnnotations.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2016, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6761678 + * @bug 6761678 8162817 * @summary Check properties of Annotations returned from * getParameterAnnotations, including freedom from security * exceptions. @@ -89,8 +89,8 @@ equal(ann.length, 2); Annotation foo = ann[0][0]; Annotation bar = ann[1][0]; - equal(foo.toString(), "@Named(value=foo)"); - equal(bar.toString(), "@Named(value=bar)"); + equal(foo.toString(), "@Named(value=\"foo\")"); + equal(bar.toString(), "@Named(value=\"bar\")"); check(foo.equals(foo)); check(! foo.equals(bar)); } diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/java/nio/file/WatchService/DeleteInterference.java --- a/jdk/test/java/nio/file/WatchService/DeleteInterference.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/java/nio/file/WatchService/DeleteInterference.java Fri Aug 05 12:03:58 2016 -0700 @@ -38,6 +38,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; +import static java.lang.System.out; import static java.nio.file.StandardWatchEventKinds.*; public class DeleteInterference { @@ -66,22 +67,28 @@ private static void openAndCloseWatcher(Path dir) { FileSystem fs = FileSystems.getDefault(); for (int i = 0; i < ITERATIONS_COUNT; i++) { + out.printf("open %d begin%n", i); try (WatchService watcher = fs.newWatchService()) { dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); } catch (IOException ioe) { // ignore + } finally { + out.printf("open %d end%n", i); } } } private static void deleteAndRecreateDirectory(Path dir) { for (int i = 0; i < ITERATIONS_COUNT; i++) { + out.printf("del %d begin%n", i); try { deleteFileTree(dir); Path subdir = Files.createDirectories(dir.resolve("subdir")); Files.createFile(subdir.resolve("test")); } catch (IOException ioe) { // ignore + } finally { + out.printf("del %d end%n", i); } } } diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/java/util/Locale/Bug8035133.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Locale/Bug8035133.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8035133 + * @summary Checks that the tags matching the range with quality weight q=0 + * e.g. en;q=0 must be elimited and must not be the part of output + */ + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + + +public class Bug8035133 { + + private static boolean err = false; + + public static void main(String[] args) { + + // checking Locale.lookup with de-ch;q=0 + checkLookup("en;q=0.1, *-ch;q=0.5, de-ch;q=0", + "de-ch, en, fr-ch", "fr-CH"); + + /* checking Locale.lookup with *;q=0 '*' should be ignored + * in lookup + */ + checkLookup("en;q=0.1, *-ch;q=0.5, *;q=0", + "de-ch, en, fr-ch", "de-CH"); + + // checking Locale.filter with fr-ch;q=0 in BASIC_FILTERING + checkFilter("en;q=0.1, fr-ch;q=0.0, de-ch;q=0.5", + "de-ch, en, fr-ch", "de-CH, en"); + + // checking Locale.filter with *;q=0 in BASIC_FILTERING + checkFilter("de-ch;q=0.6, *;q=0", "de-ch, fr-ch", ""); + + // checking Locale.filter with *;q=0 in BASIC_FILTERING + checkFilter("de-ch;q=0.6, de;q=0", "de-ch", ""); + + // checking Locale.filter with *;q=0.6, en;q=0 in BASIC_FILTERING + checkFilter("*;q=0.6, en;q=0", "de-ch, hi-in, en", "de-CH, hi-IN"); + + // checking Locale.filter with de-ch;q=0 in EXTENDED_FILTERING + checkFilter("en;q=0.1, *-ch;q=0.5, de-ch;q=0", + "de-ch, en, fr-ch", "fr-CH, en"); + + /* checking Locale.filter with *-ch;q=0 in EXTENDED_FILTERING which + * must make filter to return "" empty or no match + */ + checkFilter("de-ch;q=0.5, *-ch;q=0", "de-ch, fr-ch", ""); + + /* checking Locale.filter with *;q=0 in EXTENDED_FILTERING which + * must make filter to return "" empty or no match + */ + checkFilter("*-ch;q=0.5, *;q=0", "de-ch, fr-ch", ""); + + /* checking Locale.filter with *;q=0.6, *-Latn;q=0 in + * EXTENDED_FILTERING + */ + checkFilter("*;q=0.6, *-Latn;q=0", "de-ch, hi-in, en-Latn", + "de-CH, hi-IN"); + + if (err) { + throw new RuntimeException("[LocaleMatcher method(s) failed]"); + } + + } + + private static void checkLookup(String ranges, String tags, + String expectedLocale) { + + List priorityList = Locale.LanguageRange + .parse(ranges); + List localeList = generateLocales(tags); + Locale loc = Locale.lookup(priorityList, localeList); + String actualLocale + = loc.toLanguageTag(); + + if (!actualLocale.equals(expectedLocale)) { + System.err.println("Locale.lookup failed with ranges: " + ranges + + " Expected: " + expectedLocale + + " Actual: " + actualLocale); + err = true; + } + + } + + private static void checkFilter(String ranges, String tags, + String expectedLocales) { + + List priorityList = Locale.LanguageRange + .parse(ranges); + List localeList = generateLocales(tags); + String actualLocales = getLocalesAsString( + Locale.filter(priorityList, localeList)); + + if (!actualLocales.equals(expectedLocales)) { + System.err.println("Locale.filter failed with ranges: " + ranges + + " Expected: " + expectedLocales + + " Actual: " + actualLocales); + err = true; + } + + } + + private static List generateLocales(String tags) { + if (tags == null) { + return null; + } + + List localeList = new ArrayList<>(); + if (tags.equals("")) { + return localeList; + } + String[] t = tags.split(", "); + for (String tag : t) { + localeList.add(Locale.forLanguageTag(tag)); + } + return localeList; + } + + private static String getLocalesAsString(List locales) { + StringBuilder sb = new StringBuilder(); + + Iterator itr = locales.iterator(); + if (itr.hasNext()) { + sb.append(itr.next().toLanguageTag()); + } + while (itr.hasNext()) { + sb.append(", "); + sb.append(itr.next().toLanguageTag()); + } + + return sb.toString().trim(); + } + +} diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java --- a/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,7 @@ * @bug 8068721 * @summary test RMI-IIOP call with ConcurrentHashMap as an argument * @library /lib/testlibrary + * @modules java.corba * @build jdk.testlibrary.* * @compile -addmods java.corba Test.java HelloInterface.java HelloServer.java HelloClient.java * HelloImpl.java _HelloImpl_Tie.java _HelloInterface_Stub.java ConcurrentHashMapTest.java diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/javax/transaction/testng/Driver.java --- a/jdk/test/javax/transaction/testng/Driver.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/javax/transaction/testng/Driver.java Fri Aug 05 12:03:58 2016 -0700 @@ -23,6 +23,7 @@ /** * @test + * @modules java.sql java.transaction * @compile -addmods java.transaction * test/transaction/InvalidTransactionExceptionTests.java * test/transaction/TransactionRequiredExceptionTests.java diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java --- a/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -49,6 +49,7 @@ * run main/othervm SAAJFactoryTest saaj.factory.Valid - * scenario14 javax.xml.soap.MessageFactory=saaj.factory.Valid saaj.factory.Valid2 - * + * @modules java.xml.ws * @compile -addmods java.xml.ws saaj/factory/Invalid.java saaj/factory/Valid.java * saaj/factory/Valid2.java saaj/factory/Valid3.java SAAJFactoryTest.java * diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/javax/xml/ws/8043129/MailTest.java --- a/jdk/test/javax/xml/ws/8043129/MailTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/javax/xml/ws/8043129/MailTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,7 @@ * @summary JAF initialisation in SAAJ clashing with the one in javax.mail * @author mkos * @library javax.mail.jar + * @modules java.xml.ws * @compile -addmods java.xml.ws MailTest.java * @run main/othervm -addmods java.xml.ws MailTest */ diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/javax/xml/ws/publish/WSTest.java --- a/jdk/test/javax/xml/ws/publish/WSTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/javax/xml/ws/publish/WSTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -25,6 +25,7 @@ * @test * @bug 8146086 * @summary Publishing two webservices on same port fails with "java.net.BindException: Address already in use" + * @modules java.xml.ws * @compile -addmods java.xml.ws WSTest.java * @run main/othervm -addmods java.xml.ws WSTest */ diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/javax/xml/ws/xsanymixed/Test.java --- a/jdk/test/javax/xml/ws/xsanymixed/Test.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/javax/xml/ws/xsanymixed/Test.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,7 @@ * @bug 8036981 8038966 8051441 * @summary the content of xs:any content:mixed should remain as is, * no white space changes and no changes to namespace prefixes + * @modules java.xml.ws * @run shell compile-wsdl.sh * @compile -addmods java.xml.ws Test.java * @run main/othervm -addmods java.xml.ws Test diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java --- a/jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java Fri Aug 05 12:03:58 2016 -0700 @@ -32,7 +32,7 @@ * @run main/othervm -Djava.security.debug=sunpkcs11 TestKeyPairGenerator * @run main/othervm -Djava.security.debug=sunpkcs11 TestKeyPairGenerator * sm TestKeyPairGenerator.policy - * @key intermittent randomness + * @key randomness */ import java.math.BigInteger; diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/tools/jlink/IntegrationTest.java --- a/jdk/test/tools/jlink/IntegrationTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/tools/jlink/IntegrationTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -22,6 +22,7 @@ */ import java.io.File; +import java.io.FileReader; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; @@ -33,6 +34,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.function.Function; import jdk.tools.jlink.Jlink; @@ -203,6 +205,27 @@ throw new AssertionError("release not generated"); } + Properties props = new Properties(); + try (FileReader reader = new FileReader(release)) { + props.load(reader); + } + + if (props.getProperty("JAVA_VERSION") == null) { + throw new AssertionError("release file does not contain JAVA_VERSION"); + } + + if (props.getProperty("OS_NAME") == null) { + throw new AssertionError("release file does not contain OS_NAME"); + } + + if (props.getProperty("OS_ARCH") == null) { + throw new AssertionError("release file does not contain OS_ARCH"); + } + + if (props.getProperty("OS_VERSION") == null) { + throw new AssertionError("release file does not contain OS_VERSION"); + } + if (!Files.exists(output.resolve("toto.txt"))) { throw new AssertionError("Post processing not called"); } diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java --- a/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -30,6 +30,9 @@ * @run main ExcludeVMPluginTest */ import java.io.ByteArrayInputStream; +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import jdk.tools.jlink.internal.ResourcePoolManager; @@ -167,6 +170,13 @@ poolMgr.add( ResourcePoolEntry.create("/java.base/native/jvm.cfg", ResourcePoolEntry.Type.NATIVE_LIB, jvmcfgContent)); + + // java.base/module-info.class is used by exclude vm plugin + // to get current osName(). We read it from jrt-fs and add a + // ResourcePoolEntry + poolMgr.add( + ResourcePoolEntry.create("/java.base/module-info.class", + ResourcePoolEntry.Type.CLASS_OR_RESOURCE, getJavaBaseModuleInfo())); for (String in : input) { poolMgr.add(ResourcePoolEntry.create(in, ResourcePoolEntry.Type.NATIVE_LIB, new byte[0])); @@ -187,15 +197,19 @@ throw new Exception("Got content " + newContent + " expected " + expectdJvmCfg); } - if (out.entryCount() != (expectedOutput.length + 1)) { + // Apart from native resources, we should find jvm.cfg and + // java.base/module-info.class. So, we add 2 here to the + // expected count! + if (out.entryCount() != (expectedOutput.length + 2)) { out.entries().forEach(m -> { System.err.println(m.path()); }); - throw new Exception("Invalid output size " + out.entryCount() + " expected " + (expectedOutput.length + 1)); + throw new Exception("Invalid output size " + out.entryCount() + " expected " + (expectedOutput.length + 2)); } out.entries().forEach(md -> { - if (md.path().equals("/java.base/native/jvm.cfg")) { + if (md.path().equals("/java.base/native/jvm.cfg") || + md.path().equals("/java.base/module-info.class")) { return; } boolean contained = false; @@ -209,7 +223,11 @@ throw new RuntimeException(md.path() + " not expected"); } }); + } + // read java.base/module-info.class from jrt-fs + private static Path getJavaBaseModuleInfo() { + return Paths.get(URI.create("jrt:/modules/java.base/module-info.class")); } private static boolean isWindows() { diff -r 8b413b0e064c -r 592a43ff92cd jdk/test/tools/jlink/plugins/FileCopierPluginTest.java --- a/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java Fri Aug 05 16:20:02 2016 +0300 +++ b/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -32,8 +32,10 @@ */ import java.io.File; +import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -41,6 +43,7 @@ import jdk.tools.jlink.builder.DefaultImageBuilder; import jdk.tools.jlink.internal.plugins.FileCopierPlugin; +import jdk.tools.jlink.plugin.PluginException; import jdk.tools.jlink.plugin.ResourcePoolEntry; import jdk.tools.jlink.plugin.ResourcePool; @@ -86,6 +89,12 @@ conf.put(FileCopierPlugin.NAME, builder.toString()); plug.configure(conf); ResourcePoolManager poolMgr = new ResourcePoolManager(); + // java.base/module-info.class is used to add "release" file + // We read it from jrt-fs and add a ResourcePoolEntry + poolMgr.add( + ResourcePoolEntry.create("/java.base/module-info.class", + ResourcePoolEntry.Type.CLASS_OR_RESOURCE, getJavaBaseModuleInfo())); + expected++; ResourcePool pool = plug.transform( new ResourcePoolManager().resourcePool(), poolMgr.resourcePoolBuilder()); @@ -93,7 +102,8 @@ throw new AssertionError("Wrong number of added files"); } pool.entries().forEach(f -> { - if (!f.type().equals(ResourcePoolEntry.Type.OTHER)) { + if (!f.type().equals(ResourcePoolEntry.Type.OTHER) && + !f.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) { throw new AssertionError("Invalid type " + f.type() + " for file " + f.path()); } @@ -145,4 +155,9 @@ throw new AssertionError("Invalid Content in src2 dir"); } } + + // read java.base/module-info.class from jrt-fs + private static Path getJavaBaseModuleInfo() { + return Paths.get(URI.create("jrt:/modules/java.base/module-info.class")); + } } diff -r 8b413b0e064c -r 592a43ff92cd langtools/.hgtags --- a/langtools/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -371,3 +371,4 @@ ea4eea2997b9e2f26cd7965839921710ff4065c8 jdk-9+126 a42768b48cb0c5af9063e12093975baeeca3b5fa jdk-9+127 2764986661b6d339ba73af52d69d3506ce12e648 jdk-9+128 +e181909291981038b041ed4d22714c4760e049cd jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java Fri Aug 05 12:03:58 2016 -0700 @@ -55,7 +55,9 @@ import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.jvm.*; +import com.sun.tools.javac.tree.JCTree.JCFieldAccess; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; +import com.sun.tools.javac.tree.JCTree.Tag; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.Name; @@ -64,9 +66,15 @@ import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.Kinds.Kind.*; import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; +import static com.sun.tools.javac.code.Symbol.OperatorSymbol.AccessCode.FIRSTASGOP; import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.code.TypeTag.FORALL; import static com.sun.tools.javac.code.TypeTag.TYPEVAR; +import static com.sun.tools.javac.jvm.ByteCodes.iadd; +import static com.sun.tools.javac.jvm.ByteCodes.ishll; +import static com.sun.tools.javac.jvm.ByteCodes.lushrl; +import static com.sun.tools.javac.jvm.ByteCodes.lxor; +import static com.sun.tools.javac.jvm.ByteCodes.string_add; /** Root class for Java symbols. It contains subclasses * for specific sorts of symbols, such as variables, methods and operators, @@ -1950,15 +1958,90 @@ public static class OperatorSymbol extends MethodSymbol { public int opcode; + private int accessCode = Integer.MIN_VALUE; public OperatorSymbol(Name name, Type type, int opcode, Symbol owner) { super(PUBLIC | STATIC, name, type, owner); this.opcode = opcode; } + @Override public R accept(Symbol.Visitor v, P p) { return v.visitOperatorSymbol(this, p); } + + public int getAccessCode(Tag tag) { + if (accessCode != Integer.MIN_VALUE && !tag.isIncOrDecUnaryOp()) { + return accessCode; + } + accessCode = AccessCode.from(tag, opcode); + return accessCode; + } + + /** Access codes for dereferencing, assignment, + * and pre/post increment/decrement. + + * All access codes for accesses to the current class are even. + * If a member of the superclass should be accessed instead (because + * access was via a qualified super), add one to the corresponding code + * for the current class, making the number odd. + * This numbering scheme is used by the backend to decide whether + * to issue an invokevirtual or invokespecial call. + * + * @see Gen#visitSelect(JCFieldAccess tree) + */ + public enum AccessCode { + UNKNOWN(-1, Tag.NO_TAG), + DEREF(0, Tag.NO_TAG), + ASSIGN(2, Tag.ASSIGN), + PREINC(4, Tag.PREINC), + PREDEC(6, Tag.PREDEC), + POSTINC(8, Tag.POSTINC), + POSTDEC(10, Tag.POSTDEC), + FIRSTASGOP(12, Tag.NO_TAG); + + public final int code; + public final Tag tag; + public static final int numberOfAccessCodes = (lushrl - ishll + lxor + 2 - iadd) * 2 + FIRSTASGOP.code + 2; + + AccessCode(int code, Tag tag) { + this.code = code; + this.tag = tag; + } + + static public AccessCode getFromCode(int code) { + for (AccessCode aCodes : AccessCode.values()) { + if (aCodes.code == code) { + return aCodes; + } + } + return UNKNOWN; + } + + static int from(Tag tag, int opcode) { + /** Map bytecode of binary operation to access code of corresponding + * assignment operation. This is always an even number. + */ + switch (tag) { + case PREINC: + return AccessCode.PREINC.code; + case PREDEC: + return AccessCode.PREDEC.code; + case POSTINC: + return AccessCode.POSTINC.code; + case POSTDEC: + return AccessCode.POSTDEC.code; + } + if (iadd <= opcode && opcode <= lxor) { + return (opcode - iadd) * 2 + FIRSTASGOP.code; + } else if (opcode == string_add) { + return (lxor + 1 - iadd) * 2 + FIRSTASGOP.code; + } else if (ishll <= opcode && opcode <= lushrl) { + return (opcode - ishll + lxor + 2 - iadd) * 2 + FIRSTASGOP.code; + } + return -1; + } + } } /** Symbol completer interface. diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 05 12:03:58 2016 -0700 @@ -3159,7 +3159,7 @@ Type operand = attribExpr(tree.rhs, env); // Find operator. Symbol operator = tree.operator = operators.resolveBinary(tree, tree.getTag().noAssignOp(), owntype, operand); - if (operator.kind == MTH && + if (operator != operators.noOpSymbol && !owntype.isErroneous() && !operand.isErroneous()) { chk.checkDivZero(tree.rhs.pos(), operator, operand); @@ -3179,7 +3179,7 @@ // Find operator. Symbol operator = tree.operator = operators.resolveUnary(tree, tree.getTag(), argtype); Type owntype = types.createErrorType(tree.type); - if (operator.kind == MTH && + if (operator != operators.noOpSymbol && !argtype.isErroneous()) { owntype = (tree.getTag().isIncOrDecUnaryOp()) ? tree.arg.type @@ -3204,7 +3204,7 @@ // Find operator. Symbol operator = tree.operator = operators.resolveBinary(tree, tree.getTag(), left, right); Type owntype = types.createErrorType(tree.type); - if (operator.kind == MTH && + if (operator != operators.noOpSymbol && !left.isErroneous() && !right.isErroneous()) { owntype = operator.type.getReturnType(); diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java Fri Aug 05 12:03:58 2016 -0700 @@ -38,6 +38,7 @@ import com.sun.tools.javac.util.List; import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.code.Symbol.OperatorSymbol.AccessCode; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.code.Type.*; @@ -49,6 +50,7 @@ import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.code.Kinds.Kind.*; +import static com.sun.tools.javac.code.Symbol.OperatorSymbol.AccessCode.DEREF; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -816,33 +818,6 @@ * Access methods *************************************************************************/ - /** Access codes for dereferencing, assignment, - * and pre/post increment/decrement. - * Access codes for assignment operations are determined by method accessCode - * below. - * - * All access codes for accesses to the current class are even. - * If a member of the superclass should be accessed instead (because - * access was via a qualified super), add one to the corresponding code - * for the current class, making the number odd. - * This numbering scheme is used by the backend to decide whether - * to issue an invokevirtual or invokespecial call. - * - * @see Gen#visitSelect(JCFieldAccess tree) - */ - private static final int - DEREFcode = 0, - ASSIGNcode = 2, - PREINCcode = 4, - PREDECcode = 6, - POSTINCcode = 8, - POSTDECcode = 10, - FIRSTASGOPcode = 12; - - /** Number of access codes - */ - private static final int NCODES = accessCode(ByteCodes.lushrl) + 2; - /** A mapping from symbols to their access numbers. */ private Map accessNums; @@ -864,20 +839,6 @@ */ private ListBuffer accessed; - /** Map bytecode of binary operation to access code of corresponding - * assignment operation. This is always an even number. - */ - private static int accessCode(int bytecode) { - if (ByteCodes.iadd <= bytecode && bytecode <= ByteCodes.lxor) - return (bytecode - iadd) * 2 + FIRSTASGOPcode; - else if (bytecode == ByteCodes.string_add) - return (ByteCodes.lxor + 1 - iadd) * 2 + FIRSTASGOPcode; - else if (ByteCodes.ishll <= bytecode && bytecode <= ByteCodes.lushrl) - return (bytecode - ishll + ByteCodes.lxor + 2 - iadd) * 2 + FIRSTASGOPcode; - else - return -1; - } - /** return access code for identifier, * @param tree The tree representing the identifier use. * @param enclOp The closest enclosing operation node of tree, @@ -885,24 +846,24 @@ */ private static int accessCode(JCTree tree, JCTree enclOp) { if (enclOp == null) - return DEREFcode; + return AccessCode.DEREF.code; else if (enclOp.hasTag(ASSIGN) && tree == TreeInfo.skipParens(((JCAssign) enclOp).lhs)) - return ASSIGNcode; + return AccessCode.ASSIGN.code; else if (enclOp.getTag().isIncOrDecUnaryOp() && tree == TreeInfo.skipParens(((JCUnary) enclOp).arg)) - return mapTagToUnaryOpCode(enclOp.getTag()); + return (((JCUnary) enclOp).operator).getAccessCode(enclOp.getTag()); else if (enclOp.getTag().isAssignop() && tree == TreeInfo.skipParens(((JCAssignOp) enclOp).lhs)) - return accessCode(((OperatorSymbol) ((JCAssignOp) enclOp).operator).opcode); + return (((JCAssignOp) enclOp).operator).getAccessCode(enclOp.getTag()); else - return DEREFcode; + return AccessCode.DEREF.code; } /** Return binary operator that corresponds to given access code. */ - private OperatorSymbol binaryAccessOperator(int acode) { - return (OperatorSymbol)operators.lookupBinaryOp(sym -> accessCode(((OperatorSymbol)sym).opcode) == acode); + private OperatorSymbol binaryAccessOperator(int acode, Tag tag) { + return operators.lookupBinaryOp(op -> op.getAccessCode(tag) == acode); } /** Return tree tag for assignment operation corresponding @@ -984,7 +945,7 @@ if (anum == null) { anum = accessed.length(); accessNums.put(vsym, anum); - accessSyms.put(vsym, new MethodSymbol[NCODES]); + accessSyms.put(vsym, new MethodSymbol[AccessCode.numberOfAccessCodes]); accessed.append(vsym); // System.out.println("accessing " + vsym + " in " + vsym.location()); } @@ -996,13 +957,13 @@ switch (vsym.kind) { case VAR: acode = accessCode(tree, enclOp); - if (acode >= FIRSTASGOPcode) { - OperatorSymbol operator = binaryAccessOperator(acode); + if (acode >= AccessCode.FIRSTASGOP.code) { + OperatorSymbol operator = binaryAccessOperator(acode, enclOp.getTag()); if (operator.opcode == string_add) argtypes = List.of(syms.objectType); else argtypes = operator.type.getParameterTypes().tail; - } else if (acode == ASSIGNcode) + } else if (acode == AccessCode.ASSIGN.code) argtypes = List.of(vsym.erasure(types)); else argtypes = List.nil(); @@ -1010,7 +971,7 @@ thrown = List.nil(); break; case MTH: - acode = DEREFcode; + acode = AccessCode.DEREF.code; argtypes = vsym.erasure(types).getParameterTypes(); restype = vsym.erasure(types).getReturnType(); thrown = vsym.type.getThrownTypes(); @@ -1306,7 +1267,7 @@ accessConstructorDef(cdef.pos, sym, accessConstrs.get(sym))); } else { MethodSymbol[] accessors = accessSyms.get(sym); - for (int i = 0; i < NCODES; i++) { + for (int i = 0; i < AccessCode.numberOfAccessCodes; i++) { if (accessors[i] != null) cdef.defs = cdef.defs.prepend( accessDef(cdef.pos, sym, accessors[i], i)); @@ -1314,42 +1275,6 @@ } } - /** Maps unary operator integer codes to JCTree.Tag objects - * @param unaryOpCode the unary operator code - */ - private static Tag mapUnaryOpCodeToTag(int unaryOpCode){ - switch (unaryOpCode){ - case PREINCcode: - return PREINC; - case PREDECcode: - return PREDEC; - case POSTINCcode: - return POSTINC; - case POSTDECcode: - return POSTDEC; - default: - return NO_TAG; - } - } - - /** Maps JCTree.Tag objects to unary operator integer codes - * @param tag the JCTree.Tag - */ - private static int mapTagToUnaryOpCode(Tag tag){ - switch (tag){ - case PREINC: - return PREINCcode; - case PREDEC: - return PREDECcode; - case POSTINC: - return POSTINCcode; - case POSTDEC: - return POSTDECcode; - default: - return -1; - } - } - /** Construct definition of an access method. * @param pos The source code position of the definition. * @param vsym The private or protected symbol. @@ -1388,20 +1313,21 @@ int acode1 = acode - (acode & 1); JCExpression expr; // The access method's return value. - switch (acode1) { - case DEREFcode: + AccessCode aCode = AccessCode.getFromCode(acode1); + switch (aCode) { + case DEREF: expr = ref; break; - case ASSIGNcode: + case ASSIGN: expr = make.Assign(ref, args.head); break; - case PREINCcode: case POSTINCcode: case PREDECcode: case POSTDECcode: - expr = makeUnary(mapUnaryOpCodeToTag(acode1), ref); + case PREINC: case POSTINC: case PREDEC: case POSTDEC: + expr = makeUnary(aCode.tag, ref); break; default: expr = make.Assignop( - treeTag(binaryAccessOperator(acode1)), ref, args.head); - ((JCAssignOp) expr).operator = binaryAccessOperator(acode1); + treeTag(binaryAccessOperator(acode1, JCTree.Tag.NO_TAG)), ref, args.head); + ((JCAssignOp) expr).operator = binaryAccessOperator(acode1, JCTree.Tag.NO_TAG); } stat = make.Return(expr.setType(sym.type)); } else { @@ -3275,7 +3201,7 @@ // tree.lhs. However, we can still get the // unerased type of tree.lhs as it is stored // in tree.type in Attr. - Symbol newOperator = operators.resolveBinary(tree, + OperatorSymbol newOperator = operators.resolveBinary(tree, newTag, tree.type, tree.rhs.type); @@ -3304,7 +3230,7 @@ JCMethodInvocation app = (JCMethodInvocation)tree.lhs; // if operation is a += on strings, // make sure to convert argument to string - JCExpression rhs = (((OperatorSymbol)tree.operator).opcode == string_add) + JCExpression rhs = tree.operator.opcode == string_add ? makeString(tree.rhs) : tree.rhs; app.args = List.of(rhs).prependList(app.args); diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Fri Aug 05 12:03:58 2016 -0700 @@ -38,6 +38,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -148,7 +149,7 @@ private final String addModsOpt; private final String limitModsOpt; - private Set rootModules = Collections.emptySet(); + private Set rootModules = null; public static Modules instance(Context context) { Modules instance = context.get(Modules.class); @@ -194,7 +195,31 @@ System.err.println(msg); } + boolean inInitModules; + public void initModules(List trees, Collection extraAddMods, Collection extraLimitMods) { + Assert.check(!inInitModules); + try { + inInitModules = true; + Assert.checkNull(rootModules); + enter(trees, modules -> { + Assert.checkNull(rootModules); + Assert.checkNull(allModules); + this.rootModules = modules; + setupAllModules(extraAddMods, extraLimitMods); //initialize the module graph + Assert.checkNonNull(allModules); + inInitModules = false; + }, null); + } finally { + inInitModules = false; + } + } + public boolean enter(List trees, ClassSymbol c) { + Assert.check(rootModules != null || inInitModules || !allowModules); + return enter(trees, modules -> {}, c); + } + + private boolean enter(List trees, Consumer> init, ClassSymbol c) { if (!allowModules) { for (JCCompilationUnit tree: trees) { tree.modle = syms.noModule; @@ -212,10 +237,7 @@ setCompilationUnitModules(trees, roots); - if (!roots.isEmpty() && this.rootModules.isEmpty()) { - this.rootModules = roots; - allModules(); //ensure errors reported - } + init.accept(roots); for (ModuleSymbol msym: roots) { msym.complete(); @@ -395,6 +417,7 @@ defaultModule.completer = sym -> completeModule((ModuleSymbol) sym); } else { Assert.check(rootModules.isEmpty()); + rootModules.add(defaultModule); } if (defaultModule != syms.unnamedModule) { @@ -462,7 +485,7 @@ msym.requires = List.nil(); msym.uses = List.nil(); } else if ((msym.flags_field & Flags.AUTOMATIC_MODULE) != 0) { - completeAutomaticModule(msym); + setupAutomaticModule(msym); } else { msym.module_info.complete(); } @@ -485,7 +508,7 @@ } }; - private void completeAutomaticModule(ModuleSymbol msym) throws CompletionFailure { + private void setupAutomaticModule(ModuleSymbol msym) throws CompletionFailure { try { ListBuffer directives = new ListBuffer<>(); ListBuffer exports = new ListBuffer<>(); @@ -501,28 +524,9 @@ } } - ListBuffer requires = new ListBuffer<>(); - - //ensure all modules are found: - moduleFinder.findAllModules(); - - for (ModuleSymbol ms : allModules()) { - if (ms == syms.unnamedModule || ms == msym) - continue; - Set flags = (ms.flags_field & Flags.AUTOMATIC_MODULE) != 0 ? - EnumSet.of(RequiresFlag.PUBLIC) : EnumSet.noneOf(RequiresFlag.class); - RequiresDirective d = new RequiresDirective(ms, flags); - directives.add(d); - requires.add(d); - } - - RequiresDirective requiresUnnamed = new RequiresDirective(syms.unnamedModule); - directives.add(requiresUnnamed); - requires.add(requiresUnnamed); - msym.exports = exports.toList(); msym.provides = List.nil(); - msym.requires = requires.toList(); + msym.requires = List.nil(); msym.uses = List.nil(); msym.directives = directives.toList(); msym.flags_field |= Flags.ACYCLIC; @@ -531,6 +535,31 @@ } } + private void completeAutomaticModule(ModuleSymbol msym) throws CompletionFailure { + ListBuffer directives = new ListBuffer<>(); + + directives.addAll(msym.directives); + + ListBuffer requires = new ListBuffer<>(); + + for (ModuleSymbol ms : allModules()) { + if (ms == syms.unnamedModule || ms == msym) + continue; + Set flags = (ms.flags_field & Flags.AUTOMATIC_MODULE) != 0 ? + EnumSet.of(RequiresFlag.PUBLIC) : EnumSet.noneOf(RequiresFlag.class); + RequiresDirective d = new RequiresDirective(ms, flags); + directives.add(d); + requires.add(d); + } + + RequiresDirective requiresUnnamed = new RequiresDirective(syms.unnamedModule); + directives.add(requiresUnnamed); + requires.add(requiresUnnamed); + + msym.requires = requires.toList(); + msym.directives = directives.toList(); + } + private Completer getSourceCompleter(JCCompilationUnit tree) { return new Completer() { @Override @@ -541,8 +570,8 @@ JavaFileObject prev = log.useSource(tree.sourcefile); try { tree.defs.head.accept(v); + checkCyclicDependencies((JCModuleDecl) tree.defs.head); completeModule(msym); - checkCyclicDependencies((JCModuleDecl) tree.defs.head); } finally { log.useSource(prev); msym.flags_field &= ~UNATTRIBUTED; @@ -660,6 +689,9 @@ public Completer getUsesProvidesCompleter() { return sym -> { ModuleSymbol msym = (ModuleSymbol) sym; + + msym.complete(); + Env env = typeEnvs.get(msym); UsesProvidesVisitor v = new UsesProvidesVisitor(msym, env); JavaFileObject prev = log.useSource(env.toplevel.sourcefile); @@ -757,7 +789,9 @@ @Override public void visitRequires(JCRequires tree) { - msym.directives = msym.directives.prepend(tree.directive); + if (tree.directive != null) { + msym.directives = msym.directives.prepend(tree.directive); + } } @Override @@ -821,19 +855,29 @@ } } - private Set allModulesCache; + private Set allModules; - private Set allModules() { - if (allModulesCache != null) - return allModulesCache; + public Set allModules() { + Assert.checkNonNull(allModules); + return allModules; + } + + private void setupAllModules(Collection extraAddMods, Collection extraLimitMods) { + Assert.checkNonNull(rootModules); + Assert.checkNull(allModules); Set observable; - if (limitModsOpt == null) { + if (limitModsOpt == null && extraLimitMods.isEmpty()) { observable = null; } else { Set limitMods = new HashSet<>(); - for (String limit : limitModsOpt.split(",")) { + if (limitModsOpt != null) { + for (String limit : limitModsOpt.split(",")) { + limitMods.add(syms.enterModule(names.fromString(limit))); + } + } + for (String limit : extraLimitMods) { limitMods.add(syms.enterModule(names.fromString(limit))); } observable = computeTransitiveClosure(limitMods, null); @@ -868,8 +912,15 @@ enabledRoot.addAll(rootModules); - if (addModsOpt != null) { - for (String added : addModsOpt.split(",")) { + if (addModsOpt != null || !extraAddMods.isEmpty()) { + Set fullAddMods = new HashSet<>(); + fullAddMods.addAll(extraAddMods); + + if (addModsOpt != null) { + fullAddMods.addAll(Arrays.asList(addModsOpt.split(","))); + } + + for (String added : fullAddMods) { Stream modules; switch (added) { case ALL_SYSTEM: @@ -898,20 +949,7 @@ result.add(syms.unnamedModule); - if (!rootModules.isEmpty()) - allModulesCache = result; - - return result; - } - - public void enableAllModules() { - allModulesCache = new HashSet<>(); - - moduleFinder.findAllModules(); - - for (ModuleSymbol msym : syms.getAllModules()) { - allModulesCache.add(msym); - } + allModules = result; } private Set computeTransitiveClosure(Iterable base, Set observable) { @@ -973,6 +1011,15 @@ private final Map> requiresPublicCache = new HashMap<>(); private void completeModule(ModuleSymbol msym) { + if (inInitModules) { + msym.completer = sym -> completeModule(msym); + return ; + } + + if ((msym.flags_field & Flags.AUTOMATIC_MODULE) != 0) { + completeAutomaticModule(msym); + } + Assert.checkNonNull(msym.requires); initAddReads(); @@ -1214,9 +1261,9 @@ private void checkCyclicDependencies(JCModuleDecl mod) { for (JCDirective d : mod.directives) { - if (!d.hasTag(Tag.REQUIRES)) + JCRequires rd; + if (!d.hasTag(Tag.REQUIRES) || (rd = (JCRequires) d).directive == null) continue; - JCRequires rd = (JCRequires) d; Set nonSyntheticDeps = new HashSet<>(); List queue = List.of(rd.directive.module); while (queue.nonEmpty()) { @@ -1224,9 +1271,9 @@ queue = queue.tail; if (!nonSyntheticDeps.add(current)) continue; + current.complete(); if ((current.flags() & Flags.ACYCLIC) != 0) continue; - current.complete(); Assert.checkNonNull(current.requires, () -> current.toString()); for (RequiresDirective dep : current.requires) { if (!dep.flags.contains(RequiresFlag.EXTRA)) @@ -1262,5 +1309,7 @@ } public void newRound() { + rootModules = null; + allModules = null; } } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java Fri Aug 05 12:03:58 2016 -0700 @@ -95,6 +95,7 @@ names = Names.instance(context); log = Log.instance(context); types = Types.instance(context); + noOpSymbol = new OperatorSymbol(names.empty, Type.noType, -1, syms.noSymbol); initOperatorNames(); initUnaryOperators(); initBinaryOperators(); @@ -145,7 +146,7 @@ /** * Entry point for resolving a unary operator given an operator tag and an argument type. */ - Symbol resolveUnary(DiagnosticPosition pos, JCTree.Tag tag, Type op) { + OperatorSymbol resolveUnary(DiagnosticPosition pos, JCTree.Tag tag, Type op) { return resolve(tag, unaryOperators, unop -> unop.test(op), @@ -156,7 +157,7 @@ /** * Entry point for resolving a binary operator given an operator tag and a pair of argument types. */ - Symbol resolveBinary(DiagnosticPosition pos, JCTree.Tag tag, Type op1, Type op2) { + OperatorSymbol resolveBinary(DiagnosticPosition pos, JCTree.Tag tag, Type op1, Type op2) { return resolve(tag, binaryOperators, binop -> binop.test(op1, op2), @@ -169,8 +170,8 @@ * map. If there's a matching operator, its resolve routine is called and the result is returned; * otherwise the result of a fallback function is returned. */ - private Symbol resolve(Tag tag, Map> opMap, Predicate opTestFunc, - Function resolveFunc, Supplier noResultFunc) { + private OperatorSymbol resolve(Tag tag, Map> opMap, Predicate opTestFunc, + Function resolveFunc, Supplier noResultFunc) { return opMap.get(operatorName(tag)).stream() .filter(opTestFunc) .map(resolveFunc) @@ -181,7 +182,7 @@ /** * Creates an operator symbol. */ - private Symbol makeOperator(Name name, List formals, OperatorType res, int... opcodes) { + private OperatorSymbol makeOperator(Name name, List formals, OperatorType res, int... opcodes) { MethodType opType = new MethodType( formals.stream() .map(o -> o.asType(syms)) @@ -201,10 +202,14 @@ ((opcodes[0] << ByteCodes.preShift) | opcodes[1]); } + /** A symbol that stands for a missing operator. + */ + public final OperatorSymbol noOpSymbol; + /** * Report an operator lookup error. */ - private Symbol reportErrorIfNeeded(DiagnosticPosition pos, Tag tag, Type... args) { + private OperatorSymbol reportErrorIfNeeded(DiagnosticPosition pos, Tag tag, Type... args) { if (Stream.of(args).noneMatch(Type::isErroneous)) { Name opName = operatorName(tag); JCDiagnostic.Error opError = (args.length) == 1 ? @@ -212,7 +217,7 @@ Errors.OperatorCantBeApplied1(opName, args[0], args[1]); log.error(pos, opError); } - return syms.noSymbol; + return noOpSymbol; } /** @@ -263,10 +268,10 @@ final Name name; /** The list of symbols associated with this operator (lazily populated). */ - Optional alternatives = Optional.empty(); + Optional alternatives = Optional.empty(); /** An array of operator symbol suppliers (used to lazily populate the symbol list). */ - List> operatorSuppliers = List.nil(); + List> operatorSuppliers = List.nil(); @SuppressWarnings("varargs") OperatorHelper(Tag tag) { @@ -278,21 +283,21 @@ * using an applicability predicate; if the test suceeds that same operator is returned, * otherwise a dummy symbol is returned. */ - final Symbol doLookup(Predicate applicabilityTest) { + final OperatorSymbol doLookup(Predicate applicabilityTest) { return Stream.of(alternatives.orElseGet(this::initOperators)) .filter(applicabilityTest) .findFirst() - .orElse(syms.noSymbol); + .orElse(noOpSymbol); } /** * This routine performs lazy instantiation of the operator symbols supported by this helper. * After initialization is done, the suppliers are cleared, to free up memory. */ - private Symbol[] initOperators() { - Symbol[] operators = operatorSuppliers.stream() + private OperatorSymbol[] initOperators() { + OperatorSymbol[] operators = operatorSuppliers.stream() .map(op -> op.get()) - .toArray(Symbol[]::new); + .toArray(OperatorSymbol[]::new); alternatives = Optional.of(operators); operatorSuppliers = null; //let GC do its work return operators; @@ -311,10 +316,10 @@ /** * This routine implements the unary operator lookup process. It customizes the behavior * of the shared lookup routine in {@link OperatorHelper}, by using an unary applicability test - * (see {@link UnaryOperatorHelper#isUnaryOperatorApplicable(OperatorSymbol, Type)} + * (see {@link UnaryOperatorHelper#isUnaryOperatorApplicable(OperatorOperatorSymbol, Type)} */ - final Symbol doLookup(Type t) { - return doLookup(op -> isUnaryOperatorApplicable((OperatorSymbol)op, t)); + final OperatorSymbol doLookup(Type t) { + return doLookup(op -> isUnaryOperatorApplicable(op, t)); } /** @@ -336,7 +341,7 @@ * This method will be overridden by unary operator helpers to provide custom resolution * logic. */ - abstract Symbol resolve(Type t); + abstract OperatorSymbol resolve(Type t); } abstract class BinaryOperatorHelper extends OperatorHelper implements BiPredicate { @@ -350,8 +355,8 @@ * of the shared lookup routine in {@link OperatorHelper}, by using an unary applicability test * (see {@link BinaryOperatorHelper#isBinaryOperatorApplicable(OperatorSymbol, Type, Type)} */ - final Symbol doLookup(Type t1, Type t2) { - return doLookup(op -> isBinaryOperatorApplicable((OperatorSymbol)op, t1, t2)); + final OperatorSymbol doLookup(Type t1, Type t2) { + return doLookup(op -> isBinaryOperatorApplicable(op, t1, t2)); } /** @@ -375,7 +380,7 @@ * This method will be overridden by binary operator helpers to provide custom resolution * logic. */ - abstract Symbol resolve(Type t1, Type t2); + abstract OperatorSymbol resolve(Type t1, Type t2); } /** @@ -393,7 +398,7 @@ } @Override - public Symbol resolve(Type arg) { + public OperatorSymbol resolve(Type arg) { return doLookup(syms.objectType); } } @@ -421,7 +426,7 @@ } @Override - public Symbol resolve(Type arg) { + public OperatorSymbol resolve(Type arg) { return doLookup(unaryPromotion(arg)); } } @@ -442,7 +447,7 @@ } @Override - public Symbol resolve(Type arg) { + public OperatorSymbol resolve(Type arg) { return doLookup(syms.booleanType); } } @@ -458,7 +463,7 @@ } @Override - public Symbol resolve(Type arg) { + public OperatorSymbol resolve(Type arg) { return doLookup(types.unboxedTypeOrType(arg)); } } @@ -481,7 +486,7 @@ } @Override - public Symbol resolve(Type arg1, Type arg2) { + public OperatorSymbol resolve(Type arg1, Type arg2) { Type t = binaryPromotion(arg1, arg2); return doLookup(t, t); } @@ -504,7 +509,7 @@ } @Override - public Symbol resolve(Type arg1, Type arg2) { + public OperatorSymbol resolve(Type arg1, Type arg2) { return doLookup(syms.booleanType, syms.booleanType); } @@ -527,7 +532,7 @@ } @Override - public Symbol resolve(Type arg1, Type arg2) { + public OperatorSymbol resolve(Type arg1, Type arg2) { return doLookup(stringPromotion(arg1), stringPromotion(arg2)); } @@ -570,7 +575,7 @@ } @Override - public Symbol resolve(Type arg1, Type arg2) { + public OperatorSymbol resolve(Type arg1, Type arg2) { return doLookup(unaryPromotion(arg1), unaryPromotion(arg2)); } @@ -613,7 +618,7 @@ } @Override - public Symbol resolve(Type t1, Type t2) { + public OperatorSymbol resolve(Type t1, Type t2) { ComparisonKind kind = getKind(t1, t2); Type t = (kind == ComparisonKind.NUMERIC_OR_BOOLEAN) ? binaryPromotion(t1, t2) : @@ -798,12 +803,12 @@ .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, bool_or)); } - Symbol lookupBinaryOp(Predicate applicabilityTest) { + OperatorSymbol lookupBinaryOp(Predicate applicabilityTest) { return binaryOperators.values().stream() .flatMap(List::stream) .map(helper -> helper.doLookup(applicabilityTest)) .distinct() - .filter(sym -> sym != syms.noSymbol) + .filter(sym -> sym != noOpSymbol) .findFirst().get(); } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Fri Aug 05 12:03:58 2016 -0700 @@ -1795,7 +1795,7 @@ } public void visitAssignop(JCAssignOp tree) { - OperatorSymbol operator = (OperatorSymbol) tree.operator; + OperatorSymbol operator = tree.operator; Item l; if (operator.opcode == string_add) { l = concat.makeConcat(tree); @@ -1827,7 +1827,7 @@ } public void visitUnary(JCUnary tree) { - OperatorSymbol operator = (OperatorSymbol)tree.operator; + OperatorSymbol operator = tree.operator; if (tree.hasTag(NOT)) { CondItem od = genCond(tree.arg, false); result = od.negate(); @@ -1909,7 +1909,7 @@ } public void visitBinary(JCBinary tree) { - OperatorSymbol operator = (OperatorSymbol)tree.operator; + OperatorSymbol operator = tree.operator; if (operator.opcode == string_add) { result = concat.makeConcat(tree); } else if (tree.hasTag(AND)) { diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/StringConcat.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/StringConcat.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/StringConcat.java Fri Aug 05 12:03:58 2016 -0700 @@ -131,8 +131,7 @@ tree = TreeInfo.skipParens(tree); if (tree.hasTag(PLUS) && tree.type.constValue() == null) { JCTree.JCBinary op = (JCTree.JCBinary) tree; - if (op.operator.kind == MTH && - ((Symbol.OperatorSymbol) op.operator).opcode == string_add) { + if (op.operator.kind == MTH && op.operator.opcode == string_add) { return res .appendList(collect(op.lhs, res)) .appendList(collect(op.rhs, res)); diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java Fri Aug 05 12:03:58 2016 -0700 @@ -27,6 +27,7 @@ import java.io.*; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -1009,15 +1010,10 @@ } public List initModules(List roots) { - List result = initModules(roots, null); + modules.initModules(roots, Collections.emptySet(), Collections.emptySet()); if (roots.isEmpty()) { enterDone = true; } - return result; - } - - List initModules(List roots, ClassSymbol c) { - modules.enter(roots, c); return roots; } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacTypes.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacTypes.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacTypes.java Fri Aug 05 12:03:58 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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 @@ -85,6 +85,9 @@ @DefinedBy(Api.LANGUAGE_MODEL) public boolean isSameType(TypeMirror t1, TypeMirror t2) { + if (t1.getKind() == TypeKind.WILDCARD || t2.getKind() == TypeKind.WILDCARD) { + return false; + } return types.isSameType((Type) t1, (Type) t2); } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Fri Aug 05 12:03:58 2016 -0700 @@ -1328,6 +1328,8 @@ compiler.misc.class.file.wrong.class=\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB{0}\u306B\u4E0D\u6B63\u306A\u30AF\u30E9\u30B9\u304C\u3042\u308A\u307E\u3059 +compiler.misc.module.info.invalid.super.class=\u7121\u52B9\u306A\u30B9\u30FC\u30D1\u30FC\u30FB\u30AF\u30E9\u30B9\u3092\u542B\u3080module-info + compiler.misc.class.file.not.found={0}\u306E\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 # 0: string (classfile major version), 1: string (classfile minor version) diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Fri Aug 05 12:03:58 2016 -0700 @@ -1328,6 +1328,8 @@ compiler.misc.class.file.wrong.class=\u7C7B\u6587\u4EF6\u5305\u542B\u9519\u8BEF\u7684\u7C7B: {0} +compiler.misc.module.info.invalid.super.class=\u5E26\u6709\u65E0\u6548\u8D85\u7C7B\u7684 module-info + compiler.misc.class.file.not.found=\u627E\u4E0D\u5230{0}\u7684\u7C7B\u6587\u4EF6 # 0: string (classfile major version), 1: string (classfile minor version) diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties Fri Aug 05 12:03:58 2016 -0700 @@ -91,7 +91,7 @@ javac.opt.version=\u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831 javac.opt.arg.pathname= javac.opt.arg.file= -javac.opt.Xbootclasspath.p=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306B\u4ED8\u52A0\u3059\u308B +javac.opt.Xbootclasspath.p=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u5148\u982D\u306B\u4ED8\u52A0\u3059\u308B javac.opt.Xbootclasspath.a=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306B\u8FFD\u52A0\u3059\u308B javac.opt.Xlint=\u63A8\u5968\u306E\u8B66\u544A\u3092\u6709\u52B9\u306B\u3059\u308B javac.opt.Xlint.all=\u3059\u3079\u3066\u306E\u8B66\u544A\u3092\u6709\u52B9\u306B\u3057\u307E\u3059 diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java Fri Aug 05 12:03:58 2016 -0700 @@ -1876,8 +1876,8 @@ private Tag opcode; public JCExpression lhs; public JCExpression rhs; - public Symbol operator; - protected JCAssignOp(Tag opcode, JCTree lhs, JCTree rhs, Symbol operator) { + public OperatorSymbol operator; + protected JCAssignOp(Tag opcode, JCTree lhs, JCTree rhs, OperatorSymbol operator) { this.opcode = opcode; this.lhs = (JCExpression)lhs; this.rhs = (JCExpression)rhs; @@ -1892,7 +1892,7 @@ public JCExpression getVariable() { return lhs; } @DefinedBy(Api.COMPILER_TREE) public JCExpression getExpression() { return rhs; } - public Symbol getOperator() { + public OperatorSymbol getOperator() { return operator; } @Override @DefinedBy(Api.COMPILER_TREE) @@ -1911,7 +1911,7 @@ public static class JCUnary extends JCExpression implements UnaryTree { private Tag opcode; public JCExpression arg; - public Symbol operator; + public OperatorSymbol operator; protected JCUnary(Tag opcode, JCExpression arg) { this.opcode = opcode; this.arg = arg; @@ -1923,7 +1923,7 @@ public Kind getKind() { return TreeInfo.tagToKind(getTag()); } @DefinedBy(Api.COMPILER_TREE) public JCExpression getExpression() { return arg; } - public Symbol getOperator() { + public OperatorSymbol getOperator() { return operator; } @Override @DefinedBy(Api.COMPILER_TREE) @@ -1947,11 +1947,11 @@ private Tag opcode; public JCExpression lhs; public JCExpression rhs; - public Symbol operator; + public OperatorSymbol operator; protected JCBinary(Tag opcode, JCExpression lhs, JCExpression rhs, - Symbol operator) { + OperatorSymbol operator) { this.opcode = opcode; this.lhs = lhs; this.rhs = rhs; @@ -1966,7 +1966,7 @@ public JCExpression getLeftOperand() { return lhs; } @DefinedBy(Api.COMPILER_TREE) public JCExpression getRightOperand() { return rhs; } - public Symbol getOperator() { + public OperatorSymbol getOperator() { return operator; } @Override @DefinedBy(Api.COMPILER_TREE) diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTool.java --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTool.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavadocTool.java Fri Aug 05 12:03:58 2016 -0700 @@ -28,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.util.Collection; +import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashMap; @@ -44,6 +45,7 @@ import com.sun.tools.javac.code.ClassFinder; import com.sun.tools.javac.code.Symbol.Completer; import com.sun.tools.javac.code.Symbol.ModuleSymbol; +import com.sun.tools.javac.code.Symbol.PackageSymbol; import com.sun.tools.javac.comp.Enter; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCClassDecl; @@ -52,6 +54,7 @@ import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Name; /** @@ -183,9 +186,8 @@ // Parse file objects provide via the DocumentationTool API parse(fileObjects, classTrees, true); - modules.enter(classTrees.toList(), null); - syms.unnamedModule.complete(); // TEMP to force reading all named modules + modules.initModules(classTrees.toList(), Collections.emptySet(), Collections.emptySet()); // Build up the complete list of any packages to be documented Location location = modules.multiModuleMode ? StandardLocation.MODULE_SOURCE_PATH @@ -386,8 +388,16 @@ private Location getLocation(String packageName) throws IOException { if (location == StandardLocation.MODULE_SOURCE_PATH) { // TODO: handle invalid results - ModuleSymbol msym = syms.inferModule(names.fromString(packageName)); - return fm.getModuleLocation(location, msym.name.toString()); + Name pack = names.fromString(packageName); + + for (ModuleSymbol msym : modules.allModules()) { + PackageSymbol p = syms.getPackage(msym, pack); + if (p != null && !p.members().isEmpty()) { + return fm.getModuleLocation(location, msym.name.toString()); + } + } + + return null; } else { return location; } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties Fri Aug 05 12:03:58 2016 -0700 @@ -185,6 +185,7 @@ doclet.Same_package_name_used=\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\u5F62\u5F0F\u304C2\u56DE\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059: {0} doclet.exception_encountered={1}\u306E\u51E6\u7406\u4E2D\u306B\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\n{0} +# option specifiers doclet.usage.d.name=d doclet.usage.d.parameters= doclet.usage.d.description=\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u306E\u8EE2\u9001\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA @@ -244,7 +245,7 @@ doclet.usage.excludedocfilessubdir.name=excludedocfilessubdir doclet.usage.excludedocfilessubdir.parameters=:.. -doclet.usage.excludedocfilessubdir.description=\u6307\u5B9A\u3055\u308C\u305F\u540D\u524D\u306Edoc-files\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u3059\u3079\u3066\u9664\u5916\u3057\u307E\u3059 +doclet.usage.excludedocfilessubdir.description=\n \u6307\u5B9A\u3055\u308C\u305F\u540D\u524D\u306Edoc-files\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u3059\u3079\u3066\u9664\u5916\u3057\u307E\u3059 doclet.usage.group.name=group doclet.usage.group.parameters= :.. @@ -289,7 +290,7 @@ doclet.usage.tag.name=tag doclet.usage.tag.parameters=::
-doclet.usage.tag.description=\u5358\u4E00\u306E\u5F15\u6570\u3092\u6301\u3064\u30AB\u30B9\u30BF\u30E0\u30FB\u30BF\u30B0\u3092\u6307\u5B9A\u3057\u307E\u3059 +doclet.usage.tag.description=\n \u5358\u4E00\u306E\u5F15\u6570\u3092\u6301\u3064\u30AB\u30B9\u30BF\u30E0\u30FB\u30BF\u30B0\u3092\u6307\u5B9A\u3057\u307E\u3059 doclet.usage.taglet.name=taglet doclet.usage.taglet.description=\u30BF\u30B0\u30EC\u30C3\u30C8\u306E\u5B8C\u5168\u4FEE\u98FE\u540D\u3092\u767B\u9332\u3057\u307E\u3059 @@ -333,8 +334,8 @@ doclet.xusage.xdoclint-extended.name=Xdoclint: doclet.xusage.xdoclint-extended.parameters=(all|none|[-]) # L10N: do not localize these words: all none accessibility html missing reference syntax -doclet.xusage.xdoclint-extended.description=javadoc\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u554F\u984C\u306B\u5BFE\u3059\u308B\u7279\u5B9A\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\n javadoc\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u554F\u984C\u306B\u5BFE\u3059\u308B\u7279\u5B9A\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\n \u3053\u3053\u3067\u3001\u306Faccessibility\u3001html\u3001missing\u3001reference\u307E\u305F\u306Fsyntax\u306E\u3044\u305A\u308C\u304B\u3067\u3059\u3002\n +doclet.xusage.xdoclint-extended.description=javadoc\u30B3\u30E1\u30F3\u30C8\u306E\u554F\u984C\u306B\u95A2\u3059\u308B\u7279\u5B9A\u306E\u30C1\u30A7\u30C3\u30AF\u3092\n \u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\n \u3053\u3053\u3067\u3001\u306Faccessibility\u3001html\u3001\n missing\u3001reference\u307E\u305F\u306Fsyntax\u306E\u3044\u305A\u308C\u304B\u3067\u3059\u3002\n doclet.xusage.xdoclint-package.name=Xdoclint/package: doclet.xusage.xdoclint-package.parameters=([-]) -doclet.xusage.xdoclint-package.description=\n \u7279\u5B9A\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\u306F\n \u30AB\u30F3\u30DE\u3067\u533A\u5207\u3089\u308C\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u6307\u5B9A\u5B50\u306E\u30EA\u30B9\u30C8\u3067\u3059\u3002\u30D1\u30C3\u30B1\u30FC\u30B8\u6307\u5B9A\u5B50\u306F\u3001\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\n \u4FEE\u98FE\u3055\u308C\u305F\u540D\u524D\u3001\u307E\u305F\u306F\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\u306E\u63A5\u982D\u8F9E\u306E\u5F8C\u306B.*'\u6307\u5B9A(\u6307\u5B9A\u3057\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\n \u3059\u3079\u3066\u306E\u30B5\u30D6\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u62E1\u5F35)\u3057\u305F\u3082\u306E\u3067\u3059\u3002\u30D1\u30C3\u30B1\u30FC\u30B8\u6307\u5B9A\u5B50\u306E\u524D\u306B-\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\n \u6307\u5B9A\u3057\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u95A2\u3059\u308B\u30C1\u30A7\u30C3\u30AF\u3092\u7121\u52B9\u306B\u3067\u304D\u307E\u3059\u3002\n +doclet.xusage.xdoclint-package.description=\n \u7279\u5B9A\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\u306F\n \u30AB\u30F3\u30DE\u3067\u533A\u5207\u3089\u308C\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u6307\u5B9A\u5B50\u306E\u30EA\u30B9\u30C8\u3067\u3059\u3002\u30D1\u30C3\u30B1\u30FC\u30B8\u6307\u5B9A\u5B50\u306F\u3001\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\n \u4FEE\u98FE\u3055\u308C\u305F\u540D\u524D\u3001\u307E\u305F\u306F\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\u306E\u63A5\u982D\u8F9E\u306E\u5F8C\u306B.*'\u6307\u5B9A(\u6307\u5B9A\u3057\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\n \u3059\u3079\u3066\u306E\u30B5\u30D6\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u62E1\u5F35)\u3057\u305F\u3082\u306E\u3067\u3059\u3002\u30D1\u30C3\u30B1\u30FC\u30B8\u6307\u5B9A\u5B50\u306E\u524D\u306B-\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\n \u6307\u5B9A\u3057\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u95A2\u3059\u308B\u30C1\u30A7\u30C3\u30AF\u3092\u7121\u52B9\u306B\u3067\u304D\u307E\u3059\u3002\n diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties Fri Aug 05 12:03:58 2016 -0700 @@ -185,6 +185,7 @@ doclet.Same_package_name_used=\u7A0B\u5E8F\u5305\u540D\u79F0\u5F62\u5F0F\u4F7F\u7528\u4E86\u4E24\u6B21: {0} doclet.exception_encountered=\u5904\u7406{1}\u65F6\u51FA\u73B0\u5F02\u5E38\u9519\u8BEF\n{0} +# option specifiers doclet.usage.d.name=d doclet.usage.d.parameters= doclet.usage.d.description=\u8F93\u51FA\u6587\u4EF6\u7684\u76EE\u6807\u76EE\u5F55 @@ -244,7 +245,7 @@ doclet.usage.excludedocfilessubdir.name=excludedocfilessubdir doclet.usage.excludedocfilessubdir.parameters=:.. -doclet.usage.excludedocfilessubdir.description=\u6392\u9664\u5177\u6709\u7ED9\u5B9A\u540D\u79F0\u7684\u6240\u6709\u6587\u6863\u6587\u4EF6\u5B50\u76EE\u5F55 +doclet.usage.excludedocfilessubdir.description=\n \u6392\u9664\u5177\u6709\u7ED9\u5B9A\u540D\u79F0\u7684\u6240\u6709\u6587\u6863\u6587\u4EF6\u5B50\u76EE\u5F55 doclet.usage.group.name=group doclet.usage.group.parameters= :.. @@ -289,7 +290,7 @@ doclet.usage.tag.name=tag doclet.usage.tag.parameters=::
-doclet.usage.tag.description=\u6307\u5B9A\u5355\u4E2A\u53C2\u6570\u5B9A\u5236\u6807\u8BB0 +doclet.usage.tag.description=\n \u6307\u5B9A\u5355\u4E2A\u53C2\u6570\u5B9A\u5236\u6807\u8BB0 doclet.usage.taglet.name=taglet doclet.usage.taglet.description=\u8981\u6CE8\u518C\u7684 Taglet \u7684\u5168\u9650\u5B9A\u540D\u79F0 @@ -313,7 +314,7 @@ doclet.usage.sourcetab.description=\u6307\u5B9A\u6E90\u4E2D\u6BCF\u4E2A\u5236\u8868\u7B26\u5360\u636E\u7684\u7A7A\u683C\u6570 doclet.usage.keywords.name=keywords -doclet.usage.keywords.description=\u968F\u7A0B\u5E8F\u5305, \u7C7B\u548C\u6210\u5458\u4FE1\u606F\u4E00\u8D77\u9644\u5E26 HTML \u5143\u6807\u8BB0 +doclet.usage.keywords.description=\u968F\u7A0B\u5E8F\u5305,\n \u7C7B\u548C\u6210\u5458\u4FE1\u606F\u4E00\u8D77\u9644\u5E26 HTML \u5143\u6807\u8BB0 doclet.usage.stylesheetfile.name=stylesheetfile doclet.usage.stylesheetfile.parameters= @@ -325,16 +326,16 @@ doclet.xusage.xdocrootparent.name=Xdocrootparent doclet.xusage.xdocrootparent.parameters= -doclet.xusage.xdocrootparent.description=\u5C06\u6587\u6863\u6CE8\u91CA\u4E2D\u51FA\u73B0\u7684\u6240\u6709\u540E\u8DDF /.. \u7684 @docRoot \u66FF\u6362\u4E3A +doclet.xusage.xdocrootparent.description=\u5C06\u6587\u6863\u6CE8\u91CA\u4E2D\u51FA\u73B0\u7684\u6240\u6709\u540E\u8DDF /..\n \u7684 @docRoot \u66FF\u6362\u4E3A doclet.xusage.xdoclint.name=Xdoclint -doclet.xusage.xdoclint.description=\u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u5EFA\u8BAE\u7684\u68C0\u67E5 +doclet.xusage.xdoclint.description=\u4E3A\n javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u5EFA\u8BAE\u7684\u68C0\u67E5 doclet.xusage.xdoclint-extended.name=Xdoclint: doclet.xusage.xdoclint-extended.parameters=(all|none|[-]) # L10N: do not localize these words: all none accessibility html missing reference syntax -doclet.xusage.xdoclint-extended.description=\u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u68C0\u67E5,\n \u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u68C0\u67E5,\n \u5176\u4E2D \u4E3A accessibility, html, missing, reference \u6216 syntax \u4E4B\u4E00\u3002\n +doclet.xusage.xdoclint-extended.description=\u9488\u5BF9 javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\n \u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u68C0\u67E5,\n \u5176\u4E2D <\u7EC4> \u4E3A accessibility, html,\n missing, reference \u6216 syntax \u4E4B\u4E00\u3002\n doclet.xusage.xdoclint-package.name=Xdoclint/package: doclet.xusage.xdoclint-package.parameters=([-]) -doclet.xusage.xdoclint-package.description=\n \u5728\u7279\u5B9A\u7684\u7A0B\u5E8F\u5305\u4E2D\u542F\u7528\u6216\u7981\u7528\u68C0\u67E5\u3002<\u7A0B\u5E8F\u5305> \u662F\u9017\u53F7\u5206\u9694\u7684\n \u7A0B\u5E8F\u5305\u8BF4\u660E\u7B26\u5217\u8868\u3002\u7A0B\u5E8F\u5305\u8BF4\u660E\u7B26\u662F\u7A0B\u5E8F\u5305\u7684\u9650\u5B9A\u540D\u79F0\n \u6216\u7A0B\u5E8F\u5305\u540D\u79F0\u524D\u7F00\u540E\u8DDF .*, \u5B83\u6269\u5C55\u5230\u7ED9\u5B9A\u7A0B\u5E8F\u5305\u7684\n \u6240\u6709\u5B50\u7A0B\u5E8F\u5305\u3002\u5728\u7A0B\u5E8F\u5305\u8BF4\u660E\u7B26\u524D\u9762\u52A0\u4E0A - \u53EF\u4EE5\u4E3A\n \u6307\u5B9A\u7A0B\u5E8F\u5305\u7981\u7528\u68C0\u67E5\u3002\n +doclet.xusage.xdoclint-package.description=\n \u5728\u7279\u5B9A\u7684\u7A0B\u5E8F\u5305\u4E2D\u542F\u7528\u6216\u7981\u7528\n \u68C0\u67E5\u3002<\u7A0B\u5E8F\u5305> \u662F\u9017\u53F7\u5206\u9694\u7684\n \u7A0B\u5E8F\u5305\u8BF4\u660E\u7B26\u5217\u8868\u3002\n \u7A0B\u5E8F\u5305\u8BF4\u660E\u7B26\u662F\u7A0B\u5E8F\u5305\u7684\u9650\u5B9A\n \u540D\u79F0\u6216\u7A0B\u5E8F\u5305\u540D\u79F0\u524D\u7F00\u540E\u8DDF .*, \n \u5B83\u6269\u5C55\u5230\u7ED9\u5B9A\u7A0B\u5E8F\u5305\u7684\n \u6240\u6709\u5B50\u7A0B\u5E8F\u5305\u3002\u5728\u7A0B\u5E8F\u5305\n \u8BF4\u660E\u7B26\u524D\u9762\u52A0\u4E0A - \u53EF\u4EE5\u4E3A\n \u6307\u5B9A\u7A0B\u5E8F\u5305\u7981\u7528\u68C0\u67E5\u3002\n diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/JavadocTool.java --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/JavadocTool.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/JavadocTool.java Fri Aug 05 12:03:58 2016 -0700 @@ -49,6 +49,7 @@ import com.sun.tools.javac.code.Symbol.Completer; import com.sun.tools.javac.code.Symbol.CompletionFailure; import com.sun.tools.javac.code.Symbol.ModuleSymbol; +import com.sun.tools.javac.code.Symbol.PackageSymbol; import com.sun.tools.javac.comp.Enter; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCClassDecl; @@ -56,6 +57,7 @@ import com.sun.tools.javac.util.Abort; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Position; import jdk.javadoc.doclet.DocletEnvironment; @@ -187,9 +189,8 @@ // Parse file objects provide via the DocumentationTool API parse(fileObjects, classTrees, true); - modules.enter(classTrees.toList(), null); - syms.unnamedModule.complete(); // TEMP to force reading all named modules + modules.initModules(classTrees.toList(), Collections.emptySet(), Collections.emptySet()); // Build up the complete list of any packages to be documented Location location = modules.multiModuleMode ? StandardLocation.MODULE_SOURCE_PATH @@ -394,11 +395,16 @@ private Location getLocation(String packageName) throws IOException { if (location == StandardLocation.MODULE_SOURCE_PATH) { // TODO: handle invalid results better. - ModuleSymbol msym = syms.inferModule(names.fromString(packageName)); - if (msym == null) { - return null; + Name pack = names.fromString(packageName); + + for (ModuleSymbol msym : modules.allModules()) { + PackageSymbol p = syms.getPackage(msym, pack); + if (p != null && !p.members().isEmpty()) { + return fm.getModuleLocation(location, msym.name.toString()); + } } - return fm.getModuleLocation(location, msym.name.toString()); + + return null; } else { return location; } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java Fri Aug 05 12:03:58 2016 -0700 @@ -808,7 +808,7 @@ } private String esc(char c, char quote) { - if (32 <= c && c <= 126 && c != quote) + if (32 <= c && c <= 126 && c != quote && c != '\\') return String.valueOf(c); else switch (c) { case '\b': return "\\b"; diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ConstantWriter.java --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ConstantWriter.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ConstantWriter.java Fri Aug 05 12:03:58 2016 -0700 @@ -385,6 +385,10 @@ sb.append('\\').append('\\'); break; default: + if (Character.isISOControl(c)) { + sb.append(String.format("\\u%04x", (int) c)); + break; + } sb.append(c); } } diff -r 8b413b0e064c -r 592a43ff92cd langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties Fri Aug 05 12:03:58 2016 -0700 @@ -231,7 +231,7 @@ help.set.format = \u30B9\u30CB\u30DA\u30C3\u30C8\u30FB\u30A4\u30D9\u30F3\u30C8\u3092\u30EC\u30DD\u30FC\u30C8\u3059\u308B\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\n\n\t/set format "" ...\n\n\u306F\u4E8B\u524D\u306B\u5B9A\u7FA9\u3055\u308C\u305F\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u30FB\u30E2\u30FC\u30C9\u306E\u540D\u524D\u3067\u3059 -- '/help /set mode'\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\u306F\u5B9A\u7FA9\u3059\u308B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u56FA\u6709\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u306E\u540D\u524D\u3067\u3059\u3002\n\u306F\u5F15\u7528\u7B26\u306B\u56F2\u307E\u308C\u305F\u6587\u5B57\u5217\u3067\u3001\u6B21\u306E\u5834\u5408\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u5024\u3067\u3059: \n\u30BB\u30EC\u30AF\u30BF\u304C\u4E00\u81F4\u3059\u308B(\u307E\u305F\u306F\u30BB\u30EC\u30AF\u30BF\u304C\u306A\u3044)\u3002\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u4F7F\u7528\u3055\u308C\u308B\u5834\u5408\u3001\n\u4E2D\u30AB\u30C3\u30B3\u3067\u56F2\u307E\u308C\u3066\u3044\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u540D\u304C\u305D\u306E\u3068\u304D\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u5024\u3067\u7F6E\u63DB\u3055\u308C\u307E\u3059\n\u3053\u308C\u3089\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306F\u3001\u3053\u306E\u30B3\u30DE\u30F3\u30C9\u3067\u4E8B\u524D\u306B\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3082\u3001\n\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306B\u56FA\u6709\u306E\u3053\u308C\u3089\u306E\u4E8B\u524D\u5B9A\u7FA9\u6E08\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5834\u5408\u3082\u3042\u308A\u307E\u3059:\n\t{name} == \u540D\u524D\u3001\u4F8B: \u5909\u6570\u540D\u3001 ...\n\t{type} == \u30BF\u30A4\u30D7\u540D\u3002\u5909\u6570\u307E\u305F\u306F\u5F0F\u306E\u30BF\u30A4\u30D7\u3001\n\t\t\t\u30E1\u30BD\u30C3\u30C9\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FB\u30BF\u30A4\u30D7\n\t{value} == \u5F0F\u307E\u305F\u306F\u5909\u6570\u306E\u521D\u671F\u5316\u306E\u7D50\u679C\u5024\n\t{unresolved} == \u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306E\u30EA\u30B9\u30C8\n\t{errors} == \u30EA\u30AB\u30D0\u30EA\u53EF\u80FD\u306A\u30A8\u30E9\u30FC\u306E\u30EA\u30B9\u30C8(\u51E6\u7406\u6642-\n\t\t\t"display"\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u307F)\n\t{err} == \u672A\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u30FB\u30A8\u30E9\u30FC\u884C(\u51E6\u7406\u6642-\n\t\t\t"errorline"\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u307F)\n\u6B21\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306F\u30C4\u30FC\u30EB\u306B\u3088\u3063\u3066\u30A2\u30AF\u30BB\u30B9\u3055\u308C\u3001\u8868\u793A\u3055\u308C\u308B\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3092\u6C7A\u5B9A\u3057\u307E\u3059:\n\t{display} == \u30B9\u30CB\u30DA\u30C3\u30C8\u30FB\u30A4\u30D9\u30F3\u30C8\u306B\u5BFE\u3057\u3066\u8868\u793A\u3055\u308C\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\n\t{errorline} == \u300Cerrors\u300D\u30D5\u30A3\u30FC\u30EB\u30C9\u5185\u306E\u30A8\u30E9\u30FC\u884C\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\n\t{pre} == \u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u63A5\u982D\u8F9E(\u30B3\u30DE\u30F3\u30C9\u30FB\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3092\u958B\u59CB\u3059\u308B)\n\t{post} == \u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u63A5\u5C3E\u8F9E(\u30B3\u30DE\u30F3\u30C9\u30FB\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3092\u7D42\u4E86\u3059\u308B)\n\t{errorpre} == \u30A8\u30E9\u30FC\u63A5\u982D\u8F9E(\u30A8\u30E9\u30FC\u30FB\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3092\u958B\u59CB\u3059\u308B)\n\t{errorpost} == \ \u30A8\u30E9\u30FC\u63A5\u5C3E\u8F9E(\u30A8\u30E9\u30FC\u30FB\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3092\u7D42\u4E86\u3059\u308B)\n\u3053\u308C\u3089\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u3059(\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059)\u3002\n\u306F\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u9069\u7528\u3055\u308C\u308B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3067\u3059\u3002\n\u30BB\u30EC\u30AF\u30BF\u69CB\u9020\u306F\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u306E\u30CF\u30A4\u30D5\u30F3\u533A\u5207\u308A\u30EA\u30B9\u30C8\u3067\u3059\u3002\n\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u306F\u30011\u3064\u306E\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306E\u5024\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30EA\u30B9\u30C8\u3067\u3059\u3002\n\u30BB\u30EC\u30AF\u30BF\u306F\u5404\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u304C\u4E00\u81F4\u3059\u308C\u3070\u4E00\u81F4\u3068\u306A\u308A\u307E\u3059\u3002\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u306F\n\u3044\u305A\u308C\u304B\u306E\u5024\u304C\u4E00\u81F4\u3059\u308C\u3070\u4E00\u81F4\u3068\u306A\u308A\u307E\u3059\u3002\n\n\u30B1\u30FC\u30B9\u30FB\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u7A2E\u985E\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\timport -- \u30A4\u30F3\u30DD\u30FC\u30C8\u5BA3\u8A00\n\tclass -- \u30AF\u30E9\u30B9\u5BA3\u8A00\n\tinterface -- \u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u5BA3\u8A00\n\tenum -- \u5217\u6319\u578B\u306E\u5BA3\u8A00\n\tannotation -- \u6CE8\u91C8\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u5BA3\u8A00\n\tmethod -- \u30E1\u30BD\u30C3\u30C9\u5BA3\u8A00 -- \u6CE8\u610F: {type}==parameter-types\n\tvardecl -- \u521D\u671F\u5316\u3057\u306A\u3044\u5909\u6570\u5BA3\u8A00\n\tvarinit -- \u521D\u671F\u5316\u3059\u308B\u5909\u6570\u5BA3\u8A00\n\texpression -- \u5F0F -- \u6CE8\u610F: {name}==scratch-variable-name\n\tvarvalue -- \u5909\u6570\u5024\u5F0F\n\tassignment -- \u5909\u6570\u3092\u5272\u308A\u5F53\u3066\u307E\u3059\n\tstatement -- \u6587\n\u30A2\u30AF\u30B7\u30E7\u30F3\u30FB\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30B9\u30CB\u30DA\u30C3\u30C8\u306B\u767A\u751F\u3057\u305F\u5185\u5BB9\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tadded -- \u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\n\tmodified -- \u65E2\u5B58\u306E\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F\n\treplaced -- \u65E2\u5B58\u306E\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u65B0\u898F\u30B9\u30CB\u30DA\u30C3\u30C8\u3067\u7F6E\u63DB\u3055\u308C\u307E\u3057\u305F\n\toverwrote -- \u65E2\u5B58\u306E\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u307E\u3057\u305F\n\tdropped -- \u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F\n\tused -- \u4F7F\u7528\u3067\u304D\u306A\u3044\u3068\u304D\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u4F7F\u7528\u3055\u308C\u307E\u3057\u305F\n\u767A\u751F\u6642\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u3053\u308C\u304C\u76F4\u63A5\u307E\u305F\u306F\u9593\u63A5\u30A2\u30AF\u30B7\u30E7\u30F3\u3067\u3042\u308B\u304B\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tprimary -- \u5165\u529B\u3057\u305F\u30B9\u30CB\u30DA\u30C3\u30C8\n\tupdate -- \u4F9D\u5B58\u30B9\u30CB\u30DA\u30C3\u30C8\u3078\u306E\u66F4\u65B0\n\u89E3\u6C7A\u72B6\u614B\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u89E3\u6C7A/\u5B9A\u7FA9\u306E\u72B6\u614B\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tok -- \ -\u6B63\u3057\u304F\u89E3\u6C7A\u3055\u308C\u307E\u3057\u305F\n\tdefined -- \u5FA9\u5143\u53EF\u80FD\u3067\u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306B\u3082\u304B\u304B\u308F\u3089\u305A\u5B9A\u7FA9\u3055\u308C\u307E\u3057\u305F\n\tnotdefined -- \u5FA9\u5143\u53EF\u80FD\u3067\u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306E\u305F\u3081\u5B9A\u7FA9\u3055\u308C\u307E\u305B\u3093\n\u672A\u89E3\u6C7A\u6570\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306E\u6570\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tunresolved0 -- \u672A\u89E3\u6C7A\u306E\u540D\u524D\u306F\u3042\u308A\u307E\u305B\u3093\n\tunresolved1 -- 1\u3064\u306E\u540D\u524D\u304C\u89E3\u6C7A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n\tunresolved2 -- 2\u3064\u4EE5\u4E0A\u306E\u540D\u524D\u304C\u89E3\u6C7A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n\u30A8\u30E9\u30FC\u6570\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30A8\u30E9\u30FC\u306E\u6570\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\terror0 -- \u30A8\u30E9\u30FC\u306A\u3057\n\terror1 -- 1\u3064\u306E\u30A8\u30E9\u30FC\n\terror2 -- 2\u3064\u4EE5\u4E0A\u306E\u30A8\u30E9\u30FC\n\n\u4F8B:\n\t/set format myformat action 'Created' added-primary\n\t/set format myformat action 'Update replaced' replaced-update\n\t/set format myformat display '{pre}{action} class {name}{post}' class-ok\n\t/set format myformat display '{pre}{action} variable {name}, reset to null{post}' replaced-vardecl,varinit-ok-update\n\n\u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u5BFE\u3059\u308B\u5F8C\u7D9A\u306E\u30BB\u30EC\u30AF\u30BF\u306B\u3088\u308A\u3001\u4EE5\u524D\u306B\u4F7F\u7528\u3055\u308C\u305F\u30BB\u30EC\u30AF\u30C8\u306E\u4E00\u90E8\u307E\u305F\u306F\u3059\u3079\u3066\u304C\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059 -- \u6700\u5F8C\u306E\u30BB\u30EC\u30AF\u30BF\u304C\u6709\u52B9\u306B\u306A\u308A\u307E\u3059\n +\u6B63\u3057\u304F\u89E3\u6C7A\u3055\u308C\u307E\u3057\u305F\n\tdefined -- \u5FA9\u5143\u53EF\u80FD\u3067\u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306B\u3082\u304B\u304B\u308F\u3089\u305A\u5B9A\u7FA9\u3055\u308C\u307E\u3057\u305F\n\tnotdefined -- \u5FA9\u5143\u53EF\u80FD\u3067\u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306E\u305F\u3081\u5B9A\u7FA9\u3055\u308C\u307E\u305B\u3093\n\u672A\u89E3\u6C7A\u6570\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u672A\u89E3\u6C7A\u306E\u53C2\u7167\u306E\u6570\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tunresolved0 -- \u672A\u89E3\u6C7A\u306E\u540D\u524D\u306F\u3042\u308A\u307E\u305B\u3093\n\tunresolved1 -- 1\u3064\u306E\u540D\u524D\u304C\u89E3\u6C7A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n\tunresolved2 -- 2\u3064\u4EE5\u4E0A\u306E\u540D\u524D\u304C\u89E3\u6C7A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n\u30A8\u30E9\u30FC\u6570\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30A8\u30E9\u30FC\u306E\u6570\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\terror0 -- \u30A8\u30E9\u30FC\u306A\u3057\n\terror1 -- 1\u3064\u306E\u30A8\u30E9\u30FC\n\terror2 -- 2\u3064\u4EE5\u4E0A\u306E\u30A8\u30E9\u30FC\n\n\u4F8B:\n\t/set format myformat action 'Created' added-primary\n\t/set format myformat action 'Update replaced' replaced-update\n\t/set format myformat display '{pre}{action} class {name}{post}' class-ok\n\t/set format myformat display '{pre}{action} \u5909\u6570 {name}\u3001null\u306B\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F{post}' replaced-vardecl,varinit-ok-update\n\n\u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u5BFE\u3059\u308B\u5F8C\u7D9A\u306E\u30BB\u30EC\u30AF\u30BF\u306B\u3088\u308A\u3001\u4EE5\u524D\u306B\u4F7F\u7528\u3055\u308C\u305F\u30BB\u30EC\u30AF\u30C8\u306E\u4E00\u90E8\u307E\u305F\u306F\u3059\u3079\u3066\u304C\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059 -- \u6700\u5F8C\u306E\u30BB\u30EC\u30AF\u30BF\u304C\u6709\u52B9\u306B\u306A\u308A\u307E\u3059\n help.set.truncation = \u8868\u793A\u3055\u308C\u308B\u5024\u306E\u6700\u5927\u9577\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\n\n\t/set truncation ...\n\n\u306F\u4E8B\u524D\u306B\u5B9A\u7FA9\u3055\u308C\u305F\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u30FB\u30E2\u30FC\u30C9\u306E\u540D\u524D\u3067\u3059 -- '/help /set mode'\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\n\u306F\u6700\u5927\u9577\u3092\u8868\u3059\u7B26\u53F7\u306A\u3057\u6574\u6570\u3067\u3059\u3002\n\u306F\u5F15\u7528\u7B26\u306B\u56F2\u307E\u308C\u305F\u6587\u5B57\u5217\u3067\u3001\u6B21\u306E\u5834\u5408\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u5024\u3067\u3059:\n\u306F\u3001\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306B\u3088\u3063\u3066\u5207\u6368\u3066\u9577\u306E\u5024\u3092\u5FAE\u8ABF\u6574\u3059\u308B\u5834\u5408\u306B\u306E\u307F\n\u5FC5\u8981\u3067\u3059\u3002\u306F\u3001\u5207\u6368\u3066\u304C\u9069\u7528\u3055\u308C\u308B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3067\u3059\u3002\n\u30BB\u30EC\u30AF\u30BF\u69CB\u9020\u306F\u3001\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u306E\u30CF\u30A4\u30D5\u30F3\u533A\u5207\u308A\u306E\u30EA\u30B9\u30C8\u3067\u3059\u3002\n\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u306F\u30011\u3064\u306E\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306E\u5024\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u306E\u30EA\u30B9\u30C8\u3067\u3059\u3002\n\u30BB\u30EC\u30AF\u30BF\u306F\u5404\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u304C\u4E00\u81F4\u3059\u308C\u3070\u4E00\u81F4\u3068\u306A\u308A\u307E\u3059\u3002\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u30EA\u30B9\u30C8\u306F\n\u3044\u305A\u308C\u304B\u306E\u5024\u304C\u4E00\u81F4\u3059\u308C\u3070\u4E00\u81F4\u3068\u306A\u308A\u307E\u3059\u3002\n\n\u6B21\u306B\u793A\u3059\u306E\u306F\u3001\u5207\u6368\u3066\u306B\u95A2\u9023\u3059\u308B\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u3067\u3059\u3002\n\n\u30B1\u30FC\u30B9\u30FB\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u7A2E\u985E\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tvardecl -- \u521D\u671F\u5316\u3057\u306A\u3044\u5909\u6570\u5BA3\u8A00\n\tvarinit -- \u521D\u671F\u5316\u3057\u306A\u3044\u5909\u6570\u5BA3\u8A00\n\texpression -- \u5F0F -- \u6CE8\u610F: {name}==scratch-variable-name\n\tvarvalue -- \u5909\u6570\u5024\u5F0F\n\tassignment -- \u5909\u6570\u3092\u5272\u308A\u5F53\u3066\u307E\u3059\n\t\u30A2\u30AF\u30B7\u30E7\u30F3\u30FB\u30BB\u30EC\u30AF\u30BF\u7A2E\u985E\u306F\u3001\u30B9\u30CB\u30DA\u30C3\u30C8\u306B\u767A\u751F\u3057\u305F\u5185\u5BB9\u3092\u793A\u3057\u307E\u3059\u3002\u5024\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059:\n\tadded -- \u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\n\tmodified -- \u65E2\u5B58\u306E\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F\n\treplaced -- \u65E2\u5B58\u306E\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u65B0\u898F\u30B9\u30CB\u30DA\u30C3\u30C8\u3067\u7F6E\u63DB\u3055\u308C\u307E\u3057\u305F\n\u4F8B:\n\t/set trunc mymode 80\n\t/set truncation mymode 45 expression\n\t/set truncation mymode 0 vardecl-modified,replaced\n\n\u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u5BFE\u3059\u308B\u5F8C\u7D9A\u306E\u30BB\u30EC\u30AF\u30BF\u306B\u3088\u308A\u3001\u4EE5\u524D\u306B\u4F7F\u7528\u3055\u308C\u305F\u30BB\u30EC\u30AF\u30BF\u306E\u4E00\u90E8\u307E\u305F\u306F\u3059\u3079\u3066\u304C\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059 -- \u6700\u5F8C\u306E\u30BB\u30EC\u30AF\u30BF\u304C\u6709\u52B9\u306B\u306A\u308A\u307E\u3059\n @@ -253,4 +253,4 @@ help.retain.start =\u8D77\u52D5\u69CB\u6210\u3092\u8A2D\u5B9A\u3057\u307E\u3059 -- \u8D77\u52D5\u6642\u306B\u8AAD\u307F\u53D6\u3089\u308C\u308B\u30B9\u30CB\u30DA\u30C3\u30C8\u304A\u3088\u3073\u30B3\u30DE\u30F3\u30C9\u306E\n\u30B7\u30FC\u30B1\u30F3\u30B9\u3002\n\n\t/retain start [|-default|-none]\n\n\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u6307\u5B9A\u3057\u305F\u306E\u5185\u5BB9\u304C\n\u8D77\u52D5\u30B9\u30CB\u30DA\u30C3\u30C8\u304A\u3088\u3073\u30B3\u30DE\u30F3\u30C9\u306B\n\u306A\u308A\u307E\u3059\u3002\n\u304B\u308F\u308A\u306B-default\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u4E8B\u524D\u306B\u5B9A\u7FA9\u3055\u308C\u305F\u8D77\u52D5\u30B9\u30CB\u30DA\u30C3\u30C8\u304C\n\u8D77\u52D5\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\n-none\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3059\u308B\u3068\u3001\u8D77\u52D5\u304C\u7A7A\u306B\u306A\u308A\u307E\u3059 -- \u8D77\u52D5\u30B9\u30CB\u30DA\u30C3\u30C8\u307E\u305F\u306F\n\u30B3\u30DE\u30F3\u30C9\u304C\u4F7F\u7528\u3055\u308C\u307E\u305B\u3093\u3002\n\u3053\u308C\u3089\u3092\u4F55\u3082\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u3001\u8D77\u52D5\u306F'/set start''\u307E\u305F\u306F''/retain start'\u30B3\u30DE\u30F3\u30C9\u3067\n\u6700\u5F8C\u306B\u6307\u5B9A\u3055\u308C\u305F\u3082\u306E\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\n\u8D77\u52D5\u306F\u4FDD\u6301\u3055\u308C\u3001jshell\u30C4\u30FC\u30EB\u304C\u8D77\u52D5\u307E\u305F\u306F\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u305F\u3068\u304D\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059 startup.feedback = /set mode verbose -command \n\n/set prompt verbose '\\njshell> ' ' ...> ' \n\n/set format verbose pre '| ' \n/set format verbose post '%n' \n/set format verbose errorpre '| ' \n/set format verbose errorpost '%n' \n\n/set format verbose errorline '{post}{pre} {err}' \n\n/set format verbose action '\u4F5C\u6210\u6E08' added-primary \n/set format verbose action '\u5909\u66F4\u6E08' modified-primary \n/set format verbose action '\u7F6E\u63DB\u6E08' replaced-primary \n/set format verbose action '\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u6E08' overwrote-primary \n/set format verbose action '\u524A\u9664\u6E08' dropped-primary \n/set format verbose action ' \u66F4\u65B0\u4F5C\u6210\u6E08' added-update \n/set format verbose action ' \u66F4\u65B0\u5909\u66F4\u6E08' modified-update \n/set format verbose action ' \u66F4\u65B0\u7F6E\u63DB\u6E08' replaced-update \n/set format verbose action ' \u66F4\u65B0\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u6E08' overwrote-update \n/set format verbose action ' \u66F4\u65B0\u524A\u9664\u6E08' dropped-update \n\n/set format verbose until '\u3001\u305F\u3060\u3057\u3001\u6B21\u307E\u3067\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u5316\u3067\u304D\u306A\u3044\u304B\u3001\u305D\u306E\u30E1\u30BD\u30C3\u30C9\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093:' defined-class-primary \n/set format verbose until '\u3001\u305F\u3060\u3057\u3001\u6B21\u307E\u3067\u305D\u306E\u30E1\u30BD\u30C3\u30C9\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093:' defined-interface-primary \n/set format verbose until '\u3001\u305F\u3060\u3057\u3001\u6B21\u307E\u3067\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093:' defined-enum,annotation-primary \n/set format verbose until '\u3001\u305F\u3060\u3057\u3001\u6B21\u307E\u3067\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093:' defined-method-primary \n/set format verbose until '\u3001\u305F\u3060\u3057\u3001\u6B21\u307E\u3067\u53C2\u7167\u3067\u304D\u307E\u305B\u3093:' notdefined-primary \n/set format verbose until ' \u6B21\u307E\u3067\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u5316\u3067\u304D\u306A\u3044\u304B\u3001\u305D\u306E\u30E1\u30BD\u30C3\u30C9\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093:' defined-class-update \n/set format verbose until ' \u6B21\u307E\u3067\u30E1\u30BD\u30C3\u30C9\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093:' defined-interface-update \n/set format verbose until ' \u6B21\u307E\u3067\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093:' defined-method-update \n/set format verbose until ' \u6B21\u307E\u3067\u53C2\u7167\u3067\u304D\u307E\u305B\u3093:' notdefined-update \n\n/set format verbose unrerr '{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u307E\u3057\u305F' unresolved1-error0 \n/set format verbose unrerr '{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u307E\u3057\u305F' unresolved2-error0 \n/set format verbose unrerr ' \u3053\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved0-error1 \n/set format verbose unrerr '{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u3001\u3053\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved1-error1 \n/set format verbose unrerr '{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u3001\u3053\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved2-error1 \n/set format verbose unrerr ' \u3053\u308C\u3089\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved0-error2 \n/set format verbose unrerr \ -'{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u3001\u3053\u308C\u3089\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved1-error2 \n/set format verbose unrerr '{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u3001\u3053\u308C\u3089\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved2-error2 \n\n/set format verbose resolve '{until}{unrerr}' added,modified,replaced,used \n\n/set format verbose typeKind '\u30AF\u30E9\u30B9' class \n/set format verbose typeKind '\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9' interface \n/set format verbose typeKind '\u5217\u6319\u578B' enum \n/set format verbose typeKind '\u6CE8\u91C8\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9' annotation \n\n/set format verbose result '{name} ==> {value}{post}' added,modified,replaced-ok-primary \n\n/set format verbose display '{result}{pre}\u30B9\u30AF\u30E9\u30C3\u30C1\u5909\u6570{name}\u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F : {type}{post}' expression-added,modified,replaced-primary \n/set format verbose display '{result}{pre}{name}\u306E\u5024 : {type}{post}' varvalue-primary \n/set format verbose display '{result}{pre}{name}\u306B\u5272\u308A\u5F53\u3066\u3089\u308C\u307E\u3057\u305F : {type}{post}' assignment-primary \n/set format verbose display '{result}{pre}{action} \u5909\u6570 {name} : {type}{resolve}{post}' varinit,vardecl \n/set format verbose display '{pre}{action} \u5909\u6570 {name}{resolve}{post}' vardecl,varinit-notdefined \n/set format verbose display '{pre}{action} \u5909\u6570 {name}{post}' dropped-vardecl,varinit,expression \n/set format verbose display '{pre}{action} \u5909\u6570 {name}\u3001null\u306B\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F{post}' replaced-vardecl,varinit-ok-update \n\n/set format verbose display '{pre}{action} {typeKind} {name}{resolve}{post}' class,interface,enum,annotation \n/set format verbose display '{pre}{action} \u30E1\u30BD\u30C3\u30C9 {name}({type})\u3092\u547C\u3073\u51FA\u305D\u3046\u3068\u3057\u307E\u3057\u305F{resolve}{post}' method \n\n/set format verbose display '{pre}{typeKind} {name}\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u307E\u3057\u305F{resolve}{post}' used-class,interface,enum,annotation \n/set format verbose display '{pre}\u30E1\u30BD\u30C3\u30C9{name}({type})\u3092\u547C\u3073\u51FA\u305D\u3046\u3068\u3057\u307E\u3057\u305F{resolve}{post}' used-method \n\n/set truncation verbose 80\n/set truncation verbose 1000 varvalue,expression\n\n/set mode normal -command verbose \n/set format normal display '' added,modified,replaced,overwrote,dropped-update \n/set format normal display '{pre}{action} variable {name}, reset to null{post}' replaced-vardecl,varinit-ok-update \n/set format normal display '{result}' added,modified,replaced-expression,varvalue,assignment,varinit,vardecl-ok-primary \n/set mode concise -quiet normal \n\n/set prompt concise 'jshell> ' ' ...> ' \n\n/set format concise display '' class,interface,enum,annotation,method,assignment,varinit,vardecl-ok \n\n/set feedback normal \n\n/set mode silent -quiet \n/set prompt silent '-> ' '>> ' \n/set format silent pre '| ' \n/set format silent post '%n' \n/set format silent errorpre '| ' \n/set format silent errorpost '%n' \n/set format silent display '' \n +'{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u3001\u3053\u308C\u3089\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved1-error2 \n/set format verbose unrerr '{unresolved}\u304C\u5BA3\u8A00\u3055\u308C\u3001\u3053\u308C\u3089\u306E\u30A8\u30E9\u30FC\u306F\u4FEE\u6B63\u3055\u308C\u307E\u3057\u305F: {errors}' unresolved2-error2 \n\n/set format verbose resolve '{until}{unrerr}' added,modified,replaced,used \n\n/set format verbose typeKind '\u30AF\u30E9\u30B9' class \n/set format verbose typeKind '\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9' interface \n/set format verbose typeKind '\u5217\u6319\u578B' enum \n/set format verbose typeKind '\u6CE8\u91C8\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9' annotation \n\n/set format verbose result '{name} ==> {value}{post}' added,modified,replaced-ok-primary \n\n/set format verbose display '{result}{pre}\u30B9\u30AF\u30E9\u30C3\u30C1\u5909\u6570{name}\u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F : {type}{post}' expression-added,modified,replaced-primary \n/set format verbose display '{result}{pre}{name}\u306E\u5024 : {type}{post}' varvalue-primary \n/set format verbose display '{result}{pre}{name}\u306B\u5272\u308A\u5F53\u3066\u3089\u308C\u307E\u3057\u305F : {type}{post}' assignment-primary \n/set format verbose display '{result}{pre}{action} \u5909\u6570 {name} : {type}{resolve}{post}' varinit,vardecl \n/set format verbose display '{pre}{action} \u5909\u6570 {name}{resolve}{post}' vardecl,varinit-notdefined \n/set format verbose display '{pre}{action} \u5909\u6570 {name}{post}' dropped-vardecl,varinit,expression \n/set format verbose display '{pre}{action} \u5909\u6570 {name}\u3001null\u306B\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F{post}' replaced-vardecl,varinit-ok-update \n\n/set format verbose display '{pre}{action} {typeKind} {name}{resolve}{post}' class,interface,enum,annotation \n/set format verbose display '{pre}{action} \u30E1\u30BD\u30C3\u30C9 {name}({type})\u3092\u547C\u3073\u51FA\u305D\u3046\u3068\u3057\u307E\u3057\u305F{resolve}{post}' method \n\n/set format verbose display '{pre}{typeKind} {name}\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u307E\u3057\u305F{resolve}{post}' used-class,interface,enum,annotation \n/set format verbose display '{pre}\u30E1\u30BD\u30C3\u30C9{name}({type})\u3092\u547C\u3073\u51FA\u305D\u3046\u3068\u3057\u307E\u3057\u305F{resolve}{post}' used-method \n\n/set truncation verbose 80\n/set truncation verbose 1000 varvalue,expression\n\n/set mode normal -command verbose \n/set format normal display '' added,modified,replaced,overwrote,dropped-update \n/set format normal display '{pre}{action} \u5909\u6570 {name}\u3001null\u306B\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F{post}' replaced-vardecl,varinit-ok-update \n/set format normal display '{result}' added,modified,replaced-expression,varvalue,assignment,varinit,vardecl-ok-primary \n/set mode concise -quiet normal \n\n/set prompt concise 'jshell> ' ' ...> ' \n\n/set format concise display '' class,interface,enum,annotation,method,assignment,varinit,vardecl-ok \n\n/set feedback normal \n\n/set mode silent -quiet \n/set prompt silent '-> ' '>> ' \n/set format silent pre '| ' \n/set format silent post '%n' \n/set format silent errorpre '| ' \n/set format silent errorpost '%n' \n/set format silent display '' \n diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/6330997/T6330997.java --- a/langtools/test/tools/javac/6330997/T6330997.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/javac/6330997/T6330997.java Fri Aug 05 12:03:58 2016 -0700 @@ -44,9 +44,7 @@ import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.code.ClassFinder.BadClassFile; import com.sun.tools.javac.code.Symtab; -import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.main.JavaCompiler; -import com.sun.tools.javac.util.List; import javax.tools.ToolProvider; public class T6330997 { @@ -57,8 +55,7 @@ JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, null, null, null, null, null); JavaCompiler compiler = JavaCompiler.instance(task.getContext()); Symtab syms = Symtab.instance(task.getContext()); - Modules modules = Modules.instance(task.getContext()); - modules.enter(List.nil(), null); + task.ensureEntered(); try { compiler.resolveIdent(syms.unnamedModule, "T1").complete(); } catch (Exception e) { diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/T6435291/T6435291.java --- a/langtools/test/tools/javac/T6435291/T6435291.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/javac/T6435291/T6435291.java Fri Aug 05 12:03:58 2016 -0700 @@ -38,9 +38,7 @@ import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.code.ClassFinder.BadClassFile; import com.sun.tools.javac.code.Symtab; -import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.main.JavaCompiler; -import com.sun.tools.javac.util.List; import javax.tools.ToolProvider; public class T6435291 { @@ -48,8 +46,7 @@ javax.tools.JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, null, null, null, null, null); Symtab syms = Symtab.instance(task.getContext()); - //initialize unnamed module: - Modules.instance(task.getContext()).enter(List.nil(), syms.errSymbol); + task.ensureEntered(); JavaCompiler compiler = JavaCompiler.instance(task.getContext()); try { compiler.resolveIdent(syms.unnamedModule, "T").complete(); diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/T8161277/IsSameTypeWildcardTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T8161277/IsSameTypeWildcardTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8161277 + * @summary javax.lang.model.util.Types.isSameType(...) returns true on wildcards + * @library /tools/lib/types + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.compiler/com.sun.tools.javac.code + * jdk.compiler/com.sun.tools.javac.comp + * jdk.compiler/com.sun.tools.javac.tree + * jdk.compiler/com.sun.tools.javac.util + * jdk.compiler/com.sun.tools.javac.file + * jdk.compiler/com.sun.tools.javac.model + * @build TypeHarness + * @run main IsSameTypeWildcardTest + */ + +import java.util.ArrayList; +import java.util.List; + +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.util.Assert; +import com.sun.tools.javac.model.JavacTypes; + +public class IsSameTypeWildcardTest extends TypeHarness { + StrToTypeFactory strToTypeFactory; + JavacTypes javacTypes; + + public static void main(String... args) throws Exception { + new IsSameTypeWildcardTest().runTest(); + } + + public IsSameTypeWildcardTest() { + javacTypes = JavacTypes.instance(context); + } + + void runTest() { + List imports = new ArrayList<>(); + imports.add("java.util.*"); + strToTypeFactory = new StrToTypeFactory(null, imports, null); + + Type listOfWildcard = strToTypeFactory.getType("List"); + com.sun.tools.javac.util.List arguments = listOfWildcard.getTypeArguments(); + Assert.check(!javacTypes.isSameType(arguments.head, arguments.head), + "if any argument is a wildcard then result must be false"); + } +} diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/api/6400303/T6400303.java --- a/langtools/test/tools/javac/api/6400303/T6400303.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/javac/api/6400303/T6400303.java Fri Aug 05 12:03:58 2016 -0700 @@ -41,17 +41,14 @@ import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.code.Symbol.CompletionFailure; import com.sun.tools.javac.code.Symtab; -import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.main.JavaCompiler; -import com.sun.tools.javac.util.List; public class T6400303 { public static void main(String... args) { javax.tools.JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, null, null, null, null, null); Symtab syms = Symtab.instance(task.getContext()); - //initialize unnamed module: - Modules.instance(task.getContext()).enter(List.nil(), syms.errSymbol); + task.ensureEntered(); JavaCompiler compiler = JavaCompiler.instance(task.getContext()); try { compiler.resolveIdent(syms.unnamedModule, "Test$1").complete(); diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/api/TestResolveIdent.java --- a/langtools/test/tools/javac/api/TestResolveIdent.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/javac/api/TestResolveIdent.java Fri Aug 05 12:03:58 2016 -0700 @@ -36,9 +36,7 @@ import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.code.Symtab; -import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.main.JavaCompiler; -import com.sun.tools.javac.util.List; import java.io.IOException; import javax.tools.ToolProvider; @@ -54,8 +52,7 @@ JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, null, null, null, null, null); JavaCompiler compiler = JavaCompiler.instance(task.getContext()); Symtab syms = Symtab.instance(task.getContext()); - Modules modules = Modules.instance(task.getContext()); - modules.enter(List.nil(), null); + task.ensureEntered(); System.out.println(compiler.resolveIdent(syms.unnamedModule, getDeprecatedClass().getCanonicalName())); } diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/defaultMethods/BadClassfile.java --- a/langtools/test/tools/javac/defaultMethods/BadClassfile.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/javac/defaultMethods/BadClassfile.java Fri Aug 05 12:03:58 2016 -0700 @@ -42,11 +42,9 @@ import com.sun.tools.javac.code.ClassFinder.BadClassFile; import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symtab; -import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.jvm.Target; import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.JCDiagnostic; -import com.sun.tools.javac.util.List; import java.io.File; import java.util.Arrays; import java.util.Objects; @@ -74,8 +72,7 @@ JavacTaskImpl task = (JavacTaskImpl) c.getTask(null, null, null, Arrays.asList("-classpath", System.getProperty("test.classes", ".")), null, null); Symtab syms = Symtab.instance(task.getContext()); - //initialize unnamed module: - Modules.instance(task.getContext()).enter(List.nil(), syms.errSymbol); + task.ensureEntered(); try { Symbol clazz = com.sun.tools.javac.main.JavaCompiler.instance(task.getContext()).resolveIdent(syms.unnamedModule, classname); diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/lib/combo/ReusableContext.java --- a/langtools/test/tools/javac/lib/combo/ReusableContext.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/javac/lib/combo/ReusableContext.java Fri Aug 05 12:03:58 2016 -0700 @@ -41,6 +41,7 @@ import com.sun.tools.javac.comp.Check; import com.sun.tools.javac.comp.CompileStates; import com.sun.tools.javac.comp.Enter; +import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.main.Arguments; import com.sun.tools.javac.main.JavaCompiler; import com.sun.tools.javac.tree.JCTree.JCClassDecl; @@ -92,6 +93,7 @@ ((ReusableJavaCompiler)ReusableJavaCompiler.instance(this)).clear(); Types.instance(this).newRound(); Check.instance(this).newRound(); + Modules.instance(this).newRound(); CompileStates.instance(this).clear(); MultiTaskListener.instance(this).clear(); diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/modules/T8158224/Processor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8158224/Processor.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Set; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.element.TypeElement; +import javax.lang.model.SourceVersion; + +@SupportedAnnotationTypes("Blah") +@SupportedSourceVersion(SourceVersion.RELEASE_6) +public class Processor extends AbstractProcessor { + + @Override + public boolean process(Set tE, RoundEnvironment env) { + return true; + } +} \ No newline at end of file diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/modules/T8158224/T8158224.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8158224/T8158224.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8158224 + * @summary NullPointerException in com.sun.tools.javac.comp.Modules.checkCyclicDependencies when module missing + * @build Processor + * @compile/fail/ref=T8158224.out -XDrawDiagnostics -processor Processor mods/foo/module-info.java + */ + +// No code here, this file is just to host test description. diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/modules/T8158224/T8158224.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8158224/T8158224.out Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,2 @@ +module-info.java:4:14: compiler.err.module.not.found: nonexistent +1 error diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javac/modules/T8158224/mods/foo/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8158224/mods/foo/module-info.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,5 @@ +/* /nodynamiccopyright/ */ + +module foo { + requires nonexistent; +} diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/javap/ControlCharTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javap/ControlCharTest.java Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8143366 + * @summary Check that control chars are displayed correctly + * @modules jdk.jdeps/com.sun.tools.javap + * @run testng ControlCharTest + */ + +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Scanner; +import java.util.regex.Pattern; + +public class ControlCharTest { + private String classpath; + private Path output; + private Pattern ptrn; + + @BeforeClass + public void initialize() throws Exception { + String testClasses = System.getProperty("test.classes", "."); + classpath = "-classpath " + testClasses + " ControlCharTest$Strings"; + String userdir = System.getProperty("user.dir", "."); + output = Paths.get(userdir, "output.txt"); + String regex = Pattern.quote("\\u0001\\u0002\\u0003") // \u0001\u0002\u0003 + + ".+123.+" // 123 + + Pattern.quote("\\\\u0000") // \\u0000 + + ".+" + + Pattern.quote("\\u0000") // \u0000 + ; + ptrn = Pattern.compile(regex, Pattern.DOTALL); + } + + @AfterClass + public void close() throws IOException { + Files.deleteIfExists(output); + } + + @DataProvider(name = "options") + public Object[][] createData() { + return new Object[][] { + { "-v", ""}, + { "-constants", ""} + }; + } + @Test(dataProvider = "options") + public void test(String option, String ignore) throws Exception { + String cmdline = option + " " + classpath; + javap(cmdline.split(" +")); + try (Scanner scnr = new Scanner(output)) { + Assert.assertNotNull(scnr.findWithinHorizon(ptrn, 0)); + } + } + + private void javap(String... args) throws Exception { + try (PrintWriter out = new PrintWriter(output.toFile())) { + int rc = com.sun.tools.javap.Main.run(args, out); + if (rc < 0) + throw new Exception("javap exited, rc=" + rc); + } + } + + // small class to test + static class Strings { + static final String s = "\1\2\3"; + static final String s1 = "123"; + static final String s2 = "\\u0000"; + static final String s3 = "\0"; + static String f() { return s + s1 + s2 + s3; } + } +} + + diff -r 8b413b0e064c -r 592a43ff92cd langtools/test/tools/lib/types/TypeHarness.java --- a/langtools/test/tools/lib/types/TypeHarness.java Fri Aug 05 16:20:02 2016 +0300 +++ b/langtools/test/tools/lib/types/TypeHarness.java Fri Aug 05 12:03:58 2016 -0700 @@ -22,6 +22,7 @@ */ import java.net.URI; +import java.util.ArrayList; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -40,6 +41,7 @@ import com.sun.tools.javac.comp.Check; import com.sun.tools.javac.comp.Infer; import com.sun.tools.javac.comp.InferenceContext; +import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Name; @@ -82,6 +84,7 @@ * The code then verifies that {@code [X:=Object,Y:=Object]A == A}. * * @author mcimadamore + * @author vromero */ public class TypeHarness { @@ -91,19 +94,20 @@ protected Names names; protected ReusableJavaCompiler tool; protected Infer infer; + protected Context context; protected Factory fac; protected TypeHarness() { - Context ctx = new Context(); - JavacFileManager.preRegister(ctx); - MyAttr.preRegister(ctx); - tool = new ReusableJavaCompiler(ctx); - types = Types.instance(ctx); - infer = Infer.instance(ctx); - chk = Check.instance(ctx); - predef = Symtab.instance(ctx); - names = Names.instance(ctx); + context = new Context(); + JavacFileManager.preRegister(context); + MyAttr.preRegister(context); + tool = new ReusableJavaCompiler(context); + types = Types.instance(context); + infer = Infer.instance(context); + chk = Check.instance(context); + predef = Symtab.instance(context); + names = Names.instance(context); fac = new Factory(); } @@ -411,8 +415,8 @@ public StrToTypeFactory(String pkg, java.util.List imports, java.util.List typeVarDecls) { this.pkg = pkg; this.imports = imports; - this.typeVarDecls = typeVarDecls; - this.typeVariables = from(typeVarDecls.stream() + this.typeVarDecls = typeVarDecls == null ? new ArrayList<>() : typeVarDecls; + this.typeVariables = from(this.typeVarDecls.stream() .map(this::typeVarName) .map(this::getType) .collect(Collectors.toList()) @@ -420,7 +424,7 @@ } TypeVar getTypeVarFromStr(String name) { - if (typeVarDecls == null) { + if (typeVarDecls.isEmpty()) { return null; } int index = typeVarDecls.indexOf(name); @@ -476,7 +480,7 @@ public CharSequence getCharContent(boolean ignoreEncodingErrors) { String impStmts = imports.size() > 0 ? imports.stream().map(i -> "import " + i + ";").collect(Collectors.joining("\n")) : ""; - String tvars = typeVarDecls.size() > 0 ? + String tvars = !typeVarDecls.isEmpty() ? typeVarDecls.stream().collect(Collectors.joining(",", "<", ">")) : ""; return template .replace("#Package", (pkg == null) ? "" : "package " + pkg + ";") @@ -534,6 +538,7 @@ void clear() { newRound(); + Modules.instance(context).newRound(); } } // diff -r 8b413b0e064c -r 592a43ff92cd make/common/Modules.gmk --- a/make/common/Modules.gmk Fri Aug 05 16:20:02 2016 +0300 +++ b/make/common/Modules.gmk Fri Aug 05 12:03:58 2016 -0700 @@ -55,16 +55,12 @@ java.naming \ java.prefs \ java.rmi \ - java.security.jgss \ java.security.sasl \ java.xml \ - java.xml.crypto \ jdk.httpserver \ jdk.management \ jdk.net \ jdk.sctp \ - jdk.security.auth \ - jdk.security.jgss \ jdk.unsupported \ jdk.vm.ci \ # @@ -103,19 +99,23 @@ PLATFORM_MODULES += \ java.compiler \ java.scripting \ + java.security.jgss \ java.smartcardio \ java.sql \ java.sql.rowset \ + java.xml.crypto \ jdk.accessibility \ jdk.charsets \ jdk.crypto.ec \ jdk.crypto.pkcs11 \ jdk.dynalink \ jdk.jsobject \ - jdk.xml.dom \ jdk.localedata \ jdk.naming.dns \ jdk.scripting.nashorn \ + jdk.security.auth \ + jdk.security.jgss \ + jdk.xml.dom \ jdk.zipfs \ # diff -r 8b413b0e064c -r 592a43ff92cd nashorn/.hgtags --- a/nashorn/.hgtags Fri Aug 05 16:20:02 2016 +0300 +++ b/nashorn/.hgtags Fri Aug 05 12:03:58 2016 -0700 @@ -362,3 +362,4 @@ ee90c69a18409533df8f7b602044bf966a28381a jdk-9+126 ff07be6106fa56b72c163244f45a3ecb4c995564 jdk-9+127 5a189c5b396c353786343b590f6c19a5d929f01d jdk-9+128 +68020a486500422e2c8b94b0f35cafe54c9e219a jdk-9+129 diff -r 8b413b0e064c -r 592a43ff92cd nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Fri Aug 05 16:20:02 2016 +0300 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Fri Aug 05 12:03:58 2016 -0700 @@ -3057,6 +3057,7 @@ LexicalScope(final Global global) { super(global, PropertyMap.newMap()); + setIsInternal(); } @Override diff -r 8b413b0e064c -r 592a43ff92cd nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Fri Aug 05 16:20:02 2016 +0300 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Fri Aug 05 12:03:58 2016 -0700 @@ -123,6 +123,9 @@ /** Is this a builtin object? */ public static final int IS_BUILTIN = 1 << 3; + /** Is this an internal object that should not be visible to scripts? */ + public static final int IS_INTERNAL = 1 << 4; + /** * Spill growth rate - by how many elements does {@link ScriptObject#primitiveSpill} and * {@link ScriptObject#objectSpill} when full @@ -1668,6 +1671,21 @@ } /** + * Tag this script object as internal object that should not be visible to script code. + */ + public final void setIsInternal() { + flags |= IS_INTERNAL; + } + + /** + * Check if this script object is an internal object that should not be visible to script code. + * @return true if internal + */ + public final boolean isInternal() { + return (flags & IS_INTERNAL) != 0; + } + + /** * Clears the properties from a ScriptObject * (java.util.Map-like method to help ScriptObjectMirror implementation) * @@ -2045,7 +2063,13 @@ private Object megamorphicGet(final String key, final boolean isMethod, final boolean isScope) { final FindProperty find = findProperty(key, true, isScope, this); if (find != null) { - return find.getObjectValue(); + // If this is a method invocation, and found property has a different self object then this, + // then return a function bound to the self object. This is the case for functions in with expressions. + final Object value = find.getObjectValue(); + if (isMethod && value instanceof ScriptFunction && find.getSelf() != this && !find.getSelf().isInternal()) { + return ((ScriptFunction) value).createBound(find.getSelf(), ScriptRuntime.EMPTY_ARRAY); + } + return value; } return isMethod ? getNoSuchMethod(key, isScope, INVALID_PROGRAM_POINT) : invokeNoSuchProperty(key, isScope, INVALID_PROGRAM_POINT); diff -r 8b413b0e064c -r 592a43ff92cd nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Fri Aug 05 16:20:02 2016 +0300 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Fri Aug 05 12:03:58 2016 -0700 @@ -66,6 +66,7 @@ WithObject(final ScriptObject scope, final ScriptObject expression) { super(scope, null); this.expression = expression; + setIsInternal(); } /** @@ -99,37 +100,23 @@ // With scopes can never be observed outside of Nashorn code, so all call sites that can address it will of // necessity have a Nashorn descriptor - it is safe to cast. final NashornCallSiteDescriptor ndesc = (NashornCallSiteDescriptor)desc; - FindProperty find = null; GuardedInvocation link = null; - ScriptObject self; - - final boolean isNamedOperation; - final String name; final Operation op = desc.getOperation(); - if (op instanceof NamedOperation) { - isNamedOperation = true; - name = ((NamedOperation)op).getName().toString(); - } else { - isNamedOperation = false; - name = null; - } - self = expression; - if (isNamedOperation) { - find = self.findProperty(name, true); - } + assert op instanceof NamedOperation; // WithObject is a scope object, access is always named + final String name = ((NamedOperation)op).getName().toString(); + + FindProperty find = expression.findProperty(name, true); if (find != null) { - link = self.lookup(desc, request); + link = expression.lookup(desc, request); if (link != null) { return fixExpressionCallSite(ndesc, link); } } final ScriptObject scope = getProto(); - if (isNamedOperation) { - find = scope.findProperty(name, true); - } + find = scope.findProperty(name, true); if (find != null) { return fixScopeCallSite(scope.lookup(desc, request), name, find.getOwner()); @@ -137,43 +124,41 @@ // the property is not found - now check for // __noSuchProperty__ and __noSuchMethod__ in expression - if (self != null) { - final String fallBack; + final String fallBack; - final StandardOperation firstOp = ndesc.getFirstOperation(); - switch (firstOp) { - case GET_METHOD: - fallBack = NO_SUCH_METHOD_NAME; - break; - case GET_PROPERTY: - case GET_ELEMENT: - fallBack = NO_SUCH_PROPERTY_NAME; - break; - default: - fallBack = null; - break; - } + final StandardOperation firstOp = ndesc.getFirstOperation(); + switch (firstOp) { + case GET_METHOD: + fallBack = NO_SUCH_METHOD_NAME; + break; + case GET_PROPERTY: + case GET_ELEMENT: + fallBack = NO_SUCH_PROPERTY_NAME; + break; + default: + fallBack = null; + break; + } - if (fallBack != null) { - find = self.findProperty(fallBack, true); - if (find != null) { - switch (firstOp) { - case GET_METHOD: - link = self.noSuchMethod(desc, request); - break; - case GET_PROPERTY: - case GET_ELEMENT: - link = self.noSuchProperty(desc, request); - break; - default: - break; - } + if (fallBack != null) { + find = expression.findProperty(fallBack, true); + if (find != null) { + switch (firstOp) { + case GET_METHOD: + link = expression.noSuchMethod(desc, request); + break; + case GET_PROPERTY: + case GET_ELEMENT: + link = expression.noSuchProperty(desc, request); + break; + default: + break; } } + } - if (link != null) { - return fixExpressionCallSite(ndesc, link); - } + if (link != null) { + return fixExpressionCallSite(ndesc, link); } // still not found, may be scope can handle with it's own @@ -204,7 +189,7 @@ // (as opposed from another non-scope object in the proto chain such as Object.prototype). final FindProperty exprProperty = expression.findProperty(key, true, false, expression); if (exprProperty != null) { - return exprProperty; + return exprProperty; } return super.findProperty(key, deep, isScope, start); } @@ -295,14 +280,14 @@ private GuardedInvocation fixScopeCallSite(final GuardedInvocation link, final String name, final ScriptObject owner) { final GuardedInvocation newLink = fixReceiverType(link, WITHSCOPEFILTER); final MethodHandle expressionGuard = expressionGuard(name, owner); - final MethodHandle filterGuardReceiver = filterGuardReceiver(newLink, WITHSCOPEFILTER); + final MethodHandle filteredGuard = filterGuardReceiver(newLink, WITHSCOPEFILTER); return link.replaceMethods( filterReceiver( newLink.getInvocation(), WITHSCOPEFILTER), NashornGuards.combineGuards( expressionGuard, - filterGuardReceiver)); + filteredGuard)); } private static MethodHandle filterGuardReceiver(final GuardedInvocation link, final MethodHandle receiverFilter) { diff -r 8b413b0e064c -r 592a43ff92cd nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornGuards.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornGuards.java Fri Aug 05 16:20:02 2016 +0300 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornGuards.java Fri Aug 05 12:03:58 2016 -0700 @@ -140,7 +140,7 @@ if (!needsGuard(property, desc)) { return null; } - if (NashornCallSiteDescriptor.isScope(desc)) { + if (NashornCallSiteDescriptor.isScope(desc) && sobj.isScope()) { if (property != null && property.isBound() && !property.canChangeType()) { // This is a declared top level variables in main script or eval, use identity guard. return getIdentityGuard(sobj); diff -r 8b413b0e064c -r 592a43ff92cd nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties Fri Aug 05 16:20:02 2016 +0300 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties Fri Aug 05 12:03:58 2016 -0700 @@ -135,3 +135,41 @@ Math.sqrt=returns an approximation to the square root of given argument Math.tan=returns an approximation to the tangent of given argument + +String.fromCharCode=returns a string value containing the characters corresponding to the sequence of unicode values given as arguments + +String.prototype.toString=returns string value of calling object, returns TypeError if calling object is not a string object + +String.prototype.valueOf=returns string value of calling object, returns TypeError if calling object is not a string object + +String.prototype.charAt=returns string value representing the character at the index given as argument, empty string if the index is out of range + +String.prototype.concat=returns the string resulting from appending the argument string value to the calling object + +String.prototype.indexOf=returns the index of first occurrence of specified string, starting the search from position given as argument, returns -1 if the string is not found + +String.prototype.lastIndexOf=returns the index of last occurrence of specified string, searching backwards from position given as argument, returns -1 if the string is not found + +String.prototype.localeCompare=returns negative, zero, or positive value if calling string value comes before, equal, or after argument string value in the locale-sensitive sort order + +String.prototype.match=returns an array containing entire match result when matching calling string value against regular expression given as argument + +String.prototype.replace=returns a new string with some or all matches of pattern argument replaced by the given replacement argument + +String.prototype.search=returns index of the first occurrence of the match between regular expression given as argument and the calling string, returns -1 if not found + +String.prototype.slice=returns a new string by extracting a section of the string according to given arguments + +String.prototype.split=returns an array of strings split at each point where the separator given as argument occurs in the calling string, number of array elements is limited by second argument + +String.prototype.substring=returns a new string value extracted from the calling string starting from first argument position to position before the second argument position + +String.prototype.toLowerCase=returns a new string representing the calling string value converted to lower case + +String.prototype.toLocaleLowerCase=returns a new string representing the calling string value converted to lower case according to any locale specific case mappings + +String.prototype.toUpperCase=returns a new string representing the calling string value converted to upper case + +String.prototype.toLocaleUpperCase=returns a new string representing the calling string value converted to upper case according to any locale specific case mappings + +String.prototype.trim=returns a new string representing the calling string with white space removed from both ends diff -r 8b413b0e064c -r 592a43ff92cd nashorn/test/script/basic/JDK-8160034.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8160034.js Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8160034.js: The `this` value in the `with` is broken by the repetition of a function call + * + * @test + * @option --unstable-relink-threshold=4 + * @run + */ + + +var bar = "BAR"; + +function Foo() { + this.bar = "bar"; + this.baz = "baz"; +} + +function foo_proto_h() { + print(this.bar); + delete Foo.prototype._h; +} + +function foo_proto_e() { + print(this.baz); +} + +function _h() { + print(this.bar); + Foo.prototype._h = foo_proto_h; +} + +Foo.prototype._e = foo_proto_e; +Foo.prototype._h = foo_proto_h; + + +var fn = new Function("with(this) { _h(); _e(); }"); + +for (var i = 0; i < 20; i++) { + fn.call(new Foo()); +} + +for (var i = 0; i < 20; i++) { + foo = new Foo(); + foo['e' + Math.random()] = 1; // force new map + fn.call(foo); +} + diff -r 8b413b0e064c -r 592a43ff92cd nashorn/test/script/basic/JDK-8160034.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8160034.js.EXPECTED Fri Aug 05 12:03:58 2016 -0700 @@ -0,0 +1,80 @@ +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz +bar +baz +BAR +baz