From 2de8a4cade1dff73fe5fc5d9bfdec97ccb231e93 Mon Sep 17 00:00:00 2001 From: Andrii Rodionov Date: Tue, 21 Apr 2020 16:56:20 +0300 Subject: [PATCH] [GR-22606] Splitting `registerReachabilityHandler` between different XML-parsers. --- ...avaxXmlClassAndResourcesLoaderFeature.java | 100 -------------- ...avaxXmlClassAndResourcesLoaderFeature.java | 62 +++++++++ .../hosted/xml/XMLParsersRegistration.java | 127 ++++++++++++++++++ .../oracle/svm/hosted/xml/package-info.java | 30 +++++ 4 files changed, 219 insertions(+), 100 deletions(-) delete mode 100644 substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/JavaxXmlClassAndResourcesLoaderFeature.java create mode 100644 substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/JavaxXmlClassAndResourcesLoaderFeature.java create mode 100644 substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java create mode 100644 substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/package-info.java diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/JavaxXmlClassAndResourcesLoaderFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/JavaxXmlClassAndResourcesLoaderFeature.java deleted file mode 100644 index fc22f29acb00..000000000000 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/JavaxXmlClassAndResourcesLoaderFeature.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.oracle.svm.hosted.config; - -import com.oracle.svm.core.annotate.AutomaticFeature; -import com.oracle.svm.core.configure.ResourcesRegistry; -import com.oracle.svm.core.jdk.JNIRegistrationUtil; -import com.oracle.svm.hosted.FeatureImpl; -import com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization; -import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; - -@AutomaticFeature -public class JavaxXmlClassAndResourcesLoaderFeature extends JNIRegistrationUtil implements Feature { - - private static String[] xmlClasses = { - "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", - "com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl", - "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", - "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl", - "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", - "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", - "com.sun.xml.internal.stream.XMLInputFactoryImpl", - "com.sun.xml.internal.stream.XMLOutputFactoryImpl" - }; - - private static String[] bundles = { - "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages" - }; - - private static String[] resources = { - "com.sun.*.properties" - }; - - @Override - public void beforeAnalysis(BeforeAnalysisAccess access) { - Object[] xmlMethods = { - method(access, "javax.xml.parsers.FactoryFinder", "find", Class.class, String.class), - method(access, "javax.xml.transform.FactoryFinder", "find", Class.class, String.class), - method(access, "javax.xml.stream.FactoryFinder", "find", Class.class, String.class) - }; - access.registerReachabilityHandler(JavaxXmlClassAndResourcesLoaderFeature::registerJavaxXmlConfigs, xmlMethods); - } - - private static void registerJavaxXmlConfigs(DuringAnalysisAccess a) { - registerReflectionClasses((FeatureImpl.DuringAnalysisAccessImpl) a); - registerResources(); - a.requireAnalysisIteration(); - } - - private static void registerResources() { - /* - * To allow register new resource bundle classes during analysis phase - */ - ConfigurableClassInitialization classInitializationSupport = (ConfigurableClassInitialization) ImageSingletons.lookup(RuntimeClassInitializationSupport.class); - classInitializationSupport.setConfigurationSealed(false); - - ResourcesRegistry resourcesRegistry = ImageSingletons.lookup(ResourcesRegistry.class); - for (String resourceBundle : bundles) { - resourcesRegistry.addResourceBundles(resourceBundle); - } - for (String resource : resources) { - resourcesRegistry.addResources(resource); - } - - classInitializationSupport.setConfigurationSealed(true); - } - - private static void registerReflectionClasses(FeatureImpl.DuringAnalysisAccessImpl access) { - for (String className : xmlClasses) { - RuntimeReflection.register(clazz(access, className)); - RuntimeReflection.register(constructor(access, className)); - } - } -} diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/JavaxXmlClassAndResourcesLoaderFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/JavaxXmlClassAndResourcesLoaderFeature.java new file mode 100644 index 000000000000..82fc9babff13 --- /dev/null +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/JavaxXmlClassAndResourcesLoaderFeature.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.svm.hosted.xml; + +import com.oracle.svm.core.annotate.AutomaticFeature; +import com.oracle.svm.core.jdk.JNIRegistrationUtil; +import org.graalvm.nativeimage.hosted.Feature; + +import static com.oracle.svm.hosted.xml.XMLParsersRegistration.DOMImplementationRegistryClasses; +import static com.oracle.svm.hosted.xml.XMLParsersRegistration.DOMParserClasses; +import static com.oracle.svm.hosted.xml.XMLParsersRegistration.DatatypeFactoryClasses; +import static com.oracle.svm.hosted.xml.XMLParsersRegistration.SAXParserClasses; +import static com.oracle.svm.hosted.xml.XMLParsersRegistration.StAXParserClasses; +import static com.oracle.svm.hosted.xml.XMLParsersRegistration.TransformerClassesAndResources; + +@AutomaticFeature +public class JavaxXmlClassAndResourcesLoaderFeature extends JNIRegistrationUtil implements Feature { + + @Override + public void beforeAnalysis(BeforeAnalysisAccess access) { + access.registerReachabilityHandler(new SAXParserClasses()::registerConfigs, + method(access, "javax.xml.parsers.SAXParserFactory", "newInstance")); + + access.registerReachabilityHandler(new DOMParserClasses()::registerConfigs, + method(access, "javax.xml.parsers.DocumentBuilderFactory", "newInstance")); + + access.registerReachabilityHandler(new StAXParserClasses()::registerConfigs, + method(access, "javax.xml.stream.FactoryFinder", "find", Class.class, String.class)); + + access.registerReachabilityHandler(new TransformerClassesAndResources()::registerConfigs, + method(access, "javax.xml.transform.FactoryFinder", "find", Class.class, String.class)); + + access.registerReachabilityHandler(new DOMImplementationRegistryClasses()::registerConfigs, + method(access, "org.w3c.dom.bootstrap.DOMImplementationRegistry", "newInstance")); + + access.registerReachabilityHandler(new DatatypeFactoryClasses()::registerConfigs, + method(access, "javax.xml.datatype.DatatypeFactory", "newInstance")); + } +} diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java new file mode 100644 index 000000000000..8c13e8fc6f01 --- /dev/null +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2020, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.svm.hosted.xml; + +import com.oracle.svm.core.configure.ResourcesRegistry; +import com.oracle.svm.core.jdk.JNIRegistrationUtil; +import com.oracle.svm.hosted.FeatureImpl; +import com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization; +import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.Feature; +import org.graalvm.nativeimage.hosted.RuntimeReflection; +import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public abstract class XMLParsersRegistration extends JNIRegistrationUtil { + + public void registerConfigs(Feature.DuringAnalysisAccess access) { + List parserClasses = xmlParserClasses(); + registerReflectionClasses((FeatureImpl.DuringAnalysisAccessImpl) access, parserClasses); + registerResources(); + access.requireAnalysisIteration(); + } + + abstract List xmlParserClasses(); + + void registerResources() { + } + + private static void registerReflectionClasses(FeatureImpl.DuringAnalysisAccessImpl access, List parserClasses) { + for (String className : parserClasses) { + RuntimeReflection.register(clazz(access, className)); + RuntimeReflection.register(constructor(access, className)); + } + } + + static class DatatypeFactoryClasses extends XMLParsersRegistration { + + @Override + List xmlParserClasses() { + return Collections.singletonList("com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl"); + } + } + + static class DOMImplementationRegistryClasses extends XMLParsersRegistration { + + @Override + List xmlParserClasses() { + return Collections.singletonList("com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl"); + } + } + + static class DOMParserClasses extends XMLParsersRegistration { + + @Override + List xmlParserClasses() { + return Collections.singletonList("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); + } + } + + static class SAXParserClasses extends XMLParsersRegistration { + + @Override + List xmlParserClasses() { + return Collections.singletonList("com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); + } + } + + static class StAXParserClasses extends XMLParsersRegistration { + + @Override + List xmlParserClasses() { + return Arrays.asList( + "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", + "com.sun.xml.internal.stream.XMLInputFactoryImpl", + "com.sun.xml.internal.stream.XMLOutputFactoryImpl"); + } + } + + static class TransformerClassesAndResources extends XMLParsersRegistration { + + @Override + void registerResources() { + /* + * To allow register new resource bundle classes during analysis phase + */ + ConfigurableClassInitialization classInitializationSupport = (ConfigurableClassInitialization) ImageSingletons.lookup(RuntimeClassInitializationSupport.class); + classInitializationSupport.setConfigurationSealed(false); + + ResourcesRegistry resourcesRegistry = ImageSingletons.lookup(ResourcesRegistry.class); + resourcesRegistry.addResourceBundles("com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages"); + resourcesRegistry.addResources("com.sun.*.properties"); + + classInitializationSupport.setConfigurationSealed(true); + } + + @Override + List xmlParserClasses() { + return Collections.singletonList("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"); + } + } +} diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/package-info.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/package-info.java new file mode 100644 index 000000000000..f817cf25c2e6 --- /dev/null +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/package-info.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +@Platforms(Platform.HOSTED_ONLY.class) +package com.oracle.svm.hosted.xml; + +import org.graalvm.nativeimage.Platform; +import org.graalvm.nativeimage.Platforms;