# HG changeset patch # User mkos # Date 1383938152 -3600 # Node ID cd3d3cf45c6eddfcaf2a6537c734ce0479d8f2fa # Parent 1067e01a4e0e8ca531ceea05d91078bdfbd12a8d 8027224: test regression - ClassNotFoundException Summary: test regression; fix also reviewed by Filipp Zkinkin, Iaroslav Savytskyi, Alexander Fomin Reviewed-by: mgrebac diff -r 1067e01a4e0e -r cd3d3cf45c6e src/share/jaxws_classes/com/sun/xml/internal/ws/fault/SOAPFaultBuilder.java --- a/src/share/jaxws_classes/com/sun/xml/internal/ws/fault/SOAPFaultBuilder.java Tue Jan 14 20:24:45 2014 -0500 +++ b/src/share/jaxws_classes/com/sun/xml/internal/ws/fault/SOAPFaultBuilder.java Fri Nov 08 20:15:52 2013 +0100 @@ -59,6 +59,12 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.ReflectPermission; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.Permissions; +import java.security.PrivilegedAction; +import java.security.ProtectionDomain; import java.util.Iterator; import java.util.Map; import java.util.logging.Level; @@ -546,10 +552,40 @@ // ignore } - try { - JAXB_CONTEXT = (JAXBRIContext)JAXBContext.newInstance(SOAP11Fault.class, SOAP12Fault.class); - } catch (JAXBException e) { - throw new Error(e); // this must be a bug in our code + JAXB_CONTEXT = createJAXBContext(); + } + + private static JAXBRIContext createJAXBContext() { + + // in jdk runtime doPrivileged is necessary since JAX-WS internal classes are in restricted packages + if (isJDKRuntime()) { + Permissions permissions = new Permissions(); + permissions.add(new RuntimePermission("accessClassInPackage.com.sun." + "xml.internal.ws.fault")); + permissions.add(new ReflectPermission("suppressAccessChecks")); + return AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public JAXBRIContext run() { + try { + return (JAXBRIContext) JAXBContext.newInstance(SOAP11Fault.class, SOAP12Fault.class); + } catch (JAXBException e) { + throw new Error(e); + } + } + }, + new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain(null, permissions)}) + ); + + } else { + try { + return (JAXBRIContext) JAXBContext.newInstance(SOAP11Fault.class, SOAP12Fault.class); + } catch (JAXBException e) { + throw new Error(e); + } } } + + private static boolean isJDKRuntime() { + return SOAPFaultBuilder.class.getName().contains("internal"); + } }