/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, 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.connector.subsystems.jca;
import static org.jboss.as.connector.logging.ConnectorLogger.ROOT_LOGGER;
import static org.jboss.as.connector.subsystems.jca.Constants.ARCHIVE_VALIDATION;
import static org.jboss.as.connector.subsystems.jca.Constants.BEAN_VALIDATION;
import static org.jboss.as.connector.subsystems.jca.Constants.BOOTSTRAP_CONTEXT;
import static org.jboss.as.connector.subsystems.jca.Constants.CACHED_CONNECTION_MANAGER;
import static org.jboss.as.connector.subsystems.jca.Constants.DEFAULT_NAME;
import static org.jboss.as.connector.subsystems.jca.Constants.DISTRIBUTED_WORKMANAGER;
import static org.jboss.as.connector.subsystems.jca.Constants.JCA;
import static org.jboss.as.connector.subsystems.jca.Constants.TRACER;
import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER;
import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER_LONG_RUNNING;
import static org.jboss.as.connector.subsystems.jca.Constants.WORKMANAGER_SHORT_RUNNING;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME;
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.parsing.ParseUtils.missingRequiredElement;
import static org.jboss.as.controller.parsing.ParseUtils.requireNoContent;
import static org.jboss.as.controller.parsing.ParseUtils.requireSingleAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedElement;
import java.util.EnumSet;
import java.util.List;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.jboss.as.connector.subsystems.jca.JcaArchiveValidationDefinition.ArchiveValidationParameters;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.Extension;
import org.jboss.as.controller.ExtensionContext;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.PropertiesAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SubsystemRegistration;
import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
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.threads.ThreadsParser;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.staxmapper.XMLElementReader;
import org.jboss.staxmapper.XMLElementWriter;
import org.jboss.staxmapper.XMLExtendedStreamReader;
import org.jboss.staxmapper.XMLExtendedStreamWriter;
/**
* @author <a href="mailto:stefano.maestri@redhat.com">Stefano Maestri</a>
* @author <a href="mailto:darran.lofthouse@jboss.com">Darran Lofthouse</a>
* @author <a href="mailto:jesper.pedersen@jboss.org">Jesper Pedersen</a>
*/
public class JcaExtension implements Extension {
public static final String SUBSYSTEM_NAME = "jca";
private static final ModelVersion CURRENT_MODEL_VERSION = ModelVersion.create(4, 1, 0);
private static final String RESOURCE_NAME = JcaExtension.class.getPackage().getName() + ".LocalDescriptions";
static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String... keyPrefix) {
StringBuilder prefix = new StringBuilder(SUBSYSTEM_NAME);
for (String kp : keyPrefix) {
prefix.append('.').append(kp);
}
return new StandardResourceDescriptionResolver(prefix.toString(), RESOURCE_NAME, JcaExtension.class.getClassLoader(), true, false);
}
@Override
public void initialize(final ExtensionContext context) {
ROOT_LOGGER.debugf("Initializing Connector Extension");
final boolean registerRuntimeOnly = context.isRuntimeOnlyRegistrationValid();
final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, CURRENT_MODEL_VERSION);
subsystem.registerSubsystemModel(JcaSubsystemRootDefinition.createInstance(registerRuntimeOnly));
subsystem.registerXMLElementWriter(ConnectorSubsystemParser.INSTANCE);
if (context.isRegisterTransformers()) {
JcaSubsystemRootDefinition.registerTransformers(subsystem);
}
}
@Override
public void initializeParsers(final ExtensionParsingContext context) {
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JCA_1_1.getUriString(), () -> ConnectorSubsystemParser.INSTANCE);
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JCA_2_0.getUriString(), () -> ConnectorSubsystemParser.INSTANCE);
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JCA_3_0.getUriString(), () -> ConnectorSubsystemParser.INSTANCE);
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JCA_4_0.getUriString(), () -> ConnectorSubsystemParser.INSTANCE);
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.JCA_5_0.getUriString(), () -> ConnectorSubsystemParser.INSTANCE);
}
static final class ConnectorSubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>,
XMLElementWriter<SubsystemMarshallingContext> {
static final ConnectorSubsystemParser INSTANCE = new ConnectorSubsystemParser();
/**
* {@inheritDoc}
*/
@Override
public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {
context.startSubsystemElement(Namespace.CURRENT.getUriString(), false);
ModelNode node = context.getModelNode();
writeArchiveValidation(writer, node);
writeBeanValidation(writer, node);
writeTracer(writer, node);
writeWorkManagers(writer, node);
writeDistributedWorkManagers(writer, node);
writeBootstrapContexts(writer, node);
writeCachedConnectionManager(writer, node);
writer.writeEndElement();
}
private void writeArchiveValidation(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(ARCHIVE_VALIDATION)) {
ModelNode node = parentNode.get(ARCHIVE_VALIDATION).get(ARCHIVE_VALIDATION);
if (ArchiveValidationParameters.ARCHIVE_VALIDATION_ENABLED.getAttribute().isMarshallable(node) ||
ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_ERROR.getAttribute().isMarshallable(node) ||
ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_WARN.getAttribute().isMarshallable(node)) {
writer.writeEmptyElement(Element.ARCHIVE_VALIDATION.getLocalName());
ArchiveValidationParameters.ARCHIVE_VALIDATION_ENABLED.getAttribute().marshallAsAttribute(node, writer);
ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_ERROR.getAttribute().marshallAsAttribute(node, writer);
ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_WARN.getAttribute().marshallAsAttribute(node, writer);
}
}
}
private void writeBeanValidation(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(BEAN_VALIDATION)) {
ModelNode node = parentNode.get(BEAN_VALIDATION).get(BEAN_VALIDATION);
if (JcaBeanValidationDefinition.BeanValidationParameters.BEAN_VALIDATION_ENABLED.getAttribute().isMarshallable(node)) {
writer.writeEmptyElement(Element.BEAN_VALIDATION.getLocalName());
JcaBeanValidationDefinition.BeanValidationParameters.BEAN_VALIDATION_ENABLED.getAttribute().marshallAsAttribute(node, writer);
}
}
}
private void writeTracer(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(TRACER)) {
ModelNode node = parentNode.get(TRACER).get(TRACER);
if (TracerDefinition.TracerParameters.TRACER_ENABLED.getAttribute().isMarshallable(node)) {
writer.writeEmptyElement(Element.TRACER.getLocalName());
TracerDefinition.TracerParameters.TRACER_ENABLED.getAttribute().marshallAsAttribute(node, writer);
}
}
}
private void writeCachedConnectionManager(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(CACHED_CONNECTION_MANAGER)) {
ModelNode node = parentNode.get(CACHED_CONNECTION_MANAGER).get(CACHED_CONNECTION_MANAGER);
final String name = JcaCachedConnectionManagerDefinition.CcmParameters.INSTALL.getAttribute().getName();
if (node.hasDefined(name) &&
node.get(name).asBoolean()) {
writer.writeEmptyElement(Element.CACHED_CONNECTION_MANAGER.getLocalName());
JcaCachedConnectionManagerDefinition.CcmParameters.DEBUG.getAttribute().marshallAsAttribute(node, writer);
JcaCachedConnectionManagerDefinition.CcmParameters.ERROR.getAttribute().marshallAsAttribute(node, writer);
JcaCachedConnectionManagerDefinition.CcmParameters.IGNORE_UNKNOWN_CONNECTIONS.getAttribute().marshallAsAttribute(node, writer);
}
}
}
private void writeDistributedWorkManagers(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(DISTRIBUTED_WORKMANAGER) && parentNode.get(DISTRIBUTED_WORKMANAGER).asList().size() != 0) {
ModelNode workManagers = parentNode.get(DISTRIBUTED_WORKMANAGER);
for (String name : workManagers.keys()) {
ModelNode workManager = workManagers.get(name);
writer.writeStartElement(Element.DISTRIBUTED_WORKMANAGER.getLocalName());
((SimpleAttributeDefinition) JcaDistributedWorkManagerDefinition.DWmParameters.NAME.getAttribute()).marshallAsAttribute(workManager, writer);
JcaDistributedWorkManagerDefinition.DWmParameters.ELYTRON_ENABLED.getAttribute().marshallAsElement(workManager, writer);
for (Property prop : workManager.asPropertyList()) {
if (WORKMANAGER_LONG_RUNNING.equals(prop.getName()) && prop.getValue().isDefined() && prop.getValue().asPropertyList().size() != 0) {
ThreadsParser.getInstance().writeBoundedQueueThreadPool(writer, prop.getValue().asProperty(), Element.LONG_RUNNING_THREADS.getLocalName(), false);
}
if (WORKMANAGER_SHORT_RUNNING.equals(prop.getName()) && prop.getValue().isDefined() && prop.getValue().asPropertyList().size() != 0) {
ThreadsParser.getInstance().writeBoundedQueueThreadPool(writer, prop.getValue().asProperty(), Element.SHORT_RUNNING_THREADS.getLocalName(), false);
}
if ((JcaDistributedWorkManagerDefinition.DWmParameters.POLICY.getAttribute().getName().equals(prop.getName()) && prop.getValue().isDefined()) ||
(JcaDistributedWorkManagerDefinition.DWmParameters.POLICY.getAttribute().getName().equals(prop.getName()) && workManager.hasDefined(JcaDistributedWorkManagerDefinition.DWmParameters.POLICY_OPTIONS.getAttribute().getName()))) {
writer.writeStartElement(Element.POLICY.getLocalName());
if (prop.getValue().isDefined() )
writer.writeAttribute(JcaDistributedWorkManagerDefinition.DWmParameters.NAME.getAttribute().getXmlName(), prop.getValue().asString());
else
writer.writeAttribute(JcaDistributedWorkManagerDefinition.DWmParameters.NAME.getAttribute().getXmlName(), JcaDistributedWorkManagerDefinition.DWmParameters.POLICY.getAttribute().getDefaultValue().asString());
if (workManager.hasDefined(JcaDistributedWorkManagerDefinition.DWmParameters.POLICY_OPTIONS.getAttribute().getName())) {
for (Property option : workManager.get(JcaDistributedWorkManagerDefinition.DWmParameters.POLICY_OPTIONS.getAttribute().getName()).asPropertyList()) {
writeProperty(writer, option.getName(), option
.getValue().asString(), Element.OPTION.getLocalName());
}
}
writer.writeEndElement();
}
if (JcaDistributedWorkManagerDefinition.DWmParameters.SELECTOR.getAttribute().getName().equals(prop.getName()) && prop.getValue().isDefined()) {
writer.writeStartElement(Element.SELECTOR.getLocalName());
writer.writeAttribute(JcaDistributedWorkManagerDefinition.DWmParameters.NAME.getAttribute().getXmlName(), prop.getValue().asString());
if (workManager.hasDefined(JcaDistributedWorkManagerDefinition.DWmParameters.SELECTOR_OPTIONS.getAttribute().getName())) {
for (Property option : workManager.get(JcaDistributedWorkManagerDefinition.DWmParameters.SELECTOR_OPTIONS.getAttribute().getName()).asPropertyList()) {
writeProperty(writer, option.getName(), option
.getValue().asString(), Element.OPTION.getLocalName());
}
}
writer.writeEndElement();
}
}
writer.writeEndElement();
}
}
}
private void writeWorkManagers(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(WORKMANAGER) && parentNode.get(WORKMANAGER).asList().size() != 0) {
ModelNode workManagers = parentNode.get(WORKMANAGER);
for (String name : workManagers.keys()) {
ModelNode workManager = workManagers.get(name);
if ("default".equals(workManager.get(NAME).asString())) {
writer.writeStartElement(Element.DEFAULT_WORKMANAGER.getLocalName());
} else {
writer.writeStartElement(Element.WORKMANAGER.getLocalName());
JcaWorkManagerDefinition.WmParameters.NAME.getAttribute().marshallAsAttribute(workManager, writer);
}
JcaWorkManagerDefinition.WmParameters.ELYTRON_ENABLED.getAttribute().marshallAsElement(workManager, writer);
for (String propName : workManager.keys()) {
ModelNode propVal = workManager.get(propName);
if (WORKMANAGER_LONG_RUNNING.equals(propName) && propVal.isDefined() && propVal.asPropertyList().size() != 0) {
ThreadsParser.getInstance().writeBoundedQueueThreadPool(writer, propVal.asProperty(), Element.LONG_RUNNING_THREADS.getLocalName(), false);
}
if (WORKMANAGER_SHORT_RUNNING.equals(propName) && propVal.isDefined() && propVal.asPropertyList().size() != 0) {
ThreadsParser.getInstance().writeBoundedQueueThreadPool(writer, propVal.asProperty(), Element.SHORT_RUNNING_THREADS.getLocalName(), false);
}
}
writer.writeEndElement();
}
}
}
private void writeBootstrapContexts(XMLExtendedStreamWriter writer, ModelNode parentNode) throws XMLStreamException {
if (parentNode.hasDefined(BOOTSTRAP_CONTEXT) && parentNode.get(BOOTSTRAP_CONTEXT).asList().size() != 0) {
boolean started = false;
ModelNode contexts = parentNode.get(BOOTSTRAP_CONTEXT);
for (String name : contexts.keys()) {
ModelNode context = contexts.get(name);
if (!context.get(JcaBootstrapContextDefinition.BootstrapCtxParameters.NAME.getAttribute().getName()).asString().equals(DEFAULT_NAME) &&
(JcaBootstrapContextDefinition.BootstrapCtxParameters.NAME.getAttribute().isMarshallable(context) ||
JcaBootstrapContextDefinition.BootstrapCtxParameters.WORKMANAGER.getAttribute().isMarshallable(context))) {
if (!started) {
writer.writeStartElement(Element.BOOTSTRAP_CONTEXTS.getLocalName());
started = true;
}
writer.writeStartElement(Element.BOOTSTRAP_CONTEXT.getLocalName());
JcaBootstrapContextDefinition.BootstrapCtxParameters.NAME.getAttribute().marshallAsAttribute(context, writer);
JcaBootstrapContextDefinition.BootstrapCtxParameters.WORKMANAGER.getAttribute().marshallAsAttribute(context, writer);
writer.writeEndElement();
}
}
if (started) {
writer.writeEndElement();
}
}
}
@Override
public void readElement(final XMLExtendedStreamReader reader, final List<ModelNode> list) throws XMLStreamException {
final ModelNode address = new ModelNode();
address.add(org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM, JCA);
address.protect();
final ModelNode subsystem = new ModelNode();
subsystem.get(OP).set(ADD);
subsystem.get(OP_ADDR).set(address);
list.add(subsystem);
// Handle elements
final EnumSet<Element> visited = EnumSet.noneOf(Element.class);
final EnumSet<Element> requiredElement = EnumSet.of(Element.DEFAULT_WORKMANAGER);
boolean ccmAdded = false;
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case JCA_5_0:
case JCA_4_0:
case JCA_3_0:
case JCA_2_0:
case JCA_1_1: {
final Element element = Element.forName(reader.getLocalName());
if (!visited.add(element)) {
throw unexpectedElement(reader);
}
switch (element) {
case ARCHIVE_VALIDATION: {
list.add(parseArchiveValidation(reader, address));
break;
}
case BEAN_VALIDATION: {
list.add(parseBeanValidation(reader, address));
break;
}
case DEFAULT_WORKMANAGER: {
parseWorkManager(reader, address, list, subsystem, true);
final ModelNode bootstrapContextOperation = new ModelNode();
bootstrapContextOperation.get(OP).set(ADD);
final ModelNode bootStrapCOntextAddress = address.clone();
bootStrapCOntextAddress.add(BOOTSTRAP_CONTEXT, DEFAULT_NAME);
bootStrapCOntextAddress.protect();
bootstrapContextOperation.get(OP_ADDR).set(bootStrapCOntextAddress);
bootstrapContextOperation.get(WORKMANAGER).set(DEFAULT_NAME);
bootstrapContextOperation.get(NAME).set(DEFAULT_NAME);
list.add(bootstrapContextOperation);
requiredElement.remove(Element.DEFAULT_WORKMANAGER);
break;
}
case CACHED_CONNECTION_MANAGER: {
list.add(parseCcm(reader, address));
ccmAdded = true;
break;
}
case WORKMANAGER: {
parseWorkManager(reader, address, list, subsystem, false);
// AS7-4434 Multiple work managers are allowed
visited.remove(Element.WORKMANAGER);
break;
}
case DISTRIBUTED_WORKMANAGER: {
parseDistributedWorkManager(reader, address, list, subsystem, false);
// AS7-4434 Multiple work managers are allowed
visited.remove(Element.DISTRIBUTED_WORKMANAGER);
break;
}
case BOOTSTRAP_CONTEXTS: {
parseBootstrapContexts(reader, address, list);
break;
}
case TRACER: {
if (Namespace.forUri(reader.getNamespaceURI()).equals(Namespace.JCA_3_0) ||
Namespace.forUri(reader.getNamespaceURI()).equals(Namespace.JCA_4_0) ||
Namespace.forUri(reader.getNamespaceURI()).equals(Namespace.JCA_5_0)) {
list.add(parseTracer(reader, address));
} else {
throw unexpectedElement(reader);
}
break;
}
default:
throw unexpectedElement(reader);
}
break;
}
default:
throw unexpectedElement(reader);
}
}
if (!requiredElement.isEmpty()) {
throw missingRequiredElement(reader, requiredElement);
}
if (!ccmAdded) {
final ModelNode ccmOperation = new ModelNode();
ccmOperation.get(OP).set(ADD);
final ModelNode ccmAddress = address.clone();
ccmAddress.add(CACHED_CONNECTION_MANAGER, CACHED_CONNECTION_MANAGER);
ccmAddress.protect();
ccmOperation.get(OP_ADDR).set(ccmAddress);
assert ccmOperation.keys().size() == 2; // prevent people adding params without considering special
// WFLY-2640/WFLY-8141 logic. This assert can be changed once
// you've made the necessary adjustments
list.add(ccmOperation);
}
}
private ModelNode parseArchiveValidation(final XMLExtendedStreamReader reader, final ModelNode parentOperation)
throws XMLStreamException {
final ModelNode archiveValidationOperation = new ModelNode();
archiveValidationOperation.get(OP).set(ADD);
final ModelNode archiveValidationAddress = parentOperation.clone();
archiveValidationAddress.add(ARCHIVE_VALIDATION, ARCHIVE_VALIDATION);
archiveValidationAddress.protect();
archiveValidationOperation.get(OP_ADDR).set(archiveValidationAddress);
final int cnt = reader.getAttributeCount();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
String value = rawAttributeText(reader, ArchiveValidationParameters.ARCHIVE_VALIDATION_ENABLED.getAttribute().getXmlName());
ArchiveValidationParameters.ARCHIVE_VALIDATION_ENABLED.getAttribute().parseAndSetParameter(value, archiveValidationOperation, reader);
break;
}
case FAIL_ON_ERROR: {
String value = rawAttributeText(reader, ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_ERROR.getAttribute().getXmlName());
ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_ERROR.getAttribute().parseAndSetParameter(value, archiveValidationOperation, reader);
break;
}
case FAIL_ON_WARN: {
String value = rawAttributeText(reader, ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_WARN.getAttribute().getXmlName());
ArchiveValidationParameters.ARCHIVE_VALIDATION_FAIL_ON_WARN.getAttribute().parseAndSetParameter(value, archiveValidationOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
// Handle elements
requireNoContent(reader);
return archiveValidationOperation;
}
private void parseWorkManager(final XMLExtendedStreamReader reader, final ModelNode parentAddress,
final List<ModelNode> list, final ModelNode node, boolean defaultWm) throws XMLStreamException {
final ModelNode workManagerOperation = new ModelNode();
workManagerOperation.get(OP).set(ADD);
final int cnt = reader.getAttributeCount();
String name = null;
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case NAME: {
name = rawAttributeText(reader, JcaWorkManagerDefinition.WmParameters.NAME.getAttribute().getXmlName());
JcaWorkManagerDefinition.WmParameters.NAME.getAttribute().parseAndSetParameter(name, workManagerOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
if (name == null) {
if (defaultWm) {
name = DEFAULT_NAME;
workManagerOperation.get(NAME).set(name);
} else {
throw new XMLStreamException("name attribute is mandatory for workmanager element");
}
}
final ModelNode workManagerAddress = parentAddress.clone();
workManagerAddress.add(WORKMANAGER, name);
workManagerAddress.protect();
workManagerOperation.get(OP_ADDR).set(workManagerAddress);
list.add(workManagerOperation);
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
Namespace readerNS = Namespace.forUri(reader.getNamespaceURI());
switch (element) {
case LONG_RUNNING_THREADS: {
org.jboss.as.threads.Namespace ns = org.jboss.as.threads.Namespace.THREADS_1_1;
ThreadsParser.getInstance().parseBlockingBoundedQueueThreadPool(reader, readerNS.getUriString(),
ns, workManagerAddress, list, WORKMANAGER_LONG_RUNNING, name);
break;
}
case SHORT_RUNNING_THREADS: {
org.jboss.as.threads.Namespace ns = org.jboss.as.threads.Namespace.THREADS_1_1;
ThreadsParser.getInstance().parseBlockingBoundedQueueThreadPool(reader, readerNS.getUriString(),
ns, workManagerAddress, list, WORKMANAGER_SHORT_RUNNING, name);
break;
}
case ELYTRON_ENABLED: {
switch (readerNS) {
case JCA_5_0: {
String value = rawElementText(reader);
JcaWorkManagerDefinition.WmParameters.ELYTRON_ENABLED.getAttribute().parseAndSetParameter(value, workManagerOperation, reader);
break;
}
default: {
throw unexpectedElement(reader);
}
}
break;
}
default:
throw unexpectedElement(reader);
}
}
}
private void parseDistributedWorkManager(final XMLExtendedStreamReader reader, final ModelNode parentAddress,
final List<ModelNode> list, final ModelNode node, boolean defaultWm) throws XMLStreamException {
final ModelNode distributedWorkManagerOperation = new ModelNode();
distributedWorkManagerOperation.get(OP).set(ADD);
final int cnt = reader.getAttributeCount();
String name = null;
final AttributeDefinition attributeDefinition = JcaDistributedWorkManagerDefinition.DWmParameters.NAME.getAttribute();
final String attributeName = attributeDefinition.getXmlName();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case NAME: {
name = rawAttributeText(reader, attributeName);
((SimpleAttributeDefinition) attributeDefinition).parseAndSetParameter(name, distributedWorkManagerOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
if (name == null) {
throw ParseUtils.missingRequired(reader, attributeName);
}
final ModelNode distributedWorkManagerAddress = parentAddress.clone();
distributedWorkManagerAddress.add(DISTRIBUTED_WORKMANAGER, name);
distributedWorkManagerAddress.protect();
distributedWorkManagerOperation.get(OP_ADDR).set(distributedWorkManagerAddress);
list.add(distributedWorkManagerOperation);
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
Namespace readerNS = Namespace.forUri(reader.getNamespaceURI());
switch (element) {
case LONG_RUNNING_THREADS: {
org.jboss.as.threads.Namespace ns = org.jboss.as.threads.Namespace.THREADS_1_1;
ThreadsParser.getInstance().parseBlockingBoundedQueueThreadPool(reader, readerNS.getUriString(),
ns, distributedWorkManagerAddress, list, WORKMANAGER_LONG_RUNNING, name);
break;
}
case SHORT_RUNNING_THREADS: {
org.jboss.as.threads.Namespace ns = org.jboss.as.threads.Namespace.THREADS_1_1;
ThreadsParser.getInstance().parseBlockingBoundedQueueThreadPool(reader, readerNS.getUriString(),
ns, distributedWorkManagerAddress, list, WORKMANAGER_SHORT_RUNNING, name);
break;
}
case POLICY: {
switch (readerNS) {
case JCA_2_0:
case JCA_3_0:
case JCA_4_0:
case JCA_5_0: {
parsePolicy(reader, distributedWorkManagerOperation);
break;
}
default: {
throw unexpectedElement(reader);
}
}
break;
}
case SELECTOR: {
switch (readerNS) {
case JCA_2_0:
case JCA_3_0:
case JCA_4_0:
case JCA_5_0: {
parseSelector(reader, distributedWorkManagerOperation);
break;
}
default: {
throw unexpectedElement(reader);
}
}
break;
}
case ELYTRON_ENABLED: {
switch (readerNS) {
case JCA_5_0: {
String value = rawElementText(reader);
((SimpleAttributeDefinition) JcaDistributedWorkManagerDefinition.DWmParameters.ELYTRON_ENABLED.getAttribute()).parseAndSetParameter(value, distributedWorkManagerOperation, reader);
break;
}
default: {
throw unexpectedElement(reader);
}
}
break;
}
default:
throw unexpectedElement(reader);
}
}
}
private void parsePolicy(final XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException {
final int cnt = reader.getAttributeCount();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case NAME: {
String policy = rawAttributeText(reader, attribute.getLocalName());
((SimpleAttributeDefinition) JcaDistributedWorkManagerDefinition.DWmParameters.POLICY.getAttribute()).parseAndSetParameter(policy, operation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case OPTION: {
requireSingleAttribute(reader, "name");
final String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final String trimmed = value == null ? null : value.trim();
((PropertiesAttributeDefinition) JcaDistributedWorkManagerDefinition.DWmParameters.POLICY_OPTIONS.getAttribute()).parseAndAddParameterElement(name, trimmed, operation, reader);
break;
}
}
// Handle elements
}
}
private void parseSelector(final XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException {
final int cnt = reader.getAttributeCount();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case NAME: {
String selector = rawAttributeText(reader, attribute.getLocalName());
((SimpleAttributeDefinition) JcaDistributedWorkManagerDefinition.DWmParameters.SELECTOR.getAttribute()).parseAndSetParameter(selector, operation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
// Handle elements
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case OPTION: {
requireSingleAttribute(reader, "name");
final String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final String trimmed = value == null ? null : value.trim();
((PropertiesAttributeDefinition) JcaDistributedWorkManagerDefinition.DWmParameters.SELECTOR_OPTIONS.getAttribute()).parseAndAddParameterElement(name, trimmed, operation, reader);
break;
}
}
// Handle elements
}
}
private ModelNode parseBeanValidation(final XMLExtendedStreamReader reader, final ModelNode parentOperation) throws XMLStreamException {
final ModelNode beanValidationOperation = new ModelNode();
beanValidationOperation.get(OP).set(ADD);
final ModelNode beanValidationAddress = parentOperation.clone();
beanValidationAddress.add(BEAN_VALIDATION, BEAN_VALIDATION);
beanValidationAddress.protect();
beanValidationOperation.get(OP_ADDR).set(beanValidationAddress);
final int cnt = reader.getAttributeCount();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
String value = rawAttributeText(reader, JcaBeanValidationDefinition.BeanValidationParameters.BEAN_VALIDATION_ENABLED.getAttribute().getXmlName());
JcaBeanValidationDefinition.BeanValidationParameters.BEAN_VALIDATION_ENABLED.getAttribute().parseAndSetParameter(value, beanValidationOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
// Handle elements
requireNoContent(reader);
return beanValidationOperation;
}
private ModelNode parseTracer(final XMLExtendedStreamReader reader, final ModelNode parentOperation) throws XMLStreamException {
final ModelNode tracerOperation = new ModelNode();
tracerOperation.get(OP).set(ADD);
final ModelNode tracerAddress = parentOperation.clone();
tracerAddress.add(TRACER, TRACER);
tracerAddress.protect();
tracerOperation.get(OP_ADDR).set(tracerAddress);
final int cnt = reader.getAttributeCount();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
String value = rawAttributeText(reader, TracerDefinition.TracerParameters.TRACER_ENABLED.getAttribute().getXmlName());
TracerDefinition.TracerParameters.TRACER_ENABLED.getAttribute().parseAndSetParameter(value, tracerOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
// Handle elements
requireNoContent(reader);
return tracerOperation;
}
private ModelNode parseCcm(final XMLExtendedStreamReader reader, final ModelNode parentOperation) throws XMLStreamException {
final ModelNode ccmOperation = new ModelNode();
ccmOperation.get(OP).set(ADD);
final ModelNode ccmAddress = parentOperation.clone();
ccmAddress.add(CACHED_CONNECTION_MANAGER, CACHED_CONNECTION_MANAGER);
ccmAddress.protect();
ccmOperation.get(OP_ADDR).set(ccmAddress);
final int cnt = reader.getAttributeCount();
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case DEBUG: {
String value = rawAttributeText(reader, JcaCachedConnectionManagerDefinition.CcmParameters.DEBUG.getAttribute().getXmlName());
JcaCachedConnectionManagerDefinition.CcmParameters.DEBUG.getAttribute().parseAndSetParameter(value, ccmOperation, reader);
break;
}
case ERROR: {
String value = rawAttributeText(reader, JcaCachedConnectionManagerDefinition.CcmParameters.ERROR.getAttribute().getXmlName());
JcaCachedConnectionManagerDefinition.CcmParameters.ERROR.getAttribute().parseAndSetParameter(value, ccmOperation, reader);
break;
}
case IGNORE_UNKNOWN_CONNECHIONS: {
String value = rawAttributeText(reader, JcaCachedConnectionManagerDefinition.CcmParameters.IGNORE_UNKNOWN_CONNECTIONS.getAttribute().getXmlName());
JcaCachedConnectionManagerDefinition.CcmParameters.IGNORE_UNKNOWN_CONNECTIONS.getAttribute().parseAndSetParameter(value, ccmOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
ccmOperation.get(JcaCachedConnectionManagerDefinition.CcmParameters.INSTALL.getAttribute().getName()).set(true);
// Handle elements
requireNoContent(reader);
return ccmOperation;
}
private void parseBootstrapContexts(final XMLExtendedStreamReader reader, final ModelNode parentAddress, final List<ModelNode> list) throws XMLStreamException {
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case BOOTSTRAP_CONTEXT: {
ModelNode bootstrapContextOperation = new ModelNode();
bootstrapContextOperation.get(OP).set(ADD);
final int cnt = reader.getAttributeCount();
String name = null;
String wmName = null;
for (int i = 0; i < cnt; i++) {
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case NAME: {
name = rawAttributeText(reader, JcaBootstrapContextDefinition.BootstrapCtxParameters.NAME.getAttribute().getXmlName());
JcaBootstrapContextDefinition.BootstrapCtxParameters.NAME.getAttribute().parseAndSetParameter(name, bootstrapContextOperation, reader);
break;
}
case WORKMANAGER: {
wmName = rawAttributeText(reader, JcaBootstrapContextDefinition.BootstrapCtxParameters.WORKMANAGER.getAttribute().getXmlName());
JcaBootstrapContextDefinition.BootstrapCtxParameters.WORKMANAGER.getAttribute().parseAndSetParameter(wmName, bootstrapContextOperation, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
if (name == null) {
if (DEFAULT_NAME.equals(wmName)) {
name = DEFAULT_NAME;
} else {
throw new XMLStreamException("name attribute is mandatory for workmanager element");
}
}
final ModelNode bootstrapContextAddress = parentAddress.clone();
bootstrapContextAddress.add(BOOTSTRAP_CONTEXT, name);
bootstrapContextAddress.protect();
bootstrapContextOperation.get(OP_ADDR).set(bootstrapContextAddress);
// Handle elements
requireNoContent(reader);
list.add(bootstrapContextOperation);
break;
}
default: {
throw unexpectedElement(reader);
}
}
}
}
public String rawAttributeText(XMLStreamReader reader, String attributeName) {
String attributeString = reader.getAttributeValue("", attributeName) == null ? null : reader.getAttributeValue(
"", attributeName)
.trim();
return attributeString;
}
public String rawElementText(XMLStreamReader reader) throws XMLStreamException {
String elementText = reader.getElementText();
elementText = elementText == null || elementText.trim().length() == 0 ? null : elementText.trim();
return elementText;
}
private void writeProperty(XMLExtendedStreamWriter writer, String name, String value, String localName)
throws XMLStreamException {
writer.writeStartElement(localName);
writer.writeAttribute("name", name);
writer.writeCharacters(value);
writer.writeEndElement();
}
}
}