< prev index next >

jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java

Print this page

        

*** 148,164 **** /** * Create an instance of a class using the specified ClassLoader */ static JAXBContext newInstance(String contextPath, String className, ClassLoader classLoader, Map properties) throws JAXBException { try { Class spFactory = ServiceLoaderUtil.safeLoadClass(className, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader); ! return newInstance(contextPath, spFactory, classLoader, properties); } catch (ClassNotFoundException x) { throw new JAXBException(Messages.format(Messages.DEFAULT_PROVIDER_NOT_FOUND), x); } catch (RuntimeException | JAXBException x) { // avoid wrapping RuntimeException to JAXBException, --- 148,165 ---- /** * Create an instance of a class using the specified ClassLoader */ static JAXBContext newInstance(String contextPath, + Class[] contextPathClasses, String className, ClassLoader classLoader, Map properties) throws JAXBException { try { Class spFactory = ServiceLoaderUtil.safeLoadClass(className, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader); ! return newInstance(contextPath, contextPathClasses, spFactory, classLoader, properties); } catch (ClassNotFoundException x) { throw new JAXBException(Messages.format(Messages.DEFAULT_PROVIDER_NOT_FOUND), x); } catch (RuntimeException | JAXBException x) { // avoid wrapping RuntimeException to JAXBException,
*** 173,182 **** --- 174,184 ---- throw new JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, className, x), x); } } static JAXBContext newInstance(String contextPath, + Class[] contextPathClasses, Class spFactory, ClassLoader classLoader, Map properties) throws JAXBException { try {
*** 210,219 **** --- 212,224 ---- if (!(context instanceof JAXBContext)) { // the cast would fail, so generate an exception with a nice message throw handleClassCastException(context.getClass(), JAXBContext.class); } + + ModuleUtil.delegateAddOpensToImplModule(contextPathClasses, spFactory); + return (JAXBContext) context; } catch (InvocationTargetException x) { // throw if it is exception not to be wrapped // otherwise, wrap with a JAXBException Throwable e = handleInvocationTargetException(x);
*** 275,284 **** --- 280,290 ---- Object context = m.invoke(obj, classes, properties); if (!(context instanceof JAXBContext)) { // the cast would fail, so generate an exception with a nice message throw handleClassCastException(context.getClass(), JAXBContext.class); } + ModuleUtil.delegateAddOpensToImplModule(classes, spFactory); return (JAXBContext) context; } catch (NoSuchMethodException | IllegalAccessException e) { throw new JAXBException(e); } catch (InvocationTargetException e) {
*** 293,346 **** static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties) throws JAXBException { ! StringTokenizer packages = new StringTokenizer(contextPath, ":"); ! if (!packages.hasMoreTokens()) { // no context is specified throw new JAXBException(Messages.format(Messages.NO_PACKAGE_IN_CONTEXTPATH)); } ! // search for jaxb.properties in the class loader of each class first ! logger.fine("Searching jaxb.properties"); ! while (packages.hasMoreTokens()) { ! // com.acme.foo - > com/acme/foo/jaxb.properties ! String factoryClassName = ! classNameFromPackageProperties( ! classLoader, ! packages.nextToken(":").replace('.', '/'), ! factoryId, ! JAXB_CONTEXT_FACTORY_DEPRECATED); ! if (factoryClassName != null) { ! return newInstance(contextPath, factoryClassName, classLoader, properties); } } String factoryName = classNameFromSystemProperties(); ! if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader( JAXBContextFactory.class, logger, EXCEPTION_HANDLER); ! if (obj != null) return obj.createContext(contextPath, classLoader, properties); // to ensure backwards compatibility factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader); ! if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader( "javax.xml.bind.JAXBContext", logger); if (ctxFactory != null) { ! return newInstance(contextPath, ctxFactory, classLoader, properties); } // else no provider found logger.fine("Trying to create the platform default provider"); ! return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties); } static JAXBContext find(Class<?>[] classes, Map<String, ?> properties) throws JAXBException { // search for jaxb.properties in the class loader of each class first --- 299,354 ---- static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties) throws JAXBException { ! if (contextPath == null || contextPath.isEmpty()) { // no context is specified throw new JAXBException(Messages.format(Messages.NO_PACKAGE_IN_CONTEXTPATH)); } ! //ModuleUtil is mr-jar class, scans context path for jaxb classes on jdk9 and higher ! Class[] contextPathClasses = ModuleUtil.getClassesFromContextPath(contextPath, classLoader); ! //first try with classloader#getResource ! String factoryClassName = jaxbProperties(contextPath, classLoader, factoryId); ! if (factoryClassName == null && contextPathClasses != null) { ! //try with class#getResource ! factoryClassName = jaxbProperties(contextPathClasses, factoryId); } + + if (factoryClassName != null) { + return newInstance(contextPath, contextPathClasses, factoryClassName, classLoader, properties); } + String factoryName = classNameFromSystemProperties(); ! if (factoryName != null) return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties); JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader( JAXBContextFactory.class, logger, EXCEPTION_HANDLER); ! if (obj != null) { ! JAXBContext context = obj.createContext(contextPath, classLoader, properties); ! ModuleUtil.delegateAddOpensToImplModule(contextPathClasses, obj.getClass()); ! return context; ! } // to ensure backwards compatibility factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader); ! if (factoryName != null) return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties); Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader( "javax.xml.bind.JAXBContext", logger); if (ctxFactory != null) { ! return newInstance(contextPath, contextPathClasses, ctxFactory, classLoader, properties); } // else no provider found logger.fine("Trying to create the platform default provider"); ! return newInstance(contextPath, contextPathClasses, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties); } static JAXBContext find(Class<?>[] classes, Map<String, ?> properties) throws JAXBException { // search for jaxb.properties in the class loader of each class first
*** 354,379 **** // TODO: do we want to optimize away searching the same package? org.Foo, org.Bar, com.Baz // classes from the same package might come from different class loades, so it might be a bad idea // TODO: it's easier to look things up from the class // c.getResourceAsStream("jaxb.properties"); String factoryClassName = classNameFromPackageProperties( ! getClassClassLoader(c), ! c.getPackage().getName().replace('.', '/'), JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED); ! if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); } String factoryClassName = classNameFromSystemProperties(); if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); JAXBContextFactory factory = ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER); ! if (factory != null) return factory.createContext(classes, properties); // to ensure backwards compatibility String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader()); if (className != null) return newInstance(classes, properties, className); --- 362,396 ---- // TODO: do we want to optimize away searching the same package? org.Foo, org.Bar, com.Baz // classes from the same package might come from different class loades, so it might be a bad idea // TODO: it's easier to look things up from the class // c.getResourceAsStream("jaxb.properties"); + URL jaxbPropertiesUrl = getResourceUrl(c, "jaxb.properties"); + + if (jaxbPropertiesUrl != null) { + String factoryClassName = classNameFromPackageProperties( ! jaxbPropertiesUrl, JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED); ! return newInstance(classes, properties, factoryClassName); ! } ! } String factoryClassName = classNameFromSystemProperties(); if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); JAXBContextFactory factory = ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER); ! if (factory != null) { ! JAXBContext context = factory.createContext(classes, properties); ! ModuleUtil.delegateAddOpensToImplModule(classes, factory.getClass()); ! return context; ! } // to ensure backwards compatibility String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader()); if (className != null) return newInstance(classes, properties, className);
*** 393,419 **** /** * first factoryId should be the preferred one, * more of those can be provided to support backwards compatibility */ ! private static String classNameFromPackageProperties(ClassLoader classLoader, ! String packageName, String ... factoryIds) throws JAXBException { ! String resourceName = packageName + "/jaxb.properties"; ! logger.log(Level.FINE, "Trying to locate {0}", resourceName); ! Properties props = loadJAXBProperties(classLoader, resourceName); ! if (props != null) { for(String factoryId : factoryIds) { if (props.containsKey(factoryId)) { return props.getProperty(factoryId); } } throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0])); } - return null; - } private static String classNameFromSystemProperties() throws JAXBException { String factoryClassName = getSystemProperty(JAXBContext.JAXB_CONTEXT_FACTORY); if (factoryClassName != null) { --- 410,434 ---- /** * first factoryId should be the preferred one, * more of those can be provided to support backwards compatibility */ ! private static String classNameFromPackageProperties(URL packagePropertiesUrl, String ... factoryIds) throws JAXBException { ! logger.log(Level.FINE, "Trying to locate {0}", packagePropertiesUrl.toString()); ! Properties props = loadJAXBProperties(packagePropertiesUrl); for(String factoryId : factoryIds) { if (props.containsKey(factoryId)) { return props.getProperty(factoryId); } } + //Factory key not found + String propertiesUrl = packagePropertiesUrl.toExternalForm(); + String packageName = propertiesUrl.substring(0, propertiesUrl.indexOf("/jaxb.properties")); throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0])); } private static String classNameFromSystemProperties() throws JAXBException { String factoryClassName = getSystemProperty(JAXBContext.JAXB_CONTEXT_FACTORY); if (factoryClassName != null) {
*** 450,483 **** logger.log(Level.FINE, " not found"); } return value; } ! private static Properties loadJAXBProperties(ClassLoader classLoader, ! String propFileName) throws JAXBException { - Properties props = null; try { ! URL url; ! if (classLoader == null) ! url = ClassLoader.getSystemResource(propFileName); ! else ! url = classLoader.getResource(propFileName); ! ! if (url != null) { logger.log(Level.FINE, "loading props from {0}", url); props = new Properties(); InputStream is = url.openStream(); props.load(is); is.close(); ! } } catch (IOException ioe) { ! logger.log(Level.FINE, "Unable to load " + propFileName, ioe); throw new JAXBException(ioe.toString(), ioe); } ! return props; } /** * Search the given ClassLoader for an instance of the specified class and --- 465,508 ---- logger.log(Level.FINE, " not found"); } return value; } ! private static Properties loadJAXBProperties(URL url) throws JAXBException { try { ! Properties props; logger.log(Level.FINE, "loading props from {0}", url); props = new Properties(); InputStream is = url.openStream(); props.load(is); is.close(); ! return props; } catch (IOException ioe) { ! logger.log(Level.FINE, "Unable to load " + url.toString(), ioe); throw new JAXBException(ioe.toString(), ioe); } + } ! /** ! * If run on JPMS package containing resource must be open unconditionally. ! * ! * @param classLoader classloader to load resource with ! * @param resourceName qualified name of the resource ! * @return resource url if found ! */ ! private static URL getResourceUrl(ClassLoader classLoader, String resourceName) { ! URL url; ! if (classLoader == null) ! url = ClassLoader.getSystemResource(resourceName); ! else ! url = classLoader.getResource(resourceName); ! return url; ! } ! ! private static URL getResourceUrl(Class<?> clazz, String resourceName) { ! return clazz.getResource(resourceName); } /** * Search the given ClassLoader for an instance of the specified class and
*** 604,609 **** --- 629,658 ---- logger.log(Level.SEVERE, "Unable to close resource: " + resource, ex); } } } + private static String jaxbProperties(String contextPath, ClassLoader classLoader, String factoryId) throws JAXBException { + String[] packages = contextPath.split(":"); + + for (String pkg : packages) { + String pkgUrl = pkg.replace('.', '/'); + URL jaxbPropertiesUrl = getResourceUrl(classLoader, pkgUrl + "/jaxb.properties"); + if (jaxbPropertiesUrl != null) { + return classNameFromPackageProperties(jaxbPropertiesUrl, + factoryId, JAXB_CONTEXT_FACTORY_DEPRECATED); + } + } + return null; + } + + private static String jaxbProperties(Class[] classesFromContextPath, String factoryId) throws JAXBException { + for (Class c : classesFromContextPath) { + URL jaxbPropertiesUrl = getResourceUrl(c, "jaxb.properties"); + if (jaxbPropertiesUrl != null) { + return classNameFromPackageProperties(jaxbPropertiesUrl, factoryId, JAXB_CONTEXT_FACTORY_DEPRECATED); + } + } + return null; + } + }
< prev index next >