From c8684a49b50bb16b0e9817783cc453720d8699f7 Mon Sep 17 00:00:00 2001 From: Alessio Soldano Date: Tue, 24 Oct 2017 23:05:40 +0200 Subject: [PATCH 1/2] Fixing log for performance reasons --- .../main/java/javax/xml/bind/ContextFinder.java | 8 ++++++-- .../java/javax/xml/bind/ServiceLoaderUtil.java | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java b/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java index d0d7c574..08159cbd 100644 --- a/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java +++ b/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java @@ -429,7 +429,9 @@ static JAXBContext find(Class[] classes, Map properties) throws JA private static String classNameFromPackageProperties(URL packagePropertiesUrl, String ... factoryIds) throws JAXBException { - logger.log(Level.FINE, "Trying to locate {0}", packagePropertiesUrl.toString()); + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Trying to locate {0}", packagePropertiesUrl.toString()); + } Properties props = loadJAXBProperties(packagePropertiesUrl); for(String factoryId : factoryIds) { if (props.containsKey(factoryId)) { @@ -492,7 +494,9 @@ private static Properties loadJAXBProperties(URL url) throws JAXBException { is.close(); return props; } catch (IOException ioe) { - logger.log(Level.FINE, "Unable to load " + url.toString(), ioe); + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Unable to load " + url.toString(), ioe); + } throw new JAXBException(ioe.toString(), ioe); } } diff --git a/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java b/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java index f5bc4d54..8b79dd50 100644 --- a/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java +++ b/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java @@ -67,8 +67,11 @@ static P firstByServiceLoader(Class

spiClass, ServiceLoader

serviceLoader = ServiceLoader.load(spiClass); for (P impl : serviceLoader) { - logger.fine("ServiceProvider loading Facility used; returning object [" + - impl.getClass().getName() + "]"); + if (logger.isLoggable(Level.FINE)) + { + logger.fine( + "ServiceProvider loading Facility used; returning object [" + impl.getClass().getName() + "]"); + } return impl; } @@ -88,8 +91,10 @@ static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) { Iterator iter = ((Iterable) m.invoke(null, serviceClass)).iterator(); if (iter.hasNext()) { Object next = iter.next(); - logger.fine("Found implementation using OSGi facility; returning object [" + - next.getClass().getName() + "]."); + if (logger.isLoggable(Level.FINE)) { + logger.fine("Found implementation using OSGi facility; returning object [" + + next.getClass().getName() + "]."); + } return next; } else { return null; @@ -99,7 +104,9 @@ static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) { ClassNotFoundException | NoSuchMethodException ignored) { - logger.log(Level.FINE, "Unable to find from OSGi: [" + factoryId + "]", ignored); + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Unable to find from OSGi: [" + factoryId + "]", ignored); + } return null; } } From 36f81ef9a5ed8ea227341a4c4d4b6d63fd89b20d Mon Sep 17 00:00:00 2001 From: Alessio Soldano Date: Tue, 24 Oct 2017 23:07:00 +0200 Subject: [PATCH 2/2] Fix classloader discovery logic --- .../java/javax/xml/bind/ContextFinder.java | 26 ++++++++++++------- .../javax/xml/bind/ServiceLoaderUtil.java | 3 ++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java b/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java index 08159cbd..df54c50f 100644 --- a/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java +++ b/jaxb-api/src/main/java/javax/xml/bind/ContextFinder.java @@ -269,11 +269,11 @@ public Object run() throws Exception { /** * Create an instance of a class using the thread context ClassLoader */ - static JAXBContext newInstance(Class[] classes, Map properties, String className) throws JAXBException { + static JAXBContext newInstance(Class[] classes, Map properties, String className, ClassLoader loader) throws JAXBException { Class spi; try { - spi = ServiceLoaderUtil.safeLoadClass(className, PLATFORM_DEFAULT_FACTORY_CLASS, getContextClassLoader()); + spi = ServiceLoaderUtil.safeLoadClass(className, PLATFORM_DEFAULT_FACTORY_CLASS, loader); } catch (ClassNotFoundException e) { throw new JAXBException(Messages.format(Messages.DEFAULT_PROVIDER_NOT_FOUND), e); } @@ -341,7 +341,7 @@ static JAXBContext find(String factoryId, if (factoryName != null) return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties); JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader( - JAXBContextFactory.class, logger, EXCEPTION_HANDLER); + JAXBContextFactory.class, classLoader, logger, EXCEPTION_HANDLER); if (obj != null) { ModuleUtil.delegateAddOpensToImplModule(contextPathClasses, obj.getClass()); @@ -388,16 +388,19 @@ static JAXBContext find(Class[] classes, Map properties) throws JA jaxbPropertiesUrl, JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED); - return newInstance(classes, properties, factoryClassName); + return newInstance(classes, properties, factoryClassName, getContextClassLoader()); } } String factoryClassName = classNameFromSystemProperties(); - if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); + if (factoryClassName != null) return newInstance(classes, properties, factoryClassName, getContextClassLoader()); JAXBContextFactory factory = - ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER); + ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, getContextClassLoader(), logger, EXCEPTION_HANDLER); + if (factory == null) { + factory = ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, ContextFinder.class.getClassLoader(), logger, EXCEPTION_HANDLER); + } if (factory != null) { ModuleUtil.delegateAddOpensToImplModule(classes, factory.getClass()); @@ -405,8 +408,13 @@ static JAXBContext find(Class[] classes, Map properties) throws JA } // to ensure backwards compatibility - String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader()); - if (className != null) return newInstance(classes, properties, className); + ClassLoader cl = getContextClassLoader(); + String className = firstByServiceLoaderDeprecated(JAXBContext.class, cl); + if (className == null) { + cl = ContextFinder.class.getClassLoader(); + className = firstByServiceLoaderDeprecated(JAXBContext.class, cl); + } + if (className != null) return newInstance(classes, properties, className, cl); logger.fine("Trying to create the platform default provider"); Class ctxFactoryClass = @@ -418,7 +426,7 @@ static JAXBContext find(Class[] classes, Map properties) throws JA // else no provider found logger.fine("Trying to create the platform default provider"); - return newInstance(classes, properties, PLATFORM_DEFAULT_FACTORY_CLASS); + return newInstance(classes, properties, PLATFORM_DEFAULT_FACTORY_CLASS, null); } diff --git a/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java b/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java index 8b79dd50..739d5221 100644 --- a/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java +++ b/jaxb-api/src/main/java/javax/xml/bind/ServiceLoaderUtil.java @@ -60,11 +60,12 @@ class ServiceLoaderUtil { private static final String OSGI_SERVICE_LOADER_METHOD_NAME = "lookupProviderClasses"; static P firstByServiceLoader(Class

spiClass, + ClassLoader loader, Logger logger, ExceptionHandler handler) throws T { // service discovery try { - ServiceLoader

serviceLoader = ServiceLoader.load(spiClass); + ServiceLoader

serviceLoader = loader != null ? ServiceLoader.load(spiClass, loader) : ServiceLoader.load(spiClass); for (P impl : serviceLoader) { if (logger.isLoggable(Level.FINE))