Bump source/binary level to 11, drop MR-jar (#207) Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/api/pom.xml b/api/pom.xml index e99ae32..b7b1bc6 100644 --- a/api/pom.xml +++ b/api/pom.xml
@@ -67,11 +67,6 @@ <plugin> <artifactId>maven-javadoc-plugin</artifactId> <configuration> - <additionalOptions> - <additionalOptions>--add-modules</additionalOptions> - <additionalOptions>java.desktop</additionalOptions> - </additionalOptions> - <release>11</release> <nodeprecated>false</nodeprecated> <notimestamp>true</notimestamp> <nosince>true</nosince> @@ -146,21 +141,6 @@ </resources> </configuration> </execution> - <execution> - <id>add-mr-resource</id> - <phase>prepare-package</phase> - <goals> - <goal>add-resource</goal> - </goals> - <configuration> - <resources> - <resource> - <directory>${project.basedir}/src/main/mr-jar</directory> - <targetPath>META-INF/versions/9</targetPath> - </resource> - </resources> - </configuration> - </execution> </executions> </plugin> <plugin> @@ -191,41 +171,12 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> - <source>9</source> - <target>9</target> <compilerArgs> <arg>-Xlint:all</arg> </compilerArgs> <showDeprecation>true</showDeprecation> <showWarnings>true</showWarnings> </configuration> - <executions> - <execution> - <id>default-compile-mr</id> - <goals> - <goal>compile</goal> - </goals> - <configuration> - <release>9</release> - <compileSourceRoots> - <compileSourceRoot>${project.basedir}/src/main/mr-jar</compileSourceRoot> - </compileSourceRoots> - <outputDirectory>${project.build.outputDirectory}/META-INF/versions/9</outputDirectory> - </configuration> - </execution> - <execution> - <id>base-compile</id> - <goals> - <goal>compile</goal> - </goals> - <configuration> - <release>8</release> - <excludes> - <exclude>module-info.java</exclude> - </excludes> - </configuration> - </execution> - </executions> </plugin> <plugin> <groupId>org.apache.felix</groupId> @@ -244,9 +195,8 @@ Jakarta XML Binding API ${spec.version} Design Specification </Bundle-Description> <Extension-Name>${extension.name}</Extension-Name> - <Implementation-Version>${spec.version}.${impl.version}</Implementation-Version> + <Implementation-Version>${project.version}</Implementation-Version> <Specification-Version>${spec.version}</Specification-Version> - <Export-Package>${api.package}.*; version=${spec.version}.${impl.version}</Export-Package> <Import-Package> !org.glassfish.hk2.osgiresourcelocator, * @@ -255,7 +205,6 @@ <DynamicImport-Package>org.glassfish.hk2.osgiresourcelocator</DynamicImport-Package> <Specification-Vendor>${vendor.name}</Specification-Vendor> <Implementation-Build-Id>${buildNumber}</Implementation-Build-Id> - <Multi-Release>true</Multi-Release> </instructions> </configuration> </execution> @@ -276,7 +225,6 @@ <groupId>com.github.spotbugs</groupId> <artifactId>spotbugs-maven-plugin</artifactId> <configuration> - <findbugsXmlWithMessages>true</findbugsXmlWithMessages> <fork>true</fork> <excludeFilterFile>${spotbugs.exclude}</excludeFilterFile> <failThreshold>High</failThreshold>
diff --git a/api/src/main/java/jakarta/xml/bind/DataBindingException.java b/api/src/main/java/jakarta/xml/bind/DataBindingException.java index ba90222..6ea2438 100644 --- a/api/src/main/java/jakarta/xml/bind/DataBindingException.java +++ b/api/src/main/java/jakarta/xml/bind/DataBindingException.java
@@ -22,6 +22,9 @@ * @since 1.6, JAXB 2.1 */ public class DataBindingException extends RuntimeException { + + private static final long serialVersionUID = 4743686626270704879L; + public DataBindingException(String message, Throwable cause) { super(message, cause); }
diff --git a/api/src/main/java/jakarta/xml/bind/MarshalException.java b/api/src/main/java/jakarta/xml/bind/MarshalException.java index 8e1b6d4..cc8b199 100644 --- a/api/src/main/java/jakarta/xml/bind/MarshalException.java +++ b/api/src/main/java/jakarta/xml/bind/MarshalException.java
@@ -27,6 +27,8 @@ */ public class MarshalException extends JAXBException { + private static final long serialVersionUID = 1570397297836071517L; + /** * Construct a MarshalException with the specified detail message. The * errorCode and linkedException will default to null.
diff --git a/api/src/main/java/jakarta/xml/bind/ModuleUtil.java b/api/src/main/java/jakarta/xml/bind/ModuleUtil.java index b81253a..af02171 100644 --- a/api/src/main/java/jakarta/xml/bind/ModuleUtil.java +++ b/api/src/main/java/jakarta/xml/bind/ModuleUtil.java
@@ -10,40 +10,130 @@ package jakarta.xml.bind; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** - * Intended to be overridden on JDK9, with JEP 238 multi-release class copy. - * Contains only stubs for methods needed on JDK9 runtime. + * Propagates openness of Jakarta XML Binding annotated classes packages to Jakarta XML Binding impl module. * * @author Roman Grigoriadi */ class ModuleUtil { + private static final Logger LOGGER = Logger.getLogger("jakarta.xml.bind"); + /** * Resolves classes from context path. * Only one class per package is needed to access its {@link java.lang.Module} */ static Class<?>[] getClassesFromContextPath(String contextPath, ClassLoader classLoader) throws JAXBException { - return null; + List<Class<?>> classes = new ArrayList<>(); + if (contextPath == null || contextPath.isEmpty()){ + return classes.toArray(new Class<?>[]{}); + } + + String [] tokens = contextPath.split(":"); + for (String pkg : tokens){ + + // look for ObjectFactory and load it + try { + final Class<?> o = classLoader.loadClass(pkg+".ObjectFactory"); + classes.add(o); + continue; + } catch (ClassNotFoundException e) { + // not necessarily an error + } + + // look for jaxb.index and load the list of classes + try { + final Class<?> firstByJaxbIndex = findFirstByJaxbIndex(pkg, classLoader); + if (firstByJaxbIndex != null) { + classes.add(firstByJaxbIndex); + } + } catch (IOException e) { + throw new JAXBException(e); + } + } + + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, "Resolved classes from context path: {0}", classes); + } + return classes.toArray(new Class<?>[]{}); } /** * Find first class in package by {@code jaxb.index} file. */ static Class<?> findFirstByJaxbIndex(String pkg, ClassLoader classLoader) throws IOException, JAXBException { + final String resource = pkg.replace('.', '/') + "/jaxb.index"; + final InputStream resourceAsStream = classLoader.getResourceAsStream(resource); + + if (resourceAsStream == null) { + return null; + } + + try (BufferedReader in = new BufferedReader(new InputStreamReader(resourceAsStream, "UTF-8"))) { + String className = in.readLine(); + while (className != null) { + className = className.trim(); + if (className.startsWith("#") || (className.length() == 0)) { + className = in.readLine(); + continue; + } + + try { + return classLoader.loadClass(pkg + '.' + className); + } catch (ClassNotFoundException e) { + throw new JAXBException(Messages.format(Messages.ERROR_LOAD_CLASS, className, pkg), e); + } + + } + } return null; } /** * Implementation may be defined in other module than {@code jakarta.xml.bind}. In that case openness - * {@linkplain java.lang.Module#isOpen open} of classes should be delegated to implementation module. + * {@linkplain Module#isOpen open} of classes should be delegated to implementation module. * - * @param classes used to resolve module for {@linkplain java.lang.Module#addOpens(String, java.lang.Module)} - * @param factorySPI used to resolve {@link java.lang.Module} of the implementation. + * @param classes used to resolve module for {@linkplain Module#addOpens(String, Module)} + * @param factorySPI used to resolve {@link Module} of the implementation. + * + * @throws JAXBException if ony of a classes package is not open to {@code jakarta.xml.bind} module. */ - static void delegateAddOpensToImplModule(Class<?>[] classes, Class<?> factorySPI) { - //stub + public static void delegateAddOpensToImplModule(Class<?>[] classes, Class<?> factorySPI) throws JAXBException { + final Module implModule = factorySPI.getModule(); + + Module jaxbModule = JAXBContext.class.getModule(); + + for (Class<?> cls : classes) { + Class<?> jaxbClass = cls.isArray() ? + cls.getComponentType() : cls; + + final Module classModule = jaxbClass.getModule(); + final String packageName = jaxbClass.getPackageName(); + //no need for unnamed and java.base types + if (!classModule.isNamed() || classModule.getName().equals("java.base")) { + continue; + } + //report error if they are not open to jakarta.xml.bind + if (!classModule.isOpen(packageName, jaxbModule)) { + throw new JAXBException(Messages.format(Messages.JAXB_CLASSES_NOT_OPEN, + packageName, jaxbClass.getName(), classModule.getName())); + } + //propagate openness to impl module + classModule.addOpens(packageName, implModule); + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, "Propagating openness of package {0} in {1} to {2}.", + new String[]{ packageName, classModule.getName(), implModule.getName() }); + } + } } }
diff --git a/api/src/main/java/jakarta/xml/bind/PropertyException.java b/api/src/main/java/jakarta/xml/bind/PropertyException.java index 3a297e3..f559c95 100644 --- a/api/src/main/java/jakarta/xml/bind/PropertyException.java +++ b/api/src/main/java/jakarta/xml/bind/PropertyException.java
@@ -22,8 +22,10 @@ * @since 1.6, JAXB 1.0 */ public class PropertyException extends JAXBException { - - /** + + private static final long serialVersionUID = 3159963351607157477L; + + /** * Construct a PropertyException with the specified detail message. The * errorCode and linkedException will default to null. *
diff --git a/api/src/main/java/jakarta/xml/bind/UnmarshalException.java b/api/src/main/java/jakarta/xml/bind/UnmarshalException.java index 7422013..458a36f 100644 --- a/api/src/main/java/jakarta/xml/bind/UnmarshalException.java +++ b/api/src/main/java/jakarta/xml/bind/UnmarshalException.java
@@ -29,6 +29,8 @@ */ public class UnmarshalException extends JAXBException { + private static final long serialVersionUID = 6121932693435295453L; + /** * Construct an UnmarshalException with the specified detail message. The * errorCode and linkedException will default to null.
diff --git a/api/src/main/java/jakarta/xml/bind/ValidationException.java b/api/src/main/java/jakarta/xml/bind/ValidationException.java index bcf3487..043f714 100644 --- a/api/src/main/java/jakarta/xml/bind/ValidationException.java +++ b/api/src/main/java/jakarta/xml/bind/ValidationException.java
@@ -26,6 +26,8 @@ */ public class ValidationException extends JAXBException { + private static final long serialVersionUID = 2206436657505193108L; + /** * Construct an ValidationException with the specified detail message. The * errorCode and linkedException will default to null.
diff --git a/api/src/main/mr-jar/jakarta/xml/bind/ModuleUtil.java b/api/src/main/mr-jar/jakarta/xml/bind/ModuleUtil.java deleted file mode 100644 index e316871..0000000 --- a/api/src/main/mr-jar/jakarta/xml/bind/ModuleUtil.java +++ /dev/null
@@ -1,144 +0,0 @@ -/* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Distribution License v. 1.0, which is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -package jakarta.xml.bind; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Propagates openness of Jakarta XML Binding annottated classess packages to Jakarta XML Binding impl module. - * - * @author Roman Grigoriadi - */ -class ModuleUtil { - - private static Logger logger = Logger.getLogger("jakarta.xml.bind"); - - /** - * Resolves classes from context path. - * Only one class per package is needed to access its {@link java.lang.Module} - */ - static Class<?>[] getClassesFromContextPath(String contextPath, ClassLoader classLoader) throws JAXBException { - List<Class<?>> classes = new ArrayList<>(); - if (contextPath == null || contextPath.isEmpty()){ - return classes.toArray(new Class<?>[]{}); - } - - String [] tokens = contextPath.split(":"); - for (String pkg : tokens){ - - // look for ObjectFactory and load it - final Class<?> o; - try { - o = classLoader.loadClass(pkg+".ObjectFactory"); - classes.add(o); - continue; - } catch (ClassNotFoundException e) { - // not necessarily an error - } - - // look for jaxb.index and load the list of classes - try { - final Class<?> firstByJaxbIndex = findFirstByJaxbIndex(pkg, classLoader); - if (firstByJaxbIndex != null) { - classes.add(firstByJaxbIndex); - } - } catch (IOException e) { - throw new JAXBException(e); - } - } - - if (logger.isLoggable(Level.FINE)) { - logger.log(Level.FINE, "Resolved classes from context path: {0}", classes); - } - return classes.toArray(new Class<?>[]{}); - } - - /** - * Find first class in package by {@code jaxb.index} file. - */ - static Class<?> findFirstByJaxbIndex(String pkg, ClassLoader classLoader) throws IOException, JAXBException { - final String resource = pkg.replace('.', '/') + "/jaxb.index"; - final InputStream resourceAsStream = classLoader.getResourceAsStream(resource); - - if (resourceAsStream == null) { - return null; - } - - BufferedReader in = - new BufferedReader(new InputStreamReader(resourceAsStream, "UTF-8")); - try { - String className = in.readLine(); - while (className != null) { - className = className.trim(); - if (className.startsWith("#") || (className.length() == 0)) { - className = in.readLine(); - continue; - } - - try { - return classLoader.loadClass(pkg + '.' + className); - } catch (ClassNotFoundException e) { - throw new JAXBException(Messages.format(Messages.ERROR_LOAD_CLASS, className, pkg), e); - } - - } - } finally { - in.close(); - } - return null; - } - - /** - * Implementation may be defined in other module than {@code jakarta.xml.bind}. In that case openness - * {@linkplain Module#isOpen open} of classes should be delegated to implementation module. - * - * @param classes used to resolve module for {@linkplain Module#addOpens(String, Module)} - * @param factorySPI used to resolve {@link Module} of the implementation. - * - * @throws JAXBException if ony of a classes package is not open to {@code jakarta.xml.bind} module. - */ - public static void delegateAddOpensToImplModule(Class<?>[] classes, Class<?> factorySPI) throws JAXBException { - final Module implModule = factorySPI.getModule(); - - Module jaxbModule = JAXBContext.class.getModule(); - - for (Class<?> cls : classes) { - Class<?> jaxbClass = cls.isArray() ? - cls.getComponentType() : cls; - - final Module classModule = jaxbClass.getModule(); - final String packageName = jaxbClass.getPackageName(); - //no need for unnamed and java.base types - if (!classModule.isNamed() || classModule.getName().equals("java.base")) { - continue; - } - //report error if they are not open to jakarta.xml.bind - if (!classModule.isOpen(packageName, jaxbModule)) { - throw new JAXBException(Messages.format(Messages.JAXB_CLASSES_NOT_OPEN, - packageName, jaxbClass.getName(), classModule.getName())); - } - //propagate openness to impl module - classModule.addOpens(packageName, implModule); - if (logger.isLoggable(Level.FINE)) { - logger.log(Level.FINE, "Propagating openness of package {0} in {1} to {2}.", - new String[]{ packageName, classModule.getName(), implModule.getName() }); - } - } - } - -}
diff --git a/pom.xml b/pom.xml index d6d893c..75f1e8d 100644 --- a/pom.xml +++ b/pom.xml
@@ -78,6 +78,8 @@ <spotbugs.threshold>Low</spotbugs.threshold> <spotbugs.version>4.3.0</spotbugs.version> + <maven.compiler.release>11</maven.compiler.release> + <release.spec.feedback>jaxb-dev@eclipse.org</release.spec.feedback> <release.spec.date>Jul 2017</release.spec.date> <api.package>jakarta.xml.bind</api.package>