From 1b10ebcece12a22d31235b643c4c7d4d496e988a Mon Sep 17 00:00:00 2001 From: Tomaz Cerar Date: Thu, 29 Sep 2016 17:25:21 +0200 Subject: [PATCH] WFCORE-1841 lazy subsystem parser support - introduces parser providers (via staxmapper 1.3) - migrates core subsystems to use it - should redurce memory usage down a bit --- .../PersistentResourceXMLDescription.java | 11 ++++++++-- .../extension/ExtensionRegistry.java | 14 ++++++++++++- .../parsing/ExtensionParsingContext.java | 4 ++++ .../scanner/DeploymentScannerExtension.java | 8 +++---- .../scanner/DeploymentScannerParser_1_0.java | 2 -- .../scanner/DeploymentScannerParser_1_1.java | 2 -- .../scanner/DeploymentScannerParser_2_0.java | 2 -- .../org/wildfly/extension/io/IOExtension.java | 6 +++--- .../extension/io/IOSubsystemParser_1_0.java | 4 +--- .../extension/io/IOSubsystemParser_1_1.java | 2 -- .../java/org/jboss/as/jmx/JMXExtension.java | 12 ++++------- .../jboss/as/logging/LoggingExtension.java | 21 ++++++++++--------- pom.xml | 2 +- .../subsystem/test/SubsystemTestDelegate.java | 5 +++-- 14 files changed, 53 insertions(+), 42 deletions(-) diff --git a/controller/src/main/java/org/jboss/as/controller/PersistentResourceXMLDescription.java b/controller/src/main/java/org/jboss/as/controller/PersistentResourceXMLDescription.java index fcf83f8b33d..7b92fe5a6d7 100644 --- a/controller/src/main/java/org/jboss/as/controller/PersistentResourceXMLDescription.java +++ b/controller/src/main/java/org/jboss/as/controller/PersistentResourceXMLDescription.java @@ -93,9 +93,10 @@ private PersistentResourceXMLDescription(PersistentResourceXMLBuilder builder) { this.attributeGroups = null; } this.children = new ArrayList<>(); - for (PersistentResourceXMLBuilder b : builder.children) { + for (PersistentResourceXMLBuilder b : builder.childrenBuilder) { this.children.add(b.build()); } + builder.children.forEach(this.children::add); this.useValueAsElementName = builder.useValueAsElementName; this.noAddOperation = builder.noAddOperation; this.additionalOperationsGenerator = builder.additionalOperationsGenerator; @@ -462,7 +463,8 @@ public static class PersistentResourceXMLBuilder { protected boolean noAddOperation; protected AdditionalOperationsGenerator additionalOperationsGenerator; protected final LinkedList attributeList = new LinkedList<>(); - protected final List children = new ArrayList<>(); + final List childrenBuilder = new ArrayList<>(); + final List children = new ArrayList<>(); protected final LinkedHashMap attributeParsers = new LinkedHashMap<>(); protected final LinkedHashMap attributeMarshallers = new LinkedHashMap<>(); protected boolean useElementsForGroups = true; @@ -502,6 +504,11 @@ protected PersistentResourceXMLBuilder(final PathElement pathElement, String nam } public PersistentResourceXMLBuilder addChild(PersistentResourceXMLBuilder builder) { + this.childrenBuilder.add(builder); + return this; + } + + public PersistentResourceXMLBuilder addChild(PersistentResourceXMLDescription builder) { this.children.add(builder); return this; } diff --git a/controller/src/main/java/org/jboss/as/controller/extension/ExtensionRegistry.java b/controller/src/main/java/org/jboss/as/controller/extension/ExtensionRegistry.java index 80a5c7f9d53..6acca8877cf 100644 --- a/controller/src/main/java/org/jboss/as/controller/extension/ExtensionRegistry.java +++ b/controller/src/main/java/org/jboss/as/controller/extension/ExtensionRegistry.java @@ -35,7 +35,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; - +import java.util.function.Supplier; import javax.xml.namespace.QName; import org.jboss.as.controller.AttributeDefinition; @@ -456,6 +456,18 @@ public void setSubsystemXmlMapping(String subsystemName, String namespaceUri, XM } } + @Override + public void setSubsystemXmlMapping(String subsystemName, String namespaceUri, Supplier>> supplier){ + assert subsystemName != null : "subsystemName is null"; + assert namespaceUri != null : "namespaceUri is null"; + synchronized (extension) { + extension.getSubsystemInfo(subsystemName).addParsingNamespace(namespaceUri); + if (extension.xmlMapper != null) { + extension.xmlMapper.registerRootElement(new QName(namespaceUri, SUBSYSTEM), supplier); + } + } + } + @Override public void setProfileParsingCompletionHandler(ProfileParsingCompletionHandler handler) { assert handler != null : "handler is null"; diff --git a/controller/src/main/java/org/jboss/as/controller/parsing/ExtensionParsingContext.java b/controller/src/main/java/org/jboss/as/controller/parsing/ExtensionParsingContext.java index 468db22e4ab..5026d9e64f9 100644 --- a/controller/src/main/java/org/jboss/as/controller/parsing/ExtensionParsingContext.java +++ b/controller/src/main/java/org/jboss/as/controller/parsing/ExtensionParsingContext.java @@ -23,6 +23,7 @@ package org.jboss.as.controller.parsing; import java.util.List; +import java.util.function.Supplier; import org.jboss.as.controller.ProcessType; @@ -66,6 +67,9 @@ public interface ExtensionParsingContext { */ void setSubsystemXmlMapping(String subsystemName, String namespaceUri, XMLElementReader> reader); + + void setSubsystemXmlMapping(String subsystemName, String namespaceUri, Supplier>> supplier); + /** * Registers a {@link ProfileParsingCompletionHandler} to receive a callback upon completion of parsing of a * profile. diff --git a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerExtension.java b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerExtension.java index e0be4859901..5be9211c1c2 100644 --- a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerExtension.java +++ b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerExtension.java @@ -70,7 +70,7 @@ public void initialize(ExtensionContext context) { } final SubsystemRegistration subsystem = context.registerSubsystem(CommonAttributes.DEPLOYMENT_SCANNER, CURRENT_VERSION); - subsystem.registerXMLElementWriter(DeploymentScannerParser_2_0.INSTANCE); + subsystem.registerXMLElementWriter(new DeploymentScannerParser_2_0()); final ManagementResourceRegistration registration = subsystem.registerSubsystemModel(new DeploymentScannerSubsystemDefinition()); registration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE); @@ -89,9 +89,9 @@ public void initialize(ExtensionContext context) { */ @Override public void initializeParsers(ExtensionParsingContext context) { - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.DEPLOYMENT_SCANNER_1_0.getUriString(), DeploymentScannerParser_1_0.INSTANCE); - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.DEPLOYMENT_SCANNER_1_1.getUriString(), DeploymentScannerParser_1_1.INSTANCE); - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.DEPLOYMENT_SCANNER_2_0.getUriString(), DeploymentScannerParser_2_0.INSTANCE); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.DEPLOYMENT_SCANNER_1_0.getUriString(), DeploymentScannerParser_1_0::new); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.DEPLOYMENT_SCANNER_1_1.getUriString(), DeploymentScannerParser_1_1::new); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.DEPLOYMENT_SCANNER_2_0.getUriString(), DeploymentScannerParser_2_0::new); } diff --git a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_0.java b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_0.java index da0f3767b67..91f9171cb3f 100644 --- a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_0.java +++ b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_0.java @@ -50,8 +50,6 @@ */ class DeploymentScannerParser_1_0 implements XMLStreamConstants, XMLElementReader>, XMLElementWriter { - public static final DeploymentScannerParser_1_0 INSTANCE = new DeploymentScannerParser_1_0(); - /** {@inheritDoc} */ @Override public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException { diff --git a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_1.java b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_1.java index 41fb46755c8..774746117c9 100644 --- a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_1.java +++ b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_1_1.java @@ -49,8 +49,6 @@ */ class DeploymentScannerParser_1_1 implements XMLStreamConstants, XMLElementReader>, XMLElementWriter { - public static final DeploymentScannerParser_1_1 INSTANCE = new DeploymentScannerParser_1_1(); - /** * {@inheritDoc} */ diff --git a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_2_0.java b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_2_0.java index 310d902040d..05562a9596b 100644 --- a/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_2_0.java +++ b/deployment-scanner/src/main/java/org/jboss/as/server/deployment/scanner/DeploymentScannerParser_2_0.java @@ -49,8 +49,6 @@ */ class DeploymentScannerParser_2_0 implements XMLStreamConstants, XMLElementReader>, XMLElementWriter { - public static final DeploymentScannerParser_2_0 INSTANCE = new DeploymentScannerParser_2_0(); - /** * {@inheritDoc} */ diff --git a/io/subsystem/src/main/java/org/wildfly/extension/io/IOExtension.java b/io/subsystem/src/main/java/org/wildfly/extension/io/IOExtension.java index bbfeb1302fa..6d15611d279 100644 --- a/io/subsystem/src/main/java/org/wildfly/extension/io/IOExtension.java +++ b/io/subsystem/src/main/java/org/wildfly/extension/io/IOExtension.java @@ -58,8 +58,8 @@ public static StandardResourceDescriptionResolver getResolver(final String... ke @Override public void initializeParsers(ExtensionParsingContext context) { - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.IO_1_0.getUriString(), IOSubsystemParser_1_0.INSTANCE); - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.IO_1_1.getUriString(), IOSubsystemParser_1_1.INSTANCE); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.IO_1_0.getUriString(), IOSubsystemParser_1_0::new); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.IO_1_1.getUriString(), IOSubsystemParser_1_1::new); } @Override @@ -67,7 +67,7 @@ public void initialize(ExtensionContext context) { final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, ModelVersion.create(2)); final ManagementResourceRegistration registration = subsystem.registerSubsystemModel(IORootDefinition.INSTANCE); registration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE, false); - subsystem.registerXMLElementWriter(IOSubsystemParser_1_1.INSTANCE); + subsystem.registerXMLElementWriter(new IOSubsystemParser_1_1()); } diff --git a/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_0.java b/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_0.java index 343de4aa590..d29d73f19a5 100644 --- a/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_0.java +++ b/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_0.java @@ -33,11 +33,9 @@ */ class IOSubsystemParser_1_0 extends PersistentResourceXMLParser { - static final IOSubsystemParser_1_0 INSTANCE = new IOSubsystemParser_1_0(); - private final PersistentResourceXMLDescription xmlDescription; - private IOSubsystemParser_1_0() { + IOSubsystemParser_1_0() { xmlDescription = builder(IORootDefinition.INSTANCE.getPathElement()) .addChild( builder(WorkerResourceDefinition.INSTANCE.getPathElement()) diff --git a/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_1.java b/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_1.java index 8719c9290f0..a14f3bb6d14 100644 --- a/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_1.java +++ b/io/subsystem/src/main/java/org/wildfly/extension/io/IOSubsystemParser_1_1.java @@ -33,8 +33,6 @@ * @author Tomaz Cerar (c) 2013 Red Hat Inc. */ class IOSubsystemParser_1_1 extends PersistentResourceXMLParser { - static final IOSubsystemParser_1_1 INSTANCE = new IOSubsystemParser_1_1(); - private static final PersistentResourceXMLDescription xmlDescription; diff --git a/jmx/src/main/java/org/jboss/as/jmx/JMXExtension.java b/jmx/src/main/java/org/jboss/as/jmx/JMXExtension.java index 5b0fdc2e504..ec079ad38e1 100644 --- a/jmx/src/main/java/org/jboss/as/jmx/JMXExtension.java +++ b/jmx/src/main/java/org/jboss/as/jmx/JMXExtension.java @@ -79,10 +79,6 @@ static ResourceDescriptionResolver getResourceDescriptionResolver(final String k new SensitivityClassification(SUBSYSTEM_NAME, "jmx", false, false, true); static final SensitiveTargetAccessConstraintDefinition JMX_SENSITIVITY_DEF = new SensitiveTargetAccessConstraintDefinition(JMX_SENSITIVITY); - static final JMXSubsystemParser_1_3 parserCurrent = new JMXSubsystemParser_1_3(); - static final JMXSubsystemParser_1_2 parser12 = new JMXSubsystemParser_1_2(); - static final JMXSubsystemParser_1_1 parser11 = new JMXSubsystemParser_1_1(); - static final JMXSubsystemParser_1_0 parser10 = new JMXSubsystemParser_1_0(); static final JMXSubsystemWriter writer = new JMXSubsystemWriter(); private static final int MANAGEMENT_API_MAJOR_VERSION = 1; @@ -120,10 +116,10 @@ public void initialize(ExtensionContext context) { */ @Override public void initializeParsers(ExtensionParsingContext context) { - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_0.getUriString(), parser10); - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_1.getUriString(), parser11); - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_2.getUriString(), parser12); - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_3.getUriString(), parserCurrent); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_0.getUriString(), JMXSubsystemParser_1_0::new); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_1.getUriString(), JMXSubsystemParser_1_1::new); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_2.getUriString(), JMXSubsystemParser_1_2::new); + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JMX_1_3.getUriString(), JMXSubsystemParser_1_3::new); } private static ModelNode createAddOperation() { diff --git a/logging/src/main/java/org/jboss/as/logging/LoggingExtension.java b/logging/src/main/java/org/jboss/as/logging/LoggingExtension.java index e97ede6bca6..1aea8eb636e 100644 --- a/logging/src/main/java/org/jboss/as/logging/LoggingExtension.java +++ b/logging/src/main/java/org/jboss/as/logging/LoggingExtension.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Locale; import java.util.ResourceBundle; +import java.util.function.Supplier; import org.jboss.as.controller.Extension; import org.jboss.as.controller.ExtensionContext; @@ -229,14 +230,14 @@ public void initialize(final ExtensionContext context) { @Override public void initializeParsers(final ExtensionParsingContext context) { - setParser(context, Namespace.LOGGING_1_0, new LoggingSubsystemParser_1_0()); - setParser(context, Namespace.LOGGING_1_1, new LoggingSubsystemParser_1_1()); - setParser(context, Namespace.LOGGING_1_2, new LoggingSubsystemParser_1_2()); - setParser(context, Namespace.LOGGING_1_3, new LoggingSubsystemParser_1_3()); - setParser(context, Namespace.LOGGING_1_4, new LoggingSubsystemParser_1_4()); - setParser(context, Namespace.LOGGING_1_5, new LoggingSubsystemParser_1_5()); - setParser(context, Namespace.LOGGING_2_0, new LoggingSubsystemParser_2_0()); - setParser(context, Namespace.LOGGING_3_0, new LoggingSubsystemParser_3_0()); + setParser(context, Namespace.LOGGING_1_0, LoggingSubsystemParser_1_0::new); + setParser(context, Namespace.LOGGING_1_1, LoggingSubsystemParser_1_1::new); + setParser(context, Namespace.LOGGING_1_2, LoggingSubsystemParser_1_2::new); + setParser(context, Namespace.LOGGING_1_3, LoggingSubsystemParser_1_3::new); + setParser(context, Namespace.LOGGING_1_4, LoggingSubsystemParser_1_4::new); + setParser(context, Namespace.LOGGING_1_5, LoggingSubsystemParser_1_5::new); + setParser(context, Namespace.LOGGING_2_0, LoggingSubsystemParser_2_0::new); + setParser(context, Namespace.LOGGING_3_0, LoggingSubsystemParser_3_0::new); } private void registerLoggingProfileSubModels(final ManagementResourceRegistration registration, final PathManager pathManager) { @@ -342,8 +343,8 @@ private void registerTransformers(final ChainedTransformationDescriptionBuilder } } - private static void setParser(final ExtensionParsingContext context, final Namespace namespace, final XMLElementReader> parser) { - context.setSubsystemXmlMapping(SUBSYSTEM_NAME, namespace.getUriString(), parser); + private static void setParser(final ExtensionParsingContext context, final Namespace namespace, final Supplier>> supplier) { + context.setSubsystemXmlMapping(SUBSYSTEM_NAME, namespace.getUriString(), supplier); } private static boolean getBooleanProperty(final String property) { diff --git a/pom.xml b/pom.xml index c89acfadd1e..21c139ac42e 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,7 @@ 1.0.3.GA 1.0.1.Final 1.0.0.Final - 1.2.0.Final + 1.3.0.Final 1.0.2.GA 2.2.1.Final 3.4.0.Final diff --git a/subsystem-test/framework/src/main/java/org/jboss/as/subsystem/test/SubsystemTestDelegate.java b/subsystem-test/framework/src/main/java/org/jboss/as/subsystem/test/SubsystemTestDelegate.java index 290b4818b03..982a453053d 100644 --- a/subsystem-test/framework/src/main/java/org/jboss/as/subsystem/test/SubsystemTestDelegate.java +++ b/subsystem-test/framework/src/main/java/org/jboss/as/subsystem/test/SubsystemTestDelegate.java @@ -88,8 +88,8 @@ import org.jboss.as.controller.registry.OperationEntry; import org.jboss.as.controller.registry.OperationEntry.Flag; import org.jboss.as.controller.registry.Resource; -import org.jboss.as.controller.transform.OperationTransformer.TransformedOperation; import org.jboss.as.controller.transform.ExtensionTransformerRegistration; +import org.jboss.as.controller.transform.OperationTransformer.TransformedOperation; import org.jboss.as.model.test.ChildFirstClassLoaderBuilder; import org.jboss.as.model.test.EAPRepositoryReachableUtil; import org.jboss.as.model.test.ModelFixer; @@ -107,6 +107,7 @@ import org.jboss.as.subsystem.test.ModelDescriptionValidator.ValidationConfiguration; import org.jboss.dmr.ModelNode; import org.jboss.modules.filter.ClassFilter; +import org.jboss.staxmapper.XMLElementReader; import org.jboss.staxmapper.XMLMapper; import org.junit.Assert; import org.junit.Assume; @@ -556,7 +557,7 @@ private ExtensionRegistry cloneExtensionRegistry(AdditionalInitialization additi ExtensionParsingContext epc = clone.getExtensionParsingContext(extension, null); for (Map.Entry entry : extensionParsingRegistry.getAvailableSubsystems(extension).entrySet()) { for (String namespace : entry.getValue().getXMLNamespaces()) { - epc.setSubsystemXmlMapping(entry.getKey(), namespace, null); + epc.setSubsystemXmlMapping(entry.getKey(), namespace, (XMLElementReader) null); } } }