diff --git a/.hgtags b/.hgtags index abf4dd939ca..28f9ad5279c 100644 --- a/.hgtags +++ b/.hgtags @@ -375,3 +375,4 @@ e8373543a3f0f60589b7d72b1f9b172721124caf jdk-9+129 e613affb88d178dc7c589f1679db113d589bddb4 jdk-9+130 4d2a15091124488080d65848b704e25599b2aaeb jdk-9+131 2e83d21d78cd9c1d52e6cd2599e9c8aa36ea1f52 jdk-9+132 +e17429a7e843c4a4ed3651458d0f950970edcbcc jdk-9+133 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 2ab754ea198..9b00c6661fd 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -375,3 +375,4 @@ f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129 d94d54a3192fea79234c3ac55cd0b4052d45e954 jdk-9+130 8728756c2f70a79a90188f4019cfd6b9a275765c jdk-9+131 a24702d4d5ab0015a5c553ed57f66fce7d85155e jdk-9+132 +be1218f792a450dfb5d4b1f82616b9d95a6a732e jdk-9+133 diff --git a/corba/.hgtags b/corba/.hgtags index 2ba88ee0421..a959d0d2240 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -375,3 +375,4 @@ c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129 77f9692d5976ae155773dd3e07533616bb95bae1 jdk-9+130 f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131 1ab4b9399c4cba584f66c1c088188f2f565fbf9c jdk-9+132 +2021bfedf1c478a4808a7711a6090682a12f4c0e jdk-9+133 diff --git a/hotspot/.hgtags b/hotspot/.hgtags index dd85a0e3b2b..8d8a2e6cf99 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -535,3 +535,4 @@ e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129 7d54c7056328b6a2bf4877458b8f4d8cd870f93b jdk-9+130 943bf73b49c33c2d7cbd796f6a4ae3c7a00ae932 jdk-9+131 713951c08aa26813375175c2ab6cc99ff2a56903 jdk-9+132 +a25e0fb6033245ab075136e744d362ce765464cd jdk-9+133 diff --git a/hotspot/src/share/vm/gc/g1/g1Analytics.cpp b/hotspot/src/share/vm/gc/g1/g1Analytics.cpp index 8214a4bfa55..c43b4169e49 100644 --- a/hotspot/src/share/vm/gc/g1/g1Analytics.cpp +++ b/hotspot/src/share/vm/gc/g1/g1Analytics.cpp @@ -316,12 +316,8 @@ size_t G1Analytics::predict_pending_cards() const { return get_new_size_prediction(_pending_cards_seq); } -double G1Analytics::oldest_known_gc_end_time_sec() const { - return _recent_prev_end_times_for_all_gcs_sec->oldest(); -} - double G1Analytics::last_known_gc_end_time_sec() const { - return _recent_prev_end_times_for_all_gcs_sec->last(); + return _recent_prev_end_times_for_all_gcs_sec->oldest(); } void G1Analytics::update_recent_gc_times(double end_time_sec, diff --git a/hotspot/src/share/vm/gc/g1/g1Analytics.hpp b/hotspot/src/share/vm/gc/g1/g1Analytics.hpp index 3f9a37a98e7..a22d0dd72bd 100644 --- a/hotspot/src/share/vm/gc/g1/g1Analytics.hpp +++ b/hotspot/src/share/vm/gc/g1/g1Analytics.hpp @@ -155,7 +155,6 @@ public: void update_recent_gc_times(double end_time_sec, double elapsed_ms); void compute_pause_time_ratio(double interval_ms, double pause_time_ms); - double oldest_known_gc_end_time_sec() const; double last_known_gc_end_time_sec() const; }; diff --git a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp index a267098ed86..d84e1000763 100644 --- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp @@ -28,7 +28,6 @@ #include "classfile/symbolTable.hpp" #include "code/codeCache.hpp" #include "code/icBuffer.hpp" -#include "gc/g1/g1Analytics.hpp" #include "gc/g1/bufferingOopClosure.hpp" #include "gc/g1/concurrentG1Refine.hpp" #include "gc/g1/concurrentG1RefineThread.hpp" @@ -2474,19 +2473,8 @@ size_t G1CollectedHeap::max_capacity() const { } jlong G1CollectedHeap::millis_since_last_gc() { - jlong now = os::elapsed_counter() / NANOSECS_PER_MILLISEC; - const G1Analytics* analytics = _g1_policy->analytics(); - double last = analytics->last_known_gc_end_time_sec(); - jlong ret_val = now - (last * 1000); - if (ret_val < 0) { - // See the notes in GenCollectedHeap::millis_since_last_gc() - // for more information about the implementation. - log_warning(gc)("Detected clock going backwards. " - "Milliseconds since last GC would be " JLONG_FORMAT - ". returning zero instead.", ret_val); - return 0; - } - return ret_val; + // assert(false, "NYI"); + return 0; } void G1CollectedHeap::prepare_for_verify() { diff --git a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp index dfef9538ba7..454f73bc0c6 100644 --- a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp +++ b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp @@ -604,7 +604,7 @@ void G1DefaultPolicy::record_collection_pause_end(double pause_time_ms, size_t c _analytics->report_alloc_rate_ms(alloc_rate_ms); double interval_ms = - (end_time_sec - _analytics->oldest_known_gc_end_time_sec()) * 1000.0; + (end_time_sec - _analytics->last_known_gc_end_time_sec()) * 1000.0; _analytics->update_recent_gc_times(end_time_sec, pause_time_ms); _analytics->compute_pause_time_ratio(interval_ms, pause_time_ms); } diff --git a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp index c1a28350047..049b675bd51 100644 --- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp @@ -1256,21 +1256,21 @@ class GenTimeOfLastGCClosure: public GenCollectedHeap::GenClosure { }; jlong GenCollectedHeap::millis_since_last_gc() { - // javaTimeNanos() is guaranteed to be monotonically non-decreasing - // provided the underlying platform provides such a time source - // (and it is bug free). So we still have to guard against getting - // back a time later than 'now'. + // We need a monotonically non-decreasing time in ms but + // os::javaTimeMillis() does not guarantee monotonicity. jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC; GenTimeOfLastGCClosure tolgc_cl(now); // iterate over generations getting the oldest // time that a generation was collected generation_iterate(&tolgc_cl, false); + // javaTimeNanos() is guaranteed to be monotonically non-decreasing + // provided the underlying platform provides such a time source + // (and it is bug free). So we still have to guard against getting + // back a time later than 'now'. jlong retVal = now - tolgc_cl.time(); if (retVal < 0) { - log_warning(gc)("Detected clock going backwards. " - "Milliseconds since last GC would be " JLONG_FORMAT - ". returning zero instead.", retVal); + NOT_PRODUCT(log_warning(gc)("time warp: " JLONG_FORMAT, retVal);) return 0; } return retVal; diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 380d39ea6ab..e81f2084cef 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -375,3 +375,4 @@ bdc3c0b737efbf899709eb3121ce760dcfb51151 jdk-9+127 e66cdc2de6b02443911d386fc9217b0d824d0686 jdk-9+130 874082a9b565a7092a40bfa934a6e3e3c3455a60 jdk-9+131 907445d85e680ea410fe2c83c0ec64b5508e4f3e jdk-9+132 +9490ba2e5e41685c858a0ca2a6ec87611eb011c6 jdk-9+133 diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java index 52f944101dc..4f0ce4794e8 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java @@ -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 2001-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, @@ -169,6 +169,14 @@ public class ErrorMessages extends ListResourceBundle { {ErrorMsg.INVALID_URI_ERR, "Invalid URI ''{0}''."}, + /* + * Note to translators: This message is displayed when the URI + * mentioned in the substitution text is not well-formed syntactically. + */ + {ErrorMsg.CATALOG_EXCEPTION, + "JAXP08090001: The CatalogResolver is enabled with the catalog \"{0}\", " + + "but a CatalogException is returned."}, + /* * Note to translators: The file or URI named in the substitution text * exists but could not be opened. diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java index 4192cf2d7e6..69d410b2fa5 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java @@ -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 2001-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, @@ -17,9 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: ErrorMsg.java,v 1.2.4.1 2005/09/15 10:18:01 pvedula Exp $ - */ package com.sun.org.apache.xalan.internal.xsltc.compiler.util; @@ -60,6 +57,7 @@ public final class ErrorMsg { public static final String ARGUMENT_CONVERSION_ERR = "ARGUMENT_CONVERSION_ERR"; public static final String FILE_NOT_FOUND_ERR = "FILE_NOT_FOUND_ERR"; public static final String INVALID_URI_ERR = "INVALID_URI_ERR"; + public static final String CATALOG_EXCEPTION = "CATALOG_EXCEPTION"; public static final String FILE_ACCESS_ERR = "FILE_ACCESS_ERR"; public static final String MISSING_ROOT_ERR = "MISSING_ROOT_ERR"; public static final String NAMESPACE_UNDEF_ERR = "NAMESPACE_UNDEF_ERR"; diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java index 84ed22dcd21..c0b29dbf0e9 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java @@ -51,10 +51,11 @@ import java.util.Vector; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; 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.CatalogUriResolver; +import javax.xml.catalog.CatalogResolver; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.ErrorListener; @@ -241,7 +242,7 @@ public class TransformerFactoryImpl // type checking private Map _xsltcExtensionFunctions; - CatalogUriResolver _catalogUriResolver; + CatalogResolver _catalogUriResolver; CatalogFeatures _catalogFeatures; CatalogFeatures.Builder cfBuilder = CatalogFeatures.builder(); // Catalog features @@ -634,7 +635,7 @@ public class TransformerFactoryImpl } // 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; } @@ -923,7 +924,7 @@ public class TransformerFactoryImpl String transletClassName = getTransletBaseName(source); if (_packageName != null) - transletClassName = _packageName + "." + transletClassName; + transletClassName = _packageName + "." + transletClassName; if (_jarFileName != null) bytecodes = getBytecodesFromJar(source, transletClassName); @@ -1327,7 +1328,7 @@ public class TransformerFactoryImpl if (source == null && _catalogFiles != null && _xmlFeatures.getFeature(JdkXmlFeatures.XmlFeature.USE_CATALOG)) { if (_catalogUriResolver == null) { - _catalogUriResolver = CatalogManager.catalogUriResolver(_catalogFeatures); + _catalogUriResolver = CatalogManager.catalogResolver(_catalogFeatures); } source = _catalogUriResolver.resolve(href, context); } @@ -1340,6 +1341,10 @@ public class TransformerFactoryImpl final ErrorMsg msg = new ErrorMsg(ErrorMsg.INVALID_URI_ERR, href + "\n" + e.getMessage(), this); xsltc.getParser().reportError(Constants.FATAL, msg); } + catch (CatalogException e) { + final ErrorMsg msg = new ErrorMsg(ErrorMsg.CATALOG_EXCEPTION, href + "\n" + e.getMessage(), this); + xsltc.getParser().reportError(Constants.FATAL, msg); + } return null; } diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java index 46dd7b60c56..97de2fdfbdf 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java @@ -60,9 +60,10 @@ import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; import javax.xml.XMLConstants; +import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogManager; -import javax.xml.catalog.CatalogUriResolver; +import javax.xml.catalog.CatalogResolver; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -224,7 +225,7 @@ public final class TransformerImpl extends Transformer // Catalog features CatalogFeatures _catalogFeatures; - CatalogUriResolver _catalogUriResolver; + CatalogResolver _catalogUriResolver; // Catalog is enabled by default boolean _useCatalog = true; @@ -1337,7 +1338,7 @@ public final class TransformerImpl extends Transformer if (resolvedSource == null && _useCatalog && _catalogFeatures.get(CatalogFeatures.Feature.FILES) != null) { if (_catalogUriResolver == null) { - _catalogUriResolver = CatalogManager.catalogUriResolver(_catalogFeatures); + _catalogUriResolver = CatalogManager.catalogResolver(_catalogFeatures); } resolvedSource = _catalogUriResolver.resolve(href, baseURI); } @@ -1350,7 +1351,7 @@ public final class TransformerImpl extends Transformer return getDOM(resolvedSource); } - catch (TransformerException e) { + catch (TransformerException | CatalogException e) { if (_errorListener != null) postErrorToListener("File not found: " + e.getMessage()); return(null); diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java index bf1b53b1b32..6cd1fd0435c 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java @@ -511,7 +511,8 @@ public class XMLDocumentFragmentScannerImpl //fDocumentHandler.endElement(getElementQName(),null); break; default : - throw new InternalError("processing event: " + event); + // Errors should have already been handled by the Scanner + return false; } //System.out.println("here in before calling next"); diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java index 8e25a0b286a..d3b848c9847 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java @@ -20,8 +20,6 @@ package com.sun.org.apache.xerces.internal.impl ; -import com.sun.org.apache.xerces.internal.impl.Constants; -import com.sun.org.apache.xerces.internal.impl.XMLEntityHandler; import com.sun.org.apache.xerces.internal.impl.io.ASCIIReader; import com.sun.org.apache.xerces.internal.impl.io.UCSReader; import com.sun.org.apache.xerces.internal.impl.io.UTF8Reader; @@ -42,7 +40,6 @@ import com.sun.xml.internal.stream.StaxEntityResolverWrapper; import com.sun.xml.internal.stream.StaxXMLInputSource; import com.sun.xml.internal.stream.XMLEntityStorage; import java.io.*; -import java.lang.reflect.Method; import java.net.HttpURLConnection; import java.net.URISyntaxException; import java.net.URL; @@ -59,7 +56,6 @@ 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; @@ -420,7 +416,6 @@ public class XMLEntityManager implements XMLComponent, XMLEntityResolver { private boolean fUseCatalog = true; CatalogFeatures fCatalogFeatures; CatalogResolver fCatalogResolver; - CatalogUriResolver fCatalogUriResolver; private String fCatalogFile; private String fDefer; @@ -1044,12 +1039,18 @@ public class XMLEntityManager implements XMLComponent, XMLEntityResolver { } 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); + try { + 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); + } + } catch (CatalogException e) { + fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,"CatalogException", + new Object[]{SecuritySupport.sanitizePath(fCatalogFile)}, + XMLErrorReporter.SEVERITY_FATAL_ERROR, e ); } } } @@ -1140,7 +1141,7 @@ public class XMLEntityManager implements XMLComponent, XMLEntityResolver { if (fUseCatalog && fCatalogFile != null) { /* since the method can be called from various processors, both - CatalogResolver and CatalogUriResolver are used to attempt to find + EntityResolver and URIResolver are used to attempt to find a match */ InputSource is = null; @@ -1153,13 +1154,20 @@ public class XMLEntityManager implements XMLComponent, XMLEntityResolver { 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); + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); + } + + Source source = null; + try { + source = fCatalogResolver.resolve(literalSystemId, baseSystemId); + } catch (CatalogException e) { + throw new XNIException(e); } - Source source = fCatalogUriResolver.resolve(literalSystemId, baseSystemId); if (source != null && !source.isEmpty()) { xmlInputSource = new XMLInputSource(publicId, source.getSystemId(), baseSystemId, true); } diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties index 01531f7ae62..9707c7690ca 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties @@ -303,3 +303,5 @@ MaxElementDepthLimit=JAXP00010006: The element \"{0}\" has a depth of \"{1}\" that exceeds the limit \"{2}\" set by \"{3}\". EntityReplacementLimit=JAXP00010007: The total number of nodes in entity references is \"{0}\" that is over the limit \"{1}\" set by \"{2}\". +# Catalog 09 + CatalogException=JAXP00090001: The CatalogResolver is enabled with the catalog \"{0}\", but a CatalogException is returned. \ No newline at end of file diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/EntityResolverWrapper.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/EntityResolverWrapper.java index 9cca074e1af..333342ce562 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/EntityResolverWrapper.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/EntityResolverWrapper.java @@ -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, 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 * @@ -28,6 +28,7 @@ import com.sun.org.apache.xerces.internal.xni.XNIException; import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier; import com.sun.org.apache.xerces.internal.xni.parser.XMLEntityResolver; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; +import javax.xml.catalog.CatalogException; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; @@ -132,6 +133,10 @@ public class EntityResolverWrapper } throw new XNIException(ex); } + + catch (CatalogException e) { + throw new XNIException(e); + } } // unable to resolve entity diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java index b1ccb1bc9cc..3f5410c1741 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 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 @@ -75,7 +75,6 @@ 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; @@ -371,7 +370,6 @@ public class XIncludeHandler private boolean fUseCatalog = true; CatalogFeatures fCatalogFeatures; CatalogResolver fCatalogResolver; - CatalogUriResolver fCatalogUriResolver; private String fCatalogFile; private String fDefer; @@ -1638,10 +1636,10 @@ public class XIncludeHandler */ Source source = null; try { - if (fCatalogUriResolver == null) { - fCatalogUriResolver = CatalogManager.catalogUriResolver(fCatalogFeatures); + if (fCatalogResolver == null) { + fCatalogResolver = CatalogManager.catalogResolver(fCatalogFeatures); } - source = fCatalogUriResolver.resolve(href, fCurrentBaseURI.getExpandedSystemId()); + source = fCatalogResolver.resolve(href, fCurrentBaseURI.getExpandedSystemId()); } catch (CatalogException e) {} if (source != null && !source.isEmpty()) { @@ -1669,7 +1667,7 @@ public class XIncludeHandler includedSource.getBaseSystemId(), accept, acceptLanguage); } } - catch (IOException e) { + catch (IOException | CatalogException e) { reportResourceError( "XMLResourceError", new Object[] { href, e.getMessage()}); diff --git a/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/StaxEntityResolverWrapper.java b/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/StaxEntityResolverWrapper.java index d3b50721bae..d531ca0b3be 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/StaxEntityResolverWrapper.java +++ b/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/StaxEntityResolverWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 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 @@ -33,6 +33,7 @@ import javax.xml.stream.XMLStreamReader; import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier; import com.sun.org.apache.xerces.internal.xni.XNIException; import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; +import javax.xml.catalog.CatalogException; /** * @@ -58,11 +59,11 @@ public class StaxEntityResolverWrapper { public StaxXMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) throws XNIException, java.io.IOException { Object object = null ; - try{ + try { object = fStaxResolver.resolveEntity(resourceIdentifier.getPublicId(), resourceIdentifier.getLiteralSystemId(), resourceIdentifier.getBaseSystemId(), null); return getStaxInputSource(object) ; - }catch(XMLStreamException streamException){ + } catch(XMLStreamException | CatalogException streamException){ throw new XNIException(streamException) ; } } diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java index 848472c3111..16f70ad7581 100644 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java @@ -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 @@ -42,9 +42,9 @@ import java.util.stream.Stream; *

* A catalog can be used in two situations: *

*

diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java index 2e3c5b4f74b..bc8518685f7 100644 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java @@ -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 @@ -76,17 +76,6 @@ public final class CatalogManager { return new CatalogResolverImpl(catalog); } - /** - * Creates an instance of a {@code CatalogUriResolver} using the specified catalog. - * - * @param catalog the catalog instance - * @return an instance of a {@code CatalogResolver} - */ - public static CatalogUriResolver catalogUriResolver(Catalog catalog) { - if (catalog == null) CatalogMessages.reportNPEOnNull("catalog", null); - return new CatalogUriResolverImpl(catalog); - } - /** * Creates an instance of a {@code CatalogResolver} using the specified feature * settings and path to one or more catalog files. @@ -115,33 +104,4 @@ public final class CatalogManager { Catalog catalog = catalog(features, paths); return new CatalogResolverImpl(catalog); } - - /** - * Creates an instance of a {@code CatalogUriResolver} using the specified - * feature settings and path to one or more catalog files. - *

- * If {@code paths} is empty, system property {@code javax.xml.catalog.files} - * will be read to locate the initial list of catalog files. - *

- * If more than one catalog files are specified through the paths argument or - * {@code javax.xml.catalog.files} property, the first entry is considered - * the main catalog, while others are treated as alternative catalogs after - * those referenced by the {@code nextCatalog} elements in the main catalog. - *

- * As specified in - * - * XML Catalogs, OASIS Standard V1.1, invalid path entries will be ignored. - * No error will be reported. In case all entries are invalid, the resolver - * will return as no mapping is found. - * - * @param features the catalog features - * @param paths the path(s) to one or more catalogs - * - * @return an instance of a {@code CatalogUriResolver} - * @throws CatalogException If an error occurs while parsing the catalog - */ - public static CatalogUriResolver catalogUriResolver(CatalogFeatures features, String... paths) { - Catalog catalog = catalog(features, paths); - return new CatalogUriResolverImpl(catalog); - } } diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java index b517f0713f1..ecf506f5cab 100644 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java @@ -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 @@ -24,32 +24,90 @@ */ package javax.xml.catalog; +import java.io.InputStream; +import javax.xml.stream.XMLResolver; +import javax.xml.transform.Source; +import javax.xml.transform.URIResolver; +import org.w3c.dom.ls.LSInput; +import org.w3c.dom.ls.LSResourceResolver; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; /** - * A SAX EntityResolver that uses catalogs to resolve references. + * A Catalog Resolver that implements SAX {@link org.xml.sax.EntityResolver}, + * StAX {@link javax.xml.stream.XMLResolver}, + * DOM LS {@link org.w3c.dom.ls.LSResourceResolver} used by Schema Validation, and + * Transform {@link javax.xml.transform.URIResolver}, and resolves + * external references using catalogs. + *

+ * The + * Catalog Standard distinguished {@code external identifiers} from {@code uri entries} + * as being used to solely identify DTDs, while {@code uri entries} for + * other resources such as stylesheets and schema. The Java APIs, such as + * {@link javax.xml.stream.XMLResolver} and {@link org.w3c.dom.ls.LSResourceResolver} + * however, make no such distinction. + * In consistent with the existing Java API, this CatalogResolver recognizes a + * system identifier as an URI and will search both {@code system} and {@code uri} + * entries in a catalog in order to find a matching entry. + *

+ * The search is started in the current catalog. If a match is found, + * no further attempt will be made. Only if there is no match in the current + * catalog, will alternate catalogs including delegate and next catalogs be considered. + *

+ *

Search Order

+ * The resolver will first search the system-type of entries with the specified + * {@code systemId}. The system entries include {@code system}, + * {@code rewriteSystem} and {@code systemSuffix} entries. + *

+ * If no match is found, {@code public} entries may be searched in accordance with + * the {@code prefer} attribute. + *

+ * The {@code prefer} attribute: if the {@code prefer} is public, + * and there is no match found through the system entries, {@code public} entries + * will be considered. If it is not specified, the {@code prefer} is public + * by default (Note that by the OASIS standard, system entries will always + * be considered before public entries. Prefer public means that public entries + * will be matched when both system and public identifiers are specified. + * In general therefore, prefer public is recommended.) + *

+ * If no match is found with the {@code systemId} and {@code public} identifier, + * the resolver will continue searching {@code uri} entries + * with the specified {@code systemId} or {@code href}. The {@code uri} entries + * include {@code uri}, {@code rewriteURI}, and {@code uriSuffix} entries. + * + *

+ *

Error Handling

+ * The interfaces that the CatalogResolver extend specified checked exceptions, including: + * + *

+ * The CatalogResolver however, will throw {@link javax.xml.catalog.CatalogException} + * only when {@code javax.xml.catalog.resolve} is specified as {@code strict}. + * For applications that expect to handle the checked Exceptions, it may be + * necessary to use a custom resolver to wrap the CatalogResolver or implement it + * with a {@link javax.xml.catalog.Catalog} object. * * @since 9 */ -public interface CatalogResolver extends EntityResolver { +public interface CatalogResolver extends EntityResolver, XMLResolver, + URIResolver, LSResourceResolver { /** - * The method searches through the catalog entries in the main and - * alternative catalogs to attempt to find a match with the specified publicId - * or systemId. - *

- * For resolving external entities, system entries will be matched before - * the public entries. - *

- * The {@code prefer} attribute: if the {@code prefer} is public, - * and there is no match found through the system entries, public entries - * will be considered. If it is not specified, the {@code prefer} is public - * by default (Note that by the OASIS standard, system entries will always - * be considered first when the external system identifier is specified. - * Prefer public means that public entries will be matched when both system - * and public identifiers are specified. In general therefore, prefer - * public is recommended.) + * Implements {@link org.xml.sax.EntityResolver}. The method searches through + * the catalog entries in the main and alternative catalogs to attempt to find + * a match with the specified {@code publicId} or systemId. * * @param publicId the public identifier of the external entity being * referenced, or null if none was supplied @@ -59,15 +117,123 @@ public interface CatalogResolver extends EntityResolver { * requires a system identifier on all external entities, so this value is * always specified. * - * @return a {@link org.xml.sax.InputSource} object if a mapping is found. If no mapping is - * found, returns a {@link org.xml.sax.InputSource} object containing an empty - * {@link java.io.Reader} if the {@code javax.xml.catalog.resolve} property - * is set to {@code ignore}; returns null if the + * @return a {@link org.xml.sax.InputSource} object if a mapping is found. + * If no mapping is found, returns a {@link org.xml.sax.InputSource} object + * containing an empty {@link java.io.Reader} if the + * {@code javax.xml.catalog.resolve} property is set to {@code ignore}; + * returns null if the * {@code javax.xml.catalog.resolve} property is set to {@code continue}. * * @throws CatalogException if no mapping is found and - * {@code javax.xml.catalog.resolve} is specified as strict + * {@code javax.xml.catalog.resolve} is specified as {@code strict} */ @Override public InputSource resolveEntity(String publicId, String systemId); + + + /** + * Implements URIResolver. The method searches through the catalog entries + * in the main and alternative catalogs to attempt to find a match + * with the specified {@code href} attribute. The {@code href} attribute will + * be used literally, with no attempt to be made absolute to the {@code base}. + *

+ * If the value is an URN, the {@code href} attribute is recognized as a + * {@code publicId}, and used to search {@code public} entries. + * If the value is an URI, it is taken as a {@code systemId}, and used to + * search both {@code system} and {@code uri} entries. + * + * + * @param href the href attribute that specifies the URI of a style sheet, + * which may be relative or absolute + * @param base The base URI against which the href attribute will be made + * absolute if the absolute URI is required + * + * @return a {@link javax.xml.transform.Source} object if a mapping is found. + * If no mapping is found, returns an empty {@link javax.xml.transform.Source} + * object if the {@code javax.xml.catalog.resolve} property is set to + * {@code ignore}; + * returns a {@link javax.xml.transform.Source} object with the original URI + * (href, or href resolved with base if base is not null) if the + * {@code javax.xml.catalog.resolve} property is set to {@code continue}. + * + * @throws CatalogException if no mapping is found and + * {@code javax.xml.catalog.resolve} is specified as {@code strict} + */ + @Override + public Source resolve(String href, String base); + + /** + * Implements {@link javax.xml.stream.XMLResolver}. For the purpose of resolving + * {@code publicId} and {@code systemId}, this method is equivalent to + * {@link #resolveEntity(java.lang.String, java.lang.String) }. + *

+ * The {@code systemId} will be used literally, with no attempt to be made + * absolute to the {@code baseUri}. The {@code baseUri} and {@code namespace} + * are not used in the search for a match in a catalog. However, a relative + * {@code systemId} in an xml source may have been made absolute by the parser + * with the {@code baseURI}, thus making it unable to find a {@code system} entry. + * In such a case, a {@code systemSuffix} entry is recommended over a + * {@code system} entry. + * + * @param publicId the public identifier of the external entity being + * referenced, or null if none was supplied + * + * @param systemId the system identifier of the external entity being + * referenced. A system identifier is required on all external entities. XML + * requires a system identifier on all external entities, so this value is + * always specified. + * @param baseUri the absolute base URI, not used by the CatalogResolver + * @param namespace the namespace of the entity to resolve, not used by the + * CatalogResolver. + * + * @return an {@link java.io.InputStream} object if a mapping is found; null + * if no mapping is found and the {@code javax.xml.catalog.resolve} property + * is set to {@code continue} or {@code ignore}. Note that for XMLResolver, + * it is not possible to ignore a reference, {@code ignore} is therefore + * treated the same as {@code continue}. + * + * @throws CatalogException if no mapping is found and + * {@code javax.xml.catalog.resolve} is specified as {@code strict} + */ + @Override + public InputStream resolveEntity(String publicId, String systemId, + String baseUri, String namespace); + + /** + * Implements {@link org.w3c.dom.ls.LSResourceResolver}. For the purpose of + * resolving {@code publicId} and {@code systemId}, this method is equivalent + * to {@link #resolveEntity(java.lang.String, java.lang.String) }. + *

+ * The {@code systemId} will be used literally, with no attempt to be made + * absolute to the {@code baseUri}. The {@code baseUri}, {@code namespaceUri} + * and {@code type} are not used in the search for a match in a catalog. + * However, a relative {@code systemId} in a source may have been made absolute + * by the parser with the {@code baseURI}, thus making it unable to find a + * {@code system} entry. In such a case, a {@code systemSuffix} entry is + * recommended over a {@code system} entry. + * + * @param type the type of the resource being resolved, + * not used by the CatalogResolver + * @param namespaceUri the namespace of the resource being resolved, + * not used by the CatalogResolver + * @param publicId the public identifier of the external entity being + * referenced, or {@code null} if no public identifier was + * supplied or if the resource is not an entity. + * @param systemId the system identifier, an URI reference of the + * external resource being referenced + * @param baseUri the absolute base URI, not used by the CatalogResolver + * + * @return a {@link org.w3c.dom.ls.LSInput} object if a mapping is found; null + * if no mapping is found and the {@code javax.xml.catalog.resolve} property + * is set to {@code continue} or {@code ignore}. Note that for + * {@link org.w3c.dom.ls.LSResourceResolver}, it is not possible to ignore a + * reference, {@code ignore} is therefore treated the same as {@code continue}. + * + * @throws CatalogException if no mapping is found and + * {@code javax.xml.catalog.resolve} is specified as {@code strict} + */ + @Override + public LSInput resolveResource(String type, String namespaceUri, + String publicId, String systemId, String baseUri); + } diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java index 326e61ad542..9bf8b357adc 100644 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java @@ -24,15 +24,27 @@ */ package javax.xml.catalog; +import com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; import java.io.StringReader; -import java.util.Iterator; +import java.net.URL; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.Source; +import javax.xml.transform.sax.SAXSource; +import org.w3c.dom.ls.LSInput; import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; /** - * A SAX EntityResolver/JAXP URIResolver that uses catalogs. + * Implements CatalogResolver. * *

- * This class implements both a SAX EntityResolver and a JAXP URIResolver. + * This class implements a SAX EntityResolver, StAX XMLResolver, + * Schema Validation LSResourceResolver and Transform URIResolver. * * * @since 9 @@ -49,9 +61,14 @@ final class CatalogResolverImpl implements CatalogResolver { this.catalog = catalog; } + /* + Implements the EntityResolver interface + */ @Override public InputSource resolveEntity(String publicId, String systemId) { + //8150187: NPE expected if the system identifier is null for CatalogResolver CatalogMessages.reportNPEOnNull("systemId", systemId); + //Normalize publicId and systemId systemId = Normalizer.normalizeURI(Util.getNotNullOrEmpty(systemId)); publicId = Normalizer.normalizePublicId(Normalizer.decodeURN(Util.getNotNullOrEmpty(publicId))); @@ -87,4 +104,242 @@ final class CatalogResolverImpl implements CatalogResolver { return null; } + /* + Implements the URIResolver interface + */ + CatalogResolverImpl entityResolver; + + @Override + public Source resolve(String href, String base) { + CatalogMessages.reportNPEOnNull("href", href); + + href = Util.getNotNullOrEmpty(href); + base = Util.getNotNullOrEmpty(base); + + String result = null; + CatalogImpl c = (CatalogImpl)catalog; + String uri = Normalizer.normalizeURI(href); + //check whether uri is an urn + if (uri != null && uri.startsWith(Util.URN)) { + String publicId = Normalizer.decodeURN(uri); + if (publicId != null) { + result = Util.resolve(c, publicId, null); + } + } + + //if no match with a public id, continue search for an URI + if (result == null) { + //remove fragment if any. + int hashPos = uri.indexOf("#"); + if (hashPos >= 0) { + uri = uri.substring(0, hashPos); + } + + //search the current catalog + result = Util.resolve(c, null, uri); + } + + //Report error or return the URI as is when no match is found + if (result == null) { + GroupEntry.ResolveType resolveType = c.getResolve(); + switch (resolveType) { + case IGNORE: + return new SAXSource(new InputSource(new StringReader(""))); + case STRICT: + CatalogMessages.reportError(CatalogMessages.ERR_NO_URI_MATCH, + new Object[]{href, base}); + } + try { + URL url = null; + + if (base == null) { + url = new URL(uri); + result = url.toString(); + } else { + URL baseURL = new URL(base); + url = (href.length() == 0 ? baseURL : new URL(baseURL, uri)); + result = url.toString(); + } + } catch (java.net.MalformedURLException mue) { + CatalogMessages.reportError(CatalogMessages.ERR_CREATING_URI, + new Object[]{href, base}); + } + } + + SAXSource source = new SAXSource(); + source.setInputSource(new InputSource(result)); + setEntityResolver(source); + return source; + } + + /** + * Establish an entityResolver for newly resolved URIs. + *

+ * This is called from the URIResolver to set an EntityResolver on the SAX + * parser to be used for new XML documents that are encountered as a result + * of the document() function, xsl:import, or xsl:include. This is done + * because the XSLT processor calls out to the SAXParserFactory itself to + * create a new SAXParser to parse the new document. The new parser does not + * automatically inherit the EntityResolver of the original (although + * arguably it should). Quote from JAXP specification on Class + * SAXTransformerFactory: + *

+ * {@code If an application wants to set the ErrorHandler or EntityResolver + * for an XMLReader used during a transformation, it should use a URIResolver + * to return the SAXSource which provides (with getXMLReader) a reference to + * the XMLReader} + * + */ + private void setEntityResolver(SAXSource source) { + XMLReader reader = source.getXMLReader(); + if (reader == null) { + SAXParserFactory spFactory = new SAXParserFactoryImpl(); + spFactory.setNamespaceAware(true); + try { + reader = spFactory.newSAXParser().getXMLReader(); + } catch (ParserConfigurationException | SAXException ex) { + CatalogMessages.reportRunTimeError(CatalogMessages.ERR_PARSER_CONF, ex); + } + } + if (entityResolver != null) { + entityResolver = new CatalogResolverImpl(catalog); + } + reader.setEntityResolver(entityResolver); + source.setXMLReader(reader); + } + + @Override + public InputStream resolveEntity(String publicId, String systemId, String baseUri, String namespace) { + InputSource is = resolveEntity(publicId, systemId); + + if (is != null && !is.isEmpty()) { + + try { + return new URL(is.getSystemId()).openStream(); + } catch (IOException ex) { + //considered as no mapping. + } + + } + + GroupEntry.ResolveType resolveType = ((CatalogImpl) catalog).getResolve(); + switch (resolveType) { + case IGNORE: + return null; + case STRICT: + CatalogMessages.reportError(CatalogMessages.ERR_NO_MATCH, + new Object[]{publicId, systemId}); + } + + //no action, allow the parser to continue + return null; + } + + @Override + public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { + InputSource is = resolveEntity(publicId, systemId); + + if (is != null && !is.isEmpty()) { + return new LSInputImpl(is.getSystemId()); + } + + GroupEntry.ResolveType resolveType = ((CatalogImpl) catalog).getResolve(); + switch (resolveType) { + case IGNORE: + return null; + case STRICT: + CatalogMessages.reportError(CatalogMessages.ERR_NO_MATCH, + new Object[]{publicId, systemId}); + } + + //no action, allow the parser to continue + return null; + } + + /** + * Implements LSInput. All that we need is the systemId since the Catalog + * has already resolved it. + */ + class LSInputImpl implements LSInput { + + private String systemId; + + public LSInputImpl(String systemId) { + this.systemId = systemId; + } + + @Override + public Reader getCharacterStream() { + return null; + } + + @Override + public void setCharacterStream(Reader characterStream) { + } + + @Override + public InputStream getByteStream() { + return null; + } + + @Override + public void setByteStream(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 null; + } + + @Override + public void setBaseURI(String 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) { + } + } + } diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogUriResolver.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogUriResolver.java deleted file mode 100644 index 76ba60dd2eb..00000000000 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogUriResolver.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package javax.xml.catalog; - -import javax.xml.transform.Source; -import javax.xml.transform.URIResolver; - -/** - * A JAXP URIResolver that uses catalogs to resolve references. - * - * @since 9 - */ -public interface CatalogUriResolver extends URIResolver { - - /** - * The method searches through the catalog entries in the main and - * alternative catalogs to attempt to find a match with the specified URI. - * - * @param href an href attribute, which may be relative or absolute - * @param base The base URI against which the href attribute will be made - * absolute if the absolute URI is required - * - * @return a {@link javax.xml.transform.Source} object if a mapping is found. - * If no mapping is found, returns an empty {@link javax.xml.transform.Source} - * object if the {@code javax.xml.catalog.resolve} property is set to - * {@code ignore}; - * returns a {@link javax.xml.transform.Source} object with the original URI - * (href, or href resolved with base if base is not null) if the - * {@code javax.xml.catalog.resolve} property is set to {@code continue}. - * - * @throws CatalogException if no mapping is found and - * {@code javax.xml.catalog.resolve} is specified as strict - */ - @Override - public Source resolve(String href, String base); -} diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogUriResolverImpl.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogUriResolverImpl.java deleted file mode 100644 index 497aacf18fd..00000000000 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogUriResolverImpl.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * 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 - * 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 javax.xml.catalog; - -import com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl; -import java.io.StringReader; -import java.net.URL; -import java.util.Iterator; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.Source; -import javax.xml.transform.sax.SAXSource; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - -/** - * A SAX EntityResolver/JAXP URIResolver that uses catalogs. - *

- * This class implements both a SAX EntityResolver and a JAXP URIResolver. - * - * - * @since 9 - */ -final class CatalogUriResolverImpl implements CatalogUriResolver { - - Catalog catalog; - CatalogResolverImpl entityResolver; - - /** - * Construct an instance of the CatalogResolver from a Catalog. - * - * @param catalog A Catalog. - */ - public CatalogUriResolverImpl(Catalog catalog) { - this.catalog = catalog; - } - - @Override - public Source resolve(String href, String base) { - href = Util.getNotNullOrEmpty(href); - base = Util.getNotNullOrEmpty(base); - - if (href == null) return null; - - String result = null; - CatalogImpl c = (CatalogImpl)catalog; - String uri = Normalizer.normalizeURI(href); - //check whether uri is an urn - if (uri != null && uri.startsWith(Util.URN)) { - String publicId = Normalizer.decodeURN(uri); - if (publicId != null) { - result = Util.resolve(c, publicId, null); - } - } - - //if no match with a public id, continue search for an URI - if (result == null) { - //remove fragment if any. - int hashPos = uri.indexOf("#"); - if (hashPos >= 0) { - uri = uri.substring(0, hashPos); - } - - //search the current catalog - result = resolve(c, uri); - } - - //Report error or return the URI as is when no match is found - if (result == null) { - GroupEntry.ResolveType resolveType = c.getResolve(); - switch (resolveType) { - case IGNORE: - return new SAXSource(new InputSource(new StringReader(""))); - case STRICT: - CatalogMessages.reportError(CatalogMessages.ERR_NO_URI_MATCH, - new Object[]{href, base}); - } - try { - URL url = null; - - if (base == null) { - url = new URL(uri); - result = url.toString(); - } else { - URL baseURL = new URL(base); - url = (href.length() == 0 ? baseURL : new URL(baseURL, uri)); - result = url.toString(); - } - } catch (java.net.MalformedURLException mue) { - CatalogMessages.reportError(CatalogMessages.ERR_CREATING_URI, - new Object[]{href, base}); - } - } - - SAXSource source = new SAXSource(); - source.setInputSource(new InputSource(result)); - setEntityResolver(source); - return source; - } - - /** - * Resolves the publicId or systemId to one specified in the catalog. - * @param catalog the catalog - * @param href an href attribute, which may be relative or absolute - * @return the resolved systemId if a match is found, null otherwise - */ - String resolve(CatalogImpl catalog, String href) { - String result = null; - - //search the current catalog - catalog.reset(); - if (href != null) { - result = catalog.matchURI(href); - } - - //mark the catalog as having been searched before trying alternatives - catalog.markAsSearched(); - - //search alternative catalogs - if (result == null) { - Iterator iter = catalog.catalogs().iterator(); - while (iter.hasNext()) { - result = resolve((CatalogImpl)iter.next(), href); - if (result != null) { - break; - } - } - } - - return result; - } - - /** - * Establish an entityResolver for newly resolved URIs. - *

- * This is called from the URIResolver to set an EntityResolver on the SAX - * parser to be used for new XML documents that are encountered as a result - * of the document() function, xsl:import, or xsl:include. This is done - * because the XSLT processor calls out to the SAXParserFactory itself to - * create a new SAXParser to parse the new document. The new parser does not - * automatically inherit the EntityResolver of the original (although - * arguably it should). Quote from JAXP specification on Class - * SAXTransformerFactory: - *

- * {@code If an application wants to set the ErrorHandler or EntityResolver - * for an XMLReader used during a transformation, it should use a URIResolver - * to return the SAXSource which provides (with getXMLReader) a reference to - * the XMLReader} - * - */ - private void setEntityResolver(SAXSource source) { - XMLReader reader = source.getXMLReader(); - if (reader == null) { - SAXParserFactory spFactory = new SAXParserFactoryImpl(); - spFactory.setNamespaceAware(true); - try { - reader = spFactory.newSAXParser().getXMLReader(); - } catch (ParserConfigurationException | SAXException ex) { - CatalogMessages.reportRunTimeError(CatalogMessages.ERR_PARSER_CONF, ex); - } - } - if (entityResolver != null) { - entityResolver = new CatalogResolverImpl(catalog); - } - reader.setEntityResolver(entityResolver); - source.setXMLReader(reader); - } -} diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java index b164f674dbd..f2b00a21ee6 100644 --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java @@ -55,6 +55,9 @@ class Util { * prefer "public": attempts to resolve with a system entry; * attempts to resolve with a public entry if no matching * system entry is found. + * + * If no match is found, continue searching uri entries + * * @param catalog the catalog * @param publicId the publicId * @param systemId the systemId @@ -77,6 +80,10 @@ class Util { resolvedSystemId = catalog.matchPublic(publicId); } + if (resolvedSystemId == null && systemId != null) { + resolvedSystemId = catalog.matchURI(systemId); + } + //mark the catalog as having been searched before trying alternatives catalog.markAsSearched(); diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java index 41eda62e4ab..21a6780bb8d 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/CatalogReferCircularityTest.java @@ -64,4 +64,3 @@ public class CatalogReferCircularityTest { { "catalogReferCircle-left.xml" } }; } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java index 9a05145738f..0cc05e97da0 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/DefaultFeaturesTest.java @@ -69,4 +69,3 @@ public class DefaultFeaturesTest { { Feature.RESOLVE, CatalogTestUtils.RESOLVE_STRICT } }; } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java index 1f046f3bed5..626943a335b 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java @@ -86,4 +86,3 @@ public class DeferFeatureTest { return (int) method.invoke(catalog); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java index e89c82051b0..b20aba8dbf4 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/DelegatePublicTest.java @@ -100,4 +100,3 @@ public class DelegatePublicTest { return catalogResolver("delegatePublic.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java index f18b6c2eba2..e8452622462 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateSystemTest.java @@ -100,4 +100,3 @@ public class DelegateSystemTest { return catalogResolver("delegateSystem.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateUriTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateUriTest.java index 44addf59575..aa8d00efa1f 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateUriTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/DelegateUriTest.java @@ -27,8 +27,8 @@ import static catalog.CatalogTestUtils.catalogUriResolver; import static catalog.ResolutionChecker.checkUriResolution; import static catalog.ResolutionChecker.expectExceptionOnUri; +import javax.xml.catalog.CatalogResolver; import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -95,8 +95,7 @@ public class DelegateUriTest { CatalogException.class } }; } - private CatalogUriResolver createResolver() { + private CatalogResolver createResolver() { return catalogUriResolver("delegateUri.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/GroupTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/GroupTest.java index fd2766896cd..80772f98927 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/GroupTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/GroupTest.java @@ -131,4 +131,3 @@ public class GroupTest { return catalogResolver(CATALOG_GROUP); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java index b985876bb07..b2fa3a94ce8 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/LoadCatalogTest.java @@ -33,7 +33,6 @@ import static catalog.ResolutionChecker.checkUriResolution; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -56,6 +55,7 @@ public class LoadCatalogTest { private static final String CATALOG_DUMMY = "dummy.xml"; private static final String ID_ALICE = "http://remote/dtd/alice/docAlice.dtd"; + private static final String ID_ALICE_URI = "http://remote/dtd/uri/alice/docAlice.dtd"; private static final String ID_DUMMY = "http://remote/dtd/doc.dtd"; @Test(dataProvider = "entityResolver") @@ -79,8 +79,8 @@ public class LoadCatalogTest { } @Test(dataProvider = "uriResolver") - public void testMatchOnUriResolver(CatalogUriResolver resolver) { - checkUriResolution(resolver, ID_ALICE, + public void testMatchOnUriResolver(CatalogResolver resolver) { + checkUriResolution(resolver, ID_ALICE_URI, "http://local/dtd/docAliceURI.dtd"); } @@ -121,4 +121,3 @@ public class LoadCatalogTest { { new String[] { CATALOG_LOADCATALOGFILES } } }; } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/NextCatalogTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/NextCatalogTest.java index 3f14dcda3e0..4dfc4d7186d 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/NextCatalogTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/NextCatalogTest.java @@ -30,7 +30,6 @@ import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -154,9 +153,8 @@ public class NextCatalogTest { CATALOG_NEXTCATALOGRIGHT); } - private CatalogUriResolver createUriResolver() { + private CatalogResolver createUriResolver() { return catalogUriResolver(CATALOG_NEXTCATALOGLEFT, CATALOG_NEXTCATALOGRIGHT); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/NormalizationTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/NormalizationTest.java index b7715c0f69b..d66941940cf 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/NormalizationTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/NormalizationTest.java @@ -30,7 +30,6 @@ import static catalog.ResolutionChecker.checkSysIdResolution; import static catalog.ResolutionChecker.checkUriResolution; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -111,8 +110,7 @@ public class NormalizationTest { return catalogResolver(CATALOG_NORMALIZATION); } - private CatalogUriResolver createUriResolver() { + private CatalogResolver createUriResolver() { return catalogUriResolver(CATALOG_NORMALIZATION); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java index c449771b135..3f783bebbe7 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/PreferFeatureTest.java @@ -81,4 +81,3 @@ public class PreferFeatureTest { "preferFeature.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/PreferTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/PreferTest.java index 2f73bb7cb4a..c9812ead83d 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/PreferTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/PreferTest.java @@ -92,4 +92,3 @@ public class PreferTest { return catalogResolver("prefer.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java index e149949f98a..68081e29199 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/PublicFamilyTest.java @@ -70,4 +70,3 @@ public class PublicFamilyTest { return catalogResolver("publicFamily.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/PublicTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/PublicTest.java index 48c103e4203..f7a3ebd4376 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/PublicTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/PublicTest.java @@ -92,4 +92,3 @@ public class PublicTest { return catalogResolver(CATALOG_PUBLIC); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java index 9cb29bd3694..7714e66ea12 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/ResolveFeatureTest.java @@ -38,7 +38,6 @@ import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogFeatures.Feature; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -93,7 +92,7 @@ public class ResolveFeatureTest { */ @Test public void testContinueResolutionOnUriResolver() { - CatalogUriResolver resolver = createUriResolver(RESOLVE_CONTINUE); + CatalogResolver resolver = createUriResolver(RESOLVE_CONTINUE); resolver.resolve("http://remote/dtd/bob/docBobDummy.dtd", null); checkUriResolution(resolver, "http://remote/dtd/bob/docBob.dtd", "http://local/base/dtd/docBobURI.dtd"); @@ -123,7 +122,7 @@ public class ResolveFeatureTest { return catalogResolver(createFeature(resolve), CATALOG_SYSTEM); } - private CatalogUriResolver createUriResolver(String resolve) { + private CatalogResolver createUriResolver(String resolve) { return catalogUriResolver(createFeature(resolve), CATALOG_URI); } @@ -131,4 +130,3 @@ public class ResolveFeatureTest { return builder().with(Feature.RESOLVE, resolve).build(); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java index fb45816981c..c1a42668827 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteSystemTest.java @@ -95,4 +95,3 @@ public class RewriteSystemTest { return catalogResolver("rewriteSystem.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteUriTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteUriTest.java index 0a449420bd1..f4777dbaaf0 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteUriTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/RewriteUriTest.java @@ -24,11 +24,11 @@ package catalog; import static catalog.CatalogTestUtils.catalogUriResolver; -import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; +import javax.xml.catalog.CatalogResolver; import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -88,11 +88,10 @@ public class RewriteUriTest { */ @Test(expectedExceptions = CatalogException.class) public void testNoMatch() { - checkNoMatch(createResolver()); + checkNoUriMatch(createResolver()); } - private CatalogUriResolver createResolver() { + private CatalogResolver createResolver() { return catalogUriResolver("rewriteUri.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java index 6085e6e60a2..47506989742 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java @@ -36,7 +36,6 @@ import static javax.xml.catalog.CatalogFeatures.Feature.FILES; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -68,7 +67,7 @@ public class SpecifyCatalogTest { } /* - * CatalogUriResolver specifies catalog via feature javax.xml.catalog.files. + * CatalogResolver specifies catalog via feature javax.xml.catalog.files. */ @Test public void specifyCatalogOnUriResolver() { @@ -102,7 +101,7 @@ public class SpecifyCatalogTest { checkSysIdResolution(resolver, ID_SYS, matchedUri); } - private void checkResolutionOnUriResolver(CatalogUriResolver resolver, + private void checkResolutionOnUriResolver(CatalogResolver resolver, String matchedUri) { checkUriResolution(resolver, ID_URI, matchedUri); } @@ -111,4 +110,3 @@ public class SpecifyCatalogTest { return builder().with(FILES, getCatalogPath(catalogName)).build(); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java index aa921b5ef50..0c62b7d72ac 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/SystemFamilyTest.java @@ -84,4 +84,3 @@ public class SystemFamilyTest { return catalogResolver("systemFamily.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java index 97622704682..6b83fdc306e 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/SystemSuffixTest.java @@ -95,4 +95,3 @@ public class SystemSuffixTest { return catalogResolver("systemSuffix.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/SystemTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/SystemTest.java index d78029319bd..4be1e621e17 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/SystemTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/SystemTest.java @@ -92,4 +92,3 @@ public class SystemTest { return catalogResolver(CATALOG_SYSTEM); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/UriFamilyTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/UriFamilyTest.java index f6104e8d15d..7e7d1c28e82 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/UriFamilyTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/UriFamilyTest.java @@ -24,11 +24,11 @@ package catalog; import static catalog.CatalogTestUtils.catalogUriResolver; -import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; +import javax.xml.catalog.CatalogResolver; import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -58,7 +58,7 @@ public class UriFamilyTest { return new Object[][] { // The matched URI of the specified URI reference is defined in // a uri entry. - { "http://remote/dtd/alice/docAlice.dtd", + { "http://remote/dtd/uri/alice/docAlice.dtd", "http://local/base/dtd/docAliceURI.dtd" }, // The matched URI of the specified URI reference is defined in @@ -77,11 +77,10 @@ public class UriFamilyTest { */ @Test(expectedExceptions = CatalogException.class) public void testNoMatch() { - checkNoMatch(createResolver()); + checkNoUriMatch(createResolver()); } - private CatalogUriResolver createResolver() { + private CatalogResolver createResolver() { return catalogUriResolver("uriFamily.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/UriSuffixTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/UriSuffixTest.java index 9cc4a2736e2..c27094fda84 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/UriSuffixTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/UriSuffixTest.java @@ -24,11 +24,11 @@ package catalog; import static catalog.CatalogTestUtils.catalogUriResolver; -import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; +import javax.xml.catalog.CatalogResolver; import javax.xml.catalog.CatalogException; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -88,11 +88,10 @@ public class UriSuffixTest { */ @Test(expectedExceptions = CatalogException.class) public void testNoMatch() { - checkNoMatch(createResolver()); + checkNoUriMatch(createResolver()); } - private CatalogUriResolver createResolver() { + private CatalogResolver createResolver() { return catalogUriResolver("uriSuffix.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/UriTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/UriTest.java index ae17e34c6a1..6b6976d6d9e 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/UriTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/UriTest.java @@ -26,12 +26,12 @@ package catalog; import static catalog.CatalogTestUtils.CATALOG_URI; import static catalog.CatalogTestUtils.RESOLVE_CONTINUE; import static catalog.CatalogTestUtils.catalogUriResolver; -import static catalog.ResolutionChecker.checkNoMatch; +import static catalog.ResolutionChecker.checkNoUriMatch; import static catalog.ResolutionChecker.checkUriResolution; +import javax.xml.catalog.CatalogResolver; import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogFeatures; -import javax.xml.catalog.CatalogUriResolver; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; @@ -58,7 +58,7 @@ public class UriTest { return new Object[][] { // The matched URI of the specified URI reference is defined in // a uri entry. The match is an absolute path. - { "http://remote/dtd/alice/docAlice.dtd", + { "http://remote/dtd/uri/alice/docAlice.dtd", "http://local/dtd/docAliceURI.dtd" }, // The matched URI of the specified URI reference is defined in @@ -76,7 +76,7 @@ public class UriTest { } /* - * Specify base location via method CatalogUriResolver.resolve(href, base). + * Specify base location via method CatalogResolver.resolve(href, base). */ @Test public void testSpecifyBaseByAPI() { @@ -84,7 +84,7 @@ public class UriTest { "http://remote/dtd/carl/docCarl.dtd", "http://local/carlBase/dtd/docCarlURI.dtd"); - CatalogUriResolver continueResolver = catalogUriResolver( + CatalogResolver continueResolver = catalogUriResolver( CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, RESOLVE_CONTINUE).build(), CATALOG_URI); checkUriResolution(continueResolver, "docCarl.dtd", @@ -97,11 +97,10 @@ public class UriTest { */ @Test(expectedExceptions = CatalogException.class) public void testNoMatch() { - checkNoMatch(createResolver()); + checkNoUriMatch(createResolver()); } - private CatalogUriResolver createResolver() { + private CatalogResolver createResolver() { return catalogUriResolver(CATALOG_URI); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java index 468de7ef528..dbdcb446fa7 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/UrnUnwrappingTest.java @@ -67,4 +67,3 @@ public class UrnUnwrappingTest { return catalogResolver("urnUnwrapping.xml"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java index d0194ca4009..dc7bf7a7e7b 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/ValidateCatalogTest.java @@ -98,8 +98,7 @@ public class ValidateCatalogTest { "http://remote/dtd/alice/docAlice.dtd", "http://local/dtd/docAliceSys.dtd"); checkUriResolution(catalogUriResolver(catalogName, CATALOG_URI), - "http://remote/dtd/alice/docAlice.dtd", + "http://remote/dtd/uri/alice/docAlice.dtd", "http://local/dtd/docAliceURI.dtd"); } } - diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/deferFeature.xml b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/deferFeature.xml index 4bdc2591916..d9c58af34ce 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/deferFeature.xml +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/deferFeature.xml @@ -2,7 +2,7 @@ - + diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uri.xml b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uri.xml index 1ce36ea7f7b..9f37a17bc32 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uri.xml +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uri.xml @@ -1,7 +1,7 @@ - + diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uriFamily.xml b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uriFamily.xml index 2311cf9aa22..bcdc03c060f 100644 --- a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uriFamily.xml +++ b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/uriFamily.xml @@ -4,7 +4,7 @@ - + diff --git a/jaxp/test/javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.java b/jaxp/test/javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.java index 91b29b1d97b..ce95aa410ce 100644 --- a/jaxp/test/javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.java +++ b/jaxp/test/javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.java @@ -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 @@ -42,7 +42,6 @@ import java.util.HashMap; import java.util.Map; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; /* * This case tests if the properties FILES, DEFER, PREFER, RESOLVE in @@ -96,7 +95,7 @@ public class PropertiesTest { } private static void testPropertiesOnUriResolver() { - CatalogUriResolver uriResolver = catalogUriResolver((String[]) null); + CatalogResolver uriResolver = catalogUriResolver((String[]) null); uriResolver.resolve("http://remote/uri/dtd/docDummy.dtd", null); "http://local/base/dtd/docURI.dtd".equals(uriResolver.resolve( "http://remote/dtd/doc.dtd", null).getSystemId()); diff --git a/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java b/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java index a0e83d5b810..01d45ff591b 100644 --- a/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java +++ b/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java @@ -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 @@ -35,7 +35,6 @@ import java.util.stream.Stream; import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogManager; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import jaxp.library.JAXPTestUtilities; @@ -101,18 +100,18 @@ final class CatalogTestUtils { /* * Creates catalogUriResolver with a set of catalogs. */ - static CatalogUriResolver catalogUriResolver(String... catalogName) { + static CatalogResolver catalogUriResolver(String... catalogName) { return catalogUriResolver(CatalogFeatures.defaults(), catalogName); } /* * Creates catalogUriResolver with a feature and a set of catalogs. */ - static CatalogUriResolver catalogUriResolver( + static CatalogResolver catalogUriResolver( CatalogFeatures features, String... catalogName) { return (catalogName == null) ? - CatalogManager.catalogUriResolver(features) : - CatalogManager.catalogUriResolver(features, getCatalogPaths(catalogName)); + CatalogManager.catalogResolver(features) : + CatalogManager.catalogResolver(features, getCatalogPaths(catalogName)); } // Gets the paths of the specified catalogs. diff --git a/jaxp/test/javax/xml/jaxp/libs/catalog/ResolutionChecker.java b/jaxp/test/javax/xml/jaxp/libs/catalog/ResolutionChecker.java index 002ec22ede4..81013a5a7bd 100644 --- a/jaxp/test/javax/xml/jaxp/libs/catalog/ResolutionChecker.java +++ b/jaxp/test/javax/xml/jaxp/libs/catalog/ResolutionChecker.java @@ -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 @@ -24,7 +24,6 @@ package catalog; import javax.xml.catalog.CatalogResolver; -import javax.xml.catalog.CatalogUriResolver; import org.testng.Assert; @@ -65,7 +64,7 @@ class ResolutionChecker { * Checks the resolution result for specified URI references * with the specified base location. */ - static void checkUriResolution(CatalogUriResolver resolver, + static void checkUriResolution(CatalogResolver resolver, String href, String base, String matchedUri) { Assert.assertEquals(resolver.resolve(href, base).getSystemId(), matchedUri); @@ -74,7 +73,7 @@ class ResolutionChecker { /* * Checks the resolution result for specified URI references. */ - static void checkUriResolution(CatalogUriResolver resolver, + static void checkUriResolution(CatalogResolver resolver, String href, String matchedUri) { checkUriResolution(resolver, href, null, matchedUri); } @@ -92,9 +91,9 @@ class ResolutionChecker { /* * With strict resolution, if no match is found, - * CatalogUriResolver should throw CatalogException. + * CatalogResolver should throw CatalogException. */ - static void checkNoMatch(CatalogUriResolver resolver) { + static void checkNoUriMatch(CatalogResolver resolver) { resolver.resolve("http://uri/noMatch/docNoMatch.dtd", getNotSpecified(null)); } @@ -139,7 +138,7 @@ class ResolutionChecker { * URI reference with a specified base location. */ static void expectExceptionOnUri( - CatalogUriResolver resolver, String href, String base, + CatalogResolver resolver, String href, String base, Class expectedExceptionClass) { expectThrows(expectedExceptionClass, () -> { resolver.resolve(href, base); @@ -151,7 +150,7 @@ class ResolutionChecker { * URI reference without any specified base location. */ static void expectExceptionOnUri( - CatalogUriResolver resolver, String href, + CatalogResolver resolver, String href, Class expectedExceptionClass) { expectExceptionOnUri(resolver, href, null, expectedExceptionClass); } diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.java index f8dbda9310a..1078d7cd2c0 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.java @@ -327,4 +327,3 @@ public class CatalogSupport extends CatalogSupportBase { }; } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.xml index 22df286942a..f889ac50a78 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.xml +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport.xml @@ -11,32 +11,32 @@ - - - - + + + + - + - - + + - - - + + + - + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport1.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport1.java index cac5e33e99c..251a65fc779 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport1.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport1.java @@ -268,4 +268,3 @@ public class CatalogSupport1 extends CatalogSupportBase { } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport2.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport2.java index 10159d3567c..8332596e329 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport2.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport2.java @@ -270,4 +270,3 @@ public class CatalogSupport2 extends CatalogSupportBase { }; } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport3.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport3.java index 6760b1981e1..473ca119c90 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport3.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport3.java @@ -280,4 +280,3 @@ public class CatalogSupport3 extends CatalogSupportBase { }; } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport4.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport4.java index 12b15e64348..b565cf30853 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport4.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport4.java @@ -269,4 +269,3 @@ public class CatalogSupport4 extends CatalogSupportBase { }; } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport5.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport5.java new file mode 100644 index 00000000000..884f34ddb88 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport5.java @@ -0,0 +1,250 @@ +/* + * 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.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.Listeners; +import org.testng.annotations.Test; +import org.w3c.dom.ls.LSResourceResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/* + * @test + * @bug 8158084 8163232 + * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest + * @run testng/othervm -DrunSecMngr=true catalog.CatalogSupport5 + * @run testng/othervm catalog.CatalogSupport5 + * @summary extends CatalogSupport tests, verifies that when errors occur, + * relevant checked Exceptions are returned. + */ +/** + * The CatalogResolver will throw CatalogException when there is no match and + * the resolve property is strict. The Exception should be caught with the existing + * mechanisms so that the checked Exception corresponding to the process can be + * returned. + * + * @author huizhe.wang@oracle.com + */ +@Listeners({jaxp.library.FilePolicy.class, jaxp.library.NetAccessPolicy.class}) +public class CatalogSupport5 extends CatalogSupportBase { + + /* + * Initializing fields + */ + @BeforeClass + public void setUpClass() throws Exception { + setUp(); + } + + + /* + Verifies the Catalog support on SAXParser. + */ + @Test(dataProvider = "data_SAXC", expectedExceptions = SAXException.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 = SAXException.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 = SAXException.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 = SAXException.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 = SAXException.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) + 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") + public Object[][] getDataSAXC() { + return new Object[][]{ + {false, true, xml_bogus_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") + public Object[][] getDataXIC() { + return new Object[][]{ + {false, true, xml_bogus_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") + public Object[][] getDataDOMC() { + return new Object[][]{ + {false, true, xml_bogus_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") + public Object[][] getDataSchemaC() { + + return new Object[][]{ + // for resolving DTD in xsd + {false, true, xml_bogus_catalog, xsd_xmlSchema, null}, + // for resolving xsd import + {false, true, xml_bogus_catalog, xsd_xmlSchema_import, null}, + // for resolving xsd include + {false, true, xml_bogus_catalog, xsd_include_company, null} + }; + } + + /* + DataProvider: for testing Schema Validator + Data: setUseCatalog1, setUseCatalog2, useCatalog, source, resolver1, resolver2, + catalog1, catalog2 + */ + @DataProvider(name = "data_ValidatorC") + public 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_bogus_catalog, null}, + {false, false, true, ds, null, null, null, xml_bogus_catalog}, + {false, false, true, ss, null, null, xml_bogus_catalog, null}, + {false, false, true, ss, null, null, null, xml_bogus_catalog}, + {false, false, true, stax, null, null, xml_bogus_catalog, null}, + {false, false, true, stax1, null, null, null, xml_bogus_catalog}, + {false, false, true, source, null, null, xml_bogus_catalog, null}, + {false, false, true, source, null, null, null, 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") + public 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_bogus_catalog, xslSourceDTD, xmlSourceDTD, null, ""}, + // for resolving reference by the document function + {false, true, xml_bogus_catalog, xslDocSource, xmlDocSource, null, "Resolved by a catalog"}, + }; + } +} diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java index 83a1520c45d..87735104855 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java @@ -35,9 +35,9 @@ 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.catalog.CatalogResolver; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -61,7 +61,6 @@ 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.w3c.dom.Document; import org.w3c.dom.Node; @@ -677,6 +676,29 @@ public class CatalogSupportBase { } + + /** + * Extends MyHandler and overrides resolveEntity with a CatalogResolver + */ + class MyCatalogHandler extends MyHandler { + CatalogResolver cr; + + public MyCatalogHandler(CatalogResolver cr, String elementName) { + super(elementName); + this.cr = cr; + } + + @Override + public InputSource resolveEntity(String publicId, String systemId) { + return cr.resolveEntity(publicId, systemId); + } + @Override + public InputSource resolveEntity(String name, String publicId, + String baseURI, String systemId) { + return cr.resolveEntity(publicId, systemId); + } + } + /** * Extends MyHandler and overrides resolveEntity */ @@ -935,4 +957,3 @@ public class CatalogSupportBase { } } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport_uri.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport_uri.xml new file mode 100644 index 00000000000..8a4b0dbf290 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupport_uri.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java index 4c00ef686c8..6f622f9ab25 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java @@ -26,23 +26,37 @@ import static jaxp.library.JAXPTestUtilities.clearSystemProperty; import static jaxp.library.JAXPTestUtilities.getSystemProperty; import static jaxp.library.JAXPTestUtilities.setSystemProperty; +import java.io.File; +import java.io.FileInputStream; import java.io.FilePermission; import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; import java.nio.file.Paths; import java.util.PropertyPermission; - +import javax.xml.XMLConstants; import javax.xml.catalog.Catalog; 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.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Source; - +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXSource; +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 jaxp.library.JAXPTestUtilities; import org.testng.Assert; @@ -59,29 +73,235 @@ import org.xml.sax.ext.DefaultHandler2; /* * @test - * @bug 8081248 8144966 8146606 8146237 8151154 8150969 8151162 8152527 8154220 + * @bug 8081248 8144966 8146606 8146237 8151154 8150969 8151162 8152527 8154220 8163232 * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest * @run testng/othervm -DrunSecMngr=true catalog.CatalogTest * @run testng/othervm catalog.CatalogTest * @summary Tests basic Catalog functions. */ @Listeners({jaxp.library.FilePolicy.class}) -public class CatalogTest { +public class CatalogTest extends CatalogSupportBase { static final String KEY_FILES = "javax.xml.catalog.files"; - public String filepath; /* * Initializing fields */ @BeforeClass public void setUpClass() throws Exception { - String file1 = getClass().getResource("first_cat.xml").getFile(); - if (getSystemProperty("os.name").contains("Windows")) { - filepath = file1.substring(1, file1.lastIndexOf("/") + 1); - } else { - filepath = file1.substring(0, file1.lastIndexOf("/") + 1); + super.setUp(); + } + + + /* + * @bug 8163232 + * Verifies that the CatalogResolver supports the following XML Resolvers: + javax.xml.stream.XMLResolver + javax.xml.transform.URIResolver + org.w3c.dom.ls.LSResourceResolver + org.xml.sax.EntityResolver + * + * Plus, system and uri entries can equally be used. + */ + + /* + * Verifies the support for org.xml.sax.EntityResolver. + * Expected: the parser returns the expected string. + */ + @Test(dataProvider = "supportXMLResolver") + public void supportEntityResolver(String catalogFile, String xml, String expected) throws Exception { + String xmlSource = getClass().getResource(xml).getFile(); + + CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile); + MyCatalogHandler handler = new MyCatalogHandler(cr, elementInSystem); + SAXParser parser = getSAXParser(false, true, null); + parser.parse(xmlSource, handler); + + Assert.assertEquals(handler.getResult().trim(), expected); + } + + /* + * Verifies the support for javax.xml.stream.XMLResolver. + * Expected: the parser returns the expected string. + */ + @Test(dataProvider = "supportXMLResolver") + public void supportXMLResolver(String catalogFile, String xml, String expected) throws Exception { + String xmlSource = getClass().getResource(xml).getFile(); + + CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile); + + XMLInputFactory xifactory = XMLInputFactory.newInstance(); + xifactory.setProperty(XMLInputFactory.IS_COALESCING, true); + xifactory.setProperty(XMLInputFactory.RESOLVER, cr); + File file = new File(xmlSource); + String systemId = file.toURI().toString(); + InputStream entityxml = new FileInputStream(file); + XMLStreamReader streamReader = xifactory.createXMLStreamReader(systemId, entityxml); + String result = null; + while (streamReader.hasNext()) { + int eventType = streamReader.next(); + if (eventType == XMLStreamConstants.START_ELEMENT) { + eventType = streamReader.next(); + if (eventType == XMLStreamConstants.CHARACTERS) { + result = streamReader.getText(); + } + } } + System.out.println(": expected [" + expected + "] <> actual [" + result.trim() + "]"); + + Assert.assertEquals(result.trim(), expected); + } + + /* + * Verifies the support for org.w3c.dom.ls.LSResourceResolver by ShemaFactory. + * Success: parsing goes through with no error + * Fail: throws Exception if references are not resolved (by the CatalogResolver) + */ + @Test(dataProvider = "supportLSResourceResolver") + public void supportLSResourceResolver(String catalogFile, Source schemaSource) throws SAXException { + + CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile); + + SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + factory.setResourceResolver(cr); + Schema schema = factory.newSchema(schemaSource); + + } + + /* + * Verifies the support for org.w3c.dom.ls.LSResourceResolver by Validator. + * Success: parsing goes through with no error + * Fail: throws Exception if references are not resolved (by the CatalogResolver) + */ + @Test(dataProvider = "supportLSResourceResolver1") + public void supportLSResourceResolver1(String catalogFile, Source source) throws Exception { + + CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile); + + SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Validator validator = factory.newSchema().newValidator(); + validator.setResourceResolver(cr); + validator.validate(source); + } + + /* + * Verifies the support for javax.xml.transform.URIResolver. + * Success: parsing goes through with no error + * Fail: throws Exception if references are not resolved (by the CatalogResolver) + */ + @Test(dataProvider = "supportURIResolver") + public void supportURIResolver(String catalogFile, Source xsl, Source xml, String expected) throws Exception { + + CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile); + + TransformerFactory factory = TransformerFactory.newInstance(); + factory.setURIResolver(cr); + Transformer transformer = factory.newTransformer(xsl); + StringWriter out = new StringWriter(); + transformer.transform(xml, new StreamResult(out)); + if (expected != null) { + Assert.assertTrue(out.toString().contains(expected), "supportURIResolver"); + } + } + + /* + DataProvider: used to verify the support of XML Resolvers. + Data columns: + catalog filepath, xml source file, expected result + */ + @DataProvider(name = "supportXMLResolver") + public Object[][] supportXMLResolver() { + String catalogFile = getClass().getResource("catalog.xml").getFile(); + String catalogFileUri = getClass().getResource("catalog_uri.xml").getFile(); + + return new Object[][]{ + {catalogFile, "system.xml", "Test system entry"}, + {catalogFile, "rewritesystem.xml", "Test rewritesystem entry"}, + {catalogFile, "rewritesystem1.xml", "Test rewritesystem entry"}, + {catalogFile, "systemsuffix.xml", "Test systemsuffix entry"}, + {catalogFile, "delegatesystem.xml", "Test delegatesystem entry"}, + {catalogFile, "public.xml", "Test public entry"}, + {catalogFile, "delegatepublic.xml", "Test delegatepublic entry"}, + // using uri entries + {catalogFileUri, "system.xml", "Test system entry"}, + {catalogFileUri, "rewritesystem.xml", "Test rewritesystem entry"}, + {catalogFileUri, "rewritesystem1.xml", "Test rewritesystem entry"}, + {catalogFileUri, "systemsuffix.xml", "Test systemsuffix entry"}, + {catalogFileUri, "delegateuri.xml", "Test delegateuri entry"}, + {catalogFileUri, "public.xml", "Test public entry"}, + }; + } + + /* + DataProvider: used to verify the support of LSResourceResolver by SchemaFactory. + Data columns: + catalog filepath, schema source file + */ + @DataProvider(name = "supportLSResourceResolver") + public Object[][] supportLSResourceResolver() { + String catalogFile = getClass().getResource("CatalogSupport.xml").getFile(); + String catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").getFile(); + + /* + * XMLSchema.xsd has a reference to XMLSchema.dtd which in turn refers to + * datatypes.dtd + */ + return new Object[][]{ + {catalogFile, new StreamSource(new StringReader(xsd_xmlSchema))}, + {catalogFile, new StreamSource(new StringReader(xsd_xmlSchema_import))}, + {catalogFile, new StreamSource(new StringReader(xsd_include_company))}, + {catalogFileUri, new StreamSource(new StringReader(xsd_xmlSchema))}, + {catalogFileUri, new StreamSource(new StringReader(xsd_xmlSchema_import))}, + {catalogFileUri, new StreamSource(new StringReader(xsd_include_company))}, + }; + } + + /* + DataProvider: used to verify the support of LSResourceResolver by Validator. + Data columns: + catalog filepath, source file + */ + @DataProvider(name = "supportLSResourceResolver1") + public Object[][] supportLSResourceResolver1() { + String catalogFile = getClass().getResource("CatalogSupport.xml").getFile(); + String catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").getFile(); + + /* + * val_test.xml has a reference to system.dtd and val_test.xsd + */ + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + return new Object[][]{ + {catalogFile, ss}, + {catalogFileUri, ss}, + }; + } + + + /* + DataProvider: used to verify the support of LSResourceResolver by Validator. + Data columns: + catalog filepath, xsl source, xml source file + */ + @DataProvider(name = "supportURIResolver") + public Object[][] supportURIResolver() { + String catalogFile = getClass().getResource("CatalogSupport.xml").getFile(); + String catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").getFile(); + SAXSource xslSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())); + + /* + * val_test.xml has a reference to system.dtd and val_test.xsd + */ + SAXSource ss = new SAXSource(new InputSource(xml_val_test)); + ss.setSystemId(xml_val_test_id); + + return new Object[][]{ + {catalogFile, new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString())), + new StreamSource(new File(xml_doc)), "Resolved by a catalog"}, + {catalogFileUri, new SAXSource(new InputSource(new StringReader(xsl_include))), + new StreamSource(new StringReader(xml_xsl)), null}, + }; } /* @@ -110,7 +330,7 @@ public class CatalogTest { @Test(dataProvider = "resolveUri") public void testMatch1(String cFile, String href, String expectedFile, String expectedUri, String msg) { String catalogFile = getClass().getResource(cFile).getFile(); - CatalogUriResolver cur = CatalogManager.catalogUriResolver(CatalogFeatures.defaults(), catalogFile); + CatalogResolver cur = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile); Source source = cur.resolve(href, null); Assert.assertNotNull(source, "Source returned is null"); Assert.assertEquals(expectedUri, source.getSystemId(), msg); @@ -275,7 +495,7 @@ public class CatalogTest { try { - CatalogUriResolver resolver = CatalogManager.catalogUriResolver(CatalogFeatures.defaults(), catalog); + CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalog); String actualSystemId = resolver.resolve("http://remote.com/import/import.xsl", null).getSystemId(); Assert.assertTrue(!actualSystemId.contains("//"), "result contains duplicate slashes"); } catch (Exception e) { @@ -383,7 +603,7 @@ public class CatalogTest { /* - DataProvider: used to verify CatalogUriResolver's resolve function. + DataProvider: used to verify CatalogResolver's resolve function. Data columns: catalog, uri or publicId, expectedFile, expectedUri, msg @@ -571,4 +791,3 @@ public class CatalogTest { } } } - diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog.xml index f7340d77859..0c25770bf3b 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog.xml +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog.xml @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog_uri.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog_uri.xml new file mode 100644 index 00000000000..26adf0f3f01 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/catalog_uri.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/delegateuri.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/delegateuri.xml new file mode 100644 index 00000000000..88b802cfe44 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/delegateuri.xml @@ -0,0 +1,5 @@ + + + +Test &delegateuri; entry diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog.xml index 1344c78101a..b398f5ba30d 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog.xml +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog.xml @@ -22,4 +22,4 @@ - \ No newline at end of file + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog_uri.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog_uri.xml new file mode 100644 index 00000000000..a9f6b86be0c --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegatecatalog_uri.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegateuri.dtd b/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegateuri.dtd new file mode 100644 index 00000000000..a8e56d26fb3 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/files/delegateuri.dtd @@ -0,0 +1,2 @@ + + diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/system.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/system.xml index a96c4d896f7..0ceb2c633d0 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/catalog/system.xml +++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/system.xml @@ -1,5 +1,5 @@ - -Test &system; entry \ No newline at end of file +Test &system; entry diff --git a/jaxp/test/javax/xml/jaxp/unittest/parsers/HandleError.java b/jaxp/test/javax/xml/jaxp/unittest/parsers/HandleError.java new file mode 100644 index 00000000000..0a3e35c5dd3 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/parsers/HandleError.java @@ -0,0 +1,98 @@ +/* + * 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 parsers; + +import java.io.StringReader; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; + +/* + * @test + * @bug 8157797 + * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest + * @run testng/othervm -DrunSecMngr=true parsers.HandleError + * @run testng/othervm parsers.HandleError + * @summary Tests that the parser handles errors properly. + */ +@Listeners({jaxp.library.BasePolicy.class}) +public class HandleError { + + /* + * Verifies that the parser returns with no unexpected "java.lang.InternalError" + * when continue-after-fatal-error is requested. + */ + @Test + public void test() throws Exception { + String invalidXml = ""; + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + saxParserFactory.setFeature("http://apache.org/xml/features/continue-after-fatal-error", true); + SAXParser parser = saxParserFactory.newSAXParser(); + parser.parse(new InputSource(new StringReader(invalidXml)), new DefaultHandler() { + @Override + public void fatalError(SAXParseException e) throws SAXException { + System.err.printf("%s%n", e.getMessage()); + } + }); + } + + + /* + * Verifies that the parser throws SAXParseException when parsing error is + * encountered when: + * continue-after-fatal-error is not set, the default it false + * continue-after-fatal-error is explicitly set to false + */ + @Test(dataProvider = "setFeature", expectedExceptions = SAXParseException.class) + public void test1(boolean setFeature, boolean value) throws Exception { + String invalidXml = ""; + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + if (setFeature) { + saxParserFactory.setFeature("http://apache.org/xml/features/continue-after-fatal-error", value); + } + SAXParser parser = saxParserFactory.newSAXParser(); + parser.parse(new InputSource(new StringReader(invalidXml)), new DefaultHandler()); + } + + /* + DataProvider: used to set feature "continue-after-fatal-error" + Data columns: + flag to indicate the feature is to be set, the value of the feature + */ + @DataProvider(name = "setFeature") + public Object[][] getFeatureSetting() { + + return new Object[][]{ + {false, false}, + {true, false}, + }; + } +} diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 36eb74d3bb0..136f72fe00d 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -378,3 +378,4 @@ fe4e11bd2423635dc0f5f5cb9a64eb2f2cce7f4c jdk-9+128 39c6293131d91aec7f2f5120395e070a937b8858 jdk-9+130 783e7e2c587f2c7e1b9998a46d90ec196ab2a195 jdk-9+131 9fff2477a4cadf2a9618a76f1f4fe0f20bb5ff3b jdk-9+132 +05e99eefda2b58d1ed176e411302d9d6b35dca16 jdk-9+133 diff --git a/jdk/make/GenerateClasslist.gmk b/jdk/make/GenerateClasslist.gmk index 279cf9da012..3863a57d670 100644 --- a/jdk/make/GenerateClasslist.gmk +++ b/jdk/make/GenerateClasslist.gmk @@ -50,6 +50,8 @@ TARGETS += $(CLASSLIST_JAR) CLASSLIST_FILE := $(SUPPORT_OUTPUTDIR)/classlist/classlist +JLI_TRACE_FILE := $(SUPPORT_OUTPUTDIR)/classlist/jli_trace.out + # If an external buildjdk has been supplied, we don't build a separate interim # image, so just use the external build jdk instead. ifeq ($(EXTERNAL_BUILDJDK), true) @@ -59,13 +61,11 @@ endif $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXE_SUFFIX) $(CLASSLIST_JAR) $(call MakeDir, $(@D)) $(call LogInfo, Generating lib/classlist) - $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.tmp \ - -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \ - build.tools.classlist.HelloClasslist $(LOG_DEBUG) 2>&1 - # Filter out generated classes, remove after JDK-8149977 $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@ \ - -Xshare:dump -XX:SharedClassListFile=$@.tmp $(LOG_DEBUG) 2>&1 - $(RM) $@.tmp + -Djava.lang.invoke.MethodHandle.TRACE_RESOLVE=true \ + -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \ + build.tools.classlist.HelloClasslist \ + $(LOG_DEBUG) 2>&1 > $(JLI_TRACE_FILE) TARGETS += $(CLASSLIST_FILE) diff --git a/jdk/make/gendata/Gendata-java.base.gmk b/jdk/make/gendata/Gendata-java.base.gmk index 8547f205011..88acb5b983b 100644 --- a/jdk/make/gendata/Gendata-java.base.gmk +++ b/jdk/make/gendata/Gendata-java.base.gmk @@ -34,7 +34,7 @@ include GendataTZDB.gmk include GendataBlacklistedCerts.gmk -include GendataPolicyJars.gmk +include GendataCryptoPolicy.gmk ################################################################################ @@ -64,13 +64,19 @@ TARGETS += $(GENDATA_CURDATA) GENDATA_JAVA_SECURITY_SRC := $(JDK_TOPDIR)/src/java.base/share/conf/security/java.security GENDATA_JAVA_SECURITY := $(SUPPORT_OUTPUTDIR)/modules_conf/java.base/security/java.security +ifeq ($(UNLIMITED_CRYPTO), true) + CRYPTO.POLICY := unlimited +else + CRYPTO.POLICY := limited +endif + # RESTRICTED_PKGS_SRC is optionally set in custom extension for this makefile $(GENDATA_JAVA_SECURITY): $(BUILD_TOOLS) $(GENDATA_JAVA_SECURITY_SRC) $(RESTRICTED_PKGS_SRC) $(call LogInfo, Generating java.security) $(call MakeDir, $(@D)) $(TOOL_MAKEJAVASECURITY) $(GENDATA_JAVA_SECURITY_SRC) $@ $(OPENJDK_TARGET_OS) \ - $(OPENJDK_TARGET_CPU_ARCH) $(RESTRICTED_PKGS_SRC) + $(OPENJDK_TARGET_CPU_ARCH) $(CRYPTO.POLICY) $(RESTRICTED_PKGS_SRC) TARGETS += $(GENDATA_JAVA_SECURITY) diff --git a/jdk/make/gendata/GendataCryptoPolicy.gmk b/jdk/make/gendata/GendataCryptoPolicy.gmk new file mode 100644 index 00000000000..dff51230b44 --- /dev/null +++ b/jdk/make/gendata/GendataCryptoPolicy.gmk @@ -0,0 +1,72 @@ +# +# Copyright (c) 2013, 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. +# + +# +# In pre-JDK9 releases, Oracle JDK has had a separately downloadable set +# of policy files which has been a nightmare for deployment. +# +# We now create 2 complete initial sets of policy files and package into +# 2 different directories. The crypto.policy Security property will select +# the active policy. +# +# It will be up to the user/deployer to make an informed choice +# as to whether they are legally entitled to use the unlimited policy +# file in their environment. The $(UNLIMITED_CRYPTO) make variable +# determines the default directory/policy. +# + +default: all + +include $(SPEC) +include MakeBase.gmk + + +################################################################################ +POLICY_DIR := $(SUPPORT_OUTPUTDIR)/modules_conf/java.base/security/policy +LIMITED_POLICY_DIR := $(POLICY_DIR)/limited +UNLIMITED_POLICY_DIR := $(POLICY_DIR)/unlimited + +POLICY_SRC_DIR := $(JDK_TOPDIR)/src/java.base/share/conf/security/policy +LIMITED_POLICY_SRC_DIR := $(POLICY_SRC_DIR)/limited +UNLIMITED_POLICY_SRC_DIR := $(POLICY_SRC_DIR)/unlimited + +$(POLICY_DIR)/README.txt: $(POLICY_SRC_DIR)/README.txt + $(install-file) + +$(LIMITED_POLICY_DIR)/%: $(LIMITED_POLICY_SRC_DIR)/% + $(install-file) + +$(UNLIMITED_POLICY_DIR)/%: $(UNLIMITED_POLICY_SRC_DIR)/% + $(install-file) + +TARGETS += \ + $(POLICY_DIR)/README.txt \ + $(LIMITED_POLICY_DIR)/default_US_export.policy \ + $(LIMITED_POLICY_DIR)/default_local.policy \ + $(LIMITED_POLICY_DIR)/exempt_local.policy \ + $(UNLIMITED_POLICY_DIR)/default_US_export.policy \ + $(UNLIMITED_POLICY_DIR)/default_local.policy \ + +################################################################################ diff --git a/jdk/make/gendata/GendataPolicyJars.gmk b/jdk/make/gendata/GendataPolicyJars.gmk deleted file mode 100644 index 57f80abe9f2..00000000000 --- a/jdk/make/gendata/GendataPolicyJars.gmk +++ /dev/null @@ -1,150 +0,0 @@ -# -# Copyright (c) 2013, 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. -# - -default: all - -include $(SPEC) -include MakeBase.gmk -include JarArchive.gmk - - -################################################################################ - -US_EXPORT_POLICY_JAR_DST := \ - $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/security/US_export_policy.jar - -US_EXPORT_POLICY_JAR_LIMITED := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/limited/US_export_policy.jar -US_EXPORT_POLICY_JAR_UNLIMITED := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/US_export_policy.jar - -# -# TODO fix so that SetupJarArchive does not write files into SRCS -# then we don't need this extra copying -# -# NOTE: We currently do not place restrictions on our limited export -# policy. This was not a typo. This means we are shipping the same file -# for both limited and unlimited US_export_policy.jar. Only the local -# policy file currently has restrictions. -# -US_EXPORT_POLICY_JAR_SRC_DIR := \ - $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited -US_EXPORT_POLICY_JAR_TMP := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/US_export_policy_jar.tmp - -$(US_EXPORT_POLICY_JAR_TMP)/%: $(US_EXPORT_POLICY_JAR_SRC_DIR)/% - $(install-file) - -US_EXPORT_POLICY_JAR_DEPS := \ - $(US_EXPORT_POLICY_JAR_TMP)/default_US_export.policy - -$(eval $(call SetupJarArchive, BUILD_US_EXPORT_POLICY_JAR, \ - DEPENDENCIES := $(US_EXPORT_POLICY_JAR_DEPS), \ - SRCS := $(US_EXPORT_POLICY_JAR_TMP), \ - SUFFIXES := .policy, \ - JAR := $(US_EXPORT_POLICY_JAR_UNLIMITED), \ - EXTRA_MANIFEST_ATTR := Crypto-Strength: unlimited, \ - SKIP_METAINF := true, \ -)) - -$(US_EXPORT_POLICY_JAR_LIMITED): \ - $(US_EXPORT_POLICY_JAR_UNLIMITED) - $(call LogInfo, Copying unlimited $(patsubst $(OUTPUT_ROOT)/%,%,$@)) - $(install-file) - -TARGETS += $(US_EXPORT_POLICY_JAR_LIMITED) $(US_EXPORT_POLICY_JAR_UNLIMITED) - -ifeq ($(UNLIMITED_CRYPTO), true) - $(US_EXPORT_POLICY_JAR_DST): $(US_EXPORT_POLICY_JAR_UNLIMITED) - $(install-file) -else - $(US_EXPORT_POLICY_JAR_DST): $(US_EXPORT_POLICY_JAR_LIMITED) - $(install-file) -endif - -POLICY_JARS += $(US_EXPORT_POLICY_JAR_DST) - -################################################################################ - -LOCAL_POLICY_JAR_DST := \ - $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/security/local_policy.jar - -LOCAL_POLICY_JAR_LIMITED := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/limited/local_policy.jar -LOCAL_POLICY_JAR_UNLIMITED := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/local_policy.jar - -# -# TODO fix so that SetupJarArchive does not write files into SRCS -# then we don't need this extra copying -# -LOCAL_POLICY_JAR_LIMITED_TMP := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/limited/local_policy_jar.tmp -LOCAL_POLICY_JAR_UNLIMITED_TMP := \ - $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/local_policy_jar.tmp - -$(LOCAL_POLICY_JAR_LIMITED_TMP)/%: \ - $(JDK_TOPDIR)/make/data/cryptopolicy/limited/% - $(install-file) - -$(LOCAL_POLICY_JAR_UNLIMITED_TMP)/%: \ - $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited/% - $(install-file) - -$(eval $(call SetupJarArchive, BUILD_LOCAL_POLICY_JAR_LIMITED, \ - DEPENDENCIES := $(LOCAL_POLICY_JAR_LIMITED_TMP)/exempt_local.policy \ - $(LOCAL_POLICY_JAR_LIMITED_TMP)/default_local.policy, \ - SRCS := $(LOCAL_POLICY_JAR_LIMITED_TMP), \ - SUFFIXES := .policy, \ - JAR := $(LOCAL_POLICY_JAR_LIMITED), \ - EXTRA_MANIFEST_ATTR := Crypto-Strength: limited, \ - SKIP_METAINF := true, \ -)) - -$(eval $(call SetupJarArchive, BUILD_LOCAL_POLICY_JAR_UNLIMITED, \ - DEPENDENCIES := $(LOCAL_POLICY_JAR_UNLIMITED_TMP)/default_local.policy, \ - SRCS := $(LOCAL_POLICY_JAR_UNLIMITED_TMP), \ - SUFFIXES := .policy, \ - JAR := $(LOCAL_POLICY_JAR_UNLIMITED), \ - EXTRA_MANIFEST_ATTR := Crypto-Strength: unlimited, \ - SKIP_METAINF := true, \ -)) - -TARGETS += $(LOCAL_POLICY_JAR_LIMITED) $(LOCAL_POLICY_JAR_UNLIMITED) - -ifeq ($(UNLIMITED_CRYPTO), true) - $(LOCAL_POLICY_JAR_DST): $(LOCAL_POLICY_JAR_UNLIMITED) - $(install-file) -else - $(LOCAL_POLICY_JAR_DST): $(LOCAL_POLICY_JAR_LIMITED) - $(install-file) -endif - -POLICY_JARS += $(LOCAL_POLICY_JAR_DST) -TARGETS += $(POLICY_JARS) - -################################################################################ - -$(eval $(call IncludeCustomExtension, jdk, gendata/GendataPolicyJars.gmk)) diff --git a/jdk/make/lib/Lib-jdk.crypto.pkcs11.gmk b/jdk/make/lib/Lib-jdk.crypto.pkcs11.gmk index c74f77960bb..82618b11fb5 100644 --- a/jdk/make/lib/Lib-jdk.crypto.pkcs11.gmk +++ b/jdk/make/lib/Lib-jdk.crypto.pkcs11.gmk @@ -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 @@ -38,8 +38,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PKCS11, \ CFLAGS := $(CFLAGS_JDKLIB) $(addprefix -I, $(LIBJ2PKCS11_SRC)) \ $(LIBJAVA_HEADER_FLAGS) \ -I$(SUPPORT_OUTPUTDIR)/headers/jdk.crypto.pkcs11, \ - DISABLED_WARNINGS_solstudio := E_DECLARATION_IN_CODE, \ - DISABLED_WARNINGS_microsoft := 4013 4267, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libj2pkcs11/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ diff --git a/jdk/make/src/classes/build/tools/makejavasecurity/MakeJavaSecurity.java b/jdk/make/src/classes/build/tools/makejavasecurity/MakeJavaSecurity.java index 0e3ca50bc26..963db0b593e 100644 --- a/jdk/make/src/classes/build/tools/makejavasecurity/MakeJavaSecurity.java +++ b/jdk/make/src/classes/build/tools/makejavasecurity/MakeJavaSecurity.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,8 @@ import java.util.*; * * 1. Adds additional packages to the package.access and * package.definition security properties. - * 2. Filter out platform-unrelated parts + * 2. Filter out platform-unrelated parts. + * 3. Set the JCE jurisdiction policy directory. * * In order to easily maintain platform-related entries, every item * (including the last line) in package.access and package.definition @@ -50,12 +51,13 @@ public class MakeJavaSecurity { public static void main(String[] args) throws Exception { - if (args.length < 4) { + if (args.length < 5) { System.err.println("Usage: java MakeJavaSecurity " + "[input java.security file name] " + "[output java.security file name] " + "[openjdk target os] " + "[openjdk target cpu architecture]" + + "[JCE jurisdiction policy directory]" + "[more restricted packages file name?]"); System.exit(1); @@ -63,8 +65,8 @@ public class MakeJavaSecurity { // more restricted packages List extraLines; - if (args.length == 5) { - extraLines = Files.readAllLines(Paths.get(args[4])); + if (args.length == 6) { + extraLines = Files.readAllLines(Paths.get(args[5])); } else { extraLines = Collections.emptyList(); } @@ -135,6 +137,16 @@ public class MakeJavaSecurity { } } + // Set the JCE policy value + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + int index = line.indexOf("crypto.policydir-tbd"); + if (index >= 0) { + String prefix = line.substring(0, index); + lines.set(i, prefix + args[4]); + } + } + // Clean up the last line of PKG_ACC and PKG_DEF blocks. // Not really necessary since a blank line follows. boolean inBlock = false; diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java index 91071a2b3b4..461dd3967cb 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java @@ -497,6 +497,10 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; String shortTypes = LambdaForm.shortenSignature(types); String className = SPECIES_CLASS_PREFIX + shortTypes; Class c = BootLoader.loadClassOrNull(className); + if (TRACE_RESOLVE) { + System.out.println("[BMH_RESOLVE] " + shortTypes + + (c != null ? " (success)" : " (fail)") ); + } if (c != null) { return c.asSubclass(BoundMethodHandle.class); } else { diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index b71bd527608..afb04b6efa4 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -607,7 +607,10 @@ class InvokerBytecodeGenerator { private static MemberName resolveFrom(String name, MethodType type, Class holder) { MemberName member = new MemberName(holder, name, type, REF_invokeStatic); MemberName resolvedMember = MemberName.getFactory().resolveOrNull(REF_invokeStatic, member, holder); - + if (TRACE_RESOLVE) { + System.out.println("[LF_RESOLVE] " + holder.getName() + " " + name + " " + + shortenSignature(basicTypeSignature(type)) + (resolvedMember != null ? " (success)" : " (fail)") ); + } return resolvedMember; } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java index 4f5f1f4dc0d..22408f1b55a 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java @@ -46,6 +46,7 @@ import java.util.Properties; static final boolean DUMP_CLASS_FILES; static final boolean TRACE_INTERPRETER; static final boolean TRACE_METHOD_LINKAGE; + static final boolean TRACE_RESOLVE; static final int COMPILE_THRESHOLD; static final boolean LOG_LF_COMPILATION_FAILURE; static final int DONT_INLINE_THRESHOLD; @@ -65,6 +66,8 @@ import java.util.Properties; props.getProperty("java.lang.invoke.MethodHandle.TRACE_INTERPRETER")); TRACE_METHOD_LINKAGE = Boolean.parseBoolean( props.getProperty("java.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE")); + TRACE_RESOLVE = Boolean.parseBoolean( + props.getProperty("java.lang.invoke.MethodHandle.TRACE_RESOLVE")); COMPILE_THRESHOLD = Integer.parseInt( props.getProperty("java.lang.invoke.MethodHandle.COMPILE_THRESHOLD", "0")); LOG_LF_COMPILATION_FAILURE = Boolean.parseBoolean( diff --git a/jdk/src/java.base/share/classes/java/net/HttpCookie.java b/jdk/src/java.base/share/classes/java/net/HttpCookie.java index c8d127837ca..7cc7d6e8ebc 100644 --- a/jdk/src/java.base/share/classes/java/net/HttpCookie.java +++ b/jdk/src/java.base/share/classes/java/net/HttpCookie.java @@ -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 @@ -233,7 +233,7 @@ public final class HttpCookie implements Cloneable { // if not specify max-age, this cookie should be // discarded when user agent is to be closed, but // it is not expired. - if (maxAge == MAX_AGE_UNSPECIFIED) return false; + if (maxAge < 0) return false; long deltaSecond = (System.currentTimeMillis() - whenCreated) / 1000; if (deltaSecond > maxAge) @@ -952,7 +952,8 @@ public final class HttpCookie implements Cloneable { String attrName, String attrValue) { if (cookie.getMaxAge() == MAX_AGE_UNSPECIFIED) { - cookie.setMaxAge(cookie.expiryDate2DeltaSeconds(attrValue)); + long delta = cookie.expiryDate2DeltaSeconds(attrValue); + cookie.setMaxAge(delta > 0 ? delta : 0); } } }); diff --git a/jdk/src/java.base/share/classes/javax/crypto/JceSecurity.java b/jdk/src/java.base/share/classes/javax/crypto/JceSecurity.java index d4fffacf38f..cc32f835696 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/JceSecurity.java +++ b/jdk/src/java.base/share/classes/javax/crypto/JceSecurity.java @@ -29,6 +29,7 @@ import java.util.*; import java.util.jar.*; import java.io.*; import java.net.URL; +import java.nio.file.*; import java.security.*; import java.security.Provider.Service; @@ -206,7 +207,7 @@ final class JceSecurity { static { try { - NULL_URL = new URL("http://null.sun.com/"); + NULL_URL = new URL("http://null.oracle.com/"); } catch (Exception e) { throw new RuntimeException(e); } @@ -243,83 +244,94 @@ final class JceSecurity { } } + // This is called from within an doPrivileged block. private static void setupJurisdictionPolicies() throws Exception { - String javaHomeDir = System.getProperty("java.home"); - String sep = File.separator; - String pathToPolicyJar = javaHomeDir + sep + "lib" + sep + - "security" + sep; - File exportJar = new File(pathToPolicyJar, "US_export_policy.jar"); - File importJar = new File(pathToPolicyJar, "local_policy.jar"); + // Sanity check the crypto.policy Security property. Single + // directory entry, no pseudo-directories (".", "..", leading/trailing + // path separators). normalize()/getParent() will help later. + String cryptoPolicyProperty = Security.getProperty("crypto.policy"); + Path cpPath = Paths.get(cryptoPolicyProperty); - if (!exportJar.exists() || !importJar.exists()) { - throw new SecurityException - ("Cannot locate policy or framework files!"); + if ((cryptoPolicyProperty == null) || + (cpPath.getNameCount() != 1) || + (cpPath.compareTo(cpPath.getFileName()) != 0)) { + throw new SecurityException( + "Invalid policy directory name format: " + + cryptoPolicyProperty); } - // Read jurisdiction policies. - CryptoPermissions defaultExport = new CryptoPermissions(); - CryptoPermissions exemptExport = new CryptoPermissions(); - loadPolicies(exportJar, defaultExport, exemptExport); + // Prepend java.home to get the full path. normalize() in + // case an extra "." or ".." snuck in somehow. + String javaHomeProperty = System.getProperty("java.home"); + Path javaHomePolicyPath = Paths.get(javaHomeProperty, "conf", + "security", "policy").normalize(); + Path cryptoPolicyPath = Paths.get(javaHomeProperty, "conf", "security", + "policy", cryptoPolicyProperty).normalize(); - CryptoPermissions defaultImport = new CryptoPermissions(); - CryptoPermissions exemptImport = new CryptoPermissions(); - loadPolicies(importJar, defaultImport, exemptImport); - - // Merge the export and import policies for default applications. - if (defaultExport.isEmpty() || defaultImport.isEmpty()) { - throw new SecurityException("Missing mandatory jurisdiction " + - "policy files"); + if (cryptoPolicyPath.getParent().compareTo(javaHomePolicyPath) != 0) { + throw new SecurityException( + "Invalid cryptographic jurisdiction policy directory path: " + + cryptoPolicyProperty); } - defaultPolicy = defaultExport.getMinimum(defaultImport); - // Merge the export and import policies for exempt applications. - if (exemptExport.isEmpty()) { - exemptPolicy = exemptImport.isEmpty() ? null : exemptImport; - } else { - exemptPolicy = exemptExport.getMinimum(exemptImport); + if (!Files.isDirectory(cryptoPolicyPath) + || !Files.isReadable(cryptoPolicyPath)) { + throw new SecurityException( + "Can't read cryptographic policy directory: " + + cryptoPolicyProperty); } - } - /** - * Load the policies from the specified file. Also checks that the - * policies are correctly signed. - */ - private static void loadPolicies(File jarPathName, - CryptoPermissions defaultPolicy, - CryptoPermissions exemptPolicy) - throws Exception { + try (DirectoryStream stream = Files.newDirectoryStream( + cryptoPolicyPath, "{default,exempt}_*.policy")) { + for (Path entry : stream) { + try (InputStream is = new BufferedInputStream( + Files.newInputStream(entry))) { + String filename = entry.getFileName().toString(); - JarFile jf = new JarFile(jarPathName); + CryptoPermissions tmpPerms = new CryptoPermissions(); + tmpPerms.load(is); - Enumeration entries = jf.entries(); - while (entries.hasMoreElements()) { - JarEntry je = entries.nextElement(); - InputStream is = null; - try { - if (je.getName().startsWith("default_")) { - is = jf.getInputStream(je); - defaultPolicy.load(is); - } else if (je.getName().startsWith("exempt_")) { - is = jf.getInputStream(je); - exemptPolicy.load(is); - } else { - continue; - } - } finally { - if (is != null) { - is.close(); + if (filename.startsWith("default_")) { + // Did we find a default perms? + defaultPolicy = ((defaultPolicy == null) ? tmpPerms : + defaultPolicy.getMinimum(tmpPerms)); + } else if (filename.startsWith("exempt_")) { + // Did we find a exempt perms? + exemptPolicy = ((exemptPolicy == null) ? tmpPerms : + exemptPolicy.getMinimum(tmpPerms)); + } else { + // This should never happen. newDirectoryStream + // should only throw return "{default,exempt}_*.policy" + throw new SecurityException( + "Unexpected jurisdiction policy files in : " + + cryptoPolicyProperty); + } + } catch (Exception e) { + throw new SecurityException( + "Couldn't parse jurisdiction policy files in: " + + cryptoPolicyProperty); } } - - // Enforce the signer restraint, i.e. signer of JCE framework - // jar should also be the signer of the two jurisdiction policy - // jar files. - ProviderVerifier.verifyPolicySigned(je.getCertificates()); + } catch (DirectoryIteratorException ex) { + // I/O error encountered during the iteration, + // the cause is an IOException + throw new SecurityException( + "Couldn't iterate through the jurisdiction policy files: " + + cryptoPolicyProperty); + } + + // Must have a default policy + if ((defaultPolicy == null) || defaultPolicy.isEmpty()) { + throw new SecurityException( + "Missing mandatory jurisdiction policy files: " + + cryptoPolicyProperty); + } + + // If there was an empty exempt policy file, ignore it. + if ((exemptPolicy != null) && exemptPolicy.isEmpty()) { + exemptPolicy = null; } - // Close and nullify the JarFile reference to help GC. - jf.close(); - jf = null; } static CryptoPermissions getDefaultPolicy() { diff --git a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtDirectoryStream.java b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtDirectoryStream.java index eced854d9d8..f2f2aa684c3 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtDirectoryStream.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtDirectoryStream.java @@ -47,8 +47,8 @@ final class JrtDirectoryStream implements DirectoryStream { private final JrtPath dir; private final DirectoryStream.Filter filter; - private volatile boolean isClosed; - private volatile Iterator itr; + private boolean isClosed; + private Iterator itr; JrtDirectoryStream(JrtPath dir, DirectoryStream.Filter filter) @@ -73,24 +73,22 @@ final class JrtDirectoryStream implements DirectoryStream { throw new IllegalStateException(e); } return new Iterator() { - private Path next; @Override - public synchronized boolean hasNext() { - if (isClosed) - return false; - return itr.hasNext(); + public boolean hasNext() { + synchronized (JrtDirectoryStream.this) { + if (isClosed) + return false; + return itr.hasNext(); + } } @Override - public synchronized Path next() { - if (isClosed) - throw new NoSuchElementException(); - return itr.next(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); + public Path next() { + synchronized (JrtDirectoryStream.this) { + if (isClosed) + throw new NoSuchElementException(); + return itr.next(); + } } }; } diff --git a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java index 5f0433b9d3b..cb6c85d11e3 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java @@ -119,9 +119,7 @@ class JrtFileSystem extends FileSystem { @Override public Iterable getRootDirectories() { - ArrayList dirs = new ArrayList<>(); - dirs.add(getRootPath()); - return dirs; + return Collections.singleton(getRootPath()); } @Override @@ -159,9 +157,7 @@ class JrtFileSystem extends FileSystem { @Override public final Iterable getFileStores() { - ArrayList list = new ArrayList<>(1); - list.add(getFileStore(getRootPath())); - return list; + return Collections.singleton(getFileStore(getRootPath())); } private static final Set supportedFileAttributeViews diff --git a/jdk/src/java.base/share/conf/security/java.security b/jdk/src/java.base/share/conf/security/java.security index 5154fd05a0f..34e5ac92b47 100644 --- a/jdk/src/java.base/share/conf/security/java.security +++ b/jdk/src/java.base/share/conf/security/java.security @@ -804,6 +804,56 @@ jdk.tls.legacyAlgorithms= \ # EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 \ # FFFFFFFF FFFFFFFF, 2} +# Cryptographic Jurisdiction Policy defaults +# +# Due to the import control restrictions of some countries, the default +# JCE policy files allow for strong but "limited" cryptographic key +# lengths to be used. If your country's cryptographic regulations allow, +# the "unlimited" strength policy files can be used instead, which contain +# no restrictions on cryptographic strengths. +# +# If your country has restrictions that don't fit either "limited" or +# "unlimited", an appropriate set of policy files should be created and +# configured before using this distribution. The jurisdiction policy file +# configuration must reflect the cryptographic restrictions appropriate +# for your country. +# +# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY +# TO DETERMINE THE EXACT REQUIREMENTS. +# +# The policy files are flat text files organized into subdirectories of +# /conf/security/policy. Each directory contains a complete +# set of policy files. +# +# The "crypto.policy" Security property controls the directory selection, +# and thus the effective cryptographic policy. +# +# The default set of directories is: +# +# limited | unlimited +# +# however other directories can be created and configured. +# +# Within a directory, the effective policy is the combined minimum +# permissions of the grant statements in the file(s) with the filename +# pattern "default_*.policy". At least one grant is required. For +# example: +# +# limited = Export (all) + Import (limited) = Limited +# unlimited = Export (all) + Import (all) = Unlimited +# +# The effective exemption policy is the combined minimum permissions +# of the grant statements in the file(s) with the filename pattern +# "exempt_*.policy". Exemption grants are optional. +# +# limited = grants exemption permissions, by which the +# effective policy can be circumvented. +# e.g. KeyRecovery/Escrow/Weakening. +# +# Please see the JCA documentation for additional information on these +# files and formats. +crypto.policy=crypto.policydir-tbd + # # The policy for the XML Signature secure validation mode. The mode is # enabled by setting the property "org.jcp.xml.dsig.secureValidation" to diff --git a/jdk/src/java.base/share/conf/security/policy/README.txt b/jdk/src/java.base/share/conf/security/policy/README.txt new file mode 100644 index 00000000000..84e33c972b7 --- /dev/null +++ b/jdk/src/java.base/share/conf/security/policy/README.txt @@ -0,0 +1,35 @@ + + Java(TM) Cryptography Extension Policy Files + for the Java(TM) Platform, Standard Edition Runtime Environment + + README +------------------------------------------------------------------------ + + +The JCE architecture allows flexible cryptographic strength to be +configured via the jurisdiction policy files contained within these +directories. + +Due to import control restrictions of some countries, the default +JCE policy files bundled in this Java Runtime Environment allow +for strong but "limited" cryptographic strengths. For convenience, +this build also contains the "unlimited strength" policy files which +contain no restrictions on cryptographic strengths, but they must be +specifically activated by updating the "crypto.policy" Security property +(e.g. /conf/security/java.security) to point to the appropriate +directory. + +Each subdirectory contains a complete policy configuration, and additional +subdirectories can be added/removed to reflect local regulations. + +JCE for Java SE has been through the U.S. export review process. The JCE +framework, along with the various JCE providers that come standard with it +(SunJCE, SunEC, SunPKCS11, SunMSCAPI, etc), is exportable from the +United States. + +You are advised to consult your export/import control counsel or attorney +to determine the exact requirements of your location, and what policy +settings should be used. + +Please see The Java(TM) Cryptography Architecture (JCA) Reference +Guide and the java.security file for more information. diff --git a/jdk/make/data/cryptopolicy/unlimited/default_US_export.policy b/jdk/src/java.base/share/conf/security/policy/limited/default_US_export.policy similarity index 76% rename from jdk/make/data/cryptopolicy/unlimited/default_US_export.policy rename to jdk/src/java.base/share/conf/security/policy/limited/default_US_export.policy index 67d0acc47a3..1f389340585 100644 --- a/jdk/make/data/cryptopolicy/unlimited/default_US_export.policy +++ b/jdk/src/java.base/share/conf/security/policy/limited/default_US_export.policy @@ -1,4 +1,5 @@ -// Manufacturing policy file. +// Default US Export policy file. + grant { // There is no restriction to any algorithms. permission javax.crypto.CryptoAllPermission; diff --git a/jdk/make/data/cryptopolicy/limited/default_local.policy b/jdk/src/java.base/share/conf/security/policy/limited/default_local.policy similarity index 100% rename from jdk/make/data/cryptopolicy/limited/default_local.policy rename to jdk/src/java.base/share/conf/security/policy/limited/default_local.policy diff --git a/jdk/make/data/cryptopolicy/limited/exempt_local.policy b/jdk/src/java.base/share/conf/security/policy/limited/exempt_local.policy similarity index 76% rename from jdk/make/data/cryptopolicy/limited/exempt_local.policy rename to jdk/src/java.base/share/conf/security/policy/limited/exempt_local.policy index f3255a2d970..9dd5b91b06d 100644 --- a/jdk/make/data/cryptopolicy/limited/exempt_local.policy +++ b/jdk/src/java.base/share/conf/security/policy/limited/exempt_local.policy @@ -1,5 +1,5 @@ -// Some countries have import limits on crypto strength. So this file -// will be useful. +// Some countries have import limits on crypto strength, but may allow for +// these exemptions if the exemption mechanism is used. grant { // There is no restriction to any algorithms if KeyRecovery is enforced. diff --git a/jdk/src/java.base/share/conf/security/policy/unlimited/default_US_export.policy b/jdk/src/java.base/share/conf/security/policy/unlimited/default_US_export.policy new file mode 100644 index 00000000000..1f389340585 --- /dev/null +++ b/jdk/src/java.base/share/conf/security/policy/unlimited/default_US_export.policy @@ -0,0 +1,6 @@ +// Default US Export policy file. + +grant { + // There is no restriction to any algorithms. + permission javax.crypto.CryptoAllPermission; +}; diff --git a/jdk/make/data/cryptopolicy/unlimited/default_local.policy b/jdk/src/java.base/share/conf/security/policy/unlimited/default_local.policy similarity index 99% rename from jdk/make/data/cryptopolicy/unlimited/default_local.policy rename to jdk/src/java.base/share/conf/security/policy/unlimited/default_local.policy index 8dc9702e9da..2b907e25895 100644 --- a/jdk/make/data/cryptopolicy/unlimited/default_local.policy +++ b/jdk/src/java.base/share/conf/security/policy/unlimited/default_local.policy @@ -1,4 +1,5 @@ // Country-specific policy file for countries with no limits on crypto strength. + grant { // There is no restriction to any algorithms. permission javax.crypto.CryptoAllPermission; diff --git a/jdk/src/java.base/share/native/libjli/java.c b/jdk/src/java.base/share/native/libjli/java.c index 12ca2b2c656..4b869ceb56f 100644 --- a/jdk/src/java.base/share/native/libjli/java.c +++ b/jdk/src/java.base/share/native/libjli/java.c @@ -556,20 +556,6 @@ IsLauncherOption(const char* name) { JLI_StrCmp(name, "--list-modules") == 0; } -#ifndef OLD_MODULE_OPTIONS -/* - * Old module options for transition - */ -static jboolean -IsOldModuleOption(const char* name) { - return JLI_StrCmp(name, "-modulepath") == 0 || - JLI_StrCmp(name, "-mp") == 0 || - JLI_StrCmp(name, "-upgrademodulepath") == 0 || - JLI_StrCmp(name, "-addmods") == 0 || - JLI_StrCmp(name, "-limitmods") == 0; -} -#endif - /* * Test if the given name is a module-system white-space option that * will be passed to the VM with its corresponding long-form option @@ -584,8 +570,7 @@ IsModuleOption(const char* name) { JLI_StrCmp(name, "--limit-modules") == 0 || JLI_StrCmp(name, "--add-exports") == 0 || JLI_StrCmp(name, "--add-reads") == 0 || - JLI_StrCmp(name, "--patch-module") == 0 || - IsOldModuleOption(name); + JLI_StrCmp(name, "--patch-module") == 0; } /* @@ -1224,32 +1209,6 @@ GetOpt(int *pargc, char ***pargv, char **poption, char **pvalue) { } } -#ifndef OLD_MODULE_OPTIONS - // for transition to support both old and new syntax - if (JLI_StrCmp(arg, "-modulepath") == 0 || - JLI_StrCmp(arg, "-mp") == 0) { - option = "--module-path"; - } else if (JLI_StrCmp(arg, "-upgrademodulepath") == 0) { - option = "--upgrade-module-path"; - } else if (JLI_StrCmp(arg, "-addmods") == 0) { - option = "--add-modules"; - } else if (JLI_StrCmp(arg, "-limitmods") == 0) { - option = "--limit-modules"; - } else if (JLI_StrCCmp(arg, "-XaddExports:") == 0) { - option = "--add-exports"; - value = arg + 13; - kind = VM_LONG_OPTION_WITH_ARGUMENT; - } else if (JLI_StrCCmp(arg, "-XaddReads:") == 0) { - option = "--add-reads"; - value = arg + 11; - kind = VM_LONG_OPTION_WITH_ARGUMENT; - } else if (JLI_StrCCmp(arg, "-Xpatch:") == 0) { - option = "--patch-module"; - value = arg + 8; - kind = VM_LONG_OPTION_WITH_ARGUMENT; - } -#endif - *pargc = argc; *pargv = argv; *poption = option; @@ -1340,16 +1299,6 @@ ParseArguments(int *pargc, char ***pargv, JLI_StrCmp(arg, "--patch-module") == 0) { REPORT_ERROR (has_arg, ARG_ERROR6, arg); } -#ifndef OLD_MODULE_OPTIONS - else if (JLI_StrCmp(arg, "-modulepath") == 0 || - JLI_StrCmp(arg, "-mp") == 0 || - JLI_StrCmp(arg, "-upgrademodulepath") == 0) { - REPORT_ERROR (has_arg, ARG_ERROR4, arg); - } else if (JLI_StrCmp(arg, "-addmods") == 0 || - JLI_StrCmp(arg, "-limitmods") == 0) { - REPORT_ERROR (has_arg, ARG_ERROR6, arg); - } -#endif /* * The following cases will cause the argument parsing to stop */ diff --git a/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/TerminalImpl.java b/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/TerminalImpl.java index de1410f3ef1..604fac30cc4 100644 --- a/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/TerminalImpl.java +++ b/jdk/src/java.smartcardio/share/classes/sun/security/smartcardio/TerminalImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, 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 @@ -75,10 +75,10 @@ final class TerminalImpl extends CardTerminal { } } try { - card = new CardImpl(this, protocol); + card = new CardImpl(this, protocol); return card; } catch (PCSCException e) { - if (e.code == SCARD_W_REMOVED_CARD) { + if (e.code == SCARD_W_REMOVED_CARD || e.code == SCARD_E_NO_SMARTCARD) { throw new CardNotPresentException("No card present", e); } else { throw new CardException("connect() failed", e); diff --git a/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_util.c b/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_util.c index f102baa64bf..87d34543731 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_util.c +++ b/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_util.c @@ -558,7 +558,7 @@ void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR pCharArray = (*env)->GetStringUTFChars(env, jArray, &isCopy); if (pCharArray == NULL) { return; } - *ckpLength = strlen(pCharArray); + *ckpLength = (CK_ULONG) strlen(pCharArray); *ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR)); if (*ckpArray == NULL) { (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray); diff --git a/jdk/src/jdk.crypto.pkcs11/unix/native/libj2pkcs11/j2secmod_md.c b/jdk/src/jdk.crypto.pkcs11/unix/native/libj2pkcs11/j2secmod_md.c index 225263247db..d5154eff606 100644 --- a/jdk/src/jdk.crypto.pkcs11/unix/native/libj2pkcs11/j2secmod_md.c +++ b/jdk/src/jdk.crypto.pkcs11/unix/native/libj2pkcs11/j2secmod_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, 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 @@ -49,6 +49,7 @@ void *findFunction(JNIEnv *env, jlong jHandle, const char *functionName) { JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_Secmod_nssGetLibraryHandle (JNIEnv *env, jclass thisClass, jstring jLibName) { + void *hModule; const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL); if (libName == NULL) { return 0L; @@ -56,9 +57,9 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_Secmod_nssGetLibraryHandle // look up existing handle only, do not load #if defined(AIX) - void *hModule = dlopen(libName, RTLD_LAZY); + hModule = dlopen(libName, RTLD_LAZY); #else - void *hModule = dlopen(libName, RTLD_NOLOAD); + hModule = dlopen(libName, RTLD_NOLOAD); #endif dprintf2("-handle for %s: %u\n", libName, hModule); (*env)->ReleaseStringUTFChars(env, jLibName, libName); diff --git a/jdk/src/jdk.crypto.pkcs11/windows/native/libj2pkcs11/j2secmod_md.c b/jdk/src/jdk.crypto.pkcs11/windows/native/libj2pkcs11/j2secmod_md.c index 33b11bfd07e..6e983ce158f 100644 --- a/jdk/src/jdk.crypto.pkcs11/windows/native/libj2pkcs11/j2secmod_md.c +++ b/jdk/src/jdk.crypto.pkcs11/windows/native/libj2pkcs11/j2secmod_md.c @@ -31,6 +31,9 @@ #include "j2secmod.h" +extern void throwNullPointerException(JNIEnv *env, const char *message); +extern void throwIOException(JNIEnv *env, const char *message); + void *findFunction(JNIEnv *env, jlong jHandle, const char *functionName) { HINSTANCE hModule = (HINSTANCE)jHandle; void *fAddress = GetProcAddress(hModule, functionName); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java index 1b37140ed55..aaccb4269a0 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java @@ -78,28 +78,21 @@ public final class DefaultImageBuilder implements ImageBuilder { private final List args; private final Set modules; - public DefaultExecutableImage(Path home, Set modules) { - this(home, modules, createArgs(home)); - } - - private DefaultExecutableImage(Path home, Set modules, - List args) { + DefaultExecutableImage(Path home, Set modules) { Objects.requireNonNull(home); - Objects.requireNonNull(args); if (!Files.exists(home)) { throw new IllegalArgumentException("Invalid image home"); } this.home = home; this.modules = Collections.unmodifiableSet(modules); - this.args = Collections.unmodifiableList(args); + this.args = createArgs(home); } private static List createArgs(Path home) { Objects.requireNonNull(home); - List javaArgs = new ArrayList<>(); - javaArgs.add(home.resolve("bin"). - resolve(getJavaProcessName()).toString()); - return javaArgs; + Path binDir = home.resolve("bin"); + String java = Files.exists(binDir.resolve("java"))? "java" : "java.exe"; + return List.of(binDir.resolve(java).toString()); } @Override @@ -130,6 +123,7 @@ public final class DefaultImageBuilder implements ImageBuilder { private final Path root; private final Path mdir; private final Set modules = new HashSet<>(); + private String targetOsName; /** * Default image builder constructor. @@ -171,6 +165,11 @@ public final class DefaultImageBuilder implements ImageBuilder { @Override public void storeFiles(ResourcePool files) { try { + // populate release properties up-front. targetOsName + // field is assigned from there and used elsewhere. + Properties release = releaseProperties(files); + Path bin = root.resolve("bin"); + files.entries().forEach(f -> { if (!f.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) { try { @@ -186,11 +185,11 @@ public final class DefaultImageBuilder implements ImageBuilder { modules.add(m.name()); } }); - storeFiles(modules, releaseProperties(files)); + + storeFiles(modules, release); if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) { // launchers in the bin directory need execute permission - Path bin = root.resolve("bin"); if (Files.isDirectory(bin)) { Files.list(bin) .filter(f -> !f.toString().endsWith(".diz")) @@ -208,7 +207,11 @@ public final class DefaultImageBuilder implements ImageBuilder { } } - prepareApplicationFiles(files, modules); + // If native files are stripped completely, /bin dir won't exist! + // So, don't bother generating launcher scripts. + if (Files.isDirectory(bin)) { + prepareApplicationFiles(files, modules); + } } catch (IOException ex) { throw new PluginException(ex); } @@ -226,6 +229,11 @@ public final class DefaultImageBuilder implements ImageBuilder { props.setProperty("JAVA_VERSION", System.getProperty("java.version")); }); + this.targetOsName = props.getProperty("OS_NAME"); + if (this.targetOsName == null) { + throw new PluginException("TargetPlatform attribute is missing for java.base module"); + } + Optional release = pool.findEntry("/java.base/release"); if (release.isPresent()) { try (InputStream is = release.get().content()) { @@ -373,7 +381,7 @@ public final class DefaultImageBuilder implements ImageBuilder { Files.createLink(dstFile, target); } - private static String nativeDir(String filename) { + private String nativeDir(String filename) { if (isWindows()) { if (filename.endsWith(".dll") || filename.endsWith(".diz") || filename.endsWith(".pdb") || filename.endsWith(".map")) { @@ -386,8 +394,8 @@ public final class DefaultImageBuilder implements ImageBuilder { } } - private static boolean isWindows() { - return System.getProperty("os.name").startsWith("Windows"); + private boolean isWindows() { + return targetOsName.startsWith("Windows"); } /** @@ -452,12 +460,10 @@ public final class DefaultImageBuilder implements ImageBuilder { } } - private static String getJavaProcessName() { - return isWindows() ? "java.exe" : "java"; - } - public static ExecutableImage getExecutableImage(Path root) { - if (Files.exists(root.resolve("bin").resolve(getJavaProcessName()))) { + Path binDir = root.resolve("bin"); + if (Files.exists(binDir.resolve("java")) || + Files.exists(binDir.resolve("java.exe"))) { return new DefaultExecutableImage(root, retrieveModules(root)); } return null; diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PathResourcePoolEntry.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PathResourcePoolEntry.java index 7b7cba3575e..e7c0c87a5ff 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PathResourcePoolEntry.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PathResourcePoolEntry.java @@ -5,7 +5,7 @@ * 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 "Classfile" exception as provided + * 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 diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java index 514d1b7528e..115020953f3 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java @@ -24,14 +24,19 @@ */ package jdk.tools.jlink.internal.plugins; +import java.io.File; +import java.io.IOException; import java.lang.invoke.MethodType; -import java.util.Arrays; +import java.nio.file.Files; +import java.util.ArrayList; import java.util.EnumSet; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.stream.Collectors; +import java.util.stream.Stream; import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.JavaLangInvokeAccess; import jdk.tools.jlink.plugin.ResourcePoolEntry; @@ -47,12 +52,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String NAME = "generate-jli-classes"; - private static final String BMH_PARAM = "bmh"; - private static final String BMH_SPECIES_PARAM = "bmh-species"; - private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME); - private static final String DMH_PARAM = "dmh"; private static final String DIRECT_HOLDER = "java/lang/invoke/DirectMethodHandle$Holder"; private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual"; private static final String DMH_INVOKE_STATIC = "invokeStatic"; @@ -61,8 +62,6 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String DMH_INVOKE_INTERFACE = "invokeInterface"; private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit"; - private static final String INVOKERS_PARAM = "invokers"; - private static final String DELEGATING_HOLDER = "java/lang/invoke/DelegatingMethodHandle$Holder"; private static final String BASIC_FORMS_HOLDER = "java/lang/invoke/LambdaForm$Holder"; private static final String INVOKERS_HOLDER = "java/lang/invoke/Invokers$Holder"; @@ -70,12 +69,11 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess(); - List speciesTypes; + Set speciesTypes; - List invokerTypes; - - Map> dmhMethods; + Set invokerTypes; + Map> dmhMethods; public GenerateJLIClassesPlugin() { } @@ -112,8 +110,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { * A better long-term solution is to define and run a set of quick * generators and extracting this list as a step in the build process. */ - public static List defaultSpecies() { - return List.of("LL", "L3", "L4", "L5", "L6", "L7", "L7I", + public static Set defaultSpecies() { + return Set.of("LL", "L3", "L4", "L5", "L6", "L7", "L7I", "L7II", "L7IIL", "L8", "L9", "L10", "L10I", "L10II", "L10IIL", "L11", "L12", "L13", "LI", "D", "L3I", "LIL", "LLI", "LLIL", "LILL", "I", "LLILL"); @@ -122,26 +120,27 @@ public final class GenerateJLIClassesPlugin implements Plugin { /** * @return the default invoker forms to generate. */ - public static List defaultInvokers() { - return List.of("_L", "_I", "I_I", "LI_I", "ILL_I", "LIL_I", "L_L", "LL_V", "LLLL_L"); + private static Set defaultInvokers() { + return Set.of("LL_L", "LL_I", "LILL_I", "L6_L"); } /** * @return the list of default DirectMethodHandle methods to generate. */ - public static Map> defaultDMHMethods() { + private static Map> defaultDMHMethods() { return Map.of( - DMH_INVOKE_VIRTUAL, List.of("_L", "L_L", "LI_I", "LL_V"), - DMH_INVOKE_SPECIAL, List.of("L_I", "L_L", "LF_L", "LD_L", "LL_L", - "L3_L", "L4_L", "L5_L", "L6_L", "L7_L", "LI_I", "LI_L", "LIL_I", - "LII_I", "LII_L", "LLI_L", "LLI_I", "LILI_I", "LIIL_L", - "LIILL_L", "LIILL_I", "LIIL_I", "LILIL_I", "LILILL_I", - "LILII_I", "LI3_I", "LI3L_I", "LI3LL_I", "LI3_L", "LI4_I"), - DMH_INVOKE_STATIC, List.of("II_I", "IL_I", "ILIL_I", "ILII_I", - "_I", "_L", "_V", "D_L", "F_L", "I_I", "II_L", "LI_L", - "L_V", "L_L", "LL_L", "L3_L", "L4_L", "L5_L", "L6_L", - "L7_L", "L8_L", "L9_L", "L9I_L", "L9II_L", "L9IIL_L", - "L10_L", "L11_L", "L12_L", "L13_L", "L13I_L", "L13II_L") + DMH_INVOKE_VIRTUAL, Set.of("L_L", "LL_L", "LLI_I", "L3_V"), + DMH_INVOKE_SPECIAL, Set.of("LL_I", "LL_L", "LLF_L", "LLD_L", "L3_L", + "L4_L", "L5_L", "L6_L", "L7_L", "L8_L", "LLI_I", "LLI_L", + "LLIL_I", "LLII_I", "LLII_L", "L3I_L", "L3I_I", "LLILI_I", + "LLIIL_L", "LLIILL_L", "LLIILL_I", "LLIIL_I", "LLILIL_I", + "LLILILL_I", "LLILII_I", "LLI3_I", "LLI3L_I", "LLI3LL_I", + "LLI3_L", "LLI4_I"), + DMH_INVOKE_STATIC, Set.of("LII_I", "LIL_I", "LILIL_I", "LILII_I", + "L_I", "L_L", "L_V", "LD_L", "LF_L", "LI_I", "LII_L", "LLI_L", + "LL_V", "LL_L", "L3_L", "L4_L", "L5_L", "L6_L", "L7_L", + "L8_L", "L9_L", "L10_L", "L10I_L", "L10II_L", "L10IIL_L", + "L11_L", "L12_L", "L13_L", "L14_L", "L14I_L", "L14II_L") ); } @@ -160,92 +159,108 @@ public final class GenerateJLIClassesPlugin implements Plugin { public void configure(Map config) { String mainArgument = config.get(NAME); - // Enable by default - boolean bmhEnabled = true; - boolean dmhEnabled = true; - boolean invokersEnabled = true; - if (mainArgument != null) { - List args = Arrays.asList(mainArgument.split(",")); - if (!args.contains(BMH_PARAM)) { - bmhEnabled = false; - } - if (!args.contains(DMH_PARAM)) { - dmhEnabled = false; - } - if (!args.contains(INVOKERS_PARAM)) { - dmhEnabled = false; - } - } - - if (!bmhEnabled) { - speciesTypes = List.of(); - } else { - String args = config.get(BMH_SPECIES_PARAM); - List bmhSpecies; - if (args != null && !args.isEmpty()) { - bmhSpecies = Arrays.stream(args.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .collect(Collectors.toList()); - } else { - bmhSpecies = defaultSpecies(); - } - - // Expand BMH species signatures - speciesTypes = bmhSpecies.stream() - .map(type -> expandSignature(type)) - .collect(Collectors.toList()); - } - - if (!invokersEnabled) { - invokerTypes = List.of(); - } else { - String args = config.get(INVOKERS_PARAM); - if (args != null && !args.isEmpty()) { - invokerTypes = Arrays.stream(args.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .collect(Collectors.toList()); - validateMethodTypes(invokerTypes); - } else { - invokerTypes = defaultInvokers(); - } - - } - // DirectMethodHandles - if (!dmhEnabled) { + if ("none".equals(mainArgument)) { + speciesTypes = Set.of(); + invokerTypes = Set.of(); dmhMethods = Map.of(); + return; + } + + // Start with the default configuration + Set defaultBMHSpecies = defaultSpecies(); + // Expand BMH species signatures + defaultBMHSpecies = defaultBMHSpecies.stream() + .map(type -> expandSignature(type)) + .collect(Collectors.toSet()); + + Set defaultInvokerTypes = defaultInvokers(); + validateMethodTypes(defaultInvokerTypes); + + Map> defaultDmhMethods = defaultDMHMethods(); + for (Set dmhMethodTypes : defaultDmhMethods.values()) { + validateMethodTypes(dmhMethodTypes); + } + + // Extend the default configuration with the contents in the supplied + // input file + if (mainArgument == null || !mainArgument.startsWith("@")) { + speciesTypes = defaultBMHSpecies; + invokerTypes = defaultInvokerTypes; + dmhMethods = defaultDmhMethods; } else { - dmhMethods = new HashMap<>(); - for (String dmhParam : DMH_METHOD_TYPE_MAP.keySet()) { - String args = config.get(dmhParam); - if (args != null && !args.isEmpty()) { - List dmhMethodTypes = Arrays.stream(args.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .collect(Collectors.toList()); - dmhMethods.put(dmhParam, dmhMethodTypes); - validateMethodTypes(dmhMethodTypes); + File file = new File(mainArgument.substring(1)); + if (file.exists()) { + // Use TreeSet/TreeMap to keep things sorted in a deterministic + // order to avoid scrambling the layout on small changes and to + // ease finding methods in the generated code + speciesTypes = new TreeSet<>(defaultBMHSpecies); + invokerTypes = new TreeSet<>(defaultInvokerTypes); + dmhMethods = new TreeMap<>(); + for (Map.Entry> entry : defaultDmhMethods.entrySet()) { + dmhMethods.put(entry.getKey(), new TreeSet<>(entry.getValue())); } - } - if (dmhMethods.isEmpty()) { - dmhMethods = defaultDMHMethods(); + fileLines(file) + .map(line -> line.split(" ")) + .forEach(parts -> { + switch (parts[0]) { + case "[BMH_RESOLVE]": + speciesTypes.add(expandSignature(parts[1])); + break; + case "[LF_RESOLVE]": + String methodType = parts[3]; + validateMethodType(methodType); + if (parts[1].contains("Invokers")) { + invokerTypes.add(methodType); + } else if (parts[1].contains("DirectMethodHandle")) { + String dmh = parts[2]; + // ignore getObject etc for now (generated + // by default) + if (DMH_METHOD_TYPE_MAP.containsKey(dmh)) { + addDMHMethodType(dmh, methodType); + } + } + break; + default: break; // ignore + } + }); } } } - void validateMethodTypes(List dmhMethodTypes) { - for (String type : dmhMethodTypes) { - String[] typeParts = type.split("_"); - // check return type (second part) - if (typeParts.length != 2 || typeParts[1].length() != 1 - || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) { - throw new PluginException( - "Method type signature must be of form [LJIFD]*_[LJIFDV]"); - } - // expand and check arguments (first part) - expandSignature(typeParts[0]); + private void addDMHMethodType(String dmh, String methodType) { + validateMethodType(methodType); + Set methodTypes = dmhMethods.get(dmh); + if (methodTypes == null) { + methodTypes = new TreeSet<>(); + dmhMethods.put(dmh, methodTypes); } + methodTypes.add(methodType); + } + + private Stream fileLines(File file) { + try { + return Files.lines(file.toPath()); + } catch (IOException io) { + throw new PluginException("Couldn't read file"); + } + } + + private void validateMethodTypes(Set dmhMethodTypes) { + for (String type : dmhMethodTypes) { + validateMethodType(type); + } + } + + private void validateMethodType(String type) { + String[] typeParts = type.split("_"); + // check return type (second part) + if (typeParts.length != 2 || typeParts[1].length() != 1 + || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) { + throw new PluginException( + "Method type signature must be of form [LJIFD]*_[LJIFDV]"); + } + // expand and check arguments (first part) + expandSignature(typeParts[0]); } private static void requireBasicType(char c) { @@ -295,23 +310,44 @@ public final class GenerateJLIClassesPlugin implements Plugin { private void generateHolderClasses(ResourcePoolBuilder out) { int count = 0; - for (List entry : dmhMethods.values()) { + for (Set entry : dmhMethods.values()) { count += entry.size(); } MethodType[] directMethodTypes = new MethodType[count]; int[] dmhTypes = new int[count]; int index = 0; - for (Map.Entry> entry : dmhMethods.entrySet()) { + for (Map.Entry> entry : dmhMethods.entrySet()) { String dmhType = entry.getKey(); for (String type : entry.getValue()) { - directMethodTypes[index] = asMethodType(type); + // The DMH type to actually ask for is retrieved by removing + // the first argument, which needs to be of Object.class + MethodType mt = asMethodType(type); + if (mt.parameterCount() < 1 || + mt.parameterType(0) != Object.class) { + throw new PluginException( + "DMH type parameter must start with L"); + } + directMethodTypes[index] = mt.dropParameterTypes(0, 1); dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType); index++; } } MethodType[] invokerMethodTypes = new MethodType[this.invokerTypes.size()]; - for (int i = 0; i < invokerTypes.size(); i++) { - invokerMethodTypes[i] = asMethodType(invokerTypes.get(i)); + int i = 0; + for (String invokerType : invokerTypes) { + // The invoker type to ask for is retrieved by removing the first + // and the last argument, which needs to be of Object.class + MethodType mt = asMethodType(invokerType); + final int lastParam = mt.parameterCount() - 1; + if (mt.parameterCount() < 2 || + mt.parameterType(0) != Object.class || + mt.parameterType(lastParam) != Object.class) { + throw new PluginException( + "Invoker type parameter must start and end with L"); + } + mt = mt.dropParameterTypes(lastParam, lastParam + 1); + invokerMethodTypes[i] = mt.dropParameterTypes(0, 1); + i++; } try { byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes( diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties index 6fa0248531f..309187dc2d7 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties @@ -68,10 +68,12 @@ exclude-resources.argument= resources to exclude exclude-resources.description=\ Specify resources to exclude. e.g.: **.jcov,glob:**/META-INF/** -generate-jli-classes.argument= +generate-jli-classes.argument= generate-jli-classes.description=\ -Concrete java.lang.invoke classes to generate +Takes a file hinting to jlink what java.lang.invoke classes to pre-generate. If\n\ +this flag is not specified a default set of classes will be generated. To \n\ +disable pre-generation specify none as the argument installed-modules.description=Fast loading of module descriptors (always enabled) diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index 2165bef4aba..38f2392ea0f 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -213,8 +213,6 @@ java/rmi/transport/dgcDeadLock/DGCDeadLock.java 8029360 macosx-a sun/security/pkcs11/ec/TestKeyFactory.java 8026976 generic-all -sun/security/krb5/auto/Unreachable.java 7164518 macosx-all - sun/security/tools/keytool/ListKeychainStore.sh 8156889 macosx-all sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java 8026393 generic-all diff --git a/jdk/test/java/lang/ProcessBuilder/Zombies.java b/jdk/test/java/lang/ProcessBuilder/Zombies.java index 30f296cc513..10c804ee1d4 100644 --- a/jdk/test/java/lang/ProcessBuilder/Zombies.java +++ b/jdk/test/java/lang/ProcessBuilder/Zombies.java @@ -25,7 +25,6 @@ * @test * @run main/othervm Zombies * @bug 6474073 6180151 - * @key intermittent * @summary Make sure zombies don't get created on Unix * @author Martin Buchholz */ diff --git a/jdk/test/java/net/HttpCookie/CookieNegativeMaxAge.java b/jdk/test/java/net/HttpCookie/CookieNegativeMaxAge.java new file mode 100644 index 00000000000..aae65f4f625 --- /dev/null +++ b/jdk/test/java/net/HttpCookie/CookieNegativeMaxAge.java @@ -0,0 +1,56 @@ +/* + * 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 8005068 + * @summary Check that any negative maxAge is treated as "unspecified" and + * if header contains cookie with "expires" attribute in the past then cookie + * is created with maxAge=0 meaning it is specified to be immediately expired. + * @run main CookieNegativeMaxAge + */ + + +import java.net.HttpCookie; +import java.util.List; + +public class CookieNegativeMaxAge { + + public static void main(String... args) { + HttpCookie cookie = new HttpCookie("testCookie", "value"); + cookie.setMaxAge(Integer.MIN_VALUE); + if (cookie.hasExpired()) { + throw new RuntimeException("Cookie has unexpectedly expired"); + } + + List cookies = HttpCookie.parse("Set-Cookie: " + + "expiredCookie=value; expires=Thu, 01 Jan 1970 00:00:00 GMT"); + if (cookies.size() == 1) { + if (cookies.get(0).getMaxAge() != 0) { + throw new RuntimeException("Cookie maxAge expected to be 0"); + } + } else { + throw new RuntimeException("Header was incorrectly parsed"); + } + } +} diff --git a/jdk/test/java/net/URLPermission/nstest/lookup.sh b/jdk/test/java/net/URLPermission/nstest/lookup.sh index 89798669f53..798e1c168f6 100644 --- a/jdk/test/java/net/URLPermission/nstest/lookup.sh +++ b/jdk/test/java/net/URLPermission/nstest/lookup.sh @@ -27,6 +27,7 @@ # @build jdk.testlibrary.* # @compile -XDignore.symbol.file=true LookupTest.java # @run shell/timeout=50 lookup.sh +# @key intermittent # OS=`uname -s` diff --git a/jdk/test/java/net/httpclient/ProxyAuthTest.java b/jdk/test/java/net/httpclient/ProxyAuthTest.java new file mode 100644 index 00000000000..42bc0c709db --- /dev/null +++ b/jdk/test/java/net/httpclient/ProxyAuthTest.java @@ -0,0 +1,174 @@ +/* + * 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 + */ + +/* + * @test + * @bug 8163561 + * @modules java.base/sun.net.www + * @summary Verify that Proxy-Authenticate header is correctly handled + * + * @run main/othervm ProxyAuthTest + */ + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.Authenticator; +import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; +import java.net.ProxySelector; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpResponse; +import java.util.Base64; + +import sun.net.www.MessageHeader; + +public class ProxyAuthTest { + private static final String AUTH_USER = "user"; + private static final String AUTH_PASSWORD = "password"; + + public static void main(String[] args) throws Exception { + try (ServerSocket ss = new ServerSocket(0)) { + int port = ss.getLocalPort(); + MyProxy proxy = new MyProxy(ss); + (new Thread(proxy)).start(); + System.out.println("Proxy listening port " + port); + + Auth auth = new Auth(); + InetSocketAddress paddr = new InetSocketAddress("localhost", port); + + URI uri = new URI("http://www.google.ie/"); + HttpClient client = HttpClient.create() + .proxy(ProxySelector.of(paddr)) + .authenticator(auth) + .build(); + HttpResponse resp = client.request(uri) + .GET() + .responseAsync() + .get(); + if (resp.statusCode() != 404) { + throw new RuntimeException("Unexpected status code: " + resp.statusCode()); + } + + if (auth.isCalled) { + System.out.println("Authenticator is called"); + } else { + throw new RuntimeException("Authenticator is not called"); + } + + if (!proxy.matched) { + throw new RuntimeException("Proxy authentication failed"); + } + } + } + + static class Auth extends Authenticator { + private volatile boolean isCalled; + + @Override + protected PasswordAuthentication getPasswordAuthentication() { + System.out.println("scheme: " + this.getRequestingScheme()); + isCalled = true; + return new PasswordAuthentication(AUTH_USER, + AUTH_PASSWORD.toCharArray()); + } + } + + static class MyProxy implements Runnable { + final ServerSocket ss; + private volatile boolean matched; + + MyProxy(ServerSocket ss) { + this.ss = ss; + } + + public void run() { + for (int i = 0; i < 2; i++) { + try (Socket s = ss.accept(); + InputStream in = s.getInputStream(); + OutputStream os = s.getOutputStream(); + BufferedWriter writer = new BufferedWriter( + new OutputStreamWriter(os)); + PrintWriter out = new PrintWriter(writer);) { + MessageHeader headers = new MessageHeader(in); + System.out.println("Proxy: received " + headers); + + String authInfo = headers + .findValue("Proxy-Authorization"); + if (authInfo != null) { + authenticate(authInfo); + out.print("HTTP/1.1 404 Not found\r\n"); + out.print("\r\n"); + System.out.println("Proxy: 404"); + out.flush(); + } else { + out.print("HTTP/1.1 407 Proxy Authorization Required\r\n"); + out.print( + "Proxy-Authenticate: Basic realm=\"a fake realm\"\r\n"); + out.print("\r\n"); + System.out.println("Proxy: Authorization required"); + out.flush(); + } + } catch (IOException x) { + System.err.println("Unexpected IOException from proxy."); + x.printStackTrace(); + break; + } + } + } + + private void authenticate(String authInfo) throws IOException { + try { + authInfo.trim(); + int ind = authInfo.indexOf(' '); + String recvdUserPlusPass = authInfo.substring(ind + 1).trim(); + // extract encoded username:passwd + String value = new String( + Base64.getMimeDecoder().decode(recvdUserPlusPass)); + String userPlusPassword = AUTH_USER + ":" + AUTH_PASSWORD; + if (userPlusPassword.equals(value)) { + matched = true; + System.out.println("Proxy: client authentication successful"); + } else { + System.err.println( + "Proxy: client authentication failed, expected [" + + userPlusPassword + "], actual [" + value + + "]"); + } + } catch (Exception e) { + throw new IOException( + "Proxy received invalid Proxy-Authorization value: " + + authInfo); + } + } + } + +} + diff --git a/jdk/test/java/nio/channels/FileChannel/Lock.java b/jdk/test/java/nio/channels/FileChannel/Lock.java index 87f470835e7..8dee478ea82 100644 --- a/jdk/test/java/nio/channels/FileChannel/Lock.java +++ b/jdk/test/java/nio/channels/FileChannel/Lock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -22,8 +22,8 @@ */ /* @test - * @bug 4429043 4493595 6332756 6709457 - * @summary The FileChannel file locking + * @bug 4429043 4493595 6332756 6709457 7146506 + * @summary Test FileChannel file locking */ import java.io.*; @@ -33,17 +33,14 @@ import static java.nio.file.StandardOpenOption.*; /** * Testing FileChannel's lock method. */ - public class Lock { public static void main(String[] args) throws Exception { - if (args.length > 0) { - if(args[0].equals("1")) { - MadWriter mw = new MadWriter(args[1], false); - } else { - MadWriter mw = new MadWriter(args[1], true); - } + if (args.length == 2) { + attemptLock(args[1], args[0].equals("2")); return; + } else if (args.length != 0) { + throw new RuntimeException("Wrong number of parameters."); } File blah = File.createTempFile("blah", null); blah.deleteOnExit(); @@ -56,120 +53,128 @@ public class Lock { test2(blah, false); test3(blah); test4(blah); - blah.delete(); - } - - private static void test2(File blah, boolean b) throws Exception { - RandomAccessFile raf = new RandomAccessFile(blah, "rw"); - FileChannel channel = raf.getChannel(); - FileLock lock; - if (b) - lock = channel.lock(); - else - lock = channel.tryLock(); - lock.release(); - channel.close(); } + /** + * Test mutual locking with other process + */ static void test1(File blah, String str) throws Exception { + try (RandomAccessFile fis = new RandomAccessFile(blah, "rw")) { + FileChannel fc = fis.getChannel(); + FileLock lock = null; - // Grab the lock - RandomAccessFile fis = new RandomAccessFile(blah, "rw"); - FileChannel fc = fis.getChannel(); - FileLock lock = null; - - if (str.equals("1")) { - lock = fc.lock(0, 10, false); - if (lock == null) - throw new RuntimeException("Lock should not return null"); - try { - FileLock lock2 = fc.lock(5, 10, false); - throw new RuntimeException("Overlapping locks allowed"); - } catch (OverlappingFileLockException e) { - // Correct result + // grab the lock + if (str.equals("1")) { + lock = fc.lock(0, 10, false); + if (lock == null) + throw new RuntimeException("Lock should not return null"); + try { + fc.lock(5, 10, false); + throw new RuntimeException("Overlapping locks allowed"); + } catch (OverlappingFileLockException e) {} // correct result } - } - // Exec the tamperer - String command = System.getProperty("java.home") + - File.separator + "bin" + File.separator + "java"; - String testClasses = System.getProperty("test.classes"); - if (testClasses != null) - command += " -cp " + testClasses; - command += " Lock " + str + " " + blah; - Process p = Runtime.getRuntime().exec(command); + // execute the tamperer + String command = System.getProperty("java.home") + + File.separator + "bin" + File.separator + "java"; + String testClasses = System.getProperty("test.classes"); + if (testClasses != null) + command += " -cp " + testClasses; + command += " Lock " + str + " " + blah; + Process p = Runtime.getRuntime().exec(command); - BufferedReader in = new BufferedReader - (new InputStreamReader(p.getInputStream())); - - String s; - int count = 0; - while ((s = in.readLine()) != null) { - if (!s.equals("good")) { - if (File.separatorChar == '/') { - // Fails on windows over NFS... - throw new RuntimeException("Failed: "+s); + // evaluate System.out of child process + String s; + boolean hasOutput = false; + InputStreamReader isr; + isr = new InputStreamReader(p.getInputStream()); + BufferedReader br = new BufferedReader(isr); + while ((s = br.readLine()) != null) { + // only throw on Unix as windows over NFS fails... + if ((File.separatorChar == '/') && !s.equals("good")) { + throw new RuntimeException("Failed: " + s); } + hasOutput = true; } - count++; - } - if (count == 0) { - in = new BufferedReader(new InputStreamReader(p.getErrorStream())); - while ((s = in.readLine()) != null) { - System.err.println("Error output: " + s); + // evaluate System.err in case of System.out of child process + // was empty + if (!hasOutput) { + isr = new InputStreamReader(p.getErrorStream()); + br = new BufferedReader(isr); + if ((s = br.readLine()) != null) { + System.err.println("Error output:"); + System.err.println(s); + while ((s = br.readLine()) != null) { + System.err.println(s); + } + } + throw new RuntimeException("Failed, no output"); } - throw new RuntimeException("Failed, no output"); - } - // Clean up - if (lock != null) { - /* Check multiple releases */ - lock.release(); - lock.release(); + // clean up, check multiple releases + if (lock != null) { + lock.release(); + lock.release(); + } } - fc.close(); - fis.close(); } - // The overlap check for file locks should be JVM-wide - private static void test3(File blah) throws Exception { - FileChannel fc1 = new RandomAccessFile(blah, "rw").getChannel(); - FileChannel fc2 = new RandomAccessFile(blah, "rw").getChannel(); - - // lock via one channel, and then attempt to lock the same file - // using a second channel - FileLock fl1 = fc1.lock(); - try { - fc2.tryLock(); - throw new RuntimeException("Overlapping locks allowed"); - } catch (OverlappingFileLockException x) { + /** + * Basic test for FileChannel.lock() and FileChannel.tryLock() + */ + static void test2(File blah, boolean b) throws Exception { + try (RandomAccessFile raf = new RandomAccessFile(blah, "rw")) { + FileChannel channel = raf.getChannel(); + FileLock lock; + if (b) + lock = channel.lock(); + else + lock = channel.tryLock(); + lock.release(); } - try { + } + + /** + * Test that overlapping file locking is not possible when using different + * FileChannel objects to the same file path + */ + static void test3(File blah) throws Exception { + try (RandomAccessFile raf1 = new RandomAccessFile(blah, "rw"); + RandomAccessFile raf2 = new RandomAccessFile(blah, "rw")) + { + FileChannel fc1 = raf1.getChannel(); + FileChannel fc2 = raf2.getChannel(); + + // lock via one channel, and then attempt to lock the same file + // using a second channel + FileLock fl1 = fc1.lock(); + try { + fc2.tryLock(); + throw new RuntimeException("Overlapping locks allowed"); + } catch (OverlappingFileLockException x) {} + try { + fc2.lock(); + throw new RuntimeException("Overlapping locks allowed"); + } catch (OverlappingFileLockException x) {} + + // release lock and the attempt to lock with the second channel + // should succeed. + fl1.release(); fc2.lock(); - throw new RuntimeException("Overlapping locks allowed"); - } catch (OverlappingFileLockException x) { + try { + fc1.lock(); + throw new RuntimeException("Overlapping locks allowed"); + } catch (OverlappingFileLockException x) {} } - - // release lock and the attempt to lock with the second channel - // should succeed. - fl1.release(); - FileLock fl2 = fc2.lock(); - try { - fc1.lock(); - throw new RuntimeException("Overlapping locks allowed"); - } catch (OverlappingFileLockException x) { - } - - fc1.close(); - fc2.close(); } /** * Test file locking when file is opened for append */ static void test4(File blah) throws Exception { - try (FileChannel fc = new FileOutputStream(blah, true).getChannel()) { + try (FileOutputStream fos = new FileOutputStream(blah, true)) { + FileChannel fc = fos.getChannel(); fc.tryLock().release(); fc.tryLock(0L, 1L, false).release(); fc.lock().release(); @@ -182,30 +187,31 @@ public class Lock { fc.lock(0L, 1L, false).release(); } } -} -class MadWriter { - public MadWriter(String s, boolean b) throws Exception { - File f = new File(s); - RandomAccessFile fos = new RandomAccessFile(f, "rw"); - FileChannel fc = fos.getChannel(); - if (fc.tryLock(10, 10, false) == null) { - System.out.println("bad: Failed to grab adjacent lock"); + /** + * Utility method to be run in secondary process which tries to acquire a + * lock on a FileChannel + */ + static void attemptLock(String fileName, + boolean expectsLock) throws Exception + { + File f = new File(fileName); + try (RandomAccessFile raf = new RandomAccessFile(f, "rw")) { + FileChannel fc = raf.getChannel(); + if (fc.tryLock(10, 10, false) == null) { + System.out.println("bad: Failed to grab adjacent lock"); + } + if (fc.tryLock(0, 10, false) == null) { + if (expectsLock) + System.out.println("bad"); + else + System.out.println("good"); + } else { + if (expectsLock) + System.out.println("good"); + else + System.out.println("bad"); + } } - FileLock lock = fc.tryLock(0, 10, false); - if (lock == null) { - if (b) - System.out.println("bad"); - else - System.out.println("good"); - } else { - if (b) - System.out.println("good"); - else - System.out.println("bad"); - } - fc.close(); - fos.close(); } - } diff --git a/jdk/test/java/text/Bidi/BidiConformance.java b/jdk/test/java/text/Bidi/BidiConformance.java index 73689659cc3..45e49cb632f 100644 --- a/jdk/test/java/text/Bidi/BidiConformance.java +++ b/jdk/test/java/text/Bidi/BidiConformance.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, 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 @@ -25,6 +25,7 @@ * @test * @bug 6850113 8032446 * @summary confirm the behavior of new Bidi implementation. (Backward compatibility) + * @modules java.desktop */ import java.awt.font.NumericShaper; diff --git a/jdk/test/java/text/Bidi/BidiEmbeddingTest.java b/jdk/test/java/text/Bidi/BidiEmbeddingTest.java index 86578f4f1be..fb4d5f7418c 100644 --- a/jdk/test/java/text/Bidi/BidiEmbeddingTest.java +++ b/jdk/test/java/text/Bidi/BidiEmbeddingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 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 @@ -28,6 +28,7 @@ * indicate overrides, rather than using bit 7. Also tests Bidi without loading awt classes to * confirm that Bidi can be used without awt. Verify that embedding level 0 is properly mapped * to the base embedding level. + * @modules java.desktop */ import java.awt.Color; diff --git a/jdk/test/java/text/Bidi/Bug7042148.java b/jdk/test/java/text/Bidi/Bug7042148.java index 92c3001dde9..d905a49b746 100644 --- a/jdk/test/java/text/Bidi/Bug7042148.java +++ b/jdk/test/java/text/Bidi/Bug7042148.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 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 @@ -25,6 +25,7 @@ * @test * @bug 7042148 * @summary verify that Bidi.baseIsLeftToRight() returns the correct value even if an incorrect position is set in the given AttributedCharacterIterator. + * @modules java.desktop */ import java.awt.font.*; import java.text.*; diff --git a/jdk/test/java/text/Bidi/Bug7051769.java b/jdk/test/java/text/Bidi/Bug7051769.java index 9b1326021b5..a0737ec0afc 100644 --- a/jdk/test/java/text/Bidi/Bug7051769.java +++ b/jdk/test/java/text/Bidi/Bug7051769.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, 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 @@ -26,6 +26,7 @@ * @bug 7051769 8038092 * @summary verify that Bidi.toString() returns the corect result. * The second run is intended to test lazy SharedSectets init for 8038092 + * @modules java.desktop * @run main Bug7051769 * @run main/othervm -DpreloadBidi=true Bug7051769 */ diff --git a/jdk/test/java/text/BreakIterator/NewVSOld_th_TH.java b/jdk/test/java/text/BreakIterator/NewVSOld_th_TH.java index 467cbc574c3..4e114d75bf3 100644 --- a/jdk/test/java/text/BreakIterator/NewVSOld_th_TH.java +++ b/jdk/test/java/text/BreakIterator/NewVSOld_th_TH.java @@ -22,9 +22,10 @@ */ /* - @test - @summary test Comparison of New Collators against Old Collators in the en_US locale -*/ + * @test + * @summary test Comparison of New Collators against Old Collators in the en_US locale + * @modules jdk.localedata + */ import java.io.*; import java.util.Enumeration; diff --git a/jdk/test/java/text/Collator/APITest.java b/jdk/test/java/text/Collator/APITest.java index f2b0a019a29..43782c5ad90 100644 --- a/jdk/test/java/text/Collator/APITest.java +++ b/jdk/test/java/text/Collator/APITest.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test Collation API + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved diff --git a/jdk/test/java/text/Collator/CollationKeyTest.java b/jdk/test/java/text/Collator/CollationKeyTest.java index 9146bf97e9a..901a6347a57 100644 --- a/jdk/test/java/text/Collator/CollationKeyTest.java +++ b/jdk/test/java/text/Collator/CollationKeyTest.java @@ -29,6 +29,7 @@ * RuleBasedCollationKey. This test basically tests on the two features: * 1. Existing code using CollationKey works (backward compatiblility) * 2. CollationKey can be extended by its subclass. + * @modules jdk.localedata */ diff --git a/jdk/test/java/text/Collator/DanishTest.java b/jdk/test/java/text/Collator/DanishTest.java index b5194a83c2a..0c35d22e488 100644 --- a/jdk/test/java/text/Collator/DanishTest.java +++ b/jdk/test/java/text/Collator/DanishTest.java @@ -26,6 +26,7 @@ * @bug 4930708 4174436 5008498 * @library /java/text/testlib * @summary test Danish Collation + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved diff --git a/jdk/test/java/text/Collator/FinnishTest.java b/jdk/test/java/text/Collator/FinnishTest.java index 6df18ef0146..9efc3cd861d 100644 --- a/jdk/test/java/text/Collator/FinnishTest.java +++ b/jdk/test/java/text/Collator/FinnishTest.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test Finnish Collation + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved diff --git a/jdk/test/java/text/Collator/FrenchTest.java b/jdk/test/java/text/Collator/FrenchTest.java index 939ef322253..38492db023c 100644 --- a/jdk/test/java/text/Collator/FrenchTest.java +++ b/jdk/test/java/text/Collator/FrenchTest.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test French Collation + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved diff --git a/jdk/test/java/text/Collator/G7Test.java b/jdk/test/java/text/Collator/G7Test.java index 0b41566bd2e..f7bdfa4f868 100644 --- a/jdk/test/java/text/Collator/G7Test.java +++ b/jdk/test/java/text/Collator/G7Test.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test G7 Collation + * @modules jdk.localedata */ /* * diff --git a/jdk/test/java/text/Collator/JapaneseTest.java b/jdk/test/java/text/Collator/JapaneseTest.java index 2bd5f6d0179..7333da34b12 100644 --- a/jdk/test/java/text/Collator/JapaneseTest.java +++ b/jdk/test/java/text/Collator/JapaneseTest.java @@ -25,6 +25,7 @@ * @test 1.1 02/09/11 * @bug 4176141 4655819 * @summary Regression tests for Japanese Collation + * @modules jdk.localedata */ import java.text.*; diff --git a/jdk/test/java/text/Collator/KoreanTest.java b/jdk/test/java/text/Collator/KoreanTest.java index fd314ee13ed..fb3c5eae941 100644 --- a/jdk/test/java/text/Collator/KoreanTest.java +++ b/jdk/test/java/text/Collator/KoreanTest.java @@ -25,6 +25,7 @@ * @test 1.1 02/09/12 * @bug 4176141 4655819 * @summary Regression tests for Korean Collation + * @modules jdk.localedata */ import java.text.*; diff --git a/jdk/test/java/text/Collator/Regression.java b/jdk/test/java/text/Collator/Regression.java index 958ce29c524..212ab39d557 100644 --- a/jdk/test/java/text/Collator/Regression.java +++ b/jdk/test/java/text/Collator/Regression.java @@ -29,6 +29,7 @@ * 4133509 4139572 4141640 4179126 4179686 4244884 4663220 * @library /java/text/testlib * @summary Regression tests for Collation and associated classes + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved diff --git a/jdk/test/java/text/Collator/ThaiTest.java b/jdk/test/java/text/Collator/ThaiTest.java index 7d643446434..7a961ed5968 100644 --- a/jdk/test/java/text/Collator/ThaiTest.java +++ b/jdk/test/java/text/Collator/ThaiTest.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test Thai Collation + * @modules jdk.localedata */ /* * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. diff --git a/jdk/test/java/text/Collator/TurkishTest.java b/jdk/test/java/text/Collator/TurkishTest.java index f83ef228e06..d8c078abb4d 100644 --- a/jdk/test/java/text/Collator/TurkishTest.java +++ b/jdk/test/java/text/Collator/TurkishTest.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test Turkish Collation + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996 - All Rights Reserved diff --git a/jdk/test/java/text/Collator/VietnameseTest.java b/jdk/test/java/text/Collator/VietnameseTest.java index faa4921073c..6708622d096 100644 --- a/jdk/test/java/text/Collator/VietnameseTest.java +++ b/jdk/test/java/text/Collator/VietnameseTest.java @@ -26,6 +26,7 @@ * @bug 4932968 5015215 * @library /java/text/testlib * @summary test Vietnamese Collation + * @modules jdk.localedata */ /* diff --git a/jdk/test/java/text/Format/DateFormat/Bug4823811.java b/jdk/test/java/text/Format/DateFormat/Bug4823811.java index 524f790e1fb..c2d35e9f64f 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug4823811.java +++ b/jdk/test/java/text/Format/DateFormat/Bug4823811.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 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 @@ -25,6 +25,7 @@ * @test * @bug 4823811 8008577 * @summary Confirm that text which includes numbers with a trailing minus sign is parsed correctly. + * @modules jdk.localedata * @run main/othervm -Duser.timezone=GMT+09:00 -Djava.locale.providers=JRE,SPI Bug4823811 */ diff --git a/jdk/test/java/text/Format/DateFormat/Bug6683975.java b/jdk/test/java/text/Format/DateFormat/Bug6683975.java index e0c8cd75f15..1f401058e5a 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug6683975.java +++ b/jdk/test/java/text/Format/DateFormat/Bug6683975.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 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 @@ -25,6 +25,7 @@ * @test * @bug 6683975 8008577 * @summary Make sure that date is formatted correctlyin th locale. + * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=JRE,SPI Bug6683975 */ import java.text.*; diff --git a/jdk/test/java/text/Format/DateFormat/Bug8139572.java b/jdk/test/java/text/Format/DateFormat/Bug8139572.java index d55196b3a23..13154c836c5 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug8139572.java +++ b/jdk/test/java/text/Format/DateFormat/Bug8139572.java @@ -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 8139572 * @summary SimpleDateFormat parse month stand-alone format bug * @compile -encoding utf-8 Bug8139572.java + * @modules jdk.localedata * @run main Bug8139572 */ import java.text.ParseException; diff --git a/jdk/test/java/text/Format/DateFormat/ContextMonthNamesTest.java b/jdk/test/java/text/Format/DateFormat/ContextMonthNamesTest.java index 6f38bfb15c1..60632b0fcce 100644 --- a/jdk/test/java/text/Format/DateFormat/ContextMonthNamesTest.java +++ b/jdk/test/java/text/Format/DateFormat/ContextMonthNamesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -25,6 +25,7 @@ * @test * @bug 7079560 8008577 * @summary Unit test for context-sensitive month names + * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=JRE,SPI ContextMonthNamesTest */ diff --git a/jdk/test/java/text/Format/DateFormat/DateFormatTest.java b/jdk/test/java/text/Format/DateFormat/DateFormatTest.java index c4f148f3d77..7384a82af0c 100644 --- a/jdk/test/java/text/Format/DateFormat/DateFormatTest.java +++ b/jdk/test/java/text/Format/DateFormat/DateFormatTest.java @@ -26,6 +26,7 @@ * @bug 4052223 4089987 4469904 4326988 4486735 8008577 8045998 8140571 * @summary test DateFormat and SimpleDateFormat. * @library /java/text/testlib + * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=COMPAT,SPI DateFormatTest */ diff --git a/jdk/test/java/text/Format/DateFormat/LocaleDateFormats.java b/jdk/test/java/text/Format/DateFormat/LocaleDateFormats.java index bff177ff7e4..9241e59c3bd 100644 --- a/jdk/test/java/text/Format/DateFormat/LocaleDateFormats.java +++ b/jdk/test/java/text/Format/DateFormat/LocaleDateFormats.java @@ -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 @@ -24,6 +24,7 @@ /** * @test * @bug 8080774 + * @modules jdk.localedata * @run testng/othervm -Djava.locale.providers=JRE,CLDR LocaleDateFormats * @summary This file contains tests for JRE locales date formats */ diff --git a/jdk/test/java/text/Format/DateFormat/NonGregorianFormatTest.java b/jdk/test/java/text/Format/DateFormat/NonGregorianFormatTest.java index 69808d47645..b811900901d 100644 --- a/jdk/test/java/text/Format/DateFormat/NonGregorianFormatTest.java +++ b/jdk/test/java/text/Format/DateFormat/NonGregorianFormatTest.java @@ -25,6 +25,7 @@ * @test * @bug 4833268 6253991 8008577 * @summary Test formatting and parsing with non-Gregorian calendars + * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=COMPAT,SPI NonGregorianFormatTest */ diff --git a/jdk/test/java/text/Format/DateFormat/bug4117335.java b/jdk/test/java/text/Format/DateFormat/bug4117335.java index 6c9af2a4716..d9b59eda005 100644 --- a/jdk/test/java/text/Format/DateFormat/bug4117335.java +++ b/jdk/test/java/text/Format/DateFormat/bug4117335.java @@ -25,6 +25,7 @@ * @test * * @bug 4117335 4432617 + * @modules jdk.localedata */ import java.text.DateFormatSymbols ; diff --git a/jdk/test/java/text/Format/MessageFormat/LargeMessageFormat.java b/jdk/test/java/text/Format/MessageFormat/LargeMessageFormat.java index 1a4ca1d092d..55c9869c373 100644 --- a/jdk/test/java/text/Format/MessageFormat/LargeMessageFormat.java +++ b/jdk/test/java/text/Format/MessageFormat/LargeMessageFormat.java @@ -25,6 +25,7 @@ * @test * @bug 4112090 8008577 * @summary verify that MessageFormat can handle large numbers of arguments + * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=COMPAT,SPI LargeMessageFormat */ diff --git a/jdk/test/java/text/Format/NumberFormat/Bug8132125.java b/jdk/test/java/text/Format/NumberFormat/Bug8132125.java index e19b2cd17eb..9f713324a21 100644 --- a/jdk/test/java/text/Format/NumberFormat/Bug8132125.java +++ b/jdk/test/java/text/Format/NumberFormat/Bug8132125.java @@ -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 @@ -25,6 +25,7 @@ * @test * @bug 8132125 * @summary Checks Swiss' number elements + * @modules jdk.localedata */ import java.text.*; diff --git a/jdk/test/java/text/Format/NumberFormat/CurrencyFormat.java b/jdk/test/java/text/Format/NumberFormat/CurrencyFormat.java index 96fa3976701..44b53d25ec1 100644 --- a/jdk/test/java/text/Format/NumberFormat/CurrencyFormat.java +++ b/jdk/test/java/text/Format/NumberFormat/CurrencyFormat.java @@ -25,6 +25,7 @@ * @test * @bug 4290801 4942982 5102005 8008577 8021121 * @summary Basic tests for currency formatting. + * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=JRE,SPI CurrencyFormat */ diff --git a/jdk/test/java/text/Format/NumberFormat/IntlTestNumberFormatAPI.java b/jdk/test/java/text/Format/NumberFormat/IntlTestNumberFormatAPI.java index ab1069bdfc2..011db2bdea3 100644 --- a/jdk/test/java/text/Format/NumberFormat/IntlTestNumberFormatAPI.java +++ b/jdk/test/java/text/Format/NumberFormat/IntlTestNumberFormatAPI.java @@ -25,6 +25,7 @@ * @test * @library /java/text/testlib * @summary test International Number Format API + * @modules jdk.localedata */ /* (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved diff --git a/jdk/test/java/text/Format/NumberFormat/NumberRegression.java b/jdk/test/java/text/Format/NumberFormat/NumberRegression.java index 0edaa11ccf5..b194d270a5c 100644 --- a/jdk/test/java/text/Format/NumberFormat/NumberRegression.java +++ b/jdk/test/java/text/Format/NumberFormat/NumberRegression.java @@ -34,6 +34,7 @@ * @library /java/text/testlib * @build IntlTest HexDumpReader TestUtils * @modules java.base/sun.util.resources + * jdk.localedata * @compile -XDignore.symbol.file NumberRegression.java * @run main/othervm -Djava.locale.providers=COMPAT,SPI NumberRegression */ diff --git a/jdk/test/java/text/Format/NumberFormat/NumberTest.java b/jdk/test/java/text/Format/NumberFormat/NumberTest.java index ca519bb6dab..cf64a431a55 100644 --- a/jdk/test/java/text/Format/NumberFormat/NumberTest.java +++ b/jdk/test/java/text/Format/NumberFormat/NumberTest.java @@ -27,6 +27,7 @@ * @summary test NumberFormat * @library /java/text/testlib * @modules java.base/sun.util.resources + * jdk.localedata * @compile -XDignore.symbol.file NumberTest.java * @run main/othervm -Djava.locale.providers=COMPAT,SPI NumberTest */ diff --git a/jdk/test/javax/crypto/CryptoPermissions/TestUnlimited.java b/jdk/test/javax/crypto/CryptoPermissions/TestUnlimited.java new file mode 100644 index 00000000000..e6a8f7f37cc --- /dev/null +++ b/jdk/test/javax/crypto/CryptoPermissions/TestUnlimited.java @@ -0,0 +1,96 @@ +/* + * 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. + */ + +/** + * @test + * @bug 8061842 + * @summary Package jurisdiction policy files as something other than JAR + * @run main/othervm TestUnlimited "" exception + * @run main/othervm TestUnlimited limited fail + * @run main/othervm TestUnlimited unlimited pass + * @run main/othervm TestUnlimited unlimited/ pass + * @run main/othervm TestUnlimited NosuchDir exception + * @run main/othervm TestUnlimited . exception + * @run main/othervm TestUnlimited /tmp/unlimited exception + * @run main/othervm TestUnlimited ../policy/unlimited exception + * @run main/othervm TestUnlimited ./unlimited exception + * @run main/othervm TestUnlimited /unlimited exception + */ +import javax.crypto.*; +import java.security.Security; + +public class TestUnlimited { + + public static void main(String[] args) throws Exception { + /* + * Override the Security property to allow for unlimited policy. + * Would need appropriate permissions if Security Manager were + * active. + */ + if (args.length != 2) { + throw new Exception("Two args required"); + } + + boolean expected = args[1].equals("pass"); + boolean exception = args[1].equals("exception"); + boolean result = false; + + System.out.println("Testing: " + args[0]); + + if (args[0].equals("\"\"")) { + Security.setProperty("crypto.policy", ""); + } else { + Security.setProperty("crypto.policy", args[0]); + } + + /* + * Use the AES as the test Cipher + * If there is an error initializing, we will never get past here. + */ + try { + int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES"); + System.out.println("max AES key len:" + maxKeyLen); + if (maxKeyLen > 128) { + System.out.println("Unlimited policy is active"); + result = true; + } else { + System.out.println("Unlimited policy is NOT active"); + result = false; + } + } catch (Throwable e) { + if (!exception) { + throw new Exception(); + } + } + + System.out.println( + "Expected:\t" + expected + "\nResult:\t\t" + result); + if (expected != result) { + throw new Exception(); + } + + System.out.println("DONE!"); + } +} diff --git a/jdk/test/jdk/security/JavaDotSecurity/final_java_security b/jdk/test/jdk/security/JavaDotSecurity/final_java_security index cd39bea3560..f5d9c68933c 100644 --- a/jdk/test/jdk/security/JavaDotSecurity/final_java_security +++ b/jdk/test/jdk/security/JavaDotSecurity/final_java_security @@ -10,6 +10,7 @@ foo.5=8 foo.6=9a foo.7=10 foo.8=12 +crypto.policy=somepolicy package.access=sun.,\ solaris.,\ diff --git a/jdk/test/jdk/security/JavaDotSecurity/ifdefs.sh b/jdk/test/jdk/security/JavaDotSecurity/ifdefs.sh index aa1371f71cb..5dc58345fc3 100644 --- a/jdk/test/jdk/security/JavaDotSecurity/ifdefs.sh +++ b/jdk/test/jdk/security/JavaDotSecurity/ifdefs.sh @@ -46,7 +46,13 @@ if [ ! -f $TOOLSRC ]; then fi $JAVAC -d . $TOOLSRC -$JAVA $TOOLNAME $TESTSRC/raw_java_security outfile solaris sparc $TESTSRC/more_restricted +$JAVA $TOOLNAME \ + $TESTSRC/raw_java_security \ + outfile \ + solaris \ + sparc \ + somepolicy \ + $TESTSRC/more_restricted # On Windows, line end could be different. -b is a cross-platform option. -diff -b outfile $TESTSRC/final_java_security \ No newline at end of file +diff -b outfile $TESTSRC/final_java_security diff --git a/jdk/test/jdk/security/JavaDotSecurity/raw_java_security b/jdk/test/jdk/security/JavaDotSecurity/raw_java_security index 8a8a7d3cdde..9aa3c42e668 100644 --- a/jdk/test/jdk/security/JavaDotSecurity/raw_java_security +++ b/jdk/test/jdk/security/JavaDotSecurity/raw_java_security @@ -44,6 +44,7 @@ foo.tbd=11 #ifndef macosx-x64 foo.tbd=12 #endif +crypto.policy=crypto.policydir-tbd package.access=sun.,\ #ifdef solaris diff --git a/jdk/test/sun/security/krb5/auto/Unreachable.java b/jdk/test/sun/security/krb5/auto/Unreachable.java index b010b54837e..fdc1aa2ee25 100644 --- a/jdk/test/sun/security/krb5/auto/Unreachable.java +++ b/jdk/test/sun/security/krb5/auto/Unreachable.java @@ -23,31 +23,108 @@ /* * @test - * @bug 7162687 + * @bug 7162687 8015595 * @key intermittent * @summary enhance KDC server availability detection * @compile -XDignore.symbol.file Unreachable.java - * @run main/othervm/timeout=10 Unreachable + * @run main/othervm Unreachable */ - -import java.io.File; +import java.net.PortUnreachableException; +import java.net.SocketTimeoutException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.Executors; import javax.security.auth.login.LoginException; import sun.security.krb5.Config; public class Unreachable { - public static void main(String[] args) throws Exception { - File f = new File( - System.getProperty("test.src", "."), "unreachable.krb5.conf"); - System.setProperty("java.security.krb5.conf", f.getPath()); - Config.refresh(); + // Wait for 20 second until unreachable KDC throws PortUnreachableException. + private static final int TIMEOUT = 20; + private static final String REALM = "RABBIT.HOLE"; + private static final String HOST = "127.0.0.1"; + private static final int PORT = 13434; + private static final String KRB_CONF = "unreachable.krb5.conf"; - // If PortUnreachableException is not received, the login will consume - // about 3*3*30 seconds and the test will timeout. + public static void main(String[] args) throws Exception { + + // - Only PortUnreachableException will allow to continue execution. + // - SocketTimeoutException may occur on Mac because it will not throw + // PortUnreachableException for unreachable port in which case the Test + // execution will be skipped. + // - For Reachable port, the Test execution will get skipped. + // - Any other Exception will be treated as Test failure. + if (!findPortUnreachableExc()) { + System.out.println(String.format("WARNING: Either a reachable " + + "connection found to %s:%s or SocketTimeoutException " + + "occured which means PortUnreachableException not thrown" + + " by the platform.", HOST, PORT)); + return; + } + KDC kdc = KDC.existing(REALM, HOST, PORT); + KDC.saveConfig(KRB_CONF, kdc); + ExecutorService executor = Executors.newSingleThreadExecutor(); + Future future = executor.submit(new Callable() { + @Override + public Exception call() { + System.setProperty("java.security.krb5.conf", KRB_CONF); + try { + Config.refresh(); + // If PortUnreachableException is not received, the login + // will consume about 3*3*30 seconds and the test will + // timeout. + try { + Context.fromUserPass("name", "pass".toCharArray(), true); + } catch (LoginException le) { + // This is OK + } + System.out.println("Execution successful."); + } catch (Exception e) { + return e; + } + return null; + } + }); try { - Context.fromUserPass("name", "pass".toCharArray(), true); - } catch (LoginException le) { - // This is OK + Exception ex = null; + if ((ex = future.get(TIMEOUT, TimeUnit.SECONDS)) != null) { + throw new RuntimeException(ex); + } + } catch (TimeoutException e) { + future.cancel(true); + throw new RuntimeException("PortUnreachableException not thrown."); + } finally { + executor.shutdownNow(); } } + + /** + * If the remote destination to which the socket is connected does not + * exist, or is otherwise unreachable, and if an ICMP destination unreachable + * packet has been received for that address, then a subsequent call to + * send or receive may throw a PortUnreachableException. Note, there is no + * guarantee that the exception will be thrown. + */ + private static boolean findPortUnreachableExc() throws Exception { + try { + InetSocketAddress iaddr = new InetSocketAddress(HOST, PORT); + DatagramSocket dgSocket = new DatagramSocket(); + dgSocket.setSoTimeout(5000); + dgSocket.connect(iaddr); + byte[] data = new byte[]{}; + dgSocket.send(new DatagramPacket(data, data.length, iaddr)); + dgSocket.receive(new DatagramPacket(data, data.length)); + } catch (PortUnreachableException e) { + return true; + } catch (SocketTimeoutException e) { + return false; + } + return false; + } } diff --git a/jdk/test/sun/security/krb5/auto/unreachable.krb5.conf b/jdk/test/sun/security/krb5/auto/unreachable.krb5.conf deleted file mode 100644 index 8ff4cc173aa..00000000000 --- a/jdk/test/sun/security/krb5/auto/unreachable.krb5.conf +++ /dev/null @@ -1,9 +0,0 @@ -[libdefaults] - default_realm = RABBIT.HOLE -[realms] - -RABBIT.HOLE = { - kdc = 127.0.0.1:13434 - kdc = 127.0.0.1:13435 - kdc = 127.0.0.1:13436 -} diff --git a/jdk/test/sun/security/provider/SecureRandom/AutoReseed.java b/jdk/test/sun/security/provider/SecureRandom/AutoReseed.java index 48361f225d5..0cdce177b1e 100644 --- a/jdk/test/sun/security/provider/SecureRandom/AutoReseed.java +++ b/jdk/test/sun/security/provider/SecureRandom/AutoReseed.java @@ -20,6 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + import java.security.SecureRandom; import java.security.Security; @@ -27,15 +28,15 @@ import java.security.Security; * @test * @bug 8051408 * @summary make sure nextBytes etc can be called before setSeed + * @run main/othervm -Djava.security.egd=file:/dev/urandom AutoReseed */ public class AutoReseed { public static void main(String[] args) throws Exception { SecureRandom sr; - String old = Security.getProperty("securerandom.drbg.config"); - try { - for (String mech : - new String[]{"Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + boolean pass = true; + for (String mech : new String[]{"Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) { + try { System.out.println("Testing " + mech + "..."); Security.setProperty("securerandom.drbg.config", mech); @@ -46,9 +47,13 @@ public class AutoReseed { sr.reseed(); sr = SecureRandom.getInstance("DRBG"); sr.generateSeed(10); + } catch (Exception e) { + pass = false; + e.printStackTrace(System.out); } - } finally { - Security.setProperty("securerandom.drbg.config", old); + } + if (!pass) { + throw new RuntimeException("At least one test case failed"); } } } diff --git a/jdk/test/sun/security/ssl/SSLSocketImpl/CloseSocket.java b/jdk/test/sun/security/ssl/SSLSocketImpl/CloseSocket.java index 4c532beb8ac..12bfb4ef001 100644 --- a/jdk/test/sun/security/ssl/SSLSocketImpl/CloseSocket.java +++ b/jdk/test/sun/security/ssl/SSLSocketImpl/CloseSocket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 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 @@ -26,67 +26,96 @@ * @bug 4674913 * @summary Verify that EOFException are correctly handled during the handshake * @author Andreas Sterbenz + * @run main/othervm CloseSocket */ -import java.io.*; -import java.net.*; - -import javax.net.ssl.*; +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; public class CloseSocket { - public static void main(String[] args) throws Exception { - final ServerSocket serverSocket = new ServerSocket(0); - int serverPort = serverSocket.getLocalPort(); - new Thread() { - public void run() { - try { - Socket s = serverSocket.accept(); - System.out.println("Server accepted connection"); - // wait a bit before closing the socket to give - // the client time to send its hello message - Thread.currentThread().sleep(100); - s.close(); - System.out.println("Server closed socket, done."); - } catch (Exception e) { - System.out.println("Server exception:"); - e.printStackTrace(); - } - } - }.start(); - SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault(); - SSLSocket socket = (SSLSocket)factory.createSocket("localhost", serverPort); - System.out.println("Client established TCP connection"); - boolean failed = false; - try { - System.out.println("Starting handshake..."); - socket.startHandshake(); - System.out.println("ERROR: no exception"); - failed = true; - } catch (IOException e) { - System.out.println("Failed as expected: " + e); - } - try { - System.out.println("Trying read..."); + private static ArrayList testCases = new ArrayList<>(); + + static { + testCases.add(socket -> socket.startHandshake()); + testCases.add(socket -> { InputStream in = socket.getInputStream(); - int b = in.read(); - System.out.println("ERROR: no exception, read: " + b); - failed = true; - } catch (IOException e) { - System.out.println("Failed as expected: " + e); - } - try { - System.out.println("Trying read..."); + in.read(); + }); + testCases.add(socket -> { OutputStream out = socket.getOutputStream(); out.write(43); - System.out.println("ERROR: no exception"); - failed = true; - } catch (IOException e) { - System.out.println("Failed as expected: " + e); - } - if (failed) { - throw new Exception("One or more tests failed"); + }); + } + + public static void main(String[] args) throws Exception { + try (Server server = new Server()) { + new Thread(server).start(); + + SocketFactory factory = SSLSocketFactory.getDefault(); + try (SSLSocket socket = (SSLSocket) factory.createSocket("localhost", + server.getPort())) { + socket.setSoTimeout(2000); + System.out.println("Client established TCP connection"); + boolean failed = false; + for (TestCase testCase : testCases) { + try { + testCase.test(socket); + System.out.println("ERROR: no exception"); + failed = true; + } catch (IOException e) { + System.out.println("Failed as expected: " + e); + } + } + if (failed) { + throw new Exception("One or more tests failed"); + } + } } } + static class Server implements AutoCloseable, Runnable { + + final ServerSocket serverSocket; + + Server() throws IOException { + serverSocket = new ServerSocket(0); + } + + public int getPort() { + return serverSocket.getLocalPort(); + } + + @Override + public void run() { + try (Socket s = serverSocket.accept()) { + System.out.println("Server accepted connection"); + // wait a bit before closing the socket to give + // the client time to send its hello message + Thread.currentThread().sleep(100); + s.close(); + System.out.println("Server closed socket, done."); + } catch (Exception e) { + throw new RuntimeException("Problem in test execution", e); + } + } + + @Override + public void close() throws Exception { + if (!serverSocket.isClosed()) { + serverSocket.close(); + } + } + } + + interface TestCase { + void test(SSLSocket socket) throws IOException; + } } diff --git a/jdk/test/sun/util/calendar/zi/TestZoneInfo310.java b/jdk/test/sun/util/calendar/zi/TestZoneInfo310.java index 9d124ffb21d..0c1d7650c48 100644 --- a/jdk/test/sun/util/calendar/zi/TestZoneInfo310.java +++ b/jdk/test/sun/util/calendar/zi/TestZoneInfo310.java @@ -22,11 +22,15 @@ */ /* - *@test - *@bug 8007572 8008161 - *@summary Test whether the TimeZone generated from JSR310 tzdb is the same - *as the one from the tz data from javazic + * @test + * @bug 8007572 8008161 8157792 + * @summary Test whether the TimeZone generated from JSR310 tzdb is the same + * as the one from the tz data from javazic * @modules java.base/sun.util.calendar + * @build BackEnd Checksum DayOfWeek Gen GenDoc Main Mappings Month + * Rule RuleDay RuleRec Simple TestZoneInfo310 Time Timezone + * TzIDOldMapping Zone ZoneInfoFile ZoneInfoOld ZoneRec Zoneinfo + * @run main TestZoneInfo310 */ import java.io.File; @@ -164,10 +168,6 @@ public class TestZoneInfo310 { } for (String zid : zids_new) { - if (zid.equals("Asia/Oral") || zid.equals("Asia/Qyzylorda")) { - // JDK-8157792 tracking this issue - continue; - } ZoneInfoOld zi = toZoneInfoOld(TimeZone.getTimeZone(zid)); ZoneInfoOld ziOLD = (ZoneInfoOld)ZoneInfoOld.getTimeZone(zid); if (! zi.equalsTo(ziOLD)) { diff --git a/jdk/test/sun/util/calendar/zi/Zoneinfo.java b/jdk/test/sun/util/calendar/zi/Zoneinfo.java index 9e48655181f..e58fd188a30 100644 --- a/jdk/test/sun/util/calendar/zi/Zoneinfo.java +++ b/jdk/test/sun/util/calendar/zi/Zoneinfo.java @@ -373,6 +373,7 @@ class Zoneinfo { tz.getOffsetIndex(zrec.getGmtOffset()); int lastGmtOffsetValue = -1; + ZoneRec prevzrec = null; int currentSave = 0; boolean usedZone; for (int zindex = 0; zindex < zone.size(); zindex++) { @@ -441,6 +442,15 @@ class Zoneinfo { currentSave); if (zrec.hasUntil()) { if (transition >= zrec.getUntilTime(currentSave)) { + // If the GMT offset changed from the previous one, + // record fromTime as a transition. + if (!fromTimeUsed && prevzrec != null + && gmtOffset != prevzrec.getGmtOffset()) { + tz.addTransition(fromTime, + tz.getOffsetIndex(gmtOffset+currentSave), + tz.getDstOffsetIndex(currentSave)); + fromTimeUsed = true; // for consistency + } break year_loop; } } @@ -452,8 +462,6 @@ class Zoneinfo { if (fromTime != minTime) { int prevsave; - ZoneRec prevzrec = zone.get(zindex - 1); - // See if until time in the previous // ZoneRec is the same thing as the // local time in the next rule. @@ -555,6 +563,7 @@ class Zoneinfo { fromYear = zrec.getUntilYear(); year = zrec.getUntilYear(); } + prevzrec = zrec; } if (tz.getDSTType() == Timezone.UNDEF_DST) { diff --git a/jdk/test/tools/jlink/plugins/GenerateJLIClassesPluginTest.java b/jdk/test/tools/jlink/plugins/GenerateJLIClassesPluginTest.java index 53010cfa217..d1510affb5e 100644 --- a/jdk/test/tools/jlink/plugins/GenerateJLIClassesPluginTest.java +++ b/jdk/test/tools/jlink/plugins/GenerateJLIClassesPluginTest.java @@ -22,6 +22,7 @@ */ import java.nio.file.Path; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -73,50 +74,9 @@ public class GenerateJLIClassesPluginTest { classFilesForSpecies(GenerateJLIClassesPlugin.defaultSpecies()), List.of()); - - // Test a valid set of options - result = JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .output(helper.createNewImageDir("generate-jli")) - .option("--generate-jli-classes=bmh:bmh-species=LL,L3") - .addMods("java.base") - .call(); - - image = result.assertSuccess(); - - JImageValidator.validate( - image.resolve("lib").resolve("modules"), - classFilesForSpecies(List.of("LL", "L3")), - classFilesForSpecies(List.of("L4"))); - - - // Test disabling BMH species generation - result = JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .output(helper.createNewImageDir("generate-jli")) - .option("--generate-jli-classes=not-bmh:bmh-species=LL,L3") - .addMods("java.base") - .call(); - - image = result.assertSuccess(); - JImageValidator.validate( - image.resolve("lib").resolve("modules"), - List.of(), - classFilesForSpecies(List.of("LL", "L3", "L4"))); - - - // Test an invalid set of options - result = JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .output(helper.createNewImageDir("generate-jli")) - .option("--generate-jli-classes=bmh:bmh-species=LL,L7V") - .addMods("java.base") - .call(); - - result.assertFailure(); } - private static List classFilesForSpecies(List species) { + private static List classFilesForSpecies(Collection species) { return species.stream() .map(s -> "/java.base/java/lang/invoke/BoundMethodHandle$Species_" + s + ".class") .collect(Collectors.toList()); diff --git a/langtools/.hgtags b/langtools/.hgtags index 06cc131cdbd..4fdf92ea61c 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -375,3 +375,4 @@ e181909291981038b041ed4d22714c4760e049cd jdk-9+129 3665ebc22a42c8f33777ee025ba0e300e6086a8c jdk-9+130 aebfafc43714d5a27d5064d8a0011eaccde633cf jdk-9+131 2c17b65a37a8d7afdb9f96d5f11b28a3f21c78f2 jdk-9+132 +7efa4b3477b2b93edbdb4abf827b74c6391f056e jdk-9+133 diff --git a/langtools/make/CompileInterim.gmk b/langtools/make/CompileInterim.gmk index 06a13d92ba8..171c830fb1a 100644 --- a/langtools/make/CompileInterim.gmk +++ b/langtools/make/CompileInterim.gmk @@ -32,7 +32,7 @@ include JavaCompilation.gmk include SetupJavaCompilers.gmk ################################################################################ -# Setup the rules to build interim langtools, which is compiled by the boot +# Setup the rules to build interim langtools, which is compiled by the boot # javac and can be run on the boot jdk. This will be used to compile # the rest of the product. Each module is compiled separately to allow a modular # boot jdk to override system classes using -Xoverride:. @@ -45,7 +45,8 @@ define SetupInterimModule DISABLE_SJAVAC := true, \ SRC := $(LANGTOOLS_TOPDIR)/src/$(strip $1)/share/classes \ $$(wildcard $(SUPPORT_OUTPUTDIR)/gensrc/$(strip $1)), \ - EXCLUDES := sun com/sun/tools/jdeps com/sun/tools/javap, \ + EXCLUDES := sun com/sun/tools/jdeps com/sun/tools/javap \ + com/sun/tools/jdeprscan, \ EXCLUDE_FILES := module-info.java, \ COPY := .gif .png .xml .css .js javax.tools.JavaCompilerTool, \ BIN := $(BUILDTOOLS_OUTPUTDIR)/override_modules/$(strip $1), \ diff --git a/langtools/make/build.xml b/langtools/make/build.xml index c844103ed54..3fec57e54ef 100644 --- a/langtools/make/build.xml +++ b/langtools/make/build.xml @@ -88,18 +88,18 @@ - + - + - - + + + + +JDeprScan Internals +----- + +**EXPERIMENTAL OPTIONS** + + --Xload-class CLASSNAME + + Loads deprecation data from the class named CLASSNAME instead of from + the JDK image. + + --Xload-csv CVSFILE + + Loads deprecation data from file CSVFILE. + + --Xload-dir DIR + + Loads deprecation data from the class hierarchy rooted + at the directory named DIR. + + --Xload-jar JARFILE + + Loads deprecation data from the classes contained in the + jar file named JARFILE. + + --Xload-jdk9 JAVA_HOME + + Loads deprecation data from a modular JDK whose home + directory is at JAVA_HOME. This essentially adds the given + path to the system-modules location. + + --Xload-old-jdk JAVA_HOME + + Loads deprecation data from an old (non-modular) JDK whose + home directory is at JAVA_HOME. This essentially scans the + rt.jar file from that JDK. + + --Xload-self + + Loads deprecation data from the running JDK image by + traversing the entire jrt: filesystem. This differs from + -release 9, which traverses modules, packages, and classes by + starting from a set of root modules and using javax.lang.model + mechanisms (as opposed to filesystem mechanisms) for + traversing contained elements recursively. + + --Xcompiler-arg ARG + + Adds ARG to the list of arguments passed to the compiler. + + --Xcsv-comment COMMENT + + Adds a comment line containing COMMENT to the top of the CSV + that is emitted. Valid only when --Xprint-csv is + specified. More than one --Xcsv-comment option is permitted, + which will cause a corresponding number of comment lines to be + emitted to the CSV file. + + --Xprint-csv + + Prints out the loaded deprecation information in CSV format + to standard output. In this mode, no scanning is done, so + there must not be any additional directory, jar, or classname + arguments. + +**CSV FILE SYNTAX** + +The `-Xprint-csv` option causes **jdeprscan** to emit the loaded +deprecation data in CSV (comma-separated value) format. The general +syntax of CSV is documented in [RFC 4180][RFC] with supplemental +information in a [Wikipedia article][wiki]. + +The file is encoded in UTF-8. + +The file consists of a series of lines. Any of the standard line +separators CR (U+000D), LF (U+000A), or a CR immediately followed by +LF, are supported. Newlines are only supported between records and +are not supported within field values. + +Comment lines start with a `#` (U+0023) character in the first +column. The entire line is ignored up until the next line separator +sequence. + +Each line is divided into fields separated by the comma `,` (U+002C) +character. Horizontal whitespace is not treated specially; that is, +it is considered part of a field's value. An empty line is considered +to have one field which is the empty string. + +A field value that contains a comma or a quote quotation mark `"` +(U+0022) must be surrounded by quotation marks. The surrounding +quotation marks are not considered part of the field value. Any +quotation marks that are part of a field value must be repeated in +addition to being surrounded by quotation marks. + +It is a syntax error if a quotation mark appears within an unquoted field; +if a quoted field isn't immediately followed by a comma or line +separator; or if a quoted field is left unclosed at the end of the line. + +For example, a record with the following four fields: + +1. abcd +2. ef,gh +3. ij"kl +4. mnop + +would be encoded as follows: + + abcd,"ef,gh","ij""kl",mnop + +**CSV FILE DATA** + +The first line of output must be the following: + + #jdepr1 + +This is strictly a comment line, but it serves as a file +identifier. The "1" indicates version 1 of this file. + +Zero or more comment lines follow, containing text that is specified +by the `-Xcsv-comment` options. + +Subsequent non-comment lines must have the following five fields: + + kind,typeName,descOrName,since,forRemoval + +Fields are defined as follows: + + * _kind_ - one of CONSTRUCTOR, FIELD, METHOD, ENUM\_CONSTANT, + CLASS, INTERFACE, ENUM, or ANNOTATION\_TYPE. These correspond to + enumeration constants from the `javax.lang.model.element.ElementKind` + enum. + + * _typeName_ - the fully qualified name of the type (if *kind* is + CLASS, INTERFACE, ENUM, or ANNOTATION\_TYPE) or of the enclosing + type (if _kind_ is CONSTRUCTOR, FIELD, METHOD, or + ENUM\_CONSTANT). This value is a _binary name_ [JLS 13.1][jls131] + using a slash character `/` (U+002F) to separate package and + top-level name components, and a dollar sign `$` (U+0024) to + separate nested name components. For example, the `Thread.State` + enum that appears in Java SE would have the following typeName: + + java/lang/Thread$State + + * _descOrName_ - if _kind_ is METHOD or CONSTRUCTOR, this is the method's + or constructor's descriptor [JVMS 4.3.3][jvms433]; if _kind_ is FIELD or + ENUM\_CONSTANT, this is its name; otherwise this field is empty. + A method's descriptor includes its name, parameter types, and return + type. For example, the method + + public void String.getBytes(int srcBegin, + int srcEnd, + byte[] dst, + int dstBegin) + + has the descriptor + + getBytes(II[BI)V + + * _since_ - the value of the `since` element of the `@Deprecated` + annotation, or empty if this element is not present. + + * _forRemoval_ - the value of the `forRemoval` element of the + `@Deprecated` annotation, a boolean, either "true" or "false". + +Note that the _since_ field can have arbitrary text (excluding +line separators) and is thus subject to quoting. + +**EXAMPLE OUTPUT** + +Given the following method declaration and annotation from the +`java.lang.Runtime` class, + + @Deprecated(since="1.2", + forRemoval=true) + public static void runFinalizersOnExit(boolean value) + +the following line will be emitted from **jdeprscan -Xprint-csv**: + + METHOD,java/lang/Runtime,runFinalizersOnExit(Z)V,1.2,true + + +[RFC]: https://www.ietf.org/rfc/rfc4180.txt + +[wiki]: https://en.wikipedia.org/wiki/Comma-separated_values + +[jls131]: http://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1 + +[jvms433]: http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.3.3 diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/readme.md b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/readme.md new file mode 100644 index 00000000000..f51a1ea0c9b --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/readme.md @@ -0,0 +1,180 @@ + + + +JDeprScan Tool Command Reference +----- + +**NAME** + + jdeprscan - Java deprecation scanner + +**SYNOPSIS** + + jdeprscan [options] {dir | jar | class} ... + +**OPTIONS** + + -cp PATH + --class-path PATH + + Sets the classpath to PATH. + + --for-removal + + Limit reporting to deprecations whose forRemoval element + is true. + + --full-version + + Prints the full version string of the tool and exits. + + -h + --help + + Prints a help message and exits. + + -l + --list + + Prints out the set of deprecated APIs. + + --release 6|7|8|9 + + Specifies the Java SE release that is the source of + the list of deprecated APIs. If no --release option is + provided, the latest release is used. + + -v + --verbose + + Enables additional output. + + --version + + Prints the version string of the tool and exits. + +**DESCRIPTION** + +**jdeprscan** scans a class library for uses of deprecated APIs. +**jdeprscan** processes one or more arguments, which can be any +combination of a directory, a jar file, or a class name. + +A directory argument must specify a path to a directory hierarchy that +reflects the Java package hierarchy of the classes it contains. +**jdeprscan** will scan each class found in the directory hierarchy +and report information about how those classes use deprecated APIs. + +Given a jar file, **jdeprscan** will scan the classes found within +that jar file and report information about how those classes use +deprecated APIs. + +Given a class name, **jdeprscan** will search for that class on the +classpath, scan that class, and report information about how that +class uses deprecated APIs. The class name must use the fully +qualified binary name of the class, as described in the +[Java Language Specification, section 13.1][jls131]. This form uses +the '$' character instead of '.' as the separator for nested class names. +For example, the `Thread.State` enum would be specified using the string + + java.lang.Thread$State + +The `--class-path` and `-cp` options specify the classpath used for +class searching. The classpath is used for classes named on the +command line, as well as for dependencies of the classes in jar file +or directory hierarchy to be scanned. + +The `--for-removal` option limits output to uses of deprecated APIs +whose `@Deprecated` annotation includes the `forRemoval` element with +the value `true`. Note: the `forRemoval` attribute of the +`@Deprecated` annotation did not exist prior to Java SE 9, so this +option cannot be used with a release value of 6, 7, or 8. + +The `--release` option specifies the Java SE specification version +that determines the set of deprecated APIs for which scanning is +done. This is useful if a deprecation report is desired that lists +uses of deprecated APIs as of a particular release in the past. If no +`--release` option is given, the latest release is used. + +The `--list` and `-l` options will list the known set of deprecated +APIs instead of doing any scanning. Since no scanning is done, +no directory, jar, or class arguments should be provided. The set +of deprecated APIs listed is affected by the `--release` and the +`--for-removal` options. + + +**EXAMPLE OUTPUT** + +The output is a report that lists program elements that use deprecated +APIs. Output is subject to change. + +Consider the following declarations from Java SE 9: + + // java.lang.Boolean + + @Deprecated(since="9") + public Boolean(boolean value) + + // java.lang.Runtime + + @Deprecated(since="1.2", forRemoval=true) + public static void runFinalizersOnExit(boolean value) + +Running **jdeprscan** over a class that calls these methods will result +in output something like the following: + + class Example uses method java/lang/Boolean.(Z)V deprecated + class Example uses method java/lang/Runtime.runFinalizersOnExit(Z)V deprecated for removal + +Running **jdeprscan** with the `--list` option will result in output +including something like the following: + + ... + @Deprecated(since="9") java.lang.Boolean(boolean) + @Deprecated(since="1.2", forRemoval=true) void java.lang.Runtime.runFinalizersOnExit(boolean) + ... + +**NOTES** + +The **jdeprscan** tool operates by opening Java class files and +reading their structures directly, particularly the constant +pool. Because of this, **jdeprscan** can tell _that_ a deprecated API +is used, but it often cannot tell _where_ in the class that API is +used. + +The **jdeprscan** tool doesn't follow the same set of rules for +emitting warnings as specified for Java compilers in [JLS section +9.6.4.6][jls9646]. In particular, **jdeprscan** does not respond to +the `@SuppressWarnings` annotation, as that is significant only in +source code, not in class files. In addition, **jdeprscan** emits +warnings even if the usage is within the API element that is +deprecated and when the use and declaration are within the same +outermost class. + +[jls9646]: http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.6 + +[jls131]: http://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1 diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/resources/jdeprscan.properties b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/resources/jdeprscan.properties new file mode 100644 index 00000000000..fd92fe813ee --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/resources/jdeprscan.properties @@ -0,0 +1,96 @@ +main.usage=\ +Usage: jdeprscan [options] '{dir|jar|class}' ...\n\ +\n\ +options:\n\ +\ -cp --class-path PATH\n\ +\ --for-removal\n\ +\ --full-version\n\ +\ -h --help\n\ +\ -l --list\n\ +\ --release 6|7|8|9\n\ +\ -v --verbose\n\ +\ --version + +main.help=\ +Scans each argument for usages of deprecated APIs. An argument\n\ +may be a directory specifying the root of a package hierarchy,\n\ +a JAR file, or a class name. The class name must be specified\n\ +using a fully qualified class name using the $ separator character\n\ +for nested classes, for example,\n\ +\n\ +\ java.lang.Thread$State\n\ +\n\ +The --class-path (-cp) option provides a search path for resolution\n\ +of dependent classes.\n\ +\n\ +The --for-removal option limits scanning or listing to APIs that are\n\ +deprecated for removal. Cannot be used with a release value of 6, 7, or 8.\n\ +\n\ +The --full-version option prints out the full version string of the tool.\n\ +\n\ +The --help option prints out a full help message.\n\ +\n\ +The --list (-l) option prints out the set of deprecated APIs. No scanning is done,\n\ +so no directory, jar, or class arguments should be provided.\n\ +\n\ +The --release option specifies the Java SE release that provides the set\n\ +of deprecated APIs for scanning.\n\ +\n\ +The --verbose (-v) option enables additional message output during processing.\n\ +\n\ +The --version option prints out the abbreviated version string of the tool. + +main.xhelp=\ +Unsupported options:\n\ +\n\ +\ --Xload-class CLASS\n\ +\ Loads deprecation information from the named class.\n\ +\ --Xload-csv CSVFILE\n\ +\ Loads deprecation information from the named CSV file.\n\ +\ --Xload-dir DIR\n\ +\ Loads deprecation information from the class hierarchy\n\ +\ at the named directory.\n\ +\ --Xload-jar JARFILE\n\ +\ Loads deprecation information from the named JAR file.\n\ +\ --Xload-jdk9 JAVA_HOME\n\ +\ Loads deprecation information from the JDK located at\n\ +\ JAVA_HOME, which must be a modular JDK.\n\ +\ --Xload-old-jdk JAVA_HOME\n\ +\ Loads deprecation information from the JDK located at\n\ +\ JAVA_HOME, which must not be a modular JDK. Instead, the\n\ +\ named JDK must be a "classic" JDK with an rt.jar file.\n\ +\ --Xload-self\n\ +\ Loads deprecation information by traversing the jrt:\n\ +\ filesystem of the running JDK image.\n\ +\ --Xcompiler-arg ARG\n\ +\ Adds ARG to the list of compiler arguments.\n\ +\ --Xcsv-comment COMMENT\n\ +\ Adds COMMENT as a comment line to the output CSV file.\n\ +\ Only effective if -Xprint-csv is also supplied.\n\ +\ --Xhelp\n\ +\ Prints this message.\n\ +\ --Xprint-csv\n\ +\ Prints a CSV file containing the loaded deprecation information\n\ +\ instead of scanning any classes or JAR files. + +error.prefix=Error: + +scan.process.class=Processing class {0}... + +scan.dep.normal=deprecated +scan.dep.removal=deprecated FOR REMOVAL + +scan.out.extends={0} {1} extends class {2} {3} +scan.out.implements={0} {1} implements interface {2} {3} +scan.out.usestype={0} {1} uses type {2} {3} +scan.out.usesmethodintype={0} {1} uses method in type {2} {3} +scan.out.usesmethod={0} {1} uses method {2} {3} {4} {5} +scan.out.usesintfmethodintype={0} {1} uses interface method in type {2} {3} +scan.out.usesintfmethod={0} {1} uses interface method {2} {3} {4} {5} +scan.out.usesfieldintype={0} {1} uses field in type {2} {3} +scan.out.usesfield={0} {1} uses field {2} {3} {4} +scan.out.usesfieldoftype={0} {1} uses field of type {2} {3} {4} {5} +scan.out.hasfield={0} {1} has field {2} of type {3} {4} +scan.out.methodparmtype={0} {1} method {2} has parameter type {3} {4} +scan.out.methodrettype={0} {1} method {2} has return type {3} {4} +scan.out.methodoverride={0} {1} overrides method {2} {3} {4} {5} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/CPEntries.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/CPEntries.java new file mode 100644 index 00000000000..8314a2b608a --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/CPEntries.java @@ -0,0 +1,76 @@ +/* + * 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 com.sun.tools.jdeprscan.scan; + +import java.util.ArrayList; +import java.util.Formatter; +import java.util.List; +import java.util.Locale; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPool; + +import static com.sun.tools.classfile.ConstantPool.CPInfo; + +/** + * A container for selected constant pool entries. There are currently + * lists that contain the following types of CP entries: + * + * - CONSTANT_Class_info + * - CONSTANT_Fieldref_info + * - CONSTANT_Methodref_info + * - CONSTANT_InterfaceMethodref_info + */ +class CPEntries { + final List classes = new ArrayList<>(); + final List fieldRefs = new ArrayList<>(); + final List methodRefs = new ArrayList<>(); + final List intfMethodRefs = new ArrayList<>(); + + public static CPEntries loadFrom(ClassFile cf) { + CPEntries entries = new CPEntries(); + for (CPInfo cpi : cf.constant_pool.entries()) { + cpi.accept(new CPSelector(), entries); + } + return entries; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + Formatter f = new Formatter(sb, Locale.getDefault()); + f.format("Classes:%n"); + f.format("%s%n", classes); + f.format("FieldRefs:%n"); + f.format("%s%n", fieldRefs); + f.format("MethodRefs:%n"); + f.format("%s%n", methodRefs); + f.format("InterfaceMethodRefs:%n"); + f.format("%s%n", intfMethodRefs); + f.flush(); + return sb.toString(); + } +} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/CPSelector.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/CPSelector.java new file mode 100644 index 00000000000..a9d2afe4d2b --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/CPSelector.java @@ -0,0 +1,108 @@ +/* + * 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 com.sun.tools.jdeprscan.scan; + +import com.sun.tools.classfile.ConstantPool; + +/** + * A visitor that selects constant pool entries by type and adds + * them to the given CPEntries object. + */ +class CPSelector implements ConstantPool.Visitor { + @Override + public Void visitClass(ConstantPool.CONSTANT_Class_info info, CPEntries p) { + p.classes.add(info); + return null; + } + + @Override + public Void visitDouble(ConstantPool.CONSTANT_Double_info info, CPEntries p) { + return null; + } + + @Override + public Void visitFieldref(ConstantPool.CONSTANT_Fieldref_info info, CPEntries p) { + p.fieldRefs.add(info); + return null; + } + + @Override + public Void visitFloat(ConstantPool.CONSTANT_Float_info info, CPEntries p) { + return null; + } + + @Override + public Void visitInteger(ConstantPool.CONSTANT_Integer_info info, CPEntries p) { + return null; + } + + @Override + public Void visitInterfaceMethodref(ConstantPool.CONSTANT_InterfaceMethodref_info info, CPEntries p) { + p.intfMethodRefs.add(info); + return null; + } + + @Override + public Void visitInvokeDynamic(ConstantPool.CONSTANT_InvokeDynamic_info info, CPEntries p) { + return null; + } + + @Override + public Void visitLong(ConstantPool.CONSTANT_Long_info info, CPEntries p) { + return null; + } + + @Override + public Void visitNameAndType(ConstantPool.CONSTANT_NameAndType_info info, CPEntries p) { + return null; + } + + @Override + public Void visitMethodref(ConstantPool.CONSTANT_Methodref_info info, CPEntries p) { + p.methodRefs.add(info); + return null; + } + + @Override + public Void visitMethodHandle(ConstantPool.CONSTANT_MethodHandle_info info, CPEntries p) { + return null; + } + + @Override + public Void visitMethodType(ConstantPool.CONSTANT_MethodType_info info, CPEntries p) { + return null; + } + + @Override + public Void visitString(ConstantPool.CONSTANT_String_info info, CPEntries p) { + return null; + } + + @Override + public Void visitUtf8(ConstantPool.CONSTANT_Utf8_info info, CPEntries p) { + return null; + } +} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/ClassFinder.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/ClassFinder.java new file mode 100644 index 00000000000..ebb847bbe99 --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/ClassFinder.java @@ -0,0 +1,211 @@ +/* + * 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 com.sun.tools.jdeprscan.scan; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.stream.Stream; + +/** + * A simple search path for classes. + */ +public class ClassFinder { + final List list = new ArrayList<>(); + final boolean verbose; + + public ClassFinder(boolean verbose) { + this.verbose = verbose; + } + + /** + * Adds a directory to this finder's search path, ignoring errors. + * + * @param dirName the directory to add + */ + public void addDir(String dirName) { + Path dir = Paths.get(dirName); + + if (Files.isDirectory(dir)) { + list.add(new DirPathEntry(dir)); + } + } + + /** + * Adds a jar file to this finder's search path, ignoring errors. + * + * @param jarName the jar file name to add + */ + public void addJar(String jarName) { + try { + list.add(new JarPathEntry(new JarFile(jarName))); + } catch (IOException ignore) { } + } + + /** + * Adds the JRT filesystem to this finder's search path. + */ + public void addJrt() { + list.add(new JrtPathEntry()); + } + + /** + * Searches the class path for a class with the given name, + * returning a ClassFile for it. Returns null if not found. + * + * @param className the class to search for + * @return a ClassFile instance, or null if not found + */ + public ClassFile find(String className) { + for (PathEntry pe : list) { + ClassFile cf = pe.find(className); + if (cf != null) { + return cf; + } + } + return null; + } + + /** + * An entry in this finder's class path. + */ + interface PathEntry { + /** + * Returns a ClassFile instance corresponding to this name, + * or null if it's not present in this entry. + * + * @param className the class to search for + * @return a ClassFile instance, or null if not found + */ + ClassFile find(String className); + } + + /** + * An entry that represents a jar file. + */ + class JarPathEntry implements PathEntry { + final JarFile jarFile; + + JarPathEntry(JarFile jf) { + jarFile = jf; + } + + @Override + public ClassFile find(String className) { + JarEntry entry = jarFile.getJarEntry(className + ".class"); + if (entry == null) { + return null; + } + try { + return ClassFile.read(jarFile.getInputStream(entry)); + } catch (IOException | ConstantPoolException ex) { + if (verbose) { + ex.printStackTrace(); + } + } + return null; + } + } + + /** + * An entry that represents a directory containing a class hierarchy. + */ + class DirPathEntry implements PathEntry { + final Path dir; + + DirPathEntry(Path dir) { + this.dir = dir; + } + + @Override + public ClassFile find(String className) { + Path classFileName = dir.resolve(className + ".class"); + try { + return ClassFile.read(classFileName); + } catch (NoSuchFileException nsfe) { + // not found, return silently + } catch (IOException | ConstantPoolException ex) { + if (verbose) { + ex.printStackTrace(); + } + } + return null; + } + } + + /** + * An entry that represents the JRT filesystem in the running image. + * + * JRT filesystem structure is: + * /packages// + * where modlink is a symbolic link to /modules/ which is + * the top of the usual package-class hierarchy + */ + class JrtPathEntry implements PathEntry { + final FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); + + @Override + public ClassFile find(String className) { + int end = className.lastIndexOf('/'); + if (end < 0) { + return null; + } + String pkg = "/packages/" + className.substring(0, end) + .replace('/', '.'); + try (Stream mods = Files.list(fs.getPath(pkg))) { + Optional opath = + mods.map(path -> path.resolve(className + ".class")) + .filter(Files::exists) + .findFirst(); + if (opath.isPresent()) { + return ClassFile.read(opath.get()); + } else { + return null; + } + } catch (NoSuchFileException nsfe) { + // not found, return silently + } catch (IOException | ConstantPoolException ex) { + if (verbose) { + ex.printStackTrace(); + } + } + return null; + } + } +} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/MethodSig.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/MethodSig.java new file mode 100644 index 00000000000..723b489f727 --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/MethodSig.java @@ -0,0 +1,167 @@ +/* + * 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 com.sun.tools.jdeprscan.scan; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Represents a method's signature, that is, its parameter types + * and its return type. + */ +public class MethodSig { + final List parameters; + final String returnType; + + /** + * Parses the method descriptor and returns a MethodSig instance. + * + * @param desc the descriptor to parse + * @return the new MethodSig instance + */ + public static MethodSig fromDesc(String desc) { + return parse(desc, 0, desc.length()); + } + + /** + * Returns this method's return type. + * + * @return the return type + */ + public String getReturnType() { + return returnType; + } + + /** + * Returns a list of parameters of this method. + * + * @return the parameter list + */ + public List getParameters() { + return parameters; + } + + /** + * Returns a string describing this method. + * + * @return the string description + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("parameters"); + if (parameters.isEmpty()) { + sb.append(" none"); + } else { + int i = 0; + for (String p : parameters) { + sb.append(String.format(" %d=%s", i++, p)); + } + } + sb.append(String.format(" return %s", returnType)); + return sb.toString(); + } + + private MethodSig(List parameters, String returnType) { + this.parameters = Collections.unmodifiableList(parameters); + this.returnType = returnType; + } + + private static IllegalArgumentException ex(String desc, int pos) { + return new IllegalArgumentException(String.format( + "illegal descriptor \"%s\" at position %d", desc, pos)); + } + + private static MethodSig parse(String desc, int start, int end) + throws IllegalArgumentException { + int p = start; + int dims = 0; + boolean inReturnType = false; + String returnType = null; + List parameters = new ArrayList<>(); + + while (p < end) { + String type; + char ch; + switch (ch = desc.charAt(p)) { + case '(': + p++; + continue; + + case ')': + p++; + inReturnType = true; + continue; + + case '[': + p++; + dims++; + continue; + + case 'B': // byte + case 'C': // char + case 'D': // double + case 'F': // float + case 'I': // int + case 'J': // long + case 'S': // short + case 'Z': // boolean + case 'V': // void + type = Character.toString(ch); + p++; + break; + + case 'L': + int sep = desc.indexOf(';', p); + if (sep == -1 || sep >= end) + throw ex(desc, p); + type = desc.substring(p, ++sep); + p = sep; + break; + + default: + throw ex(desc, p); + } + + StringBuilder sb = new StringBuilder(); + for ( ; dims > 0; dims-- ) + sb.append("["); + sb.append(type); + if (inReturnType) { + returnType = sb.toString(); + } else { + parameters.add(sb.toString()); + } + } + + if (returnType == null) { + throw ex(desc, end); + } + + return new MethodSig(parameters, returnType); + } +} diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/Scan.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/Scan.java new file mode 100644 index 00000000000..4088e11841d --- /dev/null +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/scan/Scan.java @@ -0,0 +1,614 @@ +/* + * 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 com.sun.tools.jdeprscan.scan; + +import java.io.IOException; +import java.io.PrintStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.sun.tools.classfile.*; +import com.sun.tools.jdeprscan.DeprData; +import com.sun.tools.jdeprscan.DeprDB; +import com.sun.tools.jdeprscan.Messages; + +import static com.sun.tools.classfile.AccessFlags.*; +import static com.sun.tools.classfile.ConstantPool.*; + +/** + * An object that represents the scanning phase of deprecation usage checking. + * Given a deprecation database, scans the targeted directory hierarchy, jar + * file, or individual class for uses of deprecated APIs. + */ +public class Scan { + final PrintStream out; + final PrintStream err; + final List classPath; + final DeprDB db; + final boolean verbose; + + final ClassFinder finder; + boolean error = false; + + public Scan(PrintStream out, + PrintStream err, + List classPath, + DeprDB db, + boolean verbose) { + this.out = out; + this.err = err; + this.classPath = classPath; + this.db = db; + this.verbose = verbose; + + ClassFinder f = new ClassFinder(verbose); + + // TODO: this isn't quite right. If we've specified a release other than the current + // one, we should instead add a reference to the symbol file for that release instead + // of the current image. The problems are a) it's unclear how to get from a release + // to paths that reference the symbol files, as this might be internal to the file + // manager; and b) the symbol file includes .sig files, not class files, which ClassFile + // might not be able to handle. + f.addJrt(); + + for (String name : classPath) { + if (name.endsWith(".jar")) { + f.addJar(name); + } else { + f.addDir(name); + } + } + + finder = f; + } + + Pattern typePattern = Pattern.compile("\\[*L(.*);"); + + // "flattens" an array type name to its component type + // and a reference type "Lpkg/pkg/pkg/name;" to its base name + // "pkg/pkg/pkg/name". + // TODO: deal with primitive types + String flatten(String typeName) { + Matcher matcher = typePattern.matcher(typeName); + if (matcher.matches()) { + return matcher.group(1); + } else { + return typeName; + } + } + + String typeKind(ClassFile cf) { + AccessFlags flags = cf.access_flags; + if (flags.is(ACC_ENUM)) { + return "enum"; + } else if (flags.is(ACC_ANNOTATION)) { + return "@interface"; + } else if (flags.is(ACC_INTERFACE)) { + return "interface"; + } else { + return "class"; + } + } + + void printType(String key, ClassFile cf, String cname, boolean forRemoval) + throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get(key, typeKind(cf), cf.getName(), cname, dep)); + } + + void printMethod(String key, ClassFile cf, String cname, String mname, String rtype, + boolean forRemoval) throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get(key, typeKind(cf), cf.getName(), cname, mname, rtype, dep)); + } + + void printField(String key, ClassFile cf, String cname, String fname, + boolean forRemoval) throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get(key, typeKind(cf), cf.getName(), cname, fname, dep)); + } + + void printFieldType(String key, ClassFile cf, String cname, String fname, String type, + boolean forRemoval) throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get(key, typeKind(cf), cf.getName(), cname, fname, type, dep)); + } + + void printHasField(ClassFile cf, String fname, String type, boolean forRemoval) + throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get("scan.out.hasfield", typeKind(cf), cf.getName(), fname, type, dep)); + } + + void printHasMethodParmType(ClassFile cf, String mname, String parmType, boolean forRemoval) + throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get("scan.out.methodparmtype", typeKind(cf), cf.getName(), mname, parmType, dep)); + } + + void printHasMethodRetType(ClassFile cf, String mname, String retType, boolean forRemoval) + throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get("scan.out.methodrettype", typeKind(cf), cf.getName(), mname, retType, dep)); + } + + void printHasOverriddenMethod(ClassFile cf, String overridden, String mname, String desc, boolean forRemoval) + throws ConstantPoolException { + String dep = Messages.get(forRemoval ? "scan.dep.removal" : "scan.dep.normal"); + out.println(Messages.get("scan.out.methodoverride", typeKind(cf), cf.getName(), overridden, + mname, desc, dep)); + } + + // format should not have a newline + void err(String format, Object... args) { + error = true; + err.print("error: "); + err.printf(format, args); + err.println(); + } + + void printException(Exception ex) { + err.print(Messages.get("error.prefix")); + err.print(" "); + if (verbose) { + ex.printStackTrace(err); + } else { + err.print(ex); + } + } + + /** + * Checks whether a member (method or field) is present in a class. + * The checkMethod parameter determines whether this checks for a method + * or for a field. + * + * @param targetClass the ClassFile of the class to search + * @param targetName the method or field's name + * @param targetDesc the methods descriptor (ignored if checkMethod is false) + * @param checkMethod true if checking for method, false if checking for field + * @return boolean indicating whether the member is present + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + boolean isMemberPresent(ClassFile targetClass, + String targetName, + String targetDesc, + boolean checkMethod) + throws ConstantPoolException { + if (checkMethod) { + for (Method m : targetClass.methods) { + String mname = m.getName(targetClass.constant_pool); + String mdesc = targetClass.constant_pool.getUTF8Value(m.descriptor.index); + if (targetName.equals(mname) && targetDesc.equals(mdesc)) { + return true; + } + } + } else { + for (Field f : targetClass.fields) { + String fname = f.getName(targetClass.constant_pool); + if (targetName.equals(fname)) { + return true; + } + } + } + return false; + } + + /** + * Adds all interfaces from this class to the deque of interfaces. + * + * @param intfs the deque of interfaces + * @param cf the ClassFile of this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void addInterfaces(Deque intfs, ClassFile cf) + throws ConstantPoolException { + int count = cf.interfaces.length; + for (int i = 0; i < count; i++) { + intfs.addLast(cf.getInterfaceName(i)); + } + } + + /** + * Resolves a member by searching this class and all its superclasses and + * implemented interfaces. + * + * TODO: handles a few too many cases; needs cleanup. + * + * TODO: refine error handling + * + * @param cf the ClassFile of this class + * @param startClassName the name of the class at which to start searching + * @param findName the member name to search for + * @param findDesc the method descriptor to search for (ignored for fields) + * @param resolveMethod true if resolving a method, false if resolving a field + * @param checkStartClass true if the start class should be searched, false if + * it should be skipped + * @return the name of the class where the member resolved, or null + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + String resolveMember( + ClassFile cf, String startClassName, String findName, String findDesc, + boolean resolveMethod, boolean checkStartClass) + throws ConstantPoolException { + ClassFile startClass; + + if (cf.getName().equals(startClassName)) { + startClass = cf; + } else { + startClass = finder.find(startClassName); + if (startClass == null) { + err("can't find class %s", startClassName); + return startClassName; + } + } + + // follow super_class until it's 0, meaning we've reached Object + // accumulate interfaces of superclasses as we go along + + ClassFile curClass = startClass; + Deque intfs = new ArrayDeque<>(); + while (true) { + if ((checkStartClass || curClass != startClass) && + isMemberPresent(curClass, findName, findDesc, resolveMethod)) { + break; + } + + if (curClass.super_class == 0) { // reached Object + curClass = null; + break; + } + + String superName = curClass.getSuperclassName(); + curClass = finder.find(superName); + if (curClass == null) { + err("can't find class %s", superName); + break; + } + addInterfaces(intfs, curClass); + } + + // search interfaces: add all interfaces and superinterfaces to queue + // search until it's empty + + if (curClass == null) { + addInterfaces(intfs, startClass); + while (intfs.size() > 0) { + String intf = intfs.removeFirst(); + curClass = finder.find(intf); + if (curClass == null) { + err("can't find interface %s", intf); + break; + } + + if (isMemberPresent(curClass, findName, findDesc, resolveMethod)) { + break; + } + + addInterfaces(intfs, curClass); + } + } + + if (curClass == null) { + if (checkStartClass) { + err("can't resolve methodref %s %s %s", + startClassName, findName, findDesc); + return startClassName; + } else { + // TODO: refactor this + // checkStartClass == false means we're checking for overrides + // so not being able to resolve a method simply means there's + // no overriding, which isn't an error + return null; + } + } else { + String foundClassName = curClass.getName(); + return foundClassName; + } + } + + /** + * Checks the superclass of this class. + * + * @param cf the ClassFile of this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkSuper(ClassFile cf) throws ConstantPoolException { + String sname = cf.getSuperclassName(); + DeprData dd = db.getTypeDeprecated(sname); + if (dd != null) { + printType("scan.out.extends", cf, sname, dd.isForRemoval()); + } + } + + /** + * Checks the interfaces of this class. + * + * @param cf the ClassFile of this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkInterfaces(ClassFile cf) throws ConstantPoolException { + int ni = cf.interfaces.length; + for (int i = 0; i < ni; i++) { + String iname = cf.getInterfaceName(i); + DeprData dd = db.getTypeDeprecated(iname); + if (dd != null) { + printType("scan.out.implements", cf, iname, dd.isForRemoval()); + } + } + } + + /** + * Checks types referred to from the constant pool. + * + * @param cf the ClassFile of this class + * @param entries constant pool entries collected from this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkTypes(ClassFile cf, CPEntries entries) throws ConstantPoolException { + for (ConstantPool.CONSTANT_Class_info ci : entries.classes) { + String typeName = ci.getName(); + DeprData dd = db.getTypeDeprecated(flatten(typeName)); + if (dd != null) { + printType("scan.out.usestype", cf, typeName, dd.isForRemoval()); + } + } + } + + /** + * Checks methods referred to from the constant pool. + * + * @param cf the ClassFile of this class + * @param nti the NameAndType_info from a MethodRef or InterfaceMethodRef entry + * @param clname the class name + * @param typeKey key for the type message + * @param methKey key for the method message + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkMethodRef(ClassFile cf, + CONSTANT_NameAndType_info nti, + String clname, + String typeKey, + String methKey) throws ConstantPoolException { + DeprData dd = db.getTypeDeprecated(flatten(clname)); + if (dd != null) { + printType(typeKey, cf, clname, dd.isForRemoval()); + } + + String name = nti.getName(); + String type = nti.getType(); + clname = resolveMember(cf, flatten(clname), name, type, true, true); + dd = db.getMethodDeprecated(clname, name, type); + if (dd != null) { + printMethod(methKey, cf, clname, name, type, dd.isForRemoval()); + } + } + + /** + * Checks fields referred to from the constant pool. + * + * @param cf the ClassFile of this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkFieldRef(ClassFile cf, + ConstantPool.CONSTANT_Fieldref_info fri) throws ConstantPoolException { + CONSTANT_NameAndType_info nti = fri.getNameAndTypeInfo(); + String clname = fri.getClassName(); + String name = nti.getName(); + String type = nti.getType(); + DeprData dd = db.getTypeDeprecated(clname); + + if (dd != null) { + printType("scan.out.usesfieldintype", cf, clname, dd.isForRemoval()); + } + + clname = resolveMember(cf, flatten(clname), name, type, false, true); + dd = db.getFieldDeprecated(clname, name); + if (dd != null) { + printField("scan.out.usesfield", cf, clname, name, dd.isForRemoval()); + } + + dd = db.getTypeDeprecated(flatten(type)); + if (dd != null) { + printFieldType("scan.out.usesfieldoftype", cf, clname, name, type, dd.isForRemoval()); + } + } + + /** + * Checks the fields declared in this class. + * + * @param cf the ClassFile of this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkFields(ClassFile cf) throws ConstantPoolException { + for (Field f : cf.fields) { + String type = cf.constant_pool.getUTF8Value(f.descriptor.index); + DeprData dd = db.getTypeDeprecated(flatten(type)); + if (dd != null) { + printHasField(cf, f.getName(cf.constant_pool), type, dd.isForRemoval()); + } + } + } + + /** + * Checks the methods declared in this class. + * + * @param cf the ClassFile object of this class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void checkMethods(ClassFile cf) throws ConstantPoolException { + for (Method m : cf.methods) { + String mname = m.getName(cf.constant_pool); + String desc = cf.constant_pool.getUTF8Value(m.descriptor.index); + MethodSig sig = MethodSig.fromDesc(desc); + DeprData dd; + + for (String parm : sig.getParameters()) { + dd = db.getTypeDeprecated(flatten(parm)); + if (dd != null) { + printHasMethodParmType(cf, mname, parm, dd.isForRemoval()); + } + } + + String ret = sig.getReturnType(); + dd = db.getTypeDeprecated(flatten(ret)); + if (dd != null) { + printHasMethodRetType(cf, mname, ret, dd.isForRemoval()); + } + + // check overrides + String overridden = resolveMember(cf, cf.getName(), mname, desc, true, false); + if (overridden != null) { + dd = db.getMethodDeprecated(overridden, mname, desc); + if (dd != null) { + printHasOverriddenMethod(cf, overridden, mname, desc, dd.isForRemoval()); + } + } + } + } + + /** + * Processes a single class file. + * + * @param cf the ClassFile of the class + * @throws ConstantPoolException if a constant pool entry cannot be found + */ + void processClass(ClassFile cf) throws ConstantPoolException { + if (verbose) { + out.println(Messages.get("scan.process.class", cf.getName())); + } + + CPEntries entries = CPEntries.loadFrom(cf); + + checkSuper(cf); + checkInterfaces(cf); + checkTypes(cf, entries); + + for (ConstantPool.CONSTANT_Methodref_info mri : entries.methodRefs) { + CONSTANT_NameAndType_info nti = mri.getNameAndTypeInfo(); + String clname = mri.getClassName(); + checkMethodRef(cf, nti, clname, "scan.out.usesmethodintype", "scan.out.usesmethod"); + } + + for (ConstantPool.CONSTANT_InterfaceMethodref_info imri : entries.intfMethodRefs) { + CONSTANT_NameAndType_info nti = imri.getNameAndTypeInfo(); + String clname = imri.getClassName(); + checkMethodRef(cf, nti, clname, "scan.out.usesintfmethodintype", "scan.out.usesintfmethod"); + } + + for (ConstantPool.CONSTANT_Fieldref_info fri : entries.fieldRefs) { + checkFieldRef(cf, fri); + } + + checkFields(cf); + checkMethods(cf); + } + + /** + * Scans a jar file for uses of deprecated APIs. + * + * @param jarname the jar file to process + * @return true on success, false on failure + */ + public boolean scanJar(String jarname) { + try (JarFile jf = new JarFile(jarname)) { + finder.addJar(jarname); + Enumeration entries = jf.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String name = entry.getName(); + if (name.endsWith(".class") + && !name.endsWith("package-info.class") + && !name.endsWith("module-info.class")) { + processClass(ClassFile.read(jf.getInputStream(entry))); + } + } + return true; + } catch (IOException | ConstantPoolException ex) { + printException(ex); + return false; + } + } + + /** + * Scans class files in the named directory hierarchy for uses of deprecated APIs. + * + * @param dirname the directory hierarchy to process + * @return true on success, false on failure + */ + public boolean scanDir(String dirname) { + Path base = Paths.get(dirname); + int baseCount = base.getNameCount(); + finder.addDir(dirname); + try (Stream paths = Files.walk(Paths.get(dirname))) { + List classes = + paths.filter(p -> p.getNameCount() > baseCount) + .filter(path -> path.toString().endsWith(".class")) + .filter(path -> !path.toString().endsWith("package-info.class")) + .filter(path -> !path.toString().endsWith("module-info.class")) + .collect(Collectors.toList()); + for (Path p : classes) { + processClass(ClassFile.read(p)); + } + return true; + } catch (IOException | ConstantPoolException ex) { + printException(ex); + return false; + } + } + + /** + * Scans the named class for uses of deprecated APIs. + * + * @param className the class to scan + * @return true on success, false on failure + */ + public boolean processClassName(String className) { + try { + ClassFile cf = finder.find(className); + if (cf == null) { + err("can't find class %s", className); + return false; + } else { + processClass(cf); + return true; + } + } catch (ConstantPoolException ex) { + printException(ex); + return false; + } + } +} diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ExternalEditor.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ExternalEditor.java index a77a95acca2..e725f9cd161 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ExternalEditor.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ExternalEditor.java @@ -34,6 +34,7 @@ import java.nio.file.Path; import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.util.Arrays; +import java.util.Scanner; import java.util.function.Consumer; import java.util.stream.Collectors; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; @@ -46,17 +47,22 @@ import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; public class ExternalEditor { private final Consumer errorHandler; private final Consumer saveHandler; + private final Consumer printHandler; private final IOContext input; + private final boolean wait; private WatchService watcher; private Thread watchedThread; private Path dir; private Path tmpfile; - ExternalEditor(Consumer errorHandler, Consumer saveHandler, IOContext input) { + ExternalEditor(Consumer errorHandler, Consumer saveHandler, + IOContext input, boolean wait, Consumer printHandler) { this.errorHandler = errorHandler; this.saveHandler = saveHandler; + this.printHandler = printHandler; this.input = input; + this.wait = wait; } private void edit(String[] cmd, String initialText) { @@ -121,7 +127,16 @@ public class ExternalEditor { try { input.suspend(); Process process = pb.start(); - process.waitFor(); + // wait to exit edit mode in one of these ways... + if (wait) { + // -wait option -- ignore process exit, wait for carriage-return + Scanner scanner = new Scanner(System.in); + printHandler.accept("jshell.msg.press.return.to.leave.edit.mode"); + scanner.nextLine(); + } else { + // wait for process to exit + process.waitFor(); + } } catch (IOException ex) { errorHandler.accept("process IO failure: " + ex.getMessage()); } catch (InterruptedException ex) { @@ -148,8 +163,8 @@ public class ExternalEditor { } static void edit(String[] cmd, Consumer errorHandler, String initialText, - Consumer saveHandler, IOContext input) { - ExternalEditor ed = new ExternalEditor(errorHandler, saveHandler, input); + Consumer saveHandler, IOContext input, boolean wait, Consumer printHandler) { + ExternalEditor ed = new ExternalEditor(errorHandler, saveHandler, input, wait, printHandler); ed.edit(cmd, initialText); } } diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Feedback.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Feedback.java index eedceff6fb2..7f78c2f9962 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Feedback.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Feedback.java @@ -147,17 +147,17 @@ class Feedback { } { - for (FormatCase e : EnumSet.allOf(FormatCase.class)) + for (FormatCase e : FormatCase.all) selectorMap.put(e.name().toLowerCase(Locale.US), e); - for (FormatAction e : EnumSet.allOf(FormatAction.class)) + for (FormatAction e : FormatAction.all) selectorMap.put(e.name().toLowerCase(Locale.US), e); - for (FormatResolve e : EnumSet.allOf(FormatResolve.class)) + for (FormatResolve e : FormatResolve.all) selectorMap.put(e.name().toLowerCase(Locale.US), e); - for (FormatUnresolved e : EnumSet.allOf(FormatUnresolved.class)) + for (FormatUnresolved e : FormatUnresolved.all) selectorMap.put(e.name().toLowerCase(Locale.US), e); - for (FormatErrors e : EnumSet.allOf(FormatErrors.class)) + for (FormatErrors e : FormatErrors.all) selectorMap.put(e.name().toLowerCase(Locale.US), e); - for (FormatWhen e : EnumSet.allOf(FormatWhen.class)) + for (FormatWhen e : FormatWhen.all) selectorMap.put(e.name().toLowerCase(Locale.US), e); } diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java index 0d65fef1455..fa83c0fd40e 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java @@ -94,12 +94,16 @@ import java.util.ResourceBundle; import java.util.Spliterators; import java.util.function.Function; import java.util.function.Supplier; +import jdk.internal.joptsimple.*; import jdk.internal.jshell.tool.Feedback.FormatAction; import jdk.internal.jshell.tool.Feedback.FormatCase; import jdk.internal.jshell.tool.Feedback.FormatErrors; import jdk.internal.jshell.tool.Feedback.FormatResolve; import jdk.internal.jshell.tool.Feedback.FormatUnresolved; import jdk.internal.jshell.tool.Feedback.FormatWhen; +import static java.util.Arrays.asList; +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; import static jdk.jshell.Snippet.SubKind.VAR_VALUE_SUBKIND; import static java.util.stream.Collectors.toMap; @@ -181,6 +185,7 @@ public class JShellTool implements MessageHandler { private String cmdlineClasspath = null; private String startup = null; private String[] editor = null; + private boolean editorWait = false; // Commands and snippets which should be replayed private List replayableHistory; @@ -477,6 +482,11 @@ public class JShellTool implements MessageHandler { if (editorString == null || editorString.isEmpty()) { editor = null; } else { + char waitMarker = editorString.charAt(0); + if (waitMarker == '-' || waitMarker == '*') { + editorWait = waitMarker == '-'; + editorString = editorString.substring(1); + } editor = editorString.split(RECORD_SEPARATOR); } @@ -515,82 +525,91 @@ public class JShellTool implements MessageHandler { * @return the list of files to be loaded */ private List processCommandArgs(String[] args) { - List loadList = new ArrayList<>(); - Iterator ai = Arrays.asList(args).iterator(); - while (ai.hasNext()) { - String arg = ai.next(); - if (arg.startsWith("-")) { - switch (arg) { - case "-classpath": - case "-cp": - if (cmdlineClasspath != null) { - startmsg("jshell.err.opt.classpath.conflict"); - return null; - } - if (ai.hasNext()) { - cmdlineClasspath = ai.next(); - } else { - startmsg("jshell.err.opt.classpath.arg"); - return null; - } - break; - case "-help": - printUsage(); - return null; - case "-version": - cmdout.printf("jshell %s\n", version()); - return null; - case "-fullversion": - cmdout.printf("jshell %s\n", fullVersion()); - return null; - case "-feedback": - if (ai.hasNext()) { - commandLineFeedbackMode = ai.next(); - } else { - startmsg("jshell.err.opt.feedback.arg"); - return null; - } - break; - case "-q": - commandLineFeedbackMode = "concise"; - break; - case "-qq": - commandLineFeedbackMode = "silent"; - break; - case "-v": - commandLineFeedbackMode = "verbose"; - break; - case "-startup": - if (startup != null) { - startmsg("jshell.err.opt.startup.one"); - return null; - } - startup = readFile(ai.hasNext()? ai.next() : null, "-startup"); - if (startup == null) { - return null; - } - break; - case "-nostartup": - if (startup != null) { - startmsg("jshell.err.opt.startup.one"); - return null; - } - startup = ""; - break; - default: - if (arg.startsWith("-R")) { - remoteVMOptions.add(arg.substring(2)); - break; - } - startmsg("jshell.err.opt.unknown", arg); - printUsage(); - return null; - } + OptionParser parser = new OptionParser(); + OptionSpec cp = parser.accepts("class-path").withRequiredArg(); + OptionSpec st = parser.accepts("startup").withRequiredArg(); + parser.acceptsAll(asList("n", "no-startup")); + OptionSpec fb = parser.accepts("feedback").withRequiredArg(); + parser.accepts("q"); + parser.accepts("s"); + parser.accepts("v"); + OptionSpec r = parser.accepts("R").withRequiredArg(); + parser.acceptsAll(asList("h", "help")); + parser.accepts("version"); + parser.accepts("full-version"); + NonOptionArgumentSpec loadFileSpec = parser.nonOptions(); + + OptionSet options; + try { + options = parser.parse(args); + } catch (OptionException ex) { + if (ex.options().isEmpty()) { + startmsg("jshell.err.opt.invalid", stream(args).collect(joining(", "))); } else { - loadList.add(arg); + boolean isKnown = parser.recognizedOptions().containsKey(ex.options().iterator().next()); + startmsg(isKnown + ? "jshell.err.opt.arg" + : "jshell.err.opt.unknown", + ex.options() + .stream() + .collect(joining(", "))); } + return null; } - return loadList; + + if (options.has("help")) { + printUsage(); + return null; + } + if (options.has("version")) { + cmdout.printf("jshell %s\n", version()); + return null; + } + if (options.has("full-version")) { + cmdout.printf("jshell %s\n", fullVersion()); + return null; + } + if (options.has(cp)) { + List cps = options.valuesOf(cp); + if (cps.size() > 1) { + startmsg("jshell.err.opt.one", "--class-path"); + return null; + } + cmdlineClasspath = cps.get(0); + } + if (options.has(st)) { + List sts = options.valuesOf(st); + if (sts.size() != 1 || options.has("no-startup")) { + startmsg("jshell.err.opt.startup.one"); + return null; + } + startup = readFile(sts.get(0), "--startup"); + if (startup == null) { + return null; + } + } else if (options.has("no-startup")) { + startup = ""; + } + if ((options.valuesOf(fb).size() + + (options.has("q") ? 1 : 0) + + (options.has("s") ? 1 : 0) + + (options.has("v") ? 1 : 0)) > 1) { + startmsg("jshell.err.opt.feedback.one"); + return null; + } else if (options.has(fb)) { + commandLineFeedbackMode = options.valueOf(fb); + } else if (options.has("q")) { + commandLineFeedbackMode = "concise"; + } else if (options.has("s")) { + commandLineFeedbackMode = "silent"; + } else if (options.has("v")) { + commandLineFeedbackMode = "verbose"; + } + if (options.has(r)) { + remoteVMOptions = options.valuesOf(r); + } + + return options.valuesOf(loadFileSpec); } private void printUsage() { @@ -686,7 +705,7 @@ public class JShellTool implements MessageHandler { } if (commandLineFeedbackMode != null) { // The feedback mode to use was specified on the command line, use it - if (!feedback.setFeedback(initmh, new ArgTokenizer("-feedback", commandLineFeedbackMode))) { + if (!feedback.setFeedback(initmh, new ArgTokenizer("--feedback", commandLineFeedbackMode))) { regenerateOnDeath = false; } commandLineFeedbackMode = null; @@ -1247,7 +1266,7 @@ public class JShellTool implements MessageHandler { // retain editor setting prefs.put(EDITOR_KEY, (editor == null) ? "" - : String.join(RECORD_SEPARATOR, editor)); + : (editorWait? "-" : "*") + String.join(RECORD_SEPARATOR, editor)); return true; case "start": { if (!setStart(cmd, at, false)) { @@ -1302,7 +1321,7 @@ public class JShellTool implements MessageHandler { // The sub-command: /set editor > boolean setEditor(ArgTokenizer at, boolean argsRequired) { - at.allowedOptions("-default"); + at.allowedOptions("-default", "-wait"); String prog = at.next(); List ed = new ArrayList<>(); while (at.val() != null) { @@ -1313,14 +1332,20 @@ public class JShellTool implements MessageHandler { return false; } boolean defaultOption = at.hasOption("-default"); + boolean waitOption = at.hasOption("-wait"); if (prog != null) { if (defaultOption) { errormsg("jshell.err.default.option.or.program", at.whole()); return false; } editor = ed.toArray(new String[ed.size()]); + editorWait = waitOption; fluffmsg("jshell.msg.set.editor.set", prog); } else if (defaultOption) { + if (waitOption) { + errormsg("jshell.err.wait.applies.to.external.editor", at.whole()); + return false; + } editor = null; } else if (argsRequired) { errormsg("jshell.err.set.editor.arg"); @@ -1707,7 +1732,8 @@ public class JShellTool implements MessageHandler { return false; } } else { - ExternalEditor.edit(editor, errorHandler, src, saveHandler, input); + ExternalEditor.edit(editor, errorHandler, src, saveHandler, input, + editorWait, this::hardrb); } return true; } diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties index da44d078219..7f7f12c0433 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties @@ -26,10 +26,11 @@ jshell.msg.welcome =\ Welcome to JShell -- Version {0}\n\ For an introduction type: /help intro\n -jshell.err.opt.classpath.conflict = Conflicting -classpath option. -jshell.err.opt.classpath.arg = Argument to -classpath missing. -jshell.err.opt.feedback.arg = Argument to -feedback missing. Mode required. -jshell.err.opt.startup.one = Only one -startup or -nostartup option may be used. +jshell.err.opt.arg = Argument to {0} missing. +jshell.err.opt.invalid = Invalid options: {0}. +jshell.err.opt.one = Only one {0} option may be used. +jshell.err.opt.startup.one = Only one --startup or --no-startup option may be used. +jshell.err.opt.feedback.one = Only one feedback option (--feedback, -q, -s, or -v) may be used. jshell.err.opt.unknown = Unknown option: {0} jshell.msg.terminated =\ @@ -55,6 +56,8 @@ jshell.err.set.editor.arg = The ''/set editor'' command requires a path argument jshell.msg.set.editor.set = Editor set to: {0} jshell.err.cant.launch.editor = Cannot launch editor -- unexpected exception: {0} jshell.msg.try.set.editor = Try /set editor to use external editor. +jshell.msg.press.return.to.leave.edit.mode = Press return to leave edit mode. +jshell.err.wait.applies.to.external.editor = -wait applies to external editors, cannot be used with -default jshell.msg.try.command.without.args = Try ''{0}'' without arguments. jshell.msg.no.active = There are no active definitions. @@ -148,22 +151,21 @@ jshell.console.incomplete = \nResults may be incomplete; try again later for com help.usage = \ Usage: jshell \n\ where possible options include:\n\ -\ -classpath Specify where to find user class files\n\ -\ -cp Specify where to find user class files\n\ -\ -startup One run replacement for the start-up definitions\n\ -\ -nostartup Do not run the start-up definitions\n\ -\ -feedback Specify the initial feedback mode. The mode may be\n\ -\ predefined (silent, concise, normal, or verbose) or\n\ -\ previously user-defined\n\ -\ -q Quiet feedback. Same as: -feedback concise\n\ -\ -qq Really quiet feedback. Same as: -feedback silent\n\ -\ -v Verbose feedback. Same as: -feedback verbose\n\ -\ -J Pass directly to the runtime system.\n\ -\ Use one -J for each runtime flag or flag argument\n\ -\ -R Pass to the remote runtime system.\n\ -\ Use one -R for each remote flag or flag argument\n\ -\ -help Print this synopsis of standard options\n\ -\ -version Version information\n +\ --class-path Specify where to find user class files\n\ +\ --startup One run replacement for the start-up definitions\n\ +\ --no-startup Do not run the start-up definitions\n\ +\ --feedback Specify the initial feedback mode. The mode may be\n\ +\ predefined (silent, concise, normal, or verbose) or\n\ +\ previously user-defined\n\ +\ -q Quiet feedback. Same as: --feedback concise\n\ +\ -s Really quiet feedback. Same as: --feedback silent\n\ +\ -v Verbose feedback. Same as: --feedback verbose\n\ +\ -J Pass directly to the runtime system.\n\ +\ Use one -J for each runtime flag or flag argument\n\ +\ -R Pass to the remote runtime system.\n\ +\ Use one -R for each remote flag or flag argument\n\ +\ --help Print this synopsis of standard options\n\ +\ --version Version information\n help.list.summary = list the source you have typed help.list.args = [|-all|-start] @@ -358,7 +360,7 @@ Set jshell configuration information, including:\n\ the external editor to use, the start-up definitions to use, a new feedback mode,\n\ the command prompt, the feedback mode to use, or the format of output.\n\ \n\ -/set editor ...\n\t\ +/set editor [-wait] ...\n\t\ Specify the command to launch for the /edit command.\n\t\ The is an operating system dependent string.\n\n\ /set start \n\t\ @@ -602,12 +604,19 @@ The continuation-prompt is used on the second and subsequent lines of a multi-li help.set.editor =\ Specify the command to launch for the /edit command.\n\ \n\t\ -/set editor |-default\n\ +/set editor [-wait] |-default\n\ \n\ The is an operating system dependent string.\n\ -The may include space-separated arguments (such as flags)\n\ -When /edit is used, the temporary file to edit will be appended as the last argument.\n\ -If instead the -default option is specified, the built-in default editor will be used. +The may include space-separated arguments (such as flags)\n\n\ +If the -default option is specified, the built-in default editor will be used.\n\n\ +Otherwise an external editor should be specified in . When \n\ +is used, the temporary file to edit will be appended as the last argument.\n\ +Normally, edit mode will last until the external editor exits. Some external editors\n\ +will exit immediately (for example, if the edit window exists) either external editor\n\ +flags should be used to prevent immediate exit, or the -wait option should be used to\n\ +prompt the user to indicate when edit mode should end.\n\n\ +Note: while in edit mode no command inputs are seen. After leaving edit mode changes\n\ +to the edited snippets are not seen. help.set.start =\ Set the start-up configuration -- a sequence of snippets and commands read at start-up.\n\ diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/MemoryFileManager.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/MemoryFileManager.java index 26f43fc5c15..3655b64aad4 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/MemoryFileManager.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/MemoryFileManager.java @@ -52,8 +52,6 @@ import javax.tools.SimpleJavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; -import com.sun.tools.javac.util.DefinedBy; -import com.sun.tools.javac.util.DefinedBy.Api; import static jdk.internal.jshell.debug.InternalDebugControl.DBG_FMGR; @@ -71,8 +69,6 @@ class MemoryFileManager implements JavaFileManager { private ClassFileCreationListener classListener = null; - private final ClassLoader loader = new REPLClassLoader(); - private final JShell proc; // Upcoming Jigsaw @@ -105,7 +101,7 @@ class MemoryFileManager implements JavaFileManager { return origin; } - @Override @DefinedBy(Api.COMPILER) + @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { return src; } @@ -148,7 +144,7 @@ class MemoryFileManager implements JavaFileManager { } } - @Override @DefinedBy(Api.COMPILER) + @Override public String getName() { return className; } @@ -157,32 +153,17 @@ class MemoryFileManager implements JavaFileManager { * Will provide the compiler with an output stream that leads to our * byte array. */ - @Override @DefinedBy(Api.COMPILER) + @Override public OutputStream openOutputStream() throws IOException { return bos; } - @Override @DefinedBy(Api.COMPILER) + @Override public InputStream openInputStream() throws IOException { return new ByteArrayInputStream(getBytes()); } } - // For restoring process-local execution support - class REPLClassLoader extends ClassLoader { - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - OutputMemoryJavaFileObject fo = classObjects.get(name); - proc.debug(DBG_FMGR, "findClass %s = %s\n", name, fo); - if (fo == null) { - throw new ClassNotFoundException("Not ours"); - } - byte[] b = fo.getBytes(); - return super.defineClass(name, b, 0, b.length, null); - } - } - public MemoryFileManager(StandardJavaFileManager standardManager, JShell proc) { this.stdFileManager = standardManager; this.proc = proc; @@ -199,39 +180,11 @@ class MemoryFileManager implements JavaFileManager { } } - // For restoring process-local execution support - public Class findGeneratedClass(String genClassFullName) throws ClassNotFoundException { - for (OutputMemoryJavaFileObject co : generatedClasses()) { - if (co.className.equals(genClassFullName)) { - Class klass = loadClass(co.className); - proc.debug(DBG_FMGR, "Loaded %s\n", klass); - return klass; - } - } - return null; - } - - // For restoring process-local execution support - public byte[] findGeneratedBytes(String genClassFullName) throws ClassNotFoundException { - for (OutputMemoryJavaFileObject co : generatedClasses()) { - if (co.className.equals(genClassFullName)) { - return co.getBytes(); - } - } - return null; - } - - // For restoring process-local execution support - public Class loadClass(String name) throws ClassNotFoundException { - return getClassLoader(null).loadClass(name); - } - public JavaFileObject createSourceFileObject(Object origin, String name, String code) { return new SourceMemoryJavaFileObject(origin, name, code); } // Make compatible with Jigsaw - @DefinedBy(Api.COMPILER) public String inferModuleName(Location location) { try { if (inferModuleNameMethod == null) { @@ -250,7 +203,6 @@ class MemoryFileManager implements JavaFileManager { } // Make compatible with Jigsaw - @DefinedBy(Api.COMPILER) public Iterable> listModuleLocations(Location location) throws IOException { try { if (listModuleLocationsMethod == null) { @@ -285,10 +237,10 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public ClassLoader getClassLoader(JavaFileManager.Location location) { proc.debug(DBG_FMGR, "getClassLoader: location\n", location); - return loader; + return stdFileManager.getClassLoader(location); } /** @@ -311,7 +263,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public Iterable list(JavaFileManager.Location location, String packageName, Set kinds, @@ -368,7 +320,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public String inferBinaryName(JavaFileManager.Location location, JavaFileObject file) { if (file instanceof OutputMemoryJavaFileObject) { OutputMemoryJavaFileObject ofo = (OutputMemoryJavaFileObject) file; @@ -392,7 +344,7 @@ class MemoryFileManager implements JavaFileManager { * were created with another file manager and this file manager * does not support foreign file objects */ - @Override @DefinedBy(Api.COMPILER) + @Override public boolean isSameFile(FileObject a, FileObject b) { return stdFileManager.isSameFile(b, b); } @@ -405,7 +357,7 @@ class MemoryFileManager implements JavaFileManager { * @return the number of arguments the given option takes or -1 if * the option is not supported */ - @Override @DefinedBy(Api.COMPILER) + @Override public int isSupportedOption(String option) { proc.debug(DBG_FMGR, "isSupportedOption: %s\n", option); return stdFileManager.isSupportedOption(option); @@ -425,7 +377,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public boolean handleOption(String current, Iterator remaining) { proc.debug(DBG_FMGR, "handleOption: current: %s\n", current + ", remaining: " + remaining); @@ -438,7 +390,7 @@ class MemoryFileManager implements JavaFileManager { * @param location a location * @return true if the location is known */ - @Override @DefinedBy(Api.COMPILER) + @Override public boolean hasLocation(JavaFileManager.Location location) { proc.debug(DBG_FMGR, "hasLocation: location: %s\n", location); return stdFileManager.hasLocation(location); @@ -474,7 +426,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public JavaFileObject getJavaFileForInput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind) @@ -514,7 +466,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, Kind kind, FileObject sibling) throws IOException { @@ -567,7 +519,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public FileObject getFileForInput(JavaFileManager.Location location, String packageName, String relativeName) @@ -616,7 +568,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IllegalStateException if {@link #close} has been called * and this file manager cannot be reopened */ - @Override @DefinedBy(Api.COMPILER) + @Override public FileObject getFileForOutput(JavaFileManager.Location location, String packageName, String relativeName, @@ -636,7 +588,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IOException if an I/O error occurred * @see #close */ - @Override @DefinedBy(Api.COMPILER) + @Override public void flush() throws IOException { // Nothing to flush } @@ -652,7 +604,7 @@ class MemoryFileManager implements JavaFileManager { * @throws IOException if an I/O error occurred * @see #flush */ - @Override @DefinedBy(Api.COMPILER) + @Override public void close() throws IOException { // Nothing to close } diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java index 0c2d85d0d69..090bfb6d969 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java @@ -55,8 +55,6 @@ import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.code.Symtab; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.util.DefinedBy; -import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Pair; @@ -534,7 +532,7 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { TreePath[] deepest = new TreePath[1]; new TreePathScanner() { - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void scan(Tree tree, Void p) { if (tree == null) return null; @@ -552,7 +550,7 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { return null; } - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitErroneous(ErroneousTree node, Void p) { return scan(node.getErrorTrees(), null); } @@ -1250,7 +1248,7 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis { Trees trees = Trees.instance(source.fst); new TreePathScanner() { - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitMethod(MethodTree node, Void p) { Element currentMethod = trees.getElement(getCurrentPath()); diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDependencyScanner.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDependencyScanner.java index 5c5840ff080..5dc9e6663c6 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDependencyScanner.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDependencyScanner.java @@ -34,8 +34,6 @@ import com.sun.source.tree.PackageTree; import com.sun.source.tree.Tree; import com.sun.source.tree.VariableTree; import com.sun.source.util.TreeScanner; -import com.sun.tools.javac.util.DefinedBy; -import com.sun.tools.javac.util.DefinedBy.Api; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -67,7 +65,7 @@ class TreeDependencyScanner extends TreeScanner> { // -- Differentiate declaration references from body references --- - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitClass(ClassTree node, Set p) { scan(node.getModifiers(), p); scan(node.getTypeParameters(), p); @@ -77,7 +75,7 @@ class TreeDependencyScanner extends TreeScanner> { return null; } - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitMethod(MethodTree node, Set p) { scan(node.getModifiers(), p); scan(node.getReturnType(), p); @@ -90,7 +88,7 @@ class TreeDependencyScanner extends TreeScanner> { return null; } - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitVariable(VariableTree node, Set p) { scan(node.getModifiers(), p); scan(node.getType(), p); @@ -101,12 +99,12 @@ class TreeDependencyScanner extends TreeScanner> { // --- Ignore these --- - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitPackage(PackageTree node, Set p) { return null; } - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitImport(ImportTree node, Set p) { return null; } @@ -114,13 +112,13 @@ class TreeDependencyScanner extends TreeScanner> { // -- Actual Symbol names --- - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitMemberSelect(MemberSelectTree node, Set p) { add(p, node.getIdentifier()); return super.visitMemberSelect(node, p); } - @Override @DefinedBy(Api.COMPILER_TREE) + @Override public Void visitIdentifier(IdentifierTree node, Set p) { add(p, node.getName()); return super.visitIdentifier(node, p); diff --git a/langtools/src/jdk.jshell/share/classes/module-info.java b/langtools/src/jdk.jshell/share/classes/module-info.java index b6c1b522bbc..b9c6e5e2b26 100644 --- a/langtools/src/jdk.jshell/share/classes/module-info.java +++ b/langtools/src/jdk.jshell/share/classes/module-info.java @@ -34,6 +34,7 @@ module jdk.jshell { requires java.prefs; requires jdk.compiler; requires jdk.internal.le; + requires jdk.internal.opt; requires jdk.jdi; exports jdk.jshell; diff --git a/langtools/test/ProblemList.txt b/langtools/test/ProblemList.txt index 9a85f8b3d9e..a90395e8734 100644 --- a/langtools/test/ProblemList.txt +++ b/langtools/test/ProblemList.txt @@ -30,6 +30,7 @@ jdk/javadoc/tool/VerifyLocale.java jdk/javadoc/tool/enum/docComments/Main.java 8152313 generic-all convert to doclet test framework jdk/javadoc/tool/enum/enumType/Main.java 8152313 generic-all convert to doclet test framework jdk/javadoc/tool/varArgs/Main.java 8152313 generic-all convert to doclet test framework +jdk/javadoc/doclet/testIOException/TestIOException.java 8164597 windows-all ########################################################################### # @@ -77,3 +78,9 @@ tools/sjavac/ClasspathDependencies.java 8158002 generic-all Requires i # # jdeps +########################################################################### +# +# jdeprscan + +tools/jdeprscan/tests/jdk/jdeprscan/TestLoad.java 8164837 windows-all probably line breaks or encoding +tools/jdeprscan/tests/jdk/jdeprscan/TestScan.java 8164837 windows-all probably line breaks or encoding diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/TestCopyFiles.java b/langtools/test/jdk/javadoc/doclet/testCopyFiles/TestCopyFiles.java new file mode 100644 index 00000000000..1bc03c87bb4 --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/TestCopyFiles.java @@ -0,0 +1,98 @@ +/* + * 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 8157349 + * @summary test copy of doc-files + * @library ../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build JavadocTester + * @run main TestCopyFiles + */ + +public class TestCopyFiles extends JavadocTester { + + public static void main(String... args) throws Exception { + TestCopyFiles tester = new TestCopyFiles(); + tester.runTests(); + } + + @Test + void testDocFilesInModules() { + javadoc("-d", "modules-out", + "--module-source-path", testSrc("modules"), + "--module", "acme.mdle"); + checkExit(Exit.OK); + checkOutput("p/doc-files/inpackage.html", true, + "In a named module and named package" + ); + } + + @Test + void testDocFilesInPackages() { + javadoc("-d", "packages-out", + "-sourcepath", testSrc("packages"), + "p1"); + checkExit(Exit.OK); + checkOutput("p1/doc-files/inpackage.html", true, + "A named package in an unnamed module" + ); + } + + @Test + void testDocFilesInUnnamedPackages() { + javadoc("-d", "unnamed-out", + "-sourcepath", testSrc("unnamed"), + testSrc("unnamed/Foo.java") + ); + checkExit(Exit.OK); + checkOutput("doc-files/inpackage.html", true, + "In an unnamed package" + ); + } + + @Test + void testDocFilesInPackagesSource7() { + javadoc("-d", "packages-out-src7", + "-source", "7", + "-sourcepath", testSrc("packages"), + "p1"); + checkExit(Exit.OK); + checkOutput("p1/doc-files/inpackage.html", true, + "A named package in an unnamed module" + ); + } + + @Test + void testDocFilesInPackagesSource7UsingClassPath() { + javadoc("-d", "packages-out-src7-cp", + "-source", "7", + "-classpath", testSrc("packages"), + "p1"); + checkExit(Exit.OK); + checkOutput("p1/doc-files/inpackage.html", true, + "A named package in an unnamed module" + ); + } +} diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/module-info.java b/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/module-info.java new file mode 100644 index 00000000000..3b24d984582 --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/module-info.java @@ -0,0 +1,31 @@ +/* + * 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. + */ + + /** + * A test module. + */ +module acme.mdle { + exports p; +} diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java b/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java new file mode 100644 index 00000000000..e12c8d27504 --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java @@ -0,0 +1,31 @@ +/* + * 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 p; + +/** + * A test class. + */ +public class Foo {} diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/doc-files/inpackage.html b/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/doc-files/inpackage.html new file mode 100644 index 00000000000..c5a0ddb575f --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/doc-files/inpackage.html @@ -0,0 +1,33 @@ + + + + + "Hello World" + + + In a named module and named package + + diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/packages/p1/Foo.java b/langtools/test/jdk/javadoc/doclet/testCopyFiles/packages/p1/Foo.java new file mode 100644 index 00000000000..8e1960b5788 --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/packages/p1/Foo.java @@ -0,0 +1,34 @@ +/* + * 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. + */ + + /** + * A test class. + */ +package p1; + +/** + * A test class. + */ +public class Foo {} diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/packages/p1/doc-files/inpackage.html b/langtools/test/jdk/javadoc/doclet/testCopyFiles/packages/p1/doc-files/inpackage.html new file mode 100644 index 00000000000..4879d78d5a4 --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/packages/p1/doc-files/inpackage.html @@ -0,0 +1,33 @@ + + + + + "Hello World" + + + A named package in an unnamed module. + + diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/unnamed/Foo.java b/langtools/test/jdk/javadoc/doclet/testCopyFiles/unnamed/Foo.java new file mode 100644 index 00000000000..48210d11a77 --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/unnamed/Foo.java @@ -0,0 +1,33 @@ +/* + * 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. + */ + + /** + * A test class. + */ + +/** + * A test class. + */ +public class Foo {} diff --git a/langtools/test/jdk/javadoc/doclet/testCopyFiles/unnamed/doc-files/inpackage.html b/langtools/test/jdk/javadoc/doclet/testCopyFiles/unnamed/doc-files/inpackage.html new file mode 100644 index 00000000000..5321e80d86b --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testCopyFiles/unnamed/doc-files/inpackage.html @@ -0,0 +1,33 @@ + + + + + "Hello World" + + + In an unnamed package + + diff --git a/langtools/test/jdk/javadoc/doclet/testFramesNoFrames/TestFramesNoFrames.java b/langtools/test/jdk/javadoc/doclet/testFramesNoFrames/TestFramesNoFrames.java index c9a6f1aa5b2..bb3fee6849e 100644 --- a/langtools/test/jdk/javadoc/doclet/testFramesNoFrames/TestFramesNoFrames.java +++ b/langtools/test/jdk/javadoc/doclet/testFramesNoFrames/TestFramesNoFrames.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8162353 + * @bug 8162353 8164747 * @summary javadoc should provide a way to disable use of frames * @library /tools/lib ../lib * @modules @@ -204,7 +204,7 @@ public class TestFramesNoFrames extends JavadocTester { @Test void testModules(Path base, FrameKind fKind, OverviewKind oKind, HtmlKind hKind) throws IOException { javadoc(base, fKind, oKind, hKind, - "-modulesourcepath", gensrcModules.toString(), + "--module-source-path", gensrcModules.toString(), "--module", "m1,m2,m3"); new Checker(fKind, oKind, hKind) @@ -283,6 +283,19 @@ public class TestFramesNoFrames extends JavadocTester { // this file is only generated when not in frames mode checkFiles(!frames, "allclasses.html"); + + if (frames) { + checkOutput("allclasses-frame.html", true, + classes.stream() + .map(c -> "title=\"class in " + packagePart(c) + "\" target=\"classFrame\">" + classPart(c) + "") + .toArray(String[]::new)); + checkOutput("allclasses-noframe.html", false, + "target=\"classFrame\">"); + } else { + checkOutput("allclasses.html", false, + "target=\"classFrame\">"); + + } } private void checkFrameFiles() { @@ -367,6 +380,11 @@ public class TestFramesNoFrames extends JavadocTester { .count(); } + private String classPart(String className) { + int lastDot = className.lastIndexOf("."); + return className.substring(lastDot + 1); + } + private String packagePart(String className) { int slash = className.indexOf("/"); int lastDot = className.lastIndexOf("."); diff --git a/langtools/test/jdk/javadoc/doclet/testIOException/TestIOException.java b/langtools/test/jdk/javadoc/doclet/testIOException/TestIOException.java new file mode 100644 index 00000000000..792baa0627c --- /dev/null +++ b/langtools/test/jdk/javadoc/doclet/testIOException/TestIOException.java @@ -0,0 +1,179 @@ +/* + * 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 8164130 + * @summary test IOException handling + * @library ../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build JavadocTester + * @run main TestIOException + */ + +import java.io.File; +import java.io.FileWriter; + +public class TestIOException extends JavadocTester { + + public static void main(String... args) throws Exception { + TestIOException tester = new TestIOException(); + tester.runTests(); + } + + @Test + void testReadOnlyDirectory() { + File outDir = new File("out1"); + if (!outDir.mkdir()) { + throw new Error("Cannot create directory"); + } + if (!outDir.setReadOnly()) { + throw new Error("could not set directory read-only"); + } + if (outDir.canWrite()) { + throw new Error("directory is writable"); + } + + try { + javadoc("-d", outDir.toString(), + new File(testSrc, "TestIOException.java").getPath()); + checkExit(Exit.FAILED); + checkOutput(Output.OUT, true, + "Destination directory not writable: " + outDir); + } finally { + outDir.setWritable(true); + } + } + + @Test + void testReadOnlyFile() throws Exception { + File outDir = new File("out2"); + if (!outDir.mkdir()) { + throw new Error("Cannot create directory"); + } + File index = new File(outDir, "index.html"); + try (FileWriter fw = new FileWriter(index)) { } + if (!index.setReadOnly()) { + throw new Error("could not set index read-only"); + } + if (index.canWrite()) { + throw new Error("index is writable"); + } + + try { + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outDir.toString(), + new File(testSrc, "TestIOException.java").getPath()); + + checkExit(Exit.FAILED); + checkOutput(Output.OUT, true, + "Error writing file: " + index); + } finally { + setOutputDirectoryCheck(DirectoryCheck.EMPTY); + index.setWritable(true); + } + } + + @Test + void testReadOnlySubdirectory() throws Exception { + // init source file + File srcDir = new File("src4"); + File src_p = new File(srcDir, "p"); + src_p.mkdirs(); + File src_p_C = new File(src_p, "C.java"); + try (FileWriter fw = new FileWriter(src_p_C)) { + fw.write("package p; public class C { }"); + } + + // create an unwritable package output directory + File outDir = new File("out3"); + File pkgOutDir = new File(outDir, "p"); + if (!pkgOutDir.mkdirs()) { + throw new Error("Cannot create directory"); + } + if (!pkgOutDir.setReadOnly()) { + throw new Error("could not set directory read-only"); + } + if (pkgOutDir.canWrite()) { + throw new Error("directory is writable"); + } + + // run javadoc and check results + try { + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outDir.toString(), + src_p_C.getPath()); + checkExit(Exit.FAILED); + checkOutput(Output.OUT, true, + "Error writing file: " + new File(pkgOutDir, "C.html")); + } finally { + setOutputDirectoryCheck(DirectoryCheck.EMPTY); + pkgOutDir.setWritable(true); + } + } + + @Test + void testReadOnlyDocFilesDir() throws Exception { + // init source files + File srcDir = new File("src4"); + File src_p = new File(srcDir, "p"); + src_p.mkdirs(); + File src_p_C = new File(src_p, "C.java"); + try (FileWriter fw = new FileWriter(src_p_C)) { + fw.write("package p; public class C { }"); + } + File src_p_docfiles = new File(src_p, "doc-files"); + src_p_docfiles.mkdir(); + try (FileWriter fw = new FileWriter(new File(src_p_docfiles, "info.txt"))) { + fw.write("info"); + } + + // create an unwritable doc-files output directory + File outDir = new File("out4"); + File pkgOutDir = new File(outDir, "p"); + File docFilesOutDir = new File(pkgOutDir, "doc-files"); + if (!docFilesOutDir.mkdirs()) { + throw new Error("Cannot create directory"); + } + if (!docFilesOutDir.setReadOnly()) { + throw new Error("could not set directory read-only"); + } + if (docFilesOutDir.canWrite()) { + throw new Error("directory is writable"); + } + + try { + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outDir.toString(), + "-sourcepath", srcDir.getPath(), + "p"); + checkExit(Exit.FAILED); + checkOutput(Output.OUT, true, + "Error writing file: " + new File(docFilesOutDir, "info.txt")); + } finally { + setOutputDirectoryCheck(DirectoryCheck.EMPTY); + docFilesOutDir.setWritable(true); + } + } +} + diff --git a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java index 5498f5154d1..79e166c9b8f 100644 --- a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java +++ b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java @@ -160,8 +160,8 @@ public class TestModules extends JavadocTester { @Test void testModuleSummary() { javadoc("-d", "out-moduleSummary", "-use", - "-modulesourcepath", testSrc, - "-addmods", "module1,module2", + "--module-source-path", testSrc, + "--add-modules", "module1,module2", "testpkgmdl1", "testpkgmdl2", "module2/testpkg2mdl2"); checkExit(Exit.OK); checkModuleSummary(); @@ -174,8 +174,8 @@ public class TestModules extends JavadocTester { @Test void testModuleFilesAndLinks() { javadoc("-d", "out-modulelinks", - "-modulesourcepath", testSrc, - "-addmods", "module1", + "--module-source-path", testSrc, + "--add-modules", "module1", "testpkgmdl1"); checkExit(Exit.OK); checkModuleFilesAndLinks(true); diff --git a/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/typeannos/RepeatedAnnotations.java b/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/typeannos/RepeatedAnnotations.java index 75bedba621e..b7c432ee3ac 100644 --- a/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/typeannos/RepeatedAnnotations.java +++ b/langtools/test/jdk/javadoc/doclet/testTypeAnnotations/typeannos/RepeatedAnnotations.java @@ -8,7 +8,7 @@ * * 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 RepeatingA PARTICULAR PURPOSE. See the GNU General Public License + * 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). * diff --git a/langtools/test/jdk/javadoc/tool/modules/FilterOptions.java b/langtools/test/jdk/javadoc/tool/modules/FilterOptions.java index 0962c12a5a8..28e01da29c8 100644 --- a/langtools/test/jdk/javadoc/tool/modules/FilterOptions.java +++ b/langtools/test/jdk/javadoc/tool/modules/FilterOptions.java @@ -27,7 +27,6 @@ * @summary Tests elements filtering options * @modules * jdk.javadoc/jdk.javadoc.internal.api - * jdk.javadoc/jdk.javadoc.internal.doclets.standard * jdk.javadoc/jdk.javadoc.internal.tool * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -60,7 +59,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testDefault(Path base) throws Exception { - execTask("-modulesourcepath", src, "--module", "m1"); + execTask("--module-source-path", src, "--module", "m1"); checkModulesSpecified("m1"); checkModulesIncluded("m1"); @@ -70,7 +69,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testModuleModeApi(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-module-contents:api"); checkModuleMode("API"); @@ -78,7 +77,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testModuleModeAll(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-module-contents:all"); checkModuleMode("ALL"); @@ -86,7 +85,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowPackagesExported(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-packages:exported"); // default @@ -98,7 +97,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowPackagesAll(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-packages:all"); checkModulesSpecified("m1"); @@ -111,7 +110,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowTypesPrivate(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-types:private"); @@ -128,7 +127,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowTypesPackage(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-types:package"); @@ -144,7 +143,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowTypesProtected(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-types:protected"); @@ -161,7 +160,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowTypesPublic(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-types:public"); @@ -178,7 +177,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowMembersPrivate(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-members:private"); @@ -187,7 +186,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowMembersPackage(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-members:package"); @@ -196,7 +195,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowMembersProtected(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-members:protected"); @@ -205,7 +204,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testShowMembersPublic(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "--show-members:public"); @@ -214,7 +213,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testLegacyPublic(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "-public"); @@ -229,7 +228,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testLegacyDefault(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1"); checkModuleMode("API"); @@ -243,7 +242,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testLegacyProtected(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "-protected"); @@ -258,7 +257,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testLegacyPackage(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "-package"); @@ -277,7 +276,7 @@ public class FilterOptions extends ModuleTestBase { @Test public void testLegacyPrivate(Path base) throws Exception { - execTask("-modulesourcepath", src, + execTask("--module-source-path", src, "--module", "m1", "-private"); diff --git a/langtools/test/jdk/javadoc/tool/modules/Modules.java b/langtools/test/jdk/javadoc/tool/modules/Modules.java index 5339933967a..496a8e2c3cb 100644 --- a/langtools/test/jdk/javadoc/tool/modules/Modules.java +++ b/langtools/test/jdk/javadoc/tool/modules/Modules.java @@ -27,7 +27,6 @@ * @summary Tests primarily the module graph computations. * @modules * jdk.javadoc/jdk.javadoc.internal.api - * jdk.javadoc/jdk.javadoc.internal.doclets.standard * jdk.javadoc/jdk.javadoc.internal.tool * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -58,7 +57,7 @@ public class Modules extends ModuleTestBase { .classes("package pub; /** Klass A */ public class A {}") .classes("package pro; /** Klass B */ public class B {}") .write(src); - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "--module", "m1"); checkModulesSpecified("m1"); checkPackagesIncluded("pub"); @@ -83,7 +82,7 @@ public class Modules extends ModuleTestBase { .classes("package m2pub; /** Klass A */ public class A {}") .classes("package m2pro; /** Klass B */ public class B {}") .write(src); - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "--module", "m1,m2"); checkModulesSpecified("m1", "m2"); checkPackagesIncluded("m1pub", "m2pub"); @@ -109,7 +108,7 @@ public class Modules extends ModuleTestBase { .classes("package m2pub; /** Klass A */ public class A {}") .classes("package m2pro; /** Klass B */ public class B {}") .write(src); - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "--module", "m1", "--module", "m2"); checkModulesSpecified("m1", "m2"); @@ -152,7 +151,7 @@ public class Modules extends ModuleTestBase { .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") .write(src); - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "--module", "M"); checkModulesSpecified("M"); @@ -176,7 +175,7 @@ public class Modules extends ModuleTestBase { .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") .write(src); - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "--module", "M", "--expand-requires:public"); @@ -201,7 +200,7 @@ public class Modules extends ModuleTestBase { .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") .write(src); - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "--module", "M", "--expand-requires:all"); @@ -229,7 +228,7 @@ public class Modules extends ModuleTestBase { .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") .write(src); - execNegativeTask("-modulesourcepath", src.toString(), + execNegativeTask("--module-source-path", src.toString(), "--module", "MIA", "--expand-requires:all"); @@ -251,7 +250,7 @@ public class Modules extends ModuleTestBase { .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") .write(src); - execNegativeTask("-modulesourcepath", src.toString(), + execNegativeTask("--module-source-path", src.toString(), "--module", "M,N,L,MIA,O,P", "--expand-requires:all"); diff --git a/langtools/test/jdk/javadoc/tool/modules/PackageOptions.java b/langtools/test/jdk/javadoc/tool/modules/PackageOptions.java index fe7ca40cec3..6335418aff5 100644 --- a/langtools/test/jdk/javadoc/tool/modules/PackageOptions.java +++ b/langtools/test/jdk/javadoc/tool/modules/PackageOptions.java @@ -27,7 +27,6 @@ * @summary Test modules with packages and subpackages filtering * @modules * jdk.javadoc/jdk.javadoc.internal.api - * jdk.javadoc/jdk.javadoc.internal.doclets.standard * jdk.javadoc/jdk.javadoc.internal.tool * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -52,8 +51,8 @@ public class PackageOptions extends ModuleTestBase { @Test public void testExportedNonQualifiedPackagesLegacyMode(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), - "-addmods", "m1", + execTask("--module-source-path", createSources(base.resolve("src")), + "--add-modules", "m1", "m1pub"); checkModulesNotSpecified("m1"); @@ -64,8 +63,8 @@ public class PackageOptions extends ModuleTestBase { @Test public void testExportedQualifiedPackagesLegacyMode(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), - "-addmods", "m1", + execTask("--module-source-path", createSources(base.resolve("src")), + "--add-modules", "m1", "m1/m1pub"); checkModulesNotSpecified("m1"); @@ -76,8 +75,8 @@ public class PackageOptions extends ModuleTestBase { @Test public void testNonExportedQualifedPackagesLegacyMode(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), - "-addmods", "m1", + execTask("--module-source-path", createSources(base.resolve("src")), + "--add-modules", "m1", "m1/m1pro.pro1" /* not exported, therefore qualify with module */); checkModulesNotSpecified("m1"); @@ -92,8 +91,8 @@ public class PackageOptions extends ModuleTestBase { public void testTypesLegacyMode(Path base) throws Exception { Path srcPath = base.resolve("src"); Path typPath = srcPath.resolve("m1/m1pub/A.java"); - execTask("-modulesourcepath", createSources(srcPath), - "-addmods", "m1", + execTask("--module-source-path", createSources(srcPath), + "--add-modules", "m1", typPath.toString()); checkModulesNotSpecified("m1"); checkModulesIncluded("m1"); @@ -109,8 +108,8 @@ public class PackageOptions extends ModuleTestBase { public void testSubclassedTypesLegacyMode(Path base) throws Exception { Path srcPath = base.resolve("src"); Path typPath = srcPath.resolve("m1/m1pub/B.java"); - execTask("-modulesourcepath", createSources(srcPath), - "-addmods", "m1", + execTask("--module-source-path", createSources(srcPath), + "--add-modules", "m1", typPath.toString()); checkModulesNotSpecified("m1"); checkModulesIncluded("m1"); @@ -124,7 +123,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testDefaultPackages(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), + execTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1"); checkModulesSpecified("m1"); @@ -149,20 +148,20 @@ public class PackageOptions extends ModuleTestBase { // I/O error encounted during the iteration throw ex.getCause(); } - execTask("-modulesourcepath", src.toString(), + execTask("--module-source-path", src.toString(), "-subpackages", "m1/m1pro"); checkPackagesSpecified("m1pro", "m1pro.pro1", "m1pro.pro2"); // empty package directory should cause an error - execNegativeTask("-modulesourcepath", src.toString(), + execNegativeTask("--module-source-path", src.toString(), "m1/m1pro"); } @Test public void testExportedQualifiedSubpackageWithMultipleModules(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src"), 2), + execTask("--module-source-path", createSources(base.resolve("src"), 2), "--module", "m1", "-subpackages", "m1/m1pro.pro1:m1/m1pro.pro2:m2/m2pub.pub1"); @@ -177,7 +176,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testUnexportedUnqualifiedSubpackages(Path base) throws Exception { - execNegativeTask("-modulesourcepath", createSources(base.resolve("src")), + execNegativeTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1", "-subpackages", "m1pub.pub1:pro"); @@ -186,7 +185,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testUnexportedQualifiedPackage(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), + execTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1", "m1/m1pro"); @@ -201,7 +200,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testUnexportedQualifiedSubpackage(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), + execTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1", "-subpackages", "m1/m1pro"); @@ -216,7 +215,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testUnexportedQualifiedSubpackageExcludeQualified(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), + execTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1", "-subpackages", "m1/m1pro", "-exclude", "m1/m1pro.pro1.pro11:m1/m1pro.pro2.pro21"); @@ -233,7 +232,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testUnexportedQualifiedSubpackageExcludeUnqualified(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), + execTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1", "-subpackages", "m1/m1pro", "-exclude", "m1pro.pro1.pro11:m1pro.pro2.pro21"); @@ -250,7 +249,7 @@ public class PackageOptions extends ModuleTestBase { @Test public void testUnexportedQualifiedSubpackages(Path base) throws Exception { - execTask("-modulesourcepath", createSources(base.resolve("src")), + execTask("--module-source-path", createSources(base.resolve("src")), "--module", "m1", "-subpackages", "m1/m1pro.pro1:m1/m1pro.pro2"); diff --git a/langtools/test/jdk/jshell/CommandCompletionTest.java b/langtools/test/jdk/jshell/CommandCompletionTest.java index 0a986a621c1..6544084a133 100644 --- a/langtools/test/jdk/jshell/CommandCompletionTest.java +++ b/langtools/test/jdk/jshell/CommandCompletionTest.java @@ -58,7 +58,7 @@ public class CommandCompletionTest extends ReplToolTesting { } public void testList() { - test(false, new String[] {"-nostartup"}, + test(false, new String[] {"--no-startup"}, a -> assertCompletion(a, "/l|", false, "/list "), a -> assertCompletion(a, "/list |", false, "-all ", "-history ", "-start "), a -> assertCompletion(a, "/list -h|", false, "-history "), @@ -70,7 +70,7 @@ public class CommandCompletionTest extends ReplToolTesting { } public void testDrop() { - test(false, new String[] {"-nostartup"}, + test(false, new String[] {"--no-startup"}, a -> assertCompletion(a, "/d|", false, "/drop "), a -> assertClass(a, "class cTest {}", "class", "cTest"), a -> assertMethod(a, "int mTest() { return 0; }", "()I", "mTest"), @@ -81,7 +81,7 @@ public class CommandCompletionTest extends ReplToolTesting { } public void testEdit() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertCompletion(a, "/e|", false, "/edit ", "/exit "), a -> assertCompletion(a, "/ed|", false, "/edit "), a -> assertClass(a, "class cTest {}", "class", "cTest"), diff --git a/langtools/test/jdk/jshell/EditorTestBase.java b/langtools/test/jdk/jshell/EditorTestBase.java index 067bbb9da99..18b6dae4557 100644 --- a/langtools/test/jdk/jshell/EditorTestBase.java +++ b/langtools/test/jdk/jshell/EditorTestBase.java @@ -42,7 +42,7 @@ public abstract class EditorTestBase extends ReplToolTesting { public abstract void shutdownEditor(); public void testEditor(ReplTest... tests) { - testEditor(false, new String[]{"-nostartup"}, tests); + testEditor(false, new String[]{"--no-startup"}, tests); } public void testEditor(boolean defaultStartup, String[] args, ReplTest... tests) { @@ -71,7 +71,7 @@ public abstract class EditorTestBase extends ReplToolTesting { @Test public void testEditNegative() { for (String edit : new String[] {"/ed", "/edit"}) { - test(new String[]{"-nostartup"}, + test(new String[]{"--no-startup"}, a -> assertCommandOutputStartsWith(a, edit + " 1", "| No such snippet: 1"), a -> assertCommandOutputStartsWith(a, edit + " unknown", diff --git a/langtools/test/jdk/jshell/ExternalEditorTest.java b/langtools/test/jdk/jshell/ExternalEditorTest.java index cd3d70f442b..21c731866e5 100644 --- a/langtools/test/jdk/jshell/ExternalEditorTest.java +++ b/langtools/test/jdk/jshell/ExternalEditorTest.java @@ -203,7 +203,7 @@ public class ExternalEditorTest extends EditorTestBase { @Test(enabled = false) // TODO 8159229 public void testRemoveTempFile() { - test(new String[]{"-nostartup"}, + test(new String[]{"--no-startup"}, a -> assertCommandCheckOutput(a, "/set editor " + executionScript, assertStartsWith("| Editor set to: " + executionScript)), a -> assertVariable(a, "int", "a", "0", "0"), diff --git a/langtools/test/jdk/jshell/StartOptionTest.java b/langtools/test/jdk/jshell/StartOptionTest.java index e3326597934..5ca48854341 100644 --- a/langtools/test/jdk/jshell/StartOptionTest.java +++ b/langtools/test/jdk/jshell/StartOptionTest.java @@ -22,7 +22,7 @@ */ /* - * @test 8151754 8080883 + * @test 8151754 8080883 8160089 * @summary Testing start-up options. * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -106,53 +106,68 @@ public class StartOptionTest { @Test public void testUsage() throws Exception { - start(s -> { - assertTrue(s.split("\n").length >= 7, "Not enough usage lines: " + s); - assertTrue(s.startsWith("Usage: jshell "), "Unexpect usage start: " + s); - }, null, "-help"); + for (String opt : new String[]{"-h", "--help"}) { + start(s -> { + assertTrue(s.split("\n").length >= 7, "Not enough usage lines: " + s); + assertTrue(s.startsWith("Usage: jshell "), "Unexpect usage start: " + s); + }, null, opt); + } } @Test public void testUnknown() throws Exception { - start(s -> { - assertTrue(s.split("\n").length >= 7, "Not enough usage lines (unknown): " + s); - assertTrue(s.startsWith("Usage: jshell "), "Unexpect usage start (unknown): " + s); - }, s -> assertEquals(s.trim(), "Unknown option: -unknown"), "-unknown"); + start(s -> { }, + s -> assertEquals(s.trim(), "Unknown option: u"), "-unknown"); + start(s -> { }, + s -> assertEquals(s.trim(), "Unknown option: unknown"), "--unknown"); } public void testStartup() throws Exception { Compiler compiler = new Compiler(); Path p = compiler.getPath("file.txt"); compiler.writeToFile(p); - start("", "'-startup' requires a filename argument.", "-startup"); - start("", "Only one -startup or -nostartup option may be used.", "-startup", p.toString(), "-startup", p.toString()); - start("", "Only one -startup or -nostartup option may be used.", "-nostartup", "-startup", p.toString()); - start("", "Only one -startup or -nostartup option may be used.", "-startup", p.toString(), "-nostartup"); - start("", "Only one -startup or -nostartup option may be used.", "-nostartup", "-nostartup"); - start("", "Only one -startup or -nostartup option may be used.", "-nostartup", "-startup"); + start("", "Argument to startup missing.", "--startup"); + start("", "Only one --startup or --no-startup option may be used.", "--startup", p.toString(), "--startup", p.toString()); + start("", "Only one --startup or --no-startup option may be used.", "--no-startup", "--startup", p.toString()); + start("", "Only one --startup or --no-startup option may be used.", "--startup", p.toString(), "--no-startup"); + start("", "Argument to startup missing.", "--no-startup", "--startup"); } public void testStartupUnknown() throws Exception { - start("", "File 'UNKNOWN' for '-startup' is not found.", "-startup", "UNKNOWN"); + start("", "File 'UNKNOWN' for '--startup' is not found.", "--startup", "UNKNOWN"); } @Test public void testClasspath() throws Exception { - for (String cp : new String[] {"-cp", "-classpath"}) { - start("", "Conflicting -classpath option.", cp, ".", "-classpath", "."); - start("", "Argument to -classpath missing.", cp); + for (String cp : new String[] {"--class-path"}) { + start("", "Only one --class-path option may be used.", cp, ".", "--class-path", "."); + start("", "Argument to class-path missing.", cp); } } + @Test + public void testFeedbackOptionConflict() throws Exception { + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", + "--feedback", "concise", "--feedback", "verbose"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "--feedback", "concise", "-s"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "--feedback", "verbose", "-q"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "--feedback", "concise", "-v"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "-v", "--feedback", "concise"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "-q", "-v"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "-s", "-v"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "-v", "-q"); + start("", "Only one feedback option (--feedback, -q, -s, or -v) may be used.", "-q", "-s"); + } + @Test public void testNegFeedbackOption() throws Exception { - start("", "Argument to -feedback missing. Mode required.", "-feedback"); - start("", "Does not match any current feedback mode: blorp -- -feedback blorp", "-feedback", "blorp"); + start("", "Argument to feedback missing.", "--feedback"); + start("", "Does not match any current feedback mode: blorp -- --feedback blorp", "--feedback", "blorp"); } @Test public void testVersion() throws Exception { - start(s -> assertTrue(s.startsWith("jshell"), "unexpected version: " + s), null, "-version"); + start(s -> assertTrue(s.startsWith("jshell"), "unexpected version: " + s), null, "--version"); } @AfterMethod diff --git a/langtools/test/jdk/jshell/ToolBasicTest.java b/langtools/test/jdk/jshell/ToolBasicTest.java index 0c5bf1dfab9..7ccf529fb2d 100644 --- a/langtools/test/jdk/jshell/ToolBasicTest.java +++ b/langtools/test/jdk/jshell/ToolBasicTest.java @@ -97,7 +97,7 @@ public class ToolBasicTest extends ReplToolTesting { public void testInterrupt() { ReplTest interrupt = (a) -> assertCommand(a, "\u0003", ""); for (String s : new String[] { "", "\u0003" }) { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, (a) -> assertCommand(a, "int a = 2 +" + s, ""), interrupt, (a) -> assertCommand(a, "int a\u0003", ""), @@ -190,7 +190,7 @@ public class ToolBasicTest extends ReplToolTesting { } public void testRerun() { - test(false, new String[] {"-nostartup"}, + test(false, new String[] {"--no-startup"}, (a) -> assertCommand(a, "/0", "| No such command or snippet id: /0\n| Type /help for help."), (a) -> assertCommand(a, "/5", "| No such command or snippet id: /5\n| Type /help for help.") ); @@ -226,7 +226,7 @@ public class ToolBasicTest extends ReplToolTesting { tests.add((a) -> assertCommandCheckOutput(a, "/-" + (2 * finalI + 1), check)); } tests.add((a) -> assertCommandCheckOutput(a, "/!", assertStartsWith("int a = 0;"))); - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, tests.toArray(new ReplTest[tests.size()])); } @@ -243,7 +243,7 @@ public class ToolBasicTest extends ReplToolTesting { Path startup = compiler.getPath("StartupFileOption/startup.txt"); compiler.writeToFile(startup, "int assertionCount = 0;\n" + // id: s1 "void add(int n) { assertionCount += n; }"); - test(new String[]{"-startup", startup.toString()}, + test(new String[]{"--startup", startup.toString()}, (a) -> assertCommand(a, "add(1)", ""), // id: 1 (a) -> assertCommandCheckOutput(a, "add(ONE)", s -> assertEquals(s.split("\n")[0], "| Error:")), // id: e1 (a) -> assertVariable(a, "int", "ONE", "1", "1"), @@ -252,7 +252,7 @@ public class ToolBasicTest extends ReplToolTesting { assertRerun.apply("/s1").apply("int assertionCount = 0;", 0), assertVariables ); - test(false, new String[] {"-nostartup"}, + test(false, new String[] {"--no-startup"}, (a) -> assertCommand(a, "/s1", "| No such command or snippet id: /s1\n| Type /help for help."), (a) -> assertCommand(a, "/1", "| No such command or snippet id: /1\n| Type /help for help."), (a) -> assertCommand(a, "/e1", "| No such command or snippet id: /e1\n| Type /help for help.") @@ -268,10 +268,7 @@ public class ToolBasicTest extends ReplToolTesting { (a) -> assertCommand(a, "/classpath " + classpath, String.format("| Path '%s' added to classpath", classpath)), (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); - test(new String[] { "-cp", classpath.toString() }, - (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") - ); - test(new String[] { "-classpath", classpath.toString() }, + test(new String[] { "--class-path", classpath.toString() }, (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); } @@ -287,10 +284,7 @@ public class ToolBasicTest extends ReplToolTesting { (a) -> assertCommand(a, "/classpath " + jarPath, String.format("| Path '%s' added to classpath", jarPath)), (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); - test(new String[] { "-cp", jarPath.toString() }, - (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") - ); - test(new String[] { "-classpath", jarPath.toString() }, + test(new String[] { "--class-path", jarPath.toString() }, (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); } @@ -300,10 +294,10 @@ public class ToolBasicTest extends ReplToolTesting { Compiler compiler = new Compiler(); Path startup = compiler.getPath("StartupFileOption/startup.txt"); compiler.writeToFile(startup, "class A { public String toString() { return \"A\"; } }"); - test(new String[]{"-startup", startup.toString()}, + test(new String[]{"--startup", startup.toString()}, (a) -> evaluateExpression(a, "A", "new A()", "A") ); - test(new String[]{"-nostartup"}, + test(new String[]{"--no-startup"}, (a) -> assertCommandCheckOutput(a, "printf(\"\")", assertStartsWith("| Error:\n| cannot find symbol")) ); test( @@ -550,7 +544,7 @@ public class ToolBasicTest extends ReplToolTesting { } public void testHistoryReference() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertCommand(a, "System.err.println(1)", "", "", null, "", "1\n"), a -> assertCommand(a, "System.err.println(2)", "", "", null, "", "2\n"), a -> assertCommand(a, "/-2", "System.err.println(1)", "", null, "", "1\n"), diff --git a/langtools/test/jdk/jshell/ToolCommandOptionTest.java b/langtools/test/jdk/jshell/ToolCommandOptionTest.java index 030d016a89e..96efdb01368 100644 --- a/langtools/test/jdk/jshell/ToolCommandOptionTest.java +++ b/langtools/test/jdk/jshell/ToolCommandOptionTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8157395 8157393 8157517 + * @bug 8157395 8157393 8157517 8158738 * @summary Tests of jshell comand options, and undoing operations * @modules jdk.jshell/jdk.internal.jshell.tool * @build ToolCommandOptionTest ReplToolTesting @@ -88,7 +88,7 @@ public class ToolCommandOptionTest extends ReplToolTesting { } public void dropTest() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, (a) -> assertCommand(a, "int x = 5;", "x ==> 5"), (a) -> assertCommand(a, "x", @@ -148,6 +148,8 @@ public class ToolCommandOptionTest extends ReplToolTesting { "| Unknown option: -furball -mattress -- /retain editor -furball -mattress"), (a) -> assertCommand(a, "/retain editor -default prog", "| Specify -default option or program, not both -- /retain editor -default prog"), + (a) -> assertCommand(a, "/retain editor -default -wait", + "| -wait applies to external editors, cannot be used with -default"), (a) -> assertCommand(a, "/retain editor prog", "| Editor set to: prog"), (a) -> assertCommand(a, "/retain editor prog -default", diff --git a/langtools/test/jdk/jshell/ToolLocaleMessageTest.java b/langtools/test/jdk/jshell/ToolLocaleMessageTest.java index b2125d7c3dc..d52c4ed9633 100644 --- a/langtools/test/jdk/jshell/ToolLocaleMessageTest.java +++ b/langtools/test/jdk/jshell/ToolLocaleMessageTest.java @@ -44,7 +44,7 @@ import static org.testng.Assert.assertTrue; public class ToolLocaleMessageTest extends ReplToolTesting { void testLocale(ReplTest... tests) { - test(Locale.getDefault(), false, new String[]{"-nostartup"}, "", tests); + test(Locale.getDefault(), false, new String[]{"--no-startup"}, "", tests); } void assertCommandOK(boolean after, String cmd, String... contains) { diff --git a/langtools/test/jdk/jshell/ToolReloadTest.java b/langtools/test/jdk/jshell/ToolReloadTest.java index 0faf3e668dc..ed4c15b013b 100644 --- a/langtools/test/jdk/jshell/ToolReloadTest.java +++ b/langtools/test/jdk/jshell/ToolReloadTest.java @@ -90,7 +90,7 @@ public class ToolReloadTest extends ReplToolTesting { } public void testReloadDrop() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertVariable(a, "int", "a"), a -> dropVariable(a, "/dr 1", "int a = 0", "| dropped variable a"), a -> assertMethod(a, "int b() { return 0; }", "()I", "b"), @@ -113,7 +113,7 @@ public class ToolReloadTest extends ReplToolTesting { } public void testReloadQuiet() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertVariable(a, "int", "a"), a -> dropVariable(a, "/dr 1", "int a = 0", "| dropped variable a"), a -> assertMethod(a, "int b() { return 0; }", "()I", "b"), @@ -130,7 +130,7 @@ public class ToolReloadTest extends ReplToolTesting { } public void testReloadRepeat() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, (a) -> assertVariable(a, "int", "c", "7", "7"), (a) -> assertCommand(a, "++c", null), (a) -> assertCommand(a, "/!", null), @@ -150,7 +150,7 @@ public class ToolReloadTest extends ReplToolTesting { } public void testReloadIgnore() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, (a) -> assertCommand(a, "(-)", null), (a) -> assertCommand(a, "/list", null), (a) -> assertCommand(a, "/history", null), @@ -201,13 +201,13 @@ public class ToolReloadTest extends ReplToolTesting { } public void testReloadExitRestore() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, (a) -> assertVariable(a, "int", "x", "5", "5"), (a) -> assertMethod(a, "int m(int z) { return z * z; }", "(int)int", "m"), (a) -> evaluateExpression(a, "int", "m(x)", "25") ); - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, (a) -> assertCommand(a, "/reload -restore", "| Restarting and restoring from previous state.\n" + "-: int x = 5;\n" + diff --git a/langtools/test/jdk/jshell/ToolSimpleTest.java b/langtools/test/jdk/jshell/ToolSimpleTest.java index 96f9e69eef8..1b0f77de77e 100644 --- a/langtools/test/jdk/jshell/ToolSimpleTest.java +++ b/langtools/test/jdk/jshell/ToolSimpleTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 + * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 * @summary Simple jshell tool tests * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -157,7 +157,6 @@ public class ToolSimpleTest extends ReplToolTesting { ); } - @Test(enabled = false) // TODO 8153897 public void defineUnresolvedVar() { test( (a) -> assertCommand(a, "undefined x", @@ -209,7 +208,7 @@ public class ToolSimpleTest extends ReplToolTesting { } public void testDrop() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertVariable(a, "int", "a"), a -> dropVariable(a, "/drop 1", "int a = 0", "| dropped variable a"), a -> assertMethod(a, "int b() { return 0; }", "()I", "b"), @@ -223,7 +222,7 @@ public class ToolSimpleTest extends ReplToolTesting { a -> assertCommandCheckOutput(a, "/types", assertClasses()), a -> assertCommandCheckOutput(a, "/imports", assertImports()) ); - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertVariable(a, "int", "a"), a -> dropVariable(a, "/drop a", "int a = 0", "| dropped variable a"), a -> assertMethod(a, "int b() { return 0; }", "()I", "b"), @@ -238,7 +237,7 @@ public class ToolSimpleTest extends ReplToolTesting { } public void testDropNegative() { - test(false, new String[]{"-nostartup"}, + test(false, new String[]{"--no-startup"}, a -> assertCommandOutputStartsWith(a, "/drop 0", "| No such snippet: 0"), a -> assertCommandOutputStartsWith(a, "/drop a", "| No such snippet: a"), a -> assertCommandCheckOutput(a, "/drop", @@ -462,20 +461,20 @@ public class ToolSimpleTest extends ReplToolTesting { } public void testOptionQ() { - test(new String[]{"-q", "-nostartup"}, + test(new String[]{"-q", "--no-startup"}, (a) -> assertCommand(a, "1+1", "$1 ==> 2"), (a) -> assertCommand(a, "int x = 5", "") ); } - public void testOptionQq() { - test(new String[]{"-qq", "-nostartup"}, + public void testOptionS() { + test(new String[]{"-s", "--no-startup"}, (a) -> assertCommand(a, "1+1", "") ); } public void testOptionV() { - test(new String[]{"-v", "-nostartup"}, + test(new String[]{"-v", "--no-startup"}, (a) -> assertCommand(a, "1+1", "$1 ==> 2\n" + "| created scratch variable $1 : int") @@ -483,14 +482,36 @@ public class ToolSimpleTest extends ReplToolTesting { } public void testOptionFeedback() { - test(new String[]{"-feedback", "concise", "-nostartup"}, + test(new String[]{"--feedback", "concise", "--no-startup"}, (a) -> assertCommand(a, "1+1", "$1 ==> 2"), (a) -> assertCommand(a, "int x = 5", "") ); } + public void testCompoundOptions() { + Consumer confirmNoStartup = s -> { + assertEquals(0, Stream.of(s.split("\n")) + .filter(l -> !l.isEmpty()) + .count(), "Expected no lines: " + s); + }; + test(new String[]{"-nq"}, + (a) -> assertCommandCheckOutput(a, "/list -all", confirmNoStartup), + (a) -> assertCommand(a, "1+1", "$1 ==> 2"), + (a) -> assertCommand(a, "int x = 5", "") + ); + test(new String[]{"-qn"}, + (a) -> assertCommandCheckOutput(a, "/list -all", confirmNoStartup), + (a) -> assertCommand(a, "1+1", "$1 ==> 2"), + (a) -> assertCommand(a, "int x = 5", "") + ); + test(new String[]{"-ns"}, + (a) -> assertCommandCheckOutput(a, "/list -all", confirmNoStartup), + (a) -> assertCommand(a, "1+1", "") + ); + } + public void testOptionR() { - test(new String[]{"-R-Dthe.sound=blorp", "-nostartup"}, + test(new String[]{"-R-Dthe.sound=blorp", "--no-startup"}, (a) -> assertCommand(a, "System.getProperty(\"the.sound\")", "$1 ==> \"blorp\"") ); diff --git a/langtools/test/tools/javac/InnerClassesAttribute/Test.java b/langtools/test/tools/javac/InnerClassesAttribute/Test.java index f2357ada27c..69bbaa35d50 100644 --- a/langtools/test/tools/javac/InnerClassesAttribute/Test.java +++ b/langtools/test/tools/javac/InnerClassesAttribute/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/langtools/test/tools/javac/T8047338/FilterNonMembersToObtainFunctionDescriptorTest.java b/langtools/test/tools/javac/T8047338/FilterNonMembersToObtainFunctionDescriptorTest.java new file mode 100644 index 00000000000..501d01b4561 --- /dev/null +++ b/langtools/test/tools/javac/T8047338/FilterNonMembersToObtainFunctionDescriptorTest.java @@ -0,0 +1,55 @@ +/* + * 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 8047338 + * @summary javac is not correctly filtering non-members methods to obtain the function descriptor + * @compile FilterNonMembersToObtainFunctionDescriptorTest.java + */ + +public class FilterNonMembersToObtainFunctionDescriptorTest { + V fails(CallableFail callable) throws E { + return null; + } + + V failsSub(CallableFailSub callable) throws E { + return null; + } + + void m() throws Exception { + fails((String s) -> 2); + failsSub((String s) -> 2); + } + + interface Callable { + V callFail(String s) throws Exception; + } + + interface CallableFail extends Callable { + @Override + V callFail(String s) throws E; + } + + interface CallableFailSub extends CallableFail {} +} diff --git a/langtools/test/tools/javac/VersionOpt.java b/langtools/test/tools/javac/VersionOpt.java index 0d92962c07d..fe8224e946b 100644 --- a/langtools/test/tools/javac/VersionOpt.java +++ b/langtools/test/tools/javac/VersionOpt.java @@ -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 @@ -44,7 +44,7 @@ public class VersionOpt { // Test functions by comparing the version string from javac against // a "golden" version generated automatically from the underlying JVM. // As such, it is only effective in testing the "standard" compiler, - // and not any development version being tested via -Xpatch. + // and not any development version being tested via --patch-modules. // Check the version of the compiler being used, and let the test pass // automatically if is is a development version. Class javacClass = com.sun.tools.javac.Main.class; diff --git a/langtools/test/tools/javac/diags/examples/DirPathElementNotDirectory/modulesourcepath b/langtools/test/tools/javac/diags/examples/DirPathElementNotDirectory/modulesourcepath index 42c5a0cf3a1..35cffd6ae95 100644 --- a/langtools/test/tools/javac/diags/examples/DirPathElementNotDirectory/modulesourcepath +++ b/langtools/test/tools/javac/diags/examples/DirPathElementNotDirectory/modulesourcepath @@ -21,5 +21,5 @@ * questions. */ -// a file to be passed in where a directory is expected (-modulesourcepath option) +// a file to be passed in where a directory is expected (--module-source-path option) // to trigger an error deliberately. diff --git a/langtools/test/tools/javac/diags/examples/ModuleNotFoundInModuleSourcePath/ModuleNotFoundInModuleSourcePath.java b/langtools/test/tools/javac/diags/examples/ModuleNotFoundInModuleSourcePath/ModuleNotFoundInModuleSourcePath.java index 71d1df029d1..9c812ca11f7 100644 --- a/langtools/test/tools/javac/diags/examples/ModuleNotFoundInModuleSourcePath/ModuleNotFoundInModuleSourcePath.java +++ b/langtools/test/tools/javac/diags/examples/ModuleNotFoundInModuleSourcePath/ModuleNotFoundInModuleSourcePath.java @@ -22,6 +22,6 @@ */ // key: compiler.err.module.not.found.in.module.source.path -// options: -m m1 -modulesourcepath src +// options: -m m1 --module-source-path src class ModuleNotFoundInModuleSourcePath {} diff --git a/langtools/test/tools/javac/diags/examples/XModuleWithModulePath/XModuleWithModulePath.java b/langtools/test/tools/javac/diags/examples/XModuleWithModulePath/XModuleWithModulePath.java index a378792e520..eaffab89d3e 100644 --- a/langtools/test/tools/javac/diags/examples/XModuleWithModulePath/XModuleWithModulePath.java +++ b/langtools/test/tools/javac/diags/examples/XModuleWithModulePath/XModuleWithModulePath.java @@ -22,6 +22,6 @@ */ // key: compiler.err.xmodule.no.module.sourcepath -// options: -Xmodule:java.compiler -modulesourcepath src +// options: -Xmodule:java.compiler --module-source-path src class XModuleWithModulePath {} diff --git a/langtools/test/tools/javac/file/LimitedImage.java b/langtools/test/tools/javac/file/LimitedImage.java index a04169eaf6e..44bc82e8964 100644 --- a/langtools/test/tools/javac/file/LimitedImage.java +++ b/langtools/test/tools/javac/file/LimitedImage.java @@ -28,7 +28,7 @@ * @library /tools/lib * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main - * @run main/othervm -limitmods jdk.compiler LimitedImage + * @run main/othervm --limit-modules jdk.compiler LimitedImage */ import java.io.IOException; @@ -133,4 +133,4 @@ public class LimitedImage { } } -} \ No newline at end of file +} diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocletAbortException.java b/langtools/test/tools/javac/generics/inference/8164399/T8164399.java similarity index 64% rename from langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocletAbortException.java rename to langtools/test/tools/javac/generics/inference/8164399/T8164399.java index 7cf32a85d6b..a069edc2516 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocletAbortException.java +++ b/langtools/test/tools/javac/generics/inference/8164399/T8164399.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -23,22 +23,27 @@ * questions. */ -package jdk.javadoc.internal.doclets.toolkit.util; - -/** - *

This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. +/* + * @test + * @bug 8164399 + * @summary inference of thrown variable does not work correctly + * @compile T8164399.java */ -public class DocletAbortException extends RuntimeException { - private static final long serialVersionUID = -9131058909576418984L; - public DocletAbortException(String message) { - super(message); +abstract class T8164399 { + + interface ThrowableRunnable { + void compute() throws E; } - public DocletAbortException(Throwable cause) { - super(cause); + public abstract < E extends Exception> void computeException(ThrowableRunnable process) throws E; + + + public static T compute(ThrowableRunnable action) throws E { + return null; + } + + { + computeException(() -> compute(() -> {})); } } diff --git a/langtools/test/tools/javac/generics/inference/8164399/T8164399b.java b/langtools/test/tools/javac/generics/inference/8164399/T8164399b.java new file mode 100644 index 00000000000..ea2a8d1fb00 --- /dev/null +++ b/langtools/test/tools/javac/generics/inference/8164399/T8164399b.java @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8164399 + * @summary inference of thrown variable does not work correctly + * @compile/fail/ref=T8164399b.out -XDrawDiagnostics T8164399b.java + */ +class T8164399b { + void m(Class arg) throws T {} + void g() throws T {} + + void test() { + m(RuntimeException.class); // ok + m(Exception.class); // error + m(Throwable.class); // ok + m(java.io.Serializable.class); // error + m(Object.class); // error + m(Runnable.class); // error + T8164399b x = null; + x.g(); // expected: ok; actual: error + } +} diff --git a/langtools/test/tools/javac/generics/inference/8164399/T8164399b.out b/langtools/test/tools/javac/generics/inference/8164399/T8164399b.out new file mode 100644 index 00000000000..6091fbb27f6 --- /dev/null +++ b/langtools/test/tools/javac/generics/inference/8164399/T8164399b.out @@ -0,0 +1,2 @@ +T8164399b.java:17:10: compiler.err.unreported.exception.need.to.catch.or.throw: java.lang.Throwable&java.lang.Runnable +1 error diff --git a/langtools/test/tools/javac/modules/GraphsTest.java b/langtools/test/tools/javac/modules/GraphsTest.java index 8cfce2ad0c9..26118fff60b 100644 --- a/langtools/test/tools/javac/modules/GraphsTest.java +++ b/langtools/test/tools/javac/modules/GraphsTest.java @@ -194,7 +194,7 @@ public class GraphsTest extends ModuleTestBase { .write(modSrc); String log = new JavacTask(tb) .options("-XDrawDiagnostics", - "-modulesourcepath", modSrc.toString()) + "--module-source-path", modSrc.toString()) .outdir(Files.createDirectories(base.resolve("negative"))) .files(findJavaFiles(modSrc)) .run(Task.Expect.FAIL) diff --git a/langtools/test/tools/javac/modules/ModuleSourcePathTest.java b/langtools/test/tools/javac/modules/ModuleSourcePathTest.java index 8202ae52b7a..07deb3b9c17 100644 --- a/langtools/test/tools/javac/modules/ModuleSourcePathTest.java +++ b/langtools/test/tools/javac/modules/ModuleSourcePathTest.java @@ -23,7 +23,7 @@ /* * @test - * @summary tests for -modulesourcepath + * @summary tests for --module-source-path * @library /tools/lib * @modules * jdk.compiler/com.sun.tools.javac.api diff --git a/langtools/test/tools/javac/modules/NPEEmptyFileTest.java b/langtools/test/tools/javac/modules/NPEEmptyFileTest.java index a1ebebfec54..7260160143e 100644 --- a/langtools/test/tools/javac/modules/NPEEmptyFileTest.java +++ b/langtools/test/tools/javac/modules/NPEEmptyFileTest.java @@ -23,7 +23,7 @@ /** * @test - * @summary NPE while compiling empty javafile with -modulesourcepath option + * @summary NPE while compiling empty source file with --module-source-path option * @library /tools/lib * @modules * jdk.compiler/com.sun.tools.javac.api diff --git a/langtools/test/tools/javac/modules/SingleModuleModeTest.java b/langtools/test/tools/javac/modules/SingleModuleModeTest.java index e453d3bf8e4..17aa42c93f1 100644 --- a/langtools/test/tools/javac/modules/SingleModuleModeTest.java +++ b/langtools/test/tools/javac/modules/SingleModuleModeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, 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 diff --git a/langtools/test/tools/javac/modules/T8161501/EmptyClass.java b/langtools/test/tools/javac/modules/T8161501/EmptyClass.java new file mode 100644 index 00000000000..3d9a88eff43 --- /dev/null +++ b/langtools/test/tools/javac/modules/T8161501/EmptyClass.java @@ -0,0 +1,26 @@ +/* + * 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 pkg1; + +class EmptyClass {} diff --git a/langtools/test/tools/javac/modules/T8161501/UnnamedModuleUnnamedPackageTest.java b/langtools/test/tools/javac/modules/T8161501/UnnamedModuleUnnamedPackageTest.java new file mode 100644 index 00000000000..a8533698249 --- /dev/null +++ b/langtools/test/tools/javac/modules/T8161501/UnnamedModuleUnnamedPackageTest.java @@ -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 8161501 + * @summary JSR269 jigsaw update: javax.lang.model.element.ModuleElement.getEnclosedElements() on unnamed module with unnamed package + * @compile UnnamedModuleUnnamedPackageTest.java + * @compile -processor UnnamedModuleUnnamedPackageTest UnnamedModuleUnnamedPackageTest.java EmptyClass.java + */ + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; + +import java.util.*; +import java.util.stream.Collectors; + +@SupportedAnnotationTypes("*") +public class UnnamedModuleUnnamedPackageTest extends AbstractProcessor { + static final Set expected = new HashSet<>(Arrays.asList("unnamed package", "pkg1")); + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + for (Element e: roundEnv.getRootElements()) { + Element m = e.getEnclosingElement(); + while (!(m instanceof ModuleElement)) { + m = m.getEnclosingElement(); + } + Set found = m.getEnclosedElements().stream() + .map(p -> ((PackageElement)p).isUnnamed() ? + "unnamed package" : + ((PackageElement)p).getQualifiedName().toString()) + .collect(Collectors.toSet()); + if (!Objects.equals(expected, found)) { + System.err.println("expected: " + expected); + System.err.println("found: " + found); + throw new AssertionError("unexpected packages found"); + } + } + return false; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} diff --git a/langtools/test/tools/javac/redefineObject/Object1-test.java b/langtools/test/tools/javac/redefineObject/Object1-test.java index 86827f5ddae..a654ecee5d5 100644 --- a/langtools/test/tools/javac/redefineObject/Object1-test.java +++ b/langtools/test/tools/javac/redefineObject/Object1-test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997,2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/langtools/test/tools/javac/redefineObject/Object2-test.java b/langtools/test/tools/javac/redefineObject/Object2-test.java index 34a40554c35..59eb4b670df 100644 --- a/langtools/test/tools/javac/redefineObject/Object2-test.java +++ b/langtools/test/tools/javac/redefineObject/Object2-test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997,2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleAnnotation.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleAnnotation.java new file mode 100644 index 00000000000..c0cf8e9da2c --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleAnnotation.java @@ -0,0 +1,34 @@ +/* + * 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 jdk.deprcases.members; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; + +@Retention(value=RetentionPolicy.RUNTIME) +@Target({TYPE, METHOD, FIELD}) +public @interface ExampleAnnotation { + String file(); + @Deprecated String name() default ""; +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleClass.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleClass.java new file mode 100644 index 00000000000..0205afefcfb --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleClass.java @@ -0,0 +1,49 @@ +/* + * 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 jdk.deprcases.members; + +public class ExampleClass { + public ExampleClass() { } + + @Deprecated + public ExampleClass(boolean deprecatedConstructor) { } + + @Deprecated + public void method1() { } + + @Deprecated + public void method2() { } + + @Deprecated + public int field1 = 0; + + @Deprecated + public int field2 = 0; + + @Deprecated + public static void staticmethod1() { } + + @Deprecated + public static int staticfield3 = 0; +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleElements.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleElements.java new file mode 100644 index 00000000000..f7fb1c6463d --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleElements.java @@ -0,0 +1,44 @@ +/* + * 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 jdk.deprcases.members; + +public class ExampleElements { + @Deprecated + Object emptyFalse; + + @Deprecated(since="xyzzy") + Object sinceFalse; + + @Deprecated(forRemoval=true) + Object emptyTrue; + + @Deprecated(since="plugh", forRemoval=true) + Object sinceTrue; + + @Deprecated(since="123,456") + Object sinceWithComma; + + @Deprecated(since="7.9 \"pre-beta\" snapshot") + Object sinceWithQuote; +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleEnum.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleEnum.java new file mode 100644 index 00000000000..d0f7541817f --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleEnum.java @@ -0,0 +1,42 @@ +/* + * 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 jdk.deprcases.members; + +public enum ExampleEnum { + ONE, + TWO { + @Override + public void deprMethod1() { } + @Override @Deprecated + public void deprMethod2() { } + }, + @Deprecated THREE, + FOUR, + @Deprecated FIVE; + + @Deprecated + public void deprMethod1() { } + + public void deprMethod2() { } +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleInterface.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleInterface.java new file mode 100644 index 00000000000..972bb470255 --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleInterface.java @@ -0,0 +1,44 @@ +/* + * 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 jdk.deprcases.members; + +public interface ExampleInterface { + @Deprecated + static final int DEP_FIELD1 = 1; + + @Deprecated + static final int DEP_FIELD2 = 2; + + @Deprecated + void interfaceMethod1(); + + @Deprecated + void interfaceMethod2(); + + @Deprecated + default void defaultMethod() { } + + @Deprecated + static void staticmethod2() { } +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleSubclass.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleSubclass.java new file mode 100644 index 00000000000..4cfdaa07f32 --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/members/ExampleSubclass.java @@ -0,0 +1,39 @@ +/* + * 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 jdk.deprcases.members; + +public abstract class ExampleSubclass extends ExampleClass implements ExampleInterface { + @Override + public void method1() { } + + // hides ExampleClass.field1 + public Object field1 = null; + + @Override + public void interfaceMethod2() { + } + + // hides ExampleInterface.DEP_FIELD1 + public Object DEP_FIELD1 = null; +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedAnnotation.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedAnnotation.java new file mode 100644 index 00000000000..b11206caa56 --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedAnnotation.java @@ -0,0 +1,35 @@ +/* + * 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 jdk.deprcases.types; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; + +@Retention(value=RetentionPolicy.RUNTIME) +@Target({TYPE, METHOD, FIELD}) +@Deprecated +public @interface DeprecatedAnnotation { + String file() default "x"; + String value() default "y"; +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedClass.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedClass.java new file mode 100644 index 00000000000..3f81060c063 --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedClass.java @@ -0,0 +1,28 @@ +/* + * 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 jdk.deprcases.types; + +@Deprecated +public class DeprecatedClass { +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedEnum.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedEnum.java new file mode 100644 index 00000000000..b1d05e2759e --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedEnum.java @@ -0,0 +1,31 @@ +/* + * 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 jdk.deprcases.types; + +@Deprecated +public enum DeprecatedEnum { + FIRST, + SECOND, + THIRD +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedException.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedException.java new file mode 100644 index 00000000000..a956da80ac7 --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedException.java @@ -0,0 +1,29 @@ +/* + * 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 jdk.deprcases.types; + +@Deprecated +public class DeprecatedException extends RuntimeException { + private static final long serialVersionUID = 0L; +} diff --git a/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedInterface.java b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedInterface.java new file mode 100644 index 00000000000..e54b51b7d4d --- /dev/null +++ b/langtools/test/tools/jdeprscan/cases/jdk/deprcases/types/DeprecatedInterface.java @@ -0,0 +1,28 @@ +/* + * 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 jdk.deprcases.types; + +@Deprecated +public interface DeprecatedInterface { +} diff --git a/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestCSV.java b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestCSV.java new file mode 100644 index 00000000000..c4f6a4ba279 --- /dev/null +++ b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestCSV.java @@ -0,0 +1,144 @@ +/* + * 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 + * @summary Basic tests CSV printing and parsing + * @modules jdk.jdeps/com.sun.tools.jdeprscan + * @build TestCSV + * @run testng jdk.jdeprscan.TestCSV + */ + +package jdk.jdeprscan; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; + +import java.util.List; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import com.sun.tools.jdeprscan.CSV; +import com.sun.tools.jdeprscan.CSVParseException; + +@Test +public class TestCSV { + static String NL = System.lineSeparator(); + ByteArrayOutputStream baos; + PrintStream out; + + @BeforeMethod + public void setup() throws UnsupportedEncodingException { + baos = new ByteArrayOutputStream(); + out = new PrintStream(baos, true, "UTF-8"); + } + + String result() { + out.flush(); + return new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8); + } + + /** + * Asserts string equality after checking for and removing a trailing line separator. + * + * @param expected expected result + */ + void checkString(String expected) { + String actual = result(); + assertTrue(actual.endsWith(NL)); + assertEquals(actual.substring(0, actual.length() - NL.length()), expected); + } + + @DataProvider(name = "csvdata") + public Object[][] getCSVData() { + return new Object[][] { + { "", List.of("") }, + { "a", List.of("a") }, + { "a,b", List.of("a", "b") }, + { "a,b,c", List.of("a", "b", "c") }, + { ",a,b", List.of("", "a", "b") }, + { "a,b,", List.of("a", "b", "") }, + { ",a,b,", List.of("", "a", "b", "") }, + { ",a,,b,", List.of("", "a", "", "b", "") }, + { ",", List.of("", "") }, + { ",,", List.of("", "", "") }, + { ",,,", List.of("", "", "", "") }, + { " a , b ", List.of(" a ", " b ") }, + { "a,\",\",b", List.of("a", ",", "b") }, + { "a,\"b\"\"c\",d", List.of("a", "b\"c", "d") }, + { "a,\"b,c\",d", List.of("a", "b,c", "d") }, + + // from https://en.wikipedia.org/wiki/Comma-separated_values + // slightly modified to enable round-tripping + + { "Year,Make,Model,Description,Price", + List.of("Year", "Make", "Model", "Description", "Price") }, + { "1997,Ford,E350,\"ac, abs, moon\",3000.00", + List.of("1997", "Ford", "E350", "ac, abs, moon", "3000.00") }, + { "1999,Chevy,\"Venture \"\"Extended Edition\"\"\",,4900.00", + List.of("1999", "Chevy", "Venture \"Extended Edition\"", "", "4900.00") }, + { "1999,Chevy,\"Venture \"\"Extended Edition, Very Large\"\"\",,5000.00", + List.of("1999", "Chevy", "Venture \"Extended Edition, Very Large\"", "", "5000.00") }, + { "1996,Jeep,Grand Cherokee,\"MUST SELL!\nair, moon roof, loaded\",4799.00", + List.of("1996", "Jeep", "Grand Cherokee", "MUST SELL!\nair, moon roof, loaded", "4799.00") } + }; + } + + @Test(dataProvider = "csvdata") + public void roundTrip(String input, List parsed) { + List actual = CSV.split(input); + assertEquals(actual, parsed); + CSV.write(out, actual.toArray()); + checkString(input); + } + + // won't round-trip + public void testExtraQuote() { + assertEquals(CSV.split("a,\"b\",c"), List.of("a", "b", "c")); + } + + // won't round-trip + public void testEmptyQuote() { + assertEquals(CSV.split("a,\"\",b"), List.of("a", "", "b")); + } + + @Test(expectedExceptions=CSVParseException.class) + public void errorUnexpectedQuote() { + CSV.split("ab\"cd"); + } + + @Test(expectedExceptions=CSVParseException.class) + public void errorCharacterAfterQuote() { + CSV.split("a,\"b\"c,d"); + } + + @Test(expectedExceptions=CSVParseException.class) + public void errorUnclosedQuote() { + CSV.split("a,\"b"); + } +} diff --git a/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestLoad.java b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestLoad.java new file mode 100644 index 00000000000..cc0e3c5eba3 --- /dev/null +++ b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestLoad.java @@ -0,0 +1,120 @@ +/* + * 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 + * @summary Test of jdeprscan tool loading and printing to aCSV file. + * @modules jdk.jdeps/com.sun.tools.jdeprscan + * @library ../../../cases + * @build jdk.deprcases.members.* jdk.deprcases.types.* + * @build jdk.jdeprscan.TestLoad + * @run testng jdk.jdeprscan.TestLoad + */ + +package jdk.jdeprscan; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import com.sun.tools.jdeprscan.Main; + +import org.testng.annotations.Test; + +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertEquals; + + +public class TestLoad { + static final String UTF8 = "UTF-8"; + static final String EXPECTED = "TestLoadExpected.csv"; + + @Test + public void test1() throws IOException, UnsupportedEncodingException { + String testclasses = System.getProperty("test.classes"); + String deprcases = testclasses + "/../../../cases"; + boolean rval; + + System.out.println("test.src = " + System.getProperty("test.src")); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ByteArrayOutputStream berr = new ByteArrayOutputStream(); + + try (PrintStream prout = new PrintStream(bout, true, UTF8); + PrintStream prerr = new PrintStream(berr, true, UTF8)) { + System.out.println("Calling JDeprScan --Xprint-csv --Xload-dir " + deprcases); + rval = Main.call(prout, prerr, "--Xprint-csv", "--Xload-dir", deprcases); + System.out.println("JDeprScan returns " + rval); + } + + System.out.println("----- stdout"); + new ByteArrayInputStream(bout.toByteArray()).transferTo(System.out); + System.out.println("----- end stdout"); + System.out.println("----- stderr"); + new ByteArrayInputStream(berr.toByteArray()).transferTo(System.out); + System.out.println("----- end stderr"); + + List actualList; + try (ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray()); + InputStreamReader isr = new InputStreamReader(bais); + BufferedReader br = new BufferedReader(isr)) { + actualList = br.lines().collect(Collectors.toList()); + } + + Path expfile = Paths.get(System.getProperty("test.src"), EXPECTED); + List expectedList = Files.readAllLines(expfile); + + Set actual = new HashSet<>(actualList.subList(1, actualList.size())); + Set expected = new HashSet<>(expectedList.subList(1, expectedList.size())); + + Set diff1 = new HashSet<>(actual); + diff1.removeAll(expected); + Set diff2 = new HashSet<>(expected); + diff2.removeAll(actual); + if (diff1.size() > 0) { + System.out.println("Extra lines in output:"); + diff1.forEach(System.out::println); + } + + if (diff2.size() > 0) { + System.out.println("Lines missing from output:"); + diff2.forEach(System.out::println); + } + + assertTrue(rval); + assertEquals(berr.toByteArray().length, 0); + assertEquals(actual.size(), actualList.size() - 1); + assertEquals(diff1.size(), 0); + assertEquals(diff2.size(), 0); + } +} diff --git a/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestLoadExpected.csv b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestLoadExpected.csv new file mode 100644 index 00000000000..dd58eacd90c --- /dev/null +++ b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestLoadExpected.csv @@ -0,0 +1,30 @@ +#jdepr 1 +METHOD,jdk/deprcases/members/ExampleAnnotation,name()Ljava/lang/String;,,false +FIELD,jdk/deprcases/members/ExampleClass,field1,,false +FIELD,jdk/deprcases/members/ExampleClass,field2,,false +FIELD,jdk/deprcases/members/ExampleClass,staticfield3,,false +CONSTRUCTOR,jdk/deprcases/members/ExampleClass,(Z)V,,false +METHOD,jdk/deprcases/members/ExampleClass,method1()V,,false +METHOD,jdk/deprcases/members/ExampleClass,method2()V,,false +METHOD,jdk/deprcases/members/ExampleClass,staticmethod1()V,,false +METHOD,jdk/deprcases/members/ExampleEnum$1,deprMethod2()V,,false +ENUM_CONSTANT,jdk/deprcases/members/ExampleEnum,THREE,,false +ENUM_CONSTANT,jdk/deprcases/members/ExampleEnum,FIVE,,false +METHOD,jdk/deprcases/members/ExampleEnum,deprMethod1()V,,false +FIELD,jdk/deprcases/members/ExampleInterface,DEP_FIELD1,,false +FIELD,jdk/deprcases/members/ExampleInterface,DEP_FIELD2,,false +METHOD,jdk/deprcases/members/ExampleInterface,interfaceMethod1()V,,false +METHOD,jdk/deprcases/members/ExampleInterface,interfaceMethod2()V,,false +METHOD,jdk/deprcases/members/ExampleInterface,defaultMethod()V,,false +METHOD,jdk/deprcases/members/ExampleInterface,staticmethod2()V,,false +ANNOTATION_TYPE,jdk/deprcases/types/DeprecatedAnnotation,,,false +CLASS,jdk/deprcases/types/DeprecatedClass,,,false +ENUM,jdk/deprcases/types/DeprecatedEnum,,,false +CLASS,jdk/deprcases/types/DeprecatedException,,,false +INTERFACE,jdk/deprcases/types/DeprecatedInterface,,,false +FIELD,jdk/deprcases/members/ExampleElements,emptyFalse,,false +FIELD,jdk/deprcases/members/ExampleElements,sinceFalse,xyzzy,false +FIELD,jdk/deprcases/members/ExampleElements,emptyTrue,,true +FIELD,jdk/deprcases/members/ExampleElements,sinceTrue,plugh,true +FIELD,jdk/deprcases/members/ExampleElements,sinceWithComma,"123,456",false +FIELD,jdk/deprcases/members/ExampleElements,sinceWithQuote,"7.9 ""pre-beta"" snapshot",false diff --git a/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestMethodSig.java b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestMethodSig.java new file mode 100644 index 00000000000..e44b8b2e133 --- /dev/null +++ b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestMethodSig.java @@ -0,0 +1,61 @@ +/* + * 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 + * @summary Simple tests for method signature parsing + * @modules jdk.jdeps/com.sun.tools.jdeprscan.scan + * @build TestMethodSig + * @run testng jdk.jdeprscan.TestMethodSig + */ + +package jdk.jdeprscan; + +import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; +import static com.sun.tools.jdeprscan.scan.MethodSig.fromDesc; + +public class TestMethodSig { + @Test + public void testSimple() { + assertEquals(fromDesc("(Ljava/rmi/RMISecurityManager;)Ljava/lang/Object;").toString(), + "parameters 0=Ljava/rmi/RMISecurityManager; return Ljava/lang/Object;"); + } + + @Test + public void testMultParamVoidReturn() { + assertEquals(fromDesc("([[IZLjava/lang/String;B[J)V").toString(), + "parameters 0=[[I 1=Z 2=Ljava/lang/String; 3=B 4=[J return V"); + } + + @Test + public void testNoParams() { + assertEquals(fromDesc("()J").toString(), + "parameters none return J"); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testMissingReturnType() { + fromDesc("(ISJZ)"); + } +} diff --git a/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestScan.java b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestScan.java new file mode 100644 index 00000000000..bf18cd96122 --- /dev/null +++ b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestScan.java @@ -0,0 +1,110 @@ +/* + * 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 + * @summary Basic test of jdeprscan's scanning phase. + * @modules jdk.jdeps/com.sun.tools.jdeprscan + * @library ../../../cases + * @library ../../../usage + * @build jdk.deprcases.members.* jdk.deprcases.types.* + * @build jdk.deprusage.* + * @build jdk.jdeprscan.TestScan + * @run testng jdk.jdeprscan.TestScan + */ + +package jdk.jdeprscan; + +import com.sun.tools.jdeprscan.Main; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import org.testng.Assert; + +import org.testng.annotations.Test; + +import static org.testng.Assert.assertTrue; + + +public class TestScan { + Set loadExpected() throws IOException { + Path expFile = Paths.get(System.getProperty("test.src"), "TestScanExpected.txt"); + return new HashSet<>(Files.readAllLines(expFile, StandardCharsets.UTF_8)); + } + + @Test + public void testScanAgainstReferenceFile() throws IOException { + String testclasses = System.getProperty("test.classes"); + String deprcases = testclasses + "/../../../cases"; + String deprusage = testclasses + "/../../../usage"; + + Set expected = loadExpected(); + System.out.println("expected = " + expected); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (PrintStream out = new PrintStream(baos, false, "UTF-8")) { + boolean r = Main.call(out, System.err, + "-cp", deprcases, "--Xload-dir", deprcases, deprusage); + assertTrue(r); + } + byte[] bytes = baos.toByteArray(); + + System.out.println("--- output ---"); + ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + bais.transferTo(System.out); + System.out.println("--- end output ---"); + + Set actual = + new BufferedReader( + new InputStreamReader( + new ByteArrayInputStream(bytes), StandardCharsets.UTF_8)) + .lines() + .map(line -> line.split(" +")) + .map(array -> array[1]) + .collect(Collectors.toSet()); + System.out.println("actual = " + actual); + + Set diff1 = new HashSet<>(expected); + diff1.removeAll(actual); + Set diff2 = new HashSet<>(actual); + diff2.removeAll(expected); + + if (diff1.size() > 0 || diff2.size() > 0) { + System.out.println("missing items: " + diff1); + System.out.println("extra items: " + diff2); + } + + Assert.assertEquals(diff1.size(), 0); + Assert.assertEquals(diff2.size(), 0); + } +} diff --git a/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestScanExpected.txt b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestScanExpected.txt new file mode 100644 index 00000000000..73568034673 --- /dev/null +++ b/langtools/test/tools/jdeprscan/tests/jdk/jdeprscan/TestScanExpected.txt @@ -0,0 +1,47 @@ +jdk/jdeprusage/UseClass$ArrayCreation +jdk/jdeprusage/UseClass$ArrayFieldUsage +jdk/jdeprusage/UseClass$ArrayMethodCall +jdk/jdeprusage/UseClass$Cast +jdk/jdeprusage/UseClass$ClassLiteral +jdk/jdeprusage/UseClass$Construct +jdk/jdeprusage/UseClass$Extends +jdk/jdeprusage/UseClass$FieldType +jdk/jdeprusage/UseClass$InstanceOf +jdk/jdeprusage/UseClass$MethodParameter +jdk/jdeprusage/UseClass$MethodReturn +jdk/jdeprusage/UseEnum$ClassObject +jdk/jdeprusage/UseEnum$EnumConstant +jdk/jdeprusage/UseEnum$FieldType +jdk/jdeprusage/UseEnum$MethodParameter +jdk/jdeprusage/UseEnum$ReturnValue +jdk/jdeprusage/UseEnum$ValueOfMethod +jdk/jdeprusage/UseEnum$ValuesMethod +jdk/jdeprusage/UseEnumMembers$1 +jdk/jdeprusage/UseEnumMembers$MethodInEnum1 +jdk/jdeprusage/UseEnumMembers$MethodOnConstant1 +jdk/jdeprusage/UseEnumMembers$ReturnValue +jdk/jdeprusage/UseException$Catch +jdk/jdeprusage/UseException$Throws +jdk/jdeprusage/UseField$Direct +jdk/jdeprusage/UseField$FromSubclass +jdk/jdeprusage/UseField$Inherited +jdk/jdeprusage/UseField$StaticField +jdk/jdeprusage/UseField$SuperFromSubclass +jdk/jdeprusage/UseInterface$ClassImplements +jdk/jdeprusage/UseInterface$InterfaceExtends +jdk/jdeprusage/UseMethod$ClassStatic +jdk/jdeprusage/UseMethod$Constructor +jdk/jdeprusage/UseMethod$ConstructorFromSubclass +jdk/jdeprusage/UseMethod$Direct +jdk/jdeprusage/UseMethod$Inherited +jdk/jdeprusage/UseMethod$InheritedDefault +jdk/jdeprusage/UseMethod$InheritedFromSubclass +jdk/jdeprusage/UseMethod$InheritedInterface +jdk/jdeprusage/UseMethod$InheritedInterfaceDefault +jdk/jdeprusage/UseMethod$InterfaceDefault +jdk/jdeprusage/UseMethod$InterfaceDirect +jdk/jdeprusage/UseMethod$InterfaceStatic +jdk/jdeprusage/UseMethod$OverrideClassMethod +jdk/jdeprusage/UseMethod$OverrideDefaultMethod +jdk/jdeprusage/UseMethod$OverrideInterfaceMethod +jdk/jdeprusage/UseMethod$SuperFromSubclass diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseAnnotation.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseAnnotation.java new file mode 100644 index 00000000000..71ac29f4ef0 --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseAnnotation.java @@ -0,0 +1,41 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.types.DeprecatedAnnotation; + +public class UseAnnotation { + @DeprecatedAnnotation + static class AnnotatedClass { } + + static class AnnotatedMethod { + @DeprecatedAnnotation + void foo() { } + } + + static class AnnotatedField { + @DeprecatedAnnotation + int foo = 1; + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseClass.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseClass.java new file mode 100644 index 00000000000..b56accd828a --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseClass.java @@ -0,0 +1,107 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.types.DeprecatedClass; + +public class UseClass { + static class Extends extends DeprecatedClass { + } + + static class ClassLiteral { + Class clazz = DeprecatedClass.class; + } + + static class FieldType { + DeprecatedClass obj = null; + } + + static class MethodParameter { + void foo(DeprecatedClass x) { } + } + + static class MethodReturn { + DeprecatedClass foo() { return null; } + } + + static class ArrayCreation { + Object foo() { + return new DeprecatedClass[1]; + } + } + + static class ArrayFieldUsage { + int foo(Object o) { + return ((DeprecatedClass[])o).length; + } + } + + static class ArrayMethodCall { + Object foo(Object o) { + return ((DeprecatedClass[])o).clone(); + } + } + + static class InstanceOf { + boolean foo(Object o) { + return o instanceof DeprecatedClass; + } + } + + static class Cast { + Object foo(Object o) { + return (DeprecatedClass)o; + } + } + + static class Generic { + static void g() { } + } + + static class ClassTypeArg extends Generic { } + + static class MethodTypeArg { + void foo() { + Generic.g(); + } + } + + static class ConstructorTypeArg { + Object foo() { + return new Generic(); + } + } + + static class Construct { + Object foo() { + return new DeprecatedClass(); + } + } + + static class Local { + void foo() { + DeprecatedClass obj = null; + } + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseEnum.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseEnum.java new file mode 100644 index 00000000000..aa1c2106f48 --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseEnum.java @@ -0,0 +1,62 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.types.DeprecatedEnum; + +public class UseEnum { + static class ReturnValue { + static DeprecatedEnum returnValue() { return null; } + } + + static class MethodParameter { + static void methodParameterType(DeprecatedEnum e) { } + } + + static class FieldType { + static DeprecatedEnum field; + } + + static class EnumConstant { + static Object field2 = DeprecatedEnum.FIRST; + } + + static class ValuesMethod { + static Object[] valuesMethod() { + return DeprecatedEnum.values(); + } + } + + static class ValueOfMethod { + static Object valueOfMethod(String s) { + return DeprecatedEnum.valueOf(s); + } + } + + static class ClassObject { + static Object classObject() { + return DeprecatedEnum.class; + } + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseEnumMembers.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseEnumMembers.java new file mode 100644 index 00000000000..7b4916bfca3 --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseEnumMembers.java @@ -0,0 +1,74 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.members.ExampleEnum; + +public class UseEnumMembers { + static class ReturnValue { + static ExampleEnum returnValue() { + return ExampleEnum.FIVE; + } + } + + static class UseInSwitch { + // enum switch generates inner class UseEnumMembers$UseInSwitch$1 + static void useInSwitch(ExampleEnum e) { + switch (e) { + case ONE: + case TWO: + case FOUR: + // no deprecation + break; + case THREE: + // deprecated + break; + } + } + } + + static class MethodInEnum1 { + static void methodInEnum1(ExampleEnum e) { + e.deprMethod1(); + } + } + + static class MethodOnConstant1 { + static void methodOnConstant1() { + // surprising that there is a warning here; + // the method deprMethod1 is overridden in TWO + ExampleEnum.TWO.deprMethod1(); + } + } + + static void methodInEnum2(ExampleEnum e) { + e.deprMethod2(); + } + + static void methodOnConstant2() { + // surprising there is no warning here; + // the method is deprecated in TWO + ExampleEnum.TWO.deprMethod2(); + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseException.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseException.java new file mode 100644 index 00000000000..87f8a241eaf --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseException.java @@ -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. + */ + +package jdk.jdeprusage; + +import jdk.deprcases.types.DeprecatedException; + +public class UseException { + static class Throws { + static void foo() throws DeprecatedException { } + } + + static class Catch { + void foo() { + try { + Throws.foo(); + } catch (DeprecatedException de) { } + } + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseField.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseField.java new file mode 100644 index 00000000000..ed940c4f0ea --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseField.java @@ -0,0 +1,72 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.members.ExampleClass; +import jdk.deprcases.members.ExampleInterface; +import jdk.deprcases.members.ExampleSubclass; + +public class UseField { + static class Direct { + int f(ExampleClass ec) { + return ec.field1; + } + } + + static class Inherited { + int f(ExampleSubclass esc) { + return esc.field2; + } + } + + static class InterfaceInherited { + int f(ExampleSubclass esc) { + return esc.DEP_FIELD2; + } + } + + static class InterfaceDirect { + int f(ExampleInterface ei) { + return ei.DEP_FIELD1; + } + } + + static class FromSubclass extends ExampleClass { + int f() { + return field1; + } + } + + static class SuperFromSubclass extends ExampleClass { + int f() { + return super.field1; + } + } + + static class StaticField { + int f() { + return ExampleClass.staticfield3; + } + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseInterface.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseInterface.java new file mode 100644 index 00000000000..2368a915eb5 --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseInterface.java @@ -0,0 +1,36 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.types.DeprecatedInterface; + +public class UseInterface { + static class ClassImplements implements DeprecatedInterface { + + } + + interface InterfaceExtends extends DeprecatedInterface { + + } +} diff --git a/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseMethod.java b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseMethod.java new file mode 100644 index 00000000000..79aa91ab5b7 --- /dev/null +++ b/langtools/test/tools/jdeprscan/usage/jdk/deprusage/UseMethod.java @@ -0,0 +1,123 @@ +/* + * 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 jdk.jdeprusage; + +import jdk.deprcases.members.ExampleClass; +import jdk.deprcases.members.ExampleInterface; +import jdk.deprcases.members.ExampleSubclass; + +public class UseMethod { + static class Direct { + void m(ExampleClass ec) { + ec.method1(); + } + } + + static class Inherited { + void m(ExampleSubclass esc) { + esc.method2(); + } + } + + static class InheritedDefault { + void m(ExampleSubclass esc) { + esc.defaultMethod(); + } + } + + static class InterfaceDirect { + void m(ExampleInterface ei) { + ei.interfaceMethod1(); + } + } + + static class InterfaceDefault { + void m(ExampleInterface ei) { + ei.defaultMethod(); + } + } + + static class ClassStatic { + void m() { + ExampleClass.staticmethod1(); + } + } + + static class InterfaceStatic { + void m() { + ExampleInterface.staticmethod2(); + } + } + + static class SuperFromSubclass extends ExampleClass { + void m() { + super.method1(); + } + } + + static class InheritedFromSubclass extends ExampleClass { + void m() { + method1(); + } + } + + static class Constructor { + Object m() { + return new ExampleClass(true); + } + } + + static class ConstructorFromSubclass extends ExampleClass { + public ConstructorFromSubclass() { + super(true); + } + } + + abstract static class InheritedInterfaceDefault extends ExampleSubclass { + void m() { + defaultMethod(); + } + } + + abstract static class InheritedInterface extends ExampleSubclass { + void m() { + interfaceMethod1(); + } + } + + static class OverrideClassMethod extends ExampleClass { + @Override + public void method1() { } + } + + abstract static class OverrideInterfaceMethod implements ExampleInterface { + @Override + public void interfaceMethod1() { } + } + + abstract static class OverrideDefaultMethod implements ExampleInterface { + @Override + public void defaultMethod() { } + } +} diff --git a/langtools/test/tools/jdeps/jdkinternals/RemovedJDKInternals.java b/langtools/test/tools/jdeps/jdkinternals/RemovedJDKInternals.java index 68822f8d71c..272fb717251 100644 --- a/langtools/test/tools/jdeps/jdkinternals/RemovedJDKInternals.java +++ b/langtools/test/tools/jdeps/jdkinternals/RemovedJDKInternals.java @@ -73,7 +73,7 @@ public class RemovedJDKInternals { // patch jdk.unsupported and set -cp to codec types assertTrue(CompilerUtils.compile(Paths.get(TEST_SRC, "src", "p"), CLASSES_DIR, - "-Xpatch:jdk.unsupported=" + patchDir, + "--patch-module", "jdk.unsupported=" + patchDir, "-cp", codecDest.toString())); } diff --git a/langtools/test/tools/jdeps/lib/CompilerUtils.java b/langtools/test/tools/jdeps/lib/CompilerUtils.java index be2a0ff66b2..35c0543137f 100644 --- a/langtools/test/tools/jdeps/lib/CompilerUtils.java +++ b/langtools/test/tools/jdeps/lib/CompilerUtils.java @@ -100,7 +100,7 @@ public final class CompilerUtils { } Stream opts = Arrays.stream(new String[] { - "-modulesourcepath", source.toString(), "-m", moduleName + "--module-source-path", source.toString(), "-m", moduleName }); List javacOpts = Stream.concat(opts, Arrays.stream(options)) .collect(Collectors.toList()); diff --git a/nashorn/.hgtags b/nashorn/.hgtags index aa139484a6f..f68987a568a 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -366,3 +366,4 @@ ff07be6106fa56b72c163244f45a3ecb4c995564 jdk-9+127 0de67a63e2c73781ecf5979a2f3aa9619a445c37 jdk-9+130 ee77c6b3713ab293e027ac3ea1cc16f86dac535f jdk-9+131 55a75af751dfe44039baef2b762ee7347021025b jdk-9+132 +3a924b820d02b108cf57b51e145b5150d1eedcca jdk-9+133 diff --git a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java index 418bce95c85..d792738cfa4 100644 --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java @@ -172,7 +172,7 @@ public final class Main extends Shell { final Consumer evaluator = str -> { // could be called from different thread (GUI), we need to handle Context set/reset final Global _oldGlobal = Context.getGlobal(); - final boolean _globalChanged = (oldGlobal != global); + final boolean _globalChanged = (_oldGlobal != global); if (_globalChanged) { Context.setGlobal(global); } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesCalculator.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesCalculator.java index ac05a5f77ca..a026f2d2c57 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesCalculator.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/OptimisticTypesCalculator.java @@ -79,7 +79,7 @@ final class OptimisticTypesCalculator extends SimpleNodeVisitor { @Override public boolean enterPropertyNode(final PropertyNode propertyNode) { - if(propertyNode.getKeyName().equals(ScriptObject.PROTO_PROPERTY_NAME)) { + if(ScriptObject.PROTO_PROPERTY_NAME.equals(propertyNode.getKeyName())) { tagNeverOptimistic(propertyNode.getValue()); } return super.enterPropertyNode(propertyNode); diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties index 718f6cb07ef..d259e7528b5 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Functions.properties @@ -173,3 +173,20 @@ String.prototype.toUpperCase=returns a new string representing the calling strin 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 + +Boolean.prototype.toString=returns string representation of specified Boolean object + +Boolean.prototype.valueOf=returns the primitive value of the specified Boolean object + +Number.prototype.toString=returns string representation of specified object in the specified radix + +Number.prototype.toLocaleString=returns a string with a language sensitive representation of this number + +Number.prototype.valueOf=returns the primitive value of the specified object + +Number.prototype.toFixed=returns a string representing the number in decimal fixed-point notation + +Number.prototype.toExponential=returns a string representing the number in decimal exponential notation + +Number.prototype.toPrecision=returns a string representing the number to a specified precision in fixed-point or exponential notation +