113 } 114 115 } 116 } finally { 117 in.close(); 118 } 119 return null; 120 } 121 122 /** 123 * Implementation may be defined in other module than {@code java.xml.bind}. In that case openness 124 * {@linkplain Module#isOpen open} of classes should be delegated to implementation module. 125 * 126 * @param classes used to resolve module for {@linkplain Module#addOpens(String, Module)} 127 * @param factorySPI used to resolve {@link Module} of the implementation. 128 * 129 * @throws JAXBException if ony of a classes package is not open to {@code java.xml.bind} module. 130 */ 131 static void delegateAddOpensToImplModule(Class[] classes, Class<?> factorySPI) throws JAXBException { 132 final Module implModule = factorySPI.getModule(); 133 if (!implModule.isNamed()) { 134 return; 135 } 136 137 Module jaxbModule = JAXBContext.class.getModule(); 138 139 for (Class cls : classes) { 140 final Module classModule = cls.getModule(); 141 final String packageName = cls.getPackageName(); 142 //no need for unnamed 143 if (!classModule.isNamed()) { 144 continue; 145 } 146 //report error if they are not open to java.xml.bind 147 if (!classModule.isOpen(packageName, jaxbModule)) { 148 throw new JAXBException(Messages.format(Messages.JAXB_CLASSES_NOT_OPEN, 149 packageName, cls.getName(), classModule.getName())); 150 } 151 //propagate openness to impl module 152 classModule.addOpens(packageName, implModule); 153 if (logger.isLoggable(Level.FINE)) { 154 logger.log(Level.FINE, "Propagating openness of package {0} in {1} to {2}.", 155 new String[]{ packageName, classModule.getName(), implModule.getName() }); | 113 } 114 115 } 116 } finally { 117 in.close(); 118 } 119 return null; 120 } 121 122 /** 123 * Implementation may be defined in other module than {@code java.xml.bind}. In that case openness 124 * {@linkplain Module#isOpen open} of classes should be delegated to implementation module. 125 * 126 * @param classes used to resolve module for {@linkplain Module#addOpens(String, Module)} 127 * @param factorySPI used to resolve {@link Module} of the implementation. 128 * 129 * @throws JAXBException if ony of a classes package is not open to {@code java.xml.bind} module. 130 */ 131 static void delegateAddOpensToImplModule(Class[] classes, Class<?> factorySPI) throws JAXBException { 132 final Module implModule = factorySPI.getModule(); 133 134 Module jaxbModule = JAXBContext.class.getModule(); 135 136 for (Class cls : classes) { 137 final Module classModule = cls.getModule(); 138 final String packageName = cls.getPackageName(); 139 //no need for unnamed 140 if (!classModule.isNamed()) { 141 continue; 142 } 143 //report error if they are not open to java.xml.bind 144 if (!classModule.isOpen(packageName, jaxbModule)) { 145 throw new JAXBException(Messages.format(Messages.JAXB_CLASSES_NOT_OPEN, 146 packageName, cls.getName(), classModule.getName())); 147 } 148 //propagate openness to impl module 149 classModule.addOpens(packageName, implModule); 150 if (logger.isLoggable(Level.FINE)) { 151 logger.log(Level.FINE, "Propagating openness of package {0} in {1} to {2}.", 152 new String[]{ packageName, classModule.getName(), implModule.getName() }); |