# HG changeset patch # User dfuchs # Date 1466780403 -3600 # Node ID 68169040e3941a184d4ec9d17e05bd5c67c684ae # Parent 924b45dbcafe7200dcc69818e596d2b6749e67d7 8150173: JAXBContext.newInstance causes PrivilegedActionException when createContext's declared in abstract class extended by discovered JAXB implementation Summary: trivial fix - the concrete class must be instantiated, not the class that defines the createContext method. Reviewed-by: lancea, mchung diff -r 924b45dbcafe -r 68169040e394 jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Thu Jun 23 20:35:14 2016 +0000 +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Fri Jun 24 16:00:03 2016 +0100 @@ -193,7 +193,7 @@ try { Method m = spFactory.getMethod("createContext", String.class, ClassLoader.class, Map.class); // any failure in invoking this method would be considered fatal - Object obj = instantiateProviderIfNecessary(m); + Object obj = instantiateProviderIfNecessary(spFactory); context = m.invoke(obj, contextPath, classLoader, properties); } catch (NoSuchMethodException ignored) { // it's not an error for the provider not to have this method. @@ -203,7 +203,7 @@ // try the old method that doesn't take properties. compatible with 1.0. // it is an error for an implementation not to have both forms of the createContext method. Method m = spFactory.getMethod("createContext", String.class, ClassLoader.class); - Object obj = instantiateProviderIfNecessary(m); + Object obj = instantiateProviderIfNecessary(spFactory); // any failure in invoking this method would be considered fatal context = m.invoke(obj, contextPath, classLoader); } @@ -228,20 +228,20 @@ } } - private static Object instantiateProviderIfNecessary(Method m) throws JAXBException { - Class declaringClass = m.getDeclaringClass(); + private static Object instantiateProviderIfNecessary(Class implClass) throws JAXBException { try { - if (JAXBContextFactory.class.isAssignableFrom(declaringClass)) { + if (JAXBContextFactory.class.isAssignableFrom(implClass)) { return AccessController.doPrivileged(new PrivilegedExceptionAction() { @Override public Object run() throws Exception { - return declaringClass.newInstance(); + return implClass.newInstance(); } }); } return null; - } catch (PrivilegedActionException e) { - throw new JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, declaringClass, e), e); + } catch (PrivilegedActionException x) { + Throwable e = (x.getCause() == null) ? x : x.getCause(); + throw new JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, implClass, e), e); } } @@ -271,7 +271,7 @@ try { Method m = spFactory.getMethod("createContext", Class[].class, Map.class); - Object obj = instantiateProviderIfNecessary(m); + Object obj = instantiateProviderIfNecessary(spFactory); Object context = m.invoke(obj, classes, properties); if (!(context instanceof JAXBContext)) { // the cast would fail, so generate an exception with a nice message @@ -392,7 +392,7 @@ /** - * first factoryId should be the preffered one, + * first factoryId should be the preferred one, * more of those can be provided to support backwards compatibility */ private static String classNameFromPackageProperties(ClassLoader classLoader,