/* * JBoss, Home of Professional Open Source. * Copyright 2015, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.controller.persistence; import static org.jboss.as.controller.PersistentResourceXMLDescription.builder; import static org.jboss.as.controller.SimpleAttributeDefinitionBuilder.create; import static org.jboss.as.controller.persistence.PersistentResourceXMLParserTestCase.IdentityMappingObjectDefinition.OBJECT_DEFINITION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.io.StringWriter; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.stream.StreamSource; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.AttributeMarshaller; import org.jboss.as.controller.AttributeMarshallers; import org.jboss.as.controller.AttributeParser; import org.jboss.as.controller.AttributeParsers; import org.jboss.as.controller.ExpressionResolver; import org.jboss.as.controller.ObjectListAttributeDefinition; import org.jboss.as.controller.ObjectMapAttributeDefinition; import org.jboss.as.controller.ObjectTypeAttributeDefinition; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.PersistentResourceDefinition; import org.jboss.as.controller.PersistentResourceXMLDescription; import org.jboss.as.controller.PersistentResourceXMLParser; import org.jboss.as.controller.PropertiesAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.StringListAttributeDefinition; import org.jboss.as.controller.access.management.SensitiveTargetAccessConstraintDefinition; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.descriptions.NonResolvingResourceDescriptionResolver; import org.jboss.as.controller.operations.validation.IntRangeValidator; import org.jboss.as.controller.operations.validation.StringLengthValidator; import org.jboss.as.controller.registry.AttributeAccess; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.staxmapper.FormattingXMLStreamWriter; import org.jboss.staxmapper.XMLExtendedStreamWriter; import org.jboss.staxmapper.XMLMapper; import org.junit.Assert; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSInput; import org.w3c.dom.ls.LSParser; import org.w3c.dom.ls.LSSerializer; /** * @author <a href="http://jmesnil.net/">Jeff Mesnil</a> (c) 2015 Red Hat inc. * @author Tomaz Cerar * @author <a href=mailto:tadamski@redhat.com>Tomasz Adamski</a> */ public class PersistentResourceXMLParserTestCase { private static String readResource(final String name) throws IOException { URL configURL = PersistentResourceXMLParserTestCase.class.getResource(name); Assert.assertNotNull(name + " url is null", configURL); StringWriter writer = new StringWriter(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(configURL.openStream(), StandardCharsets.UTF_8))) { String line; while ((line = reader.readLine()) != null) { writer.write(line + "\n"); } } return writer.toString(); } private static XMLExtendedStreamWriter createXMLStreamWriter(XMLStreamWriter writer) throws Exception { return new FormattingXMLStreamWriter(writer); } @Test public void testWrappersAndGroups() throws Exception { MyParser parser = new MyParser(); String xml = readResource("groups-wrappers-subsystem.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); ModelNode subsystem = opsToModel(operations); assertEquals("bar", subsystem.get("resource", "foo", "cluster-attr1").asString()); assertEquals("baz", subsystem.get("resource", "foo", "cluster-attr2").asString()); assertEquals("alice", subsystem.get("resource", "foo", "security-my-attr1").asString()); assertEquals("bob", subsystem.get("resource", "foo", "security-my-attr2").asString()); assertEquals("bar2", subsystem.get("resource", "foo2", "cluster-attr1").asString()); assertEquals("baz2", subsystem.get("resource", "foo2", "cluster-attr2").asString()); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance() .createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testGroups() throws Exception { MyParser parser = new AttributeGroupParser(); String xml = readResource("groups-subsystem.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); ModelNode subsystem = opsToModel(operations); assertEquals("bar", subsystem.get("resource", "foo", "cluster-attr1").asString()); assertEquals("baz", subsystem.get("resource", "foo", "cluster-attr2").asString()); assertEquals("alice", subsystem.get("resource", "foo", "security-my-attr1").asString()); assertEquals("bob", subsystem.get("resource", "foo", "security-my-attr2").asString()); assertEquals("val", subsystem.get("resource", "foo", "props", "prop").asString()); assertEquals("val", subsystem.get("resource", "foo", "wrapped-properties", "prop").asString()); assertEquals("bar2", subsystem.get("resource", "foo2", "cluster-attr1").asString()); assertEquals("baz2", subsystem.get("resource", "foo2", "cluster-attr2").asString()); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance() .createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test(expected = XMLStreamException.class) public void testInvalidGroups() throws Exception { MyParser parser = new AttributeGroupParser(); String xml = "<subsystem xmlns=\"" + MyParser.NAMESPACE + "\">" + " <invalid/>" + "</subsystem>"; StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); } @Test public void testChildlessResource() throws Exception { MyParser parser = new ChildlessParser(); String xml = "<subsystem xmlns=\"" + MyParser.NAMESPACE + "\">" + " <cluster attr1=\"alice\"/>" + "</subsystem>"; StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); ModelNode subsystem = opsToModel(operations); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance() .createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testSimpleParser() throws Exception { MyParser parser = new MyParser(); String xml = readResource("simple-subsystem.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(4, operations.size()); ModelNode subsystem = opsToModel(operations); ModelNode resource = subsystem.get("resource","foo"); ModelNode complexMap = MyParser.COMPLEX_MAP.resolveModelAttribute(ExpressionResolver.TEST_RESOLVER, resource); Assert.assertEquals("Model type should be map", ModelType.OBJECT, complexMap.getType()); Assert.assertEquals("Map should have 3 elements", 3, complexMap.asList().size()); Assert.assertEquals("some.class1", complexMap.get("key1", "name").asString()); Assert.assertEquals("some.class2", complexMap.get("key2", "name").asString()); Assert.assertEquals("some.module3", complexMap.get("key3", "module").asString()); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testElementParsers() throws Exception { MyParser parser = new MyParser(); String xml = readResource("elements.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(5, operations.size()); ModelNode subsystem = opsToModel(operations); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testMail() throws Exception { MyParser parser = new MailParser(); String xml = readResource("mail-parser.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(4, operations.size()); ModelNode subsystem = opsToModel(operations); ModelNode propsModel = subsystem.get("mail-session", "custom"); assertTrue("Model should be defined", propsModel.has(MyParser.WRAPPED_PROPERTIES.getName())); Map<String,String> props = MyParser.WRAPPED_PROPERTIES.unwrap(ExpressionResolver.TEST_RESOLVER, propsModel); Assert.assertEquals(0, props.size()); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testServerParser() throws Exception { ServerParser parser = new ServerParser(); String xml = readResource("server-subsystem.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(4, operations.size()); ModelNode subsystem = opsToModel(operations); ModelNode server = subsystem.get("server", "default"); ModelNode interceptors = MyParser.INTERCEPTORS.resolveModelAttribute(ExpressionResolver.TEST_RESOLVER, server); Assert.assertEquals("Model type should be list", ModelType.LIST, interceptors.getType()); Assert.assertEquals("List should have 0 elements", 0, interceptors.asList().size()); ModelNode complexList = MyParser.COMPLEX_LIST.resolveModelAttribute(ExpressionResolver.TEST_RESOLVER, server); //this one should be undefined Assert.assertTrue("Should be empty", !complexList.isDefined()); ModelNode complexListWithDefault = MyParser.COMPLEX_LIST_WITH_DEFAULT.resolveModelAttribute(ExpressionResolver.TEST_RESOLVER, server); //this one should be undefined Assert.assertEquals("Model type should be list", ModelType.LIST, complexListWithDefault.getType()); Assert.assertEquals("List should have 1 elements", 1, complexListWithDefault.asList().size()); /*List<ModelNode> unwrapped = MyParser.COMPLEX_LIST_WITH_DEFAULT.unwrap(ExpressionResolver.TEST_RESOLVER, server); //this one should be undefined Assert.assertEquals("it should contain one element", 1, unwrapped.size());*/ StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testServerWithComplexAttributeParser() throws Exception { ServerParser parser = new ServerParser(); String xml = readResource("server-complex-attribute.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName(MyParser.NAMESPACE, "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(5, operations.size()); ModelNode subsystem = opsToModel(operations); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testORBSubsystem() throws Exception { IIOPSubsystemParser parser = new IIOPSubsystemParser(); String xml = readResource("orb-subsystem.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName("urn:jboss:domain:orb-test:1.0", "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(1, operations.size()); ModelNode subsystem = opsToModel(operations); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } @Test public void testComplexAttributesStuff() throws Exception { CoreParser parser = new CoreParser(); String xml = readResource("core-subsystem.xml"); StringReader strReader = new StringReader(xml); XMLMapper mapper = XMLMapper.Factory.create(); mapper.registerRootElement(new QName("urn:jboss:domain:core:1.0", "subsystem"), parser); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(strReader)); List<ModelNode> operations = new ArrayList<>(); mapper.parseDocument(operations, reader); Assert.assertEquals(2, operations.size()); Assert.assertEquals(2, operations.get(1).get("listeners").asList().size()); ModelNode subsystem = opsToModel(operations); StringWriter stringWriter = new StringWriter(); XMLExtendedStreamWriter xmlStreamWriter = createXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter)); SubsystemMarshallingContext context = new SubsystemMarshallingContext(subsystem, xmlStreamWriter); mapper.deparseDocument(parser, context, xmlStreamWriter); String out = stringWriter.toString(); Assert.assertEquals(normalizeXML(xml), normalizeXML(out)); } private ModelNode opsToModel(List<ModelNode> operations) { ModelNode subsystem = new ModelNode(); for (ModelNode addResourceOp : operations) { ModelNode resource = addResourceOp.clone(); resource.remove("operation"); PathAddress address = PathAddress.pathAddress(resource.remove("address")); subsystem.get(getAddress(address)).set(resource); } return subsystem; } private String[] getAddress(PathAddress address) { String[] res = new String[(address.size() - 1) * 2]; for (int i = 0; i < address.size() - 1; i++) { PathElement el = address.getElement(i + 1); res[i * 2] = el.getKey(); res[(i * 2) + 1] = el.getValue(); } return res; } private static String normalizeXML(String xml) throws Exception { // Remove all white space adjoining tags ("trim all elements") xml = xml.replaceAll("\\s*<", "<"); xml = xml.replaceAll(">\\s*", ">"); DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); DOMImplementationLS domLS = (DOMImplementationLS) registry.getDOMImplementation("LS"); LSParser lsParser = domLS.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null); LSInput input = domLS.createLSInput(); input.setStringData(xml); Document document = lsParser.parse(input); LSSerializer lsSerializer = domLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter("comments", Boolean.FALSE); lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); return lsSerializer.writeToString(document); } private static class MyParser extends PersistentResourceXMLParser { protected static final String NAMESPACE = "urn:jboss:domain:test:1.0"; protected static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, "foo"); static final AttributeDefinition clusterAttr1 = create("cluster-attr1", ModelType.STRING) .setAttributeGroup("cluster") .setXmlName("attr1") .build(); static final AttributeDefinition clusterAttr2 = create("cluster-attr2", ModelType.STRING) .setAttributeGroup("cluster") .setXmlName("attr2") .build(); static final AttributeDefinition securityAttr1 = create("security-my-attr1", ModelType.STRING) .setAttributeGroup("security") .setXmlName("my-attr1") .build(); static final AttributeDefinition securityAttr2 = create("security-my-attr2", ModelType.STRING) .setAttributeGroup("security") .setXmlName("my-attr2") .build(); static final AttributeDefinition nonGroupAttr1 = create("non-group-attr", ModelType.STRING) .setXmlName("no-attr1") .build(); static final StringListAttributeDefinition ALIAS = new StringListAttributeDefinition.Builder("alias") .setAllowNull(true) .setElementValidator(new StringLengthValidator(1)) .setAttributeParser(AttributeParser.COMMA_DELIMITED_STRING_LIST) .setAttributeMarshaller(AttributeMarshaller.COMMA_STRING_LIST) .build(); static final PropertiesAttributeDefinition PROPERTIES = new PropertiesAttributeDefinition.Builder("props", true) .setAttributeMarshaller(AttributeMarshaller.PROPERTIES_MARSHALLER_UNWRAPPED) .setAttributeParser(AttributeParser.PROPERTIES_PARSER_UNWRAPPED) .setAllowExpression(true) .build(); static final PropertiesAttributeDefinition WRAPPED_PROPERTIES_GROUP = new PropertiesAttributeDefinition.Builder("wrapped-properties", true) .setAttributeGroup("mygroup") .setAllowExpression(true) .build(); static final PropertiesAttributeDefinition WRAPPED_PROPERTIES = new PropertiesAttributeDefinition.Builder("properties", true) .setAllowExpression(true) .build(); static final SimpleAttributeDefinition BUFFER_SIZE = new SimpleAttributeDefinitionBuilder("buffer-size", ModelType.INT) .setAllowNull(true) .setDefaultValue(new ModelNode(1024)) .setAllowExpression(true) .build(); static final SimpleAttributeDefinition BUFFERS_PER_REGION = new SimpleAttributeDefinitionBuilder("buffers-per-region", ModelType.INT) .setAllowNull(true) .setDefaultValue(new ModelNode(1024)) .setAllowExpression(true) .build(); static final SimpleAttributeDefinition MAX_REGIONS = new SimpleAttributeDefinitionBuilder("max-regions", ModelType.INT) .setAllowNull(true) .setAllowExpression(true) .setDefaultValue(new ModelNode(10)) .build(); static final SimpleAttributeDefinition STATISTICS_ENABLED = new SimpleAttributeDefinitionBuilder(ModelDescriptionConstants.STATISTICS_ENABLED, ModelType.BOOLEAN) .setAttributeGroup("statistics") .setXmlName("enabled") .setDefaultValue(new ModelNode(false)) .setAllowNull(true) .setAllowExpression(true) .build(); static final SimpleAttributeDefinition SECURITY_ENABLED = new SimpleAttributeDefinitionBuilder("security-enabled", ModelType.BOOLEAN) .setAttributeGroup("security") .setXmlName("enabled") .setDefaultValue(new ModelNode(true)) .setAllowNull(true) .setAllowExpression(true) .setRestartAllServices() .build(); static final ObjectTypeAttributeDefinition CLASS = ObjectTypeAttributeDefinition.Builder.of("class", create("name", ModelType.STRING, false) .setAllowExpression(false) .build(), create("module", ModelType.STRING, false) .setAllowExpression(false) .build()) .build(); static final ObjectTypeAttributeDefinition OBJECT = ObjectTypeAttributeDefinition.Builder.of("object",ALIAS, SECURITY_ENABLED, securityAttr1) .build(); static final ModelNode COMPLEX_LIST_DEFAULT_VALUE = new ModelNode(); static{ ModelNode clazz = COMPLEX_LIST_DEFAULT_VALUE.add(); clazz.get("name").set("some.class"); clazz.get("module").set("some.module"); } static final ObjectListAttributeDefinition INTERCEPTORS = ObjectListAttributeDefinition.Builder.of("interceptors", CLASS) .setAllowNull(true) .setAllowExpression(false) .setMinSize(0) .setMaxSize(Integer.MAX_VALUE) .setDefaultValue(COMPLEX_LIST_DEFAULT_VALUE) .build(); static final ObjectListAttributeDefinition COMPLEX_LIST = ObjectListAttributeDefinition.Builder.of("complex-list", CLASS) .setAllowNull(true) .setAllowExpression(false) .build(); static final ObjectListAttributeDefinition COMPLEX_LIST_WITH_DEFAULT = ObjectListAttributeDefinition.Builder.of("complex-list-with-default", CLASS) .setAllowNull(true) .setAllowExpression(false) .setDefaultValue(COMPLEX_LIST_DEFAULT_VALUE) .build(); static final ObjectMapAttributeDefinition COMPLEX_MAP = ObjectMapAttributeDefinition.create("complex-map", CLASS) .setAllowNull(true) .setAttributeParser(new AttributeParsers.ObjectMapParser("element", true)) .setAttributeMarshaller(new AttributeMarshallers.ObjectMapAttributeMarshaller(null, "element", true)) .build(); static final ObjectMapAttributeDefinition COMPLEX_MAP2 = ObjectMapAttributeDefinition.create("object-map", OBJECT) .setAllowNull(true) .setAttributeParser(AttributeParsers.getObjectMapAttributeParser("name")) //change key attribute to name .setAttributeMarshaller(AttributeMarshallers.getObjectMapAttributeMarshaller("name")) .build(); static final ObjectMapAttributeDefinition COMPLEX_MAP3 = ObjectMapAttributeDefinition.create("map", CLASS) .setAllowNull(true) .build(); static final PersistentResourceDefinition RESOURCE_INSTANCE = new PersistentResourceDefinition(PathElement.pathElement("resource"), new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { Collection<AttributeDefinition> attributes = new ArrayList<>(); attributes.add(clusterAttr1); attributes.add(clusterAttr1); attributes.add(securityAttr1); attributes.add(securityAttr2); attributes.add(nonGroupAttr1); attributes.add(PROPERTIES); attributes.add(WRAPPED_PROPERTIES_GROUP); attributes.add(WRAPPED_PROPERTIES); attributes.add(ALIAS); attributes.add(COMPLEX_MAP); return attributes; } }; static final PersistentResourceDefinition BUFFER_CACHE_INSTANCE = new PersistentResourceDefinition(PathElement.pathElement("buffer-cache"), new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { Collection<AttributeDefinition> attributes = new ArrayList<>(); attributes.add(BUFFER_SIZE); attributes.add(BUFFERS_PER_REGION); attributes.add(MAX_REGIONS); attributes.add(ALIAS); attributes.add(COMPLEX_MAP2); return attributes; } }; static final PersistentResourceDefinition SERVER_INSTANCE = new PersistentResourceDefinition(PathElement.pathElement("server"), new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { Collection<AttributeDefinition> attributes = new ArrayList<>(); attributes.add(STATISTICS_ENABLED); attributes.add(SECURITY_ENABLED); attributes.add(INTERCEPTORS); attributes.add(COMPLEX_LIST); attributes.add(COMPLEX_LIST_WITH_DEFAULT); attributes.add(COMPLEX_MAP3); return attributes; } @Override protected List<? extends PersistentResourceDefinition> getChildren() { return Arrays.asList(BUFFER_CACHE_INSTANCE); } }; static final PersistentResourceDefinition CUSTOM_SERVER_INSTANCE = new PersistentResourceDefinition(PathElement.pathElement("custom"), new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { Collection<AttributeDefinition> attributes = new ArrayList<>(); attributes.add(BUFFER_SIZE); attributes.add(BUFFERS_PER_REGION); attributes.add(PROPERTIES); return attributes; } @Override protected List<? extends PersistentResourceDefinition> getChildren() { return Arrays.asList(BUFFER_CACHE_INSTANCE); } }; static final PersistentResourceDefinition SESSION_INSTANCE = new PersistentResourceDefinition(PathElement.pathElement("mail-session"), new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { Collection<AttributeDefinition> attributes = new ArrayList<>(); attributes.add(MAX_REGIONS); attributes.add(WRAPPED_PROPERTIES); return attributes; } @Override protected List<? extends PersistentResourceDefinition> getChildren() { return Arrays.asList(CUSTOM_SERVER_INSTANCE); } }; PersistentResourceDefinition SUBSYSTEM_ROOT_INSTANCE = new PersistentResourceDefinition(SUBSYSTEM_PATH, new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { return Collections.emptyList(); } @Override protected List<? extends PersistentResourceDefinition> getChildren() { List<PersistentResourceDefinition> children = new ArrayList<>(); children.add(RESOURCE_INSTANCE); children.add(BUFFER_CACHE_INSTANCE); return children; } }; @Override public PersistentResourceXMLDescription getParserDescription() { return builder(SUBSYSTEM_ROOT_INSTANCE.getPathElement(), NAMESPACE) .addChild( builder(RESOURCE_INSTANCE.getPathElement()) .setXmlWrapperElement("resources") .addAttributes( // cluster group clusterAttr1, clusterAttr2, // security group securityAttr1, securityAttr2, //no group element nonGroupAttr1, PROPERTIES, WRAPPED_PROPERTIES_GROUP, WRAPPED_PROPERTIES, ALIAS, COMPLEX_MAP ) ) .addChild( builder(BUFFER_CACHE_INSTANCE.getPathElement()) .addAttributes(BUFFER_SIZE, BUFFERS_PER_REGION, MAX_REGIONS) .addAttribute(ALIAS, AttributeParser.STRING_LIST, AttributeMarshaller.STRING_LIST) .addAttribute(COMPLEX_MAP2) ) .build(); } } private static class AttributeGroupParser extends MyParser { @Override public PersistentResourceXMLDescription getParserDescription() { return builder(SUBSYSTEM_ROOT_INSTANCE.getPathElement(), NAMESPACE) .addChild( builder(RESOURCE_INSTANCE.getPathElement()) .addAttributes( // cluster group clusterAttr1, clusterAttr2, // security group securityAttr1, securityAttr2, //no group element nonGroupAttr1, PROPERTIES, WRAPPED_PROPERTIES_GROUP, ALIAS ) ) .addChild( builder(BUFFER_CACHE_INSTANCE.getPathElement()) .addAttributes(BUFFER_SIZE, BUFFERS_PER_REGION, MAX_REGIONS) .addAttribute(ALIAS, AttributeParser.STRING_LIST, AttributeMarshaller.STRING_LIST) ) .build(); } } private static class ServerParser extends MyParser { @Override public PersistentResourceXMLDescription getParserDescription() { return builder(SUBSYSTEM_ROOT_INSTANCE.getPathElement(), NAMESPACE) .addChild( builder(SERVER_INSTANCE.getPathElement()) .addAttributes(SECURITY_ENABLED, STATISTICS_ENABLED) .addAttribute(INTERCEPTORS) .addAttribute(COMPLEX_LIST) .addAttribute(COMPLEX_LIST_WITH_DEFAULT) .addAttribute(PROPERTIES) .addAttribute(COMPLEX_MAP3) .addChild( builder(BUFFER_CACHE_INSTANCE.getPathElement()) .addAttributes(BUFFER_SIZE, BUFFERS_PER_REGION, MAX_REGIONS) .addAttribute(ALIAS, AttributeParser.STRING_LIST, AttributeMarshaller.STRING_LIST) ) ) .build(); } } private static class ChildlessParser extends MyParser { @Override public PersistentResourceXMLDescription getParserDescription() { return builder(SUBSYSTEM_ROOT_INSTANCE.getPathElement(), NAMESPACE) .addAttributes(clusterAttr1) .build(); } } private static class MailParser extends MyParser { @Override public PersistentResourceXMLDescription getParserDescription() { return builder(SUBSYSTEM_ROOT_INSTANCE.getPathElement(), NAMESPACE) .addChild( builder(SESSION_INSTANCE.getPathElement()) .setNameAttributeName("session-name") //custom name attribute for session resources .addAttributes(MAX_REGIONS, WRAPPED_PROPERTIES) .addChild( builder(CUSTOM_SERVER_INSTANCE.getPathElement()) .addAttributes(BUFFER_SIZE, BUFFERS_PER_REGION, PROPERTIES) .setXmlElementName("custom-server") ) ) .build(); } } private static class IIOPSubsystemParser extends PersistentResourceXMLParser { @Override public PersistentResourceXMLDescription getParserDescription() { return builder(IIOPRootDefinition.INSTANCE.getPathElement(), "urn:jboss:domain:orb-test:1.0") .addAttributes(IIOPRootDefinition.ALL_ATTRIBUTES.toArray(new AttributeDefinition[0])) .build(); } } private static class IIOPRootDefinition extends PersistentResourceDefinition { static final ModelNode NONE = new ModelNode("none"); //ORB attributes static final AttributeDefinition PERSISTENT_SERVER_ID = new SimpleAttributeDefinitionBuilder( Constants.ORB_PERSISTENT_SERVER_ID, ModelType.STRING, true).setAttributeGroup(Constants.ORB) .setDefaultValue(new ModelNode().set("1")).setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES).build(); static final AttributeDefinition GIOP_VERSION = new SimpleAttributeDefinitionBuilder(Constants.ORB_GIOP_VERSION, ModelType.STRING, true).setAttributeGroup(Constants.ORB).setDefaultValue(new ModelNode().set("1.2")) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES).setAllowExpression(true).build(); protected static final AttributeDefinition SOCKET_BINDING = new SimpleAttributeDefinitionBuilder( Constants.ORB_SOCKET_BINDING, ModelType.STRING, true).setAttributeGroup(Constants.ORB) .setDefaultValue(new ModelNode().set("iiop")).setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SOCKET_BINDING_REF).build(); static final AttributeDefinition SSL_SOCKET_BINDING = new SimpleAttributeDefinitionBuilder( Constants.ORB_SSL_SOCKET_BINDING, ModelType.STRING, true).setAttributeGroup(Constants.ORB) .setDefaultValue(new ModelNode().set("iiop-ssl")).setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SOCKET_BINDING_REF).build(); //TCP attributes static final AttributeDefinition HIGH_WATER_MARK = new SimpleAttributeDefinitionBuilder( Constants.TCP_HIGH_WATER_MARK, ModelType.INT, true).setAttributeGroup(Constants.ORB_TCP) .setValidator(new IntRangeValidator(0, Integer.MAX_VALUE, true, false)) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES).setAllowExpression(true).build(); static final AttributeDefinition NUMBER_TO_RECLAIM = new SimpleAttributeDefinitionBuilder( Constants.TCP_NUMBER_TO_RECLAIM, ModelType.INT, true).setAttributeGroup(Constants.ORB_TCP) .setValidator(new IntRangeValidator(0, Integer.MAX_VALUE, true, false)) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES).setAllowExpression(true).build(); //initializer attributes static final AttributeDefinition SECURITY = new SimpleAttributeDefinitionBuilder( Constants.ORB_INIT_SECURITY, ModelType.STRING, true) .setAttributeGroup(Constants.ORB_INIT) .setDefaultValue(NONE) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES).setAllowExpression(true) .build(); static final AttributeDefinition TRANSACTIONS = new SimpleAttributeDefinitionBuilder( Constants.ORB_INIT_TRANSACTIONS, ModelType.STRING, true) .setAttributeGroup(Constants.ORB_INIT) .setDefaultValue(NONE) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES).setAllowExpression(true).build(); //Naming attributes static final AttributeDefinition ROOT_CONTEXT = new SimpleAttributeDefinitionBuilder( Constants.NAMING_ROOT_CONTEXT, ModelType.STRING, true) .setAttributeGroup(Constants.NAMING) .setDefaultValue(new ModelNode(Constants.ROOT_CONTEXT_INIT_REF)) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final AttributeDefinition EXPORT_CORBALOC = new SimpleAttributeDefinitionBuilder( Constants.NAMING_EXPORT_CORBALOC, ModelType.BOOLEAN, true) .setAttributeGroup(Constants.NAMING) .setDefaultValue(new ModelNode(true)) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); //Security attributes static final AttributeDefinition SUPPORT_SSL = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_SUPPORT_SSL, ModelType.BOOLEAN, true) .setAttributeGroup(Constants.SECURITY) .setDefaultValue(new ModelNode(false)) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final AttributeDefinition SECURITY_DOMAIN = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_SECURITY_DOMAIN, ModelType.STRING, true) .setAttributeGroup(Constants.SECURITY) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SOCKET_BINDING_REF) .build(); static final AttributeDefinition ADD_COMPONENT_INTERCEPTOR = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_ADD_COMP_VIA_INTERCEPTOR, ModelType.BOOLEAN, true) .setAttributeGroup(Constants.SECURITY) .setDefaultValue(new ModelNode(true)) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final AttributeDefinition CLIENT_SUPPORTS = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_CLIENT_SUPPORTS, ModelType.STRING, true) .setAttributeGroup(Constants.SECURITY) .setDefaultValue(new ModelNode().set("MutualAuth")) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final AttributeDefinition CLIENT_REQUIRES = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_CLIENT_REQUIRES, ModelType.STRING, true) .setAttributeGroup(Constants.SECURITY) .setDefaultValue(new ModelNode("None")) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final AttributeDefinition SERVER_SUPPORTS = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_SERVER_SUPPORTS, ModelType.STRING, true) .setAttributeGroup(Constants.SECURITY) .setDefaultValue(new ModelNode("MutualAuth")) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final AttributeDefinition SERVER_REQUIRES = new SimpleAttributeDefinitionBuilder( Constants.SECURITY_SERVER_REQUIRES, ModelType.STRING, true) .setAttributeGroup(Constants.SECURITY) .setDefaultValue(new ModelNode("None")) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAllowExpression(true) .build(); static final PropertiesAttributeDefinition PROPERTIES = new PropertiesAttributeDefinition.Builder( Constants.PROPERTIES, true) .setWrapXmlElement(true) .setWrapperElement(Constants.PROPERTIES) .setXmlName(Constants.PROPERTY) .setAllowExpression(true) .setRestartAllServices() .build(); //ior transport config attributes static final AttributeDefinition REALM = new SimpleAttributeDefinitionBuilder( Constants.IOR_AS_CONTEXT_REALM, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_AS_CONTEXT) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SECURITY_REALM_REF) .setAllowExpression(true) .build(); static final AttributeDefinition REQUIRED = new SimpleAttributeDefinitionBuilder( Constants.IOR_AS_CONTEXT_REQUIRED, ModelType.BOOLEAN, true) .setAttributeGroup(Constants.IOR_AS_CONTEXT) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(new ModelNode(false)) .setAllowExpression(true) .build(); static final AttributeDefinition INTEGRITY = new SimpleAttributeDefinitionBuilder( Constants.IOR_TRANSPORT_INTEGRITY, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_TRANSPORT_CONFIG) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); static final AttributeDefinition CONFIDENTIALITY = new SimpleAttributeDefinitionBuilder( Constants.IOR_TRANSPORT_CONFIDENTIALITY, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_TRANSPORT_CONFIG) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); static final AttributeDefinition TRUST_IN_TARGET = new SimpleAttributeDefinitionBuilder( Constants.IOR_TRANSPORT_TRUST_IN_TARGET, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_TRANSPORT_CONFIG) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); static final AttributeDefinition TRUST_IN_CLIENT = new SimpleAttributeDefinitionBuilder( Constants.IOR_TRANSPORT_TRUST_IN_CLIENT, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_TRANSPORT_CONFIG) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); static final AttributeDefinition DETECT_REPLAY = new SimpleAttributeDefinitionBuilder( Constants.IOR_TRANSPORT_DETECT_REPLAY, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_TRANSPORT_CONFIG) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); static final AttributeDefinition DETECT_MISORDERING = new SimpleAttributeDefinitionBuilder( Constants.IOR_TRANSPORT_DETECT_MISORDERING, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_TRANSPORT_CONFIG) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); //ior as context attributes static final AttributeDefinition AUTH_METHOD = new SimpleAttributeDefinitionBuilder( Constants.IOR_AS_CONTEXT_AUTH_METHOD, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_AS_CONTEXT) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(new ModelNode("username_password")) .setAllowExpression(true) .build(); //ior sas context attributes static final AttributeDefinition CALLER_PROPAGATION = new SimpleAttributeDefinitionBuilder( Constants.IOR_SAS_CONTEXT_CALLER_PROPAGATION, ModelType.STRING, true) .setAttributeGroup(Constants.IOR_SAS_CONTEXT) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(NONE) .setAllowExpression(true) .build(); // list that contains ORB attribute definitions static final List<AttributeDefinition> ORB_ATTRIBUTES = Arrays.asList(PERSISTENT_SERVER_ID, GIOP_VERSION, SOCKET_BINDING, SSL_SOCKET_BINDING); // list that contains initializers attribute definitions static final List<AttributeDefinition> INITIALIZERS_ATTRIBUTES = Arrays.asList(SECURITY, TRANSACTIONS); // list that contains naming attributes definitions static final List<AttributeDefinition> NAMING_ATTRIBUTES = Arrays.asList(ROOT_CONTEXT, EXPORT_CORBALOC); // list that contains security attributes definitions static final List<AttributeDefinition> SECURITY_ATTRIBUTES = Arrays.asList(SUPPORT_SSL, SECURITY_DOMAIN, ADD_COMPONENT_INTERCEPTOR, CLIENT_SUPPORTS, CLIENT_REQUIRES, SERVER_SUPPORTS, SERVER_REQUIRES); //list that contains tcp attributes definitions static final List<AttributeDefinition> TCP_ATTRIBUTES = Arrays.asList(HIGH_WATER_MARK, NUMBER_TO_RECLAIM); //list that contains ior sas attributes definitions static final List<AttributeDefinition> IOR_SAS_ATTRIBUTES = Arrays.asList(CALLER_PROPAGATION); //list that contains ior as attributes definitions static final List<AttributeDefinition> IOR_AS_ATTRIBUTES = Arrays.asList(AUTH_METHOD, REALM, REQUIRED); //list that contains ior transport config attributes definitions static final List<AttributeDefinition> IOR_TRANSPORT_CONFIG_ATTRIBUTES = Arrays.asList(INTEGRITY, CONFIDENTIALITY, TRUST_IN_TARGET, TRUST_IN_CLIENT, DETECT_REPLAY, DETECT_MISORDERING); static final List<AttributeDefinition> CONFIG_ATTRIBUTES = new ArrayList<>(); static final List<AttributeDefinition> IOR_ATTRIBUTES = new ArrayList<>(); static final List<AttributeDefinition> ALL_ATTRIBUTES = new ArrayList<>(); static { CONFIG_ATTRIBUTES.addAll(ORB_ATTRIBUTES); CONFIG_ATTRIBUTES.addAll(TCP_ATTRIBUTES); CONFIG_ATTRIBUTES.addAll(INITIALIZERS_ATTRIBUTES); CONFIG_ATTRIBUTES.addAll(NAMING_ATTRIBUTES); CONFIG_ATTRIBUTES.addAll(SECURITY_ATTRIBUTES); CONFIG_ATTRIBUTES.add(PROPERTIES); IOR_ATTRIBUTES.addAll(IOR_TRANSPORT_CONFIG_ATTRIBUTES); IOR_ATTRIBUTES.addAll(IOR_AS_ATTRIBUTES); IOR_ATTRIBUTES.addAll(IOR_SAS_ATTRIBUTES); ALL_ATTRIBUTES.addAll(CONFIG_ATTRIBUTES); ALL_ATTRIBUTES.addAll(IOR_ATTRIBUTES); } static final IIOPRootDefinition INSTANCE = new IIOPRootDefinition(); private IIOPRootDefinition() { super(PathElement.pathElement("subsystem", "orb"), new NonResolvingResourceDescriptionResolver()); } @Override public Collection<AttributeDefinition> getAttributes() { return ALL_ATTRIBUTES; } } static class Constants { static final String ORB = "orb"; static final String ORB_GIOP_VERSION = "giop-version"; static final String ORB_TCP = "tcp"; static final String TCP_HIGH_WATER_MARK = "high-water-mark"; static final String TCP_NUMBER_TO_RECLAIM = "number-to-reclaim"; static final String ORB_SOCKET_BINDING = "socket-binding"; static final String ORB_SSL_SOCKET_BINDING = "ssl-socket-binding"; static final String ORB_PERSISTENT_SERVER_ID = "persistent-server-id"; static final String ORB_INIT = "initializers"; static final String ORB_INIT_SECURITY = "security"; static final String ORB_INIT_TRANSACTIONS = "transactions"; static final String NAMING = "naming"; static final String NAMING_EXPORT_CORBALOC = "export-corbaloc"; static final String NAMING_ROOT_CONTEXT = "root-context"; public static final String NONE = "none"; static final String SECURITY = "security"; static final String SECURITY_SUPPORT_SSL = "support-ssl"; static final String SECURITY_SECURITY_DOMAIN = "security-domain"; static final String SECURITY_ADD_COMP_VIA_INTERCEPTOR = "add-component-via-interceptor"; static final String SECURITY_CLIENT_SUPPORTS = "client-supports"; static final String SECURITY_CLIENT_REQUIRES = "client-requires"; static final String SECURITY_SERVER_SUPPORTS = "server-supports"; static final String SECURITY_SERVER_REQUIRES = "server-requires"; static final String IOR_TRANSPORT_CONFIG = "transport-config"; static final String IOR_TRANSPORT_INTEGRITY = "integrity"; static final String IOR_TRANSPORT_CONFIDENTIALITY = "confidentiality"; static final String IOR_TRANSPORT_TRUST_IN_TARGET = "trust-in-target"; static final String IOR_TRANSPORT_TRUST_IN_CLIENT = "trust-in-client"; static final String IOR_TRANSPORT_DETECT_REPLAY = "detect-replay"; static final String IOR_TRANSPORT_DETECT_MISORDERING = "detect-misordering"; static final String IOR_AS_CONTEXT = "as-context"; static final String IOR_AS_CONTEXT_AUTH_METHOD = "auth-method"; static final String IOR_AS_CONTEXT_REALM = "realm"; static final String IOR_AS_CONTEXT_REQUIRED = "required"; static final String IOR_SAS_CONTEXT = "sas-context"; static final String IOR_SAS_CONTEXT_CALLER_PROPAGATION = "caller-propagation"; static final String PROPERTIES = "properties"; static final String PROPERTY = "property"; static final String ROOT_CONTEXT_INIT_REF = "JBoss/Naming/root"; } private static final String CLASS = "class"; private static final String MODULE = "module"; public static final PropertiesAttributeDefinition PROPERTIES = new PropertiesAttributeDefinition.Builder("properties", true) .setAllowExpression(true) .build(); public static final ObjectTypeAttributeDefinition PROCESS_STATE_LISTENER = ObjectTypeAttributeDefinition.Builder.of("process-state-listener", SimpleAttributeDefinitionBuilder.create(CLASS, ModelType.STRING, false) .setAllowExpression(false) .build(), SimpleAttributeDefinitionBuilder.create(MODULE, ModelType.STRING, false) .setAllowExpression(false) .build(), PROPERTIES) .setRestartAllServices() .setAllowNull(true) .build(); public static final ObjectTypeAttributeDefinition STATE_LISTENER = ObjectTypeAttributeDefinition.Builder.of("state-listener", SimpleAttributeDefinitionBuilder.create(CLASS, ModelType.STRING, false) .setAllowExpression(false) .build(), SimpleAttributeDefinitionBuilder.create(MODULE, ModelType.STRING, false) .setAllowExpression(false) .build(), PROPERTIES) .setRestartAllServices() .setAllowNull(true) .build(); public static final AttributeDefinition PROCESS_STATE_LISTENERS = ObjectListAttributeDefinition.Builder.of("listeners", PROCESS_STATE_LISTENER) .setAllowNull(false) .setRuntimeServiceNotRequired() .build(); public static final AttributeDefinition UNWRAPPED_LISTENER = ObjectListAttributeDefinition.Builder.of("unwrapped-listener", STATE_LISTENER) .setAllowNull(false) .setRuntimeServiceNotRequired() .build(); static class AttributeMappingObjectDefinition { static final SimpleAttributeDefinition FROM = new SimpleAttributeDefinitionBuilder("from", ModelType.STRING, false) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition TO = new SimpleAttributeDefinitionBuilder("to", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition FILTER = new SimpleAttributeDefinitionBuilder("filter", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition FILTER_BASE_DN = new SimpleAttributeDefinitionBuilder("filter-base-dn", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition AS_RDN = new SimpleAttributeDefinitionBuilder("as-rdn", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition[] ATTRIBUTES = new SimpleAttributeDefinition[] {FROM, TO, FILTER, FILTER_BASE_DN, AS_RDN}; static final ObjectTypeAttributeDefinition OBJECT_DEFINITION = new ObjectTypeAttributeDefinition.Builder("attribute", ATTRIBUTES) .build(); } static class NewIdentityAttributeObjectDefinition { static final SimpleAttributeDefinition NAME = new SimpleAttributeDefinitionBuilder("name", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final StringListAttributeDefinition VALUE = new StringListAttributeDefinition.Builder("value") .setAllowExpression(true) .setMinSize(1) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final AttributeDefinition[] ATTRIBUTES = new AttributeDefinition[] {NAME, VALUE}; static final ObjectTypeAttributeDefinition OBJECT_DEFINITION = new ObjectTypeAttributeDefinition.Builder("attribute", ATTRIBUTES) .build(); } static class IdentityMappingObjectDefinition { static final SimpleAttributeDefinition RDN_IDENTIFIER = new SimpleAttributeDefinitionBuilder("rdn-identifier", ModelType.STRING, false) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition USE_RECURSIVE_SEARCH = new SimpleAttributeDefinitionBuilder("use-recursive-search", ModelType.BOOLEAN, false) .setDefaultValue(new ModelNode(false)) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition SEARCH_BASE_DN = new SimpleAttributeDefinitionBuilder("search-base-dn", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final ObjectListAttributeDefinition ATTRIBUTE_MAPPINGS = new ObjectListAttributeDefinition.Builder("attribute-mapping", AttributeMappingObjectDefinition.OBJECT_DEFINITION) .setAllowNull(true) .setAttributeGroup("attribute") .setAllowDuplicates(true) .build(); static final ObjectListAttributeDefinition NEW_IDENTITY_ATTRIBUTES = new ObjectListAttributeDefinition.Builder("new-identity-attributes", NewIdentityAttributeObjectDefinition.OBJECT_DEFINITION) .setAllowNull(true) .setAllowDuplicates(true) .build(); static final SimpleAttributeDefinition FILTER_NAME = new SimpleAttributeDefinitionBuilder("filter-name", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition ITERATOR_FILTER = new SimpleAttributeDefinitionBuilder("iterator-filter", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final SimpleAttributeDefinition NEW_IDENTITY_PARENT_DN = new SimpleAttributeDefinitionBuilder("new-identity-parent-dn", ModelType.STRING, true) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) .build(); static final AttributeDefinition[] ATTRIBUTES = new AttributeDefinition[] { RDN_IDENTIFIER, USE_RECURSIVE_SEARCH, SEARCH_BASE_DN, ATTRIBUTE_MAPPINGS, FILTER_NAME, ITERATOR_FILTER, NEW_IDENTITY_PARENT_DN, NEW_IDENTITY_ATTRIBUTES }; static final ObjectTypeAttributeDefinition OBJECT_DEFINITION = new ObjectTypeAttributeDefinition.Builder("identity-mapping", RDN_IDENTIFIER, USE_RECURSIVE_SEARCH, SEARCH_BASE_DN, ATTRIBUTE_MAPPINGS, FILTER_NAME, ITERATOR_FILTER, NEW_IDENTITY_PARENT_DN, NEW_IDENTITY_ATTRIBUTES/*, UserPasswordCredentialMappingObjectDefinition.OBJECT_DEFINITION, OtpCredentialMappingObjectDefinition.OBJECT_DEFINITION*/ ) .setAllowNull(false) .build(); } static final PersistentResourceDefinition SERVICE_PROCESS_RESOURCE = new PersistentResourceDefinition(PathElement.pathElement("service"), new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { Collection<AttributeDefinition> attributes = new ArrayList<>(); attributes.add(PROCESS_STATE_LISTENERS); attributes.add(UNWRAPPED_LISTENER); attributes.add(OBJECT_DEFINITION); return attributes; } }; protected static final PathElement PROCESS_SUBSYSTEM_PATH = PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, "process"); PersistentResourceDefinition PROCESS_SUBSYSTEM_ROOT_INSTANCE = new PersistentResourceDefinition(PROCESS_SUBSYSTEM_PATH, new NonResolvingResourceDescriptionResolver()) { @Override public Collection<AttributeDefinition> getAttributes() { return Collections.emptyList(); } @Override protected List<? extends PersistentResourceDefinition> getChildren() { List<PersistentResourceDefinition> children = new ArrayList<>(); children.add(SERVICE_PROCESS_RESOURCE); return children; } }; private static class CoreParser extends PersistentResourceXMLParser { protected static final String NAMESPACE = "urn:jboss:domain:core:1.0"; @Override public PersistentResourceXMLDescription getParserDescription() { return PersistentResourceXMLDescription.builder(PROCESS_SUBSYSTEM_PATH, NAMESPACE) .addChild(builder(SERVICE_PROCESS_RESOURCE.getPathElement()) .addAttribute(PROCESS_STATE_LISTENERS) .addAttribute(UNWRAPPED_LISTENER, AttributeParsers.UNWRAPPED_OBJECT_LIST_PARSER, AttributeMarshaller.UNWRAPPED_OBJECT_LIST_MARSHALLER) .addAttribute(OBJECT_DEFINITION)) .build(); } } }