/* * JBoss, Home of Professional Open Source * Copyright 2016, Red Hat, Inc., and individual contributors as indicated * by the @authors tag. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wildfly.test.mixed.domain; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.jboss.as.controller.Extension; import org.jboss.as.controller.ProcessType; import org.jboss.as.controller.RunningMode; import org.jboss.as.controller.RunningModeControl; import org.jboss.as.controller.extension.ExtensionRegistry; import org.jboss.as.controller.extension.RuntimeHostControllerInfoAccessor; import org.jboss.as.subsystem.test.TestParser; import org.jboss.dmr.ModelNode; import org.jboss.staxmapper.XMLMapper; /** * Builder to create a test xml mapper for a subsystem's xml configuration in full WildFly's testsuite without * depending on implementation details from core. * * It will parse the given subsystem xml and wrap it in a root element with a namespace. * * @author Kabir Khan */ public class TestParserUtils { private final XMLMapper xmlMapper; private final String wrappedXml; private TestParserUtils(XMLMapper xmlMapper, String wrappedXml) { this.xmlMapper = xmlMapper; this.wrappedXml = wrappedXml; } /** * Parses the operations in the subsystem xml * * @return The list of operations * @throws XMLStreamException if an error occurred parsing the xml */ public List<ModelNode> parseOperations() throws XMLStreamException { final XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(wrappedXml)); final List<ModelNode> operations = new ArrayList<>(); xmlMapper.parseDocument(operations, reader); return operations; } public static class Builder { private final Extension extension; private final String subsystemName; private final String subsystemXml; private String rootWrapperName = "test"; private String namespace = "urn.org.jboss.test:1.0"; //These are needed to initialise the extension registry used to initialise the parser, but should not have //any effect on the parsers themselves. If that assumption turns out to be wrong, we can add setters for these //later, making sure that we don't expose core implementation details (such as // RuntimeHostControllerInfoAccessor) private final ProcessType processType = ProcessType.HOST_CONTROLLER; private final RunningMode runningMode = RunningMode.NORMAL; private final RuntimeHostControllerInfoAccessor hostControllerInfoAccessor = RuntimeHostControllerInfoAccessor.SERVER; public Builder(Extension extension, String subsystemName, String subsystemXml) { this.extension = extension; this.subsystemName = subsystemName; this.subsystemXml = subsystemXml; } /** * Sets the name of the root element, which will wrap the subsystem xml. * Defaults to {@code test} if not set. * * @param rootWrapperName the name of the root wrapper xml element * @return this builder */ public Builder setRootWrapperName(String rootWrapperName) { this.rootWrapperName = rootWrapperName; return this; } /** * Sets the namespace of the root element, used to wrap the subsystem xml. * Defaults to {@code urn.org.jboss.test:1.0} if not set. * * @param namespace the name of the root wrapper xml element namespace * */ public Builder setNamespace(String namespace) { this.namespace = namespace; return this; } /** * Builds the utils needed to parse the document * * @return the test parser utils */ public TestParserUtils build() { XMLMapper xmlMapper = XMLMapper.Factory.create(); ExtensionRegistry extensionParsingRegistry = new ExtensionRegistry(processType, new RunningModeControl(runningMode), null, null, null, hostControllerInfoAccessor); TestParser testParser = new TestParser(subsystemName, extensionParsingRegistry); xmlMapper.registerRootElement(new QName(namespace, "test"), testParser); extension.initializeParsers(extensionParsingRegistry.getExtensionParsingContext("Test", xmlMapper)); String wrappedXml = "<" + rootWrapperName + " xmlns=\"" + namespace + "\">" + subsystemXml + "</test>"; return new TestParserUtils(xmlMapper, wrappedXml); } } }