diff --git a/jaxws/src/java.activation/share/classes/javax/activation/CommandInfo.java b/jaxws/src/java.activation/share/classes/javax/activation/CommandInfo.java index b8dfd8b7091..b6312e0c253 100644 --- a/jaxws/src/java.activation/share/classes/javax/activation/CommandInfo.java +++ b/jaxws/src/java.activation/share/classes/javax/activation/CommandInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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,7 +26,10 @@ package javax.activation; import java.io.*; -import java.beans.Beans; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; /** * The CommandInfo class is used by CommandMap implementations to @@ -84,8 +87,15 @@ public class CommandInfo { /** * Return the instantiated JavaBean component. *

- * Begin by instantiating the component with - * {@code Beans.instantiate()}. + * If {@code java.beans.Beans} is visible then it's + * {@code java.beans.Beans#instantiate} method is invoked to instantiate + * the component as a JavaBeans component. + * When {@code java.beans.Beans} is not visible (when {@code java.desktop} + * module is not readable or when the runtime image does not contain the + * {@code java.desktop} module) then the command's class is loaded and + * instantiated with its public no-args constructor. + *

+ * The component class needs to be public. *

* If the bean implements the {@code javax.activation.CommandObject} * interface, call its {@code setCommandContext} method. @@ -102,7 +112,7 @@ public class CommandInfo { * this method will check if it implements the * java.io.Externalizable interface. If it does, the bean's * readExternal method will be called if an InputStream - * can be acquired from the DataHandler. + * can be acquired from the DataHandler.

* * @param dh The DataHandler that describes the data to be * passed to the command. @@ -116,7 +126,7 @@ public class CommandInfo { Object new_bean = null; // try to instantiate the bean - new_bean = java.beans.Beans.instantiate(loader, className); + new_bean = Beans.instantiate(loader, className); // if we got one and it is a CommandObject if (new_bean != null) { @@ -135,4 +145,86 @@ public class CommandInfo { return new_bean; } + + /** + * Helper class to invoke Beans.instantiate reflectively or the equivalent + * with core reflection when module java.desktop is not readable. + */ + private static final class Beans { + static final Method instantiateMethod; + + static { + Method m; + try { + Class c = Class.forName("java.beans.Beans"); + m = c.getDeclaredMethod("instantiate", ClassLoader.class, String.class); + } catch (ClassNotFoundException e) { + m = null; + } catch (NoSuchMethodException e) { + m = null; + } + instantiateMethod = m; + } + + /** + * Equivalent to invoking java.beans.Beans.instantiate(loader, cn) + */ + static Object instantiate(ClassLoader loader, String cn) + throws IOException, ClassNotFoundException { + + Exception exception; + + if (instantiateMethod != null) { + + // invoke Beans.instantiate + try { + return instantiateMethod.invoke(null, loader, cn); + } catch (InvocationTargetException e) { + exception = e; + } catch (IllegalAccessException e) { + exception = e; + } + + } else { + + SecurityManager security = System.getSecurityManager(); + if (security != null) { + // if it's ok with the SecurityManager, it's ok with me. + String cname = cn.replace('/', '.'); + if (cname.startsWith("[")) { + int b = cname.lastIndexOf('[') + 2; + if (b > 1 && b < cname.length()) { + cname = cname.substring(b); + } + } + int i = cname.lastIndexOf('.'); + if (i != -1) { + security.checkPackageAccess(cname.substring(0, i)); + } + } + + // Beans.instantiate specified to use SCL when loader is null + if (loader == null) { + loader = (ClassLoader) + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + ClassLoader cl = null; + try { + cl = ClassLoader.getSystemClassLoader(); + } catch (SecurityException ex) { } + return cl; + } + }); + } + Class beanClass = Class.forName(cn, false, loader); + try { + return beanClass.getDeclaredConstructor().newInstance(); + } catch (Exception ex) { + throw new ClassNotFoundException(beanClass + ": " + ex, ex); + } + + } + return null; + } + } } diff --git a/jaxws/src/java.activation/share/classes/module-info.java b/jaxws/src/java.activation/share/classes/module-info.java index dca632ee776..1ba4eb115ec 100644 --- a/jaxws/src/java.activation/share/classes/module-info.java +++ b/jaxws/src/java.activation/share/classes/module-info.java @@ -28,8 +28,6 @@ */ module java.activation { requires public java.datatransfer; - // dependence on java.beans.Beans to be eliminated - requires java.desktop; requires java.logging; exports javax.activation; diff --git a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/util/Which.java b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/util/Which.java index 4e52d9cce11..bb9eeb5faf8 100644 --- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/util/Which.java +++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/util/Which.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -41,7 +41,7 @@ public class Which { /** * Search the specified classloader for the given classname. - * + * Then give the return value. * @param classname the fully qualified name of the class to search for * @param loader the classloader to search * @return the source location of the resource, or null if it wasn't found diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java index a2d9bceb37f..4b4f6e55c46 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java @@ -450,8 +450,8 @@ public abstract class JAXBContext { * in an empty map. * * @return a new instance of a {@code JAXBContext} - * @throws JAXBException - * if an error was encountered while creating the {@code JAXBContext} such as + * @throws JAXBException if an error was encountered while creating the + * {@code JAXBContext} such as *

    *
  1. failure to locate either ObjectFactory.class or jaxb.index in the packages
  2. *
  3. an ambiguity among global elements contained in the contextPath
  4. diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/attachment/package.html b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/attachment/package.html index c452cb9ad7f..499643d184d 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/attachment/package.html +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/attachment/package.html @@ -1,6 +1,6 @@ - @since 1.6, JAXB 2.0 + @since JAXB 2.0 diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java index cef1cf68e72..78f5232a446 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,9 +47,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; -import java.io.File; -import java.io.Reader; -import java.net.MalformedURLException; +import java.io.*; import java.net.URL; /** @@ -178,16 +176,8 @@ public abstract class AbstractUnmarshallerImpl implements Unmarshaller } try { - // copied from JAXP - String path = f.getAbsolutePath(); - if (File.separatorChar != '/') - path = path.replace(File.separatorChar, '/'); - if (!path.startsWith("/")) - path = "/" + path; - if (!path.endsWith("/") && f.isDirectory()) - path = path + "/"; - return unmarshal(new URL("file", "", path)); - } catch( MalformedURLException e ) { + return unmarshal(new BufferedInputStream(new FileInputStream(f))); + } catch( FileNotFoundException e ) { throw new IllegalArgumentException(e.getMessage()); } } diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/package.html b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/package.html index 059abed0a0b..02588965592 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/package.html +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/helpers/package.html @@ -1,6 +1,6 @@