package org.jboss.as.subsystem.test.validation.subsystem; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM; import java.util.List; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import org.jboss.as.controller.AbstractAddStepHandler; import org.jboss.as.controller.Extension; import org.jboss.as.controller.ExtensionContext; import org.jboss.as.controller.ModelVersion; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.SimpleOperationDefinition; import org.jboss.as.controller.SimpleResourceDefinition; import org.jboss.as.controller.SubsystemRegistration; import org.jboss.as.controller.descriptions.DescriptionProvider; import org.jboss.as.controller.descriptions.NonResolvingResourceDescriptionResolver; import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler; import org.jboss.as.controller.parsing.ExtensionParsingContext; import org.jboss.as.controller.parsing.ParseUtils; import org.jboss.as.controller.persistence.SubsystemMarshallingContext; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.dmr.ModelNode; import org.jboss.staxmapper.XMLElementReader; import org.jboss.staxmapper.XMLElementWriter; import org.jboss.staxmapper.XMLExtendedStreamReader; import org.jboss.staxmapper.XMLExtendedStreamWriter; /** * * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ public class ValidateSubsystemExtension implements Extension { /** The name space used for the {@code subsystem} element */ public static final String NAMESPACE = "urn:mycompany:mysubsystem:1.0"; /** The name of our subsystem within the model. */ public static final String SUBSYSTEM_NAME = "mysubsystem"; /** The parser used for parsing our subsystem */ private final SubsystemParser parser = new SubsystemParser(); private volatile DescriptionProvider addDescriptionProvider; public void setAddDescriptionProvider(DescriptionProvider addDescriptionProvider) { this.addDescriptionProvider = addDescriptionProvider; } @Override public void initializeParsers(ExtensionParsingContext context) { context.setSubsystemXmlMapping(SUBSYSTEM_NAME, NAMESPACE, parser); } @Override public void initialize(ExtensionContext context) { final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, ModelVersion.create(1)); SimpleResourceDefinition subsystemResource = new SimpleResourceDefinition(new SimpleResourceDefinition.Parameters( PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME), new NonResolvingResourceDescriptionResolver()) ); final ManagementResourceRegistration registration = subsystem.registerSubsystemModel(subsystemResource); //We always need to add an 'add' operation registration.registerOperationHandler(new SimpleOperationDefinition(ADD, NonResolvingResourceDescriptionResolver.INSTANCE){ @Override public DescriptionProvider getDescriptionProvider() { return addDescriptionProvider; } }, new AbstractAddStepHandler()); //We always need to add a 'describe' operation registration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE); subsystem.registerXMLElementWriter(parser); } private static ModelNode createAddSubsystemOperation() { final ModelNode subsystem = new ModelNode(); subsystem.get(OP).set(ADD); subsystem.get(OP_ADDR).add(SUBSYSTEM, SUBSYSTEM_NAME); return subsystem; } /** * The subsystem parser, which uses stax to read and write to and from xml */ private static class SubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>, XMLElementWriter<SubsystemMarshallingContext> { /** {@inheritDoc} */ @Override public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException { context.startSubsystemElement(ValidateSubsystemExtension.NAMESPACE, false); writer.writeEndElement(); } /** {@inheritDoc} */ @Override public void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException { // Require no content ParseUtils.requireNoContent(reader); list.add(createAddSubsystemOperation()); } } }