/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, 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.datasources;
import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import static org.jboss.as.connector.subsystems.common.pool.Constants.BACKGROUNDVALIDATION;
import static org.jboss.as.connector.subsystems.common.pool.Constants.BACKGROUNDVALIDATIONMILLIS;
import static org.jboss.as.connector.subsystems.common.pool.Constants.BLOCKING_TIMEOUT_WAIT_MILLIS;
import static org.jboss.as.connector.subsystems.common.pool.Constants.CAPACITY_DECREMENTER_CLASS;
import static org.jboss.as.connector.subsystems.common.pool.Constants.CAPACITY_DECREMENTER_PROPERTIES;
import static org.jboss.as.connector.subsystems.common.pool.Constants.CAPACITY_INCREMENTER_CLASS;
import static org.jboss.as.connector.subsystems.common.pool.Constants.CAPACITY_INCREMENTER_PROPERTIES;
import static org.jboss.as.connector.subsystems.common.pool.Constants.IDLETIMEOUTMINUTES;
import static org.jboss.as.connector.subsystems.common.pool.Constants.INITIAL_POOL_SIZE;
import static org.jboss.as.connector.subsystems.common.pool.Constants.MAX_POOL_SIZE;
import static org.jboss.as.connector.subsystems.common.pool.Constants.MIN_POOL_SIZE;
import static org.jboss.as.connector.subsystems.common.pool.Constants.POOL_FAIR;
import static org.jboss.as.connector.subsystems.common.pool.Constants.POOL_FLUSH_STRATEGY;
import static org.jboss.as.connector.subsystems.common.pool.Constants.POOL_PREFILL;
import static org.jboss.as.connector.subsystems.common.pool.Constants.POOL_USE_STRICT_MIN;
import static org.jboss.as.connector.subsystems.common.pool.Constants.USE_FAST_FAIL;
import static org.jboss.as.connector.subsystems.datasources.Constants.ALLOCATION_RETRY;
import static org.jboss.as.connector.subsystems.datasources.Constants.ALLOCATION_RETRY_WAIT_MILLIS;
import static org.jboss.as.connector.subsystems.datasources.Constants.ALLOW_MULTIPLE_USERS;
import static org.jboss.as.connector.subsystems.datasources.Constants.AUTHENTICATION_CONTEXT;
import static org.jboss.as.connector.subsystems.datasources.Constants.CHECK_VALID_CONNECTION_SQL;
import static org.jboss.as.connector.subsystems.datasources.Constants.CONNECTABLE;
import static org.jboss.as.connector.subsystems.datasources.Constants.CONNECTION_LISTENER_CLASS;
import static org.jboss.as.connector.subsystems.datasources.Constants.CONNECTION_LISTENER_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.CONNECTION_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.CONNECTION_PROPERTY_VALUE;
import static org.jboss.as.connector.subsystems.datasources.Constants.CONNECTION_URL;
import static org.jboss.as.connector.subsystems.datasources.Constants.CREDENTIAL_REFERENCE;
import static org.jboss.as.connector.subsystems.datasources.Constants.DATASOURCE_CLASS;
import static org.jboss.as.connector.subsystems.datasources.Constants.DATASOURCE_DRIVER;
import static org.jboss.as.connector.subsystems.datasources.Constants.DATA_SOURCE;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_CLASS;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_CLASS_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_DATASOURCE_CLASS_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_MAJOR_VERSION;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_MINOR_VERSION;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_MODULE_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.DRIVER_XA_DATASOURCE_CLASS_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.ELYTRON_ENABLED;
import static org.jboss.as.connector.subsystems.datasources.Constants.ENABLED;
import static org.jboss.as.connector.subsystems.datasources.Constants.ENLISTMENT_TRACE;
import static org.jboss.as.connector.subsystems.datasources.Constants.EXCEPTION_SORTER_CLASSNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.EXCEPTION_SORTER_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.INTERLEAVING;
import static org.jboss.as.connector.subsystems.datasources.Constants.JDBC_DRIVER_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.JNDI_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.JTA;
import static org.jboss.as.connector.subsystems.datasources.Constants.MCP;
import static org.jboss.as.connector.subsystems.datasources.Constants.MODULE_SLOT;
import static org.jboss.as.connector.subsystems.datasources.Constants.NEW_CONNECTION_SQL;
import static org.jboss.as.connector.subsystems.datasources.Constants.NO_RECOVERY;
import static org.jboss.as.connector.subsystems.datasources.Constants.NO_TX_SEPARATE_POOL;
import static org.jboss.as.connector.subsystems.datasources.Constants.PAD_XID;
import static org.jboss.as.connector.subsystems.datasources.Constants.PASSWORD;
import static org.jboss.as.connector.subsystems.datasources.Constants.POOLNAME_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.PREPARED_STATEMENTS_CACHE_SIZE;
import static org.jboss.as.connector.subsystems.datasources.Constants.QUERY_TIMEOUT;
import static org.jboss.as.connector.subsystems.datasources.Constants.REAUTHPLUGIN_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.REAUTH_PLUGIN_CLASSNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVERY_AUTHENTICATION_CONTEXT;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVERY_CREDENTIAL_REFERENCE;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVERY_ELYTRON_ENABLED;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVERY_PASSWORD;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVERY_SECURITY_DOMAIN;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVERY_USERNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVER_PLUGIN_CLASSNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.RECOVER_PLUGIN_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.SAME_RM_OVERRIDE;
import static org.jboss.as.connector.subsystems.datasources.Constants.SECURITY_DOMAIN;
import static org.jboss.as.connector.subsystems.datasources.Constants.SET_TX_QUERY_TIMEOUT;
import static org.jboss.as.connector.subsystems.datasources.Constants.SHARE_PREPARED_STATEMENTS;
import static org.jboss.as.connector.subsystems.datasources.Constants.SPY;
import static org.jboss.as.connector.subsystems.datasources.Constants.STALE_CONNECTION_CHECKER_CLASSNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.STALE_CONNECTION_CHECKER_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.TRACKING;
import static org.jboss.as.connector.subsystems.datasources.Constants.TRACK_STATEMENTS;
import static org.jboss.as.connector.subsystems.datasources.Constants.TRANSACTION_ISOLATION;
import static org.jboss.as.connector.subsystems.datasources.Constants.URL_DELIMITER;
import static org.jboss.as.connector.subsystems.datasources.Constants.URL_PROPERTY;
import static org.jboss.as.connector.subsystems.datasources.Constants.URL_SELECTOR_STRATEGY_CLASS_NAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.USERNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.USE_CCM;
import static org.jboss.as.connector.subsystems.datasources.Constants.USE_JAVA_CONTEXT;
import static org.jboss.as.connector.subsystems.datasources.Constants.USE_TRY_LOCK;
import static org.jboss.as.connector.subsystems.datasources.Constants.VALIDATE_ON_MATCH;
import static org.jboss.as.connector.subsystems.datasources.Constants.VALID_CONNECTION_CHECKER_CLASSNAME;
import static org.jboss.as.connector.subsystems.datasources.Constants.VALID_CONNECTION_CHECKER_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.WRAP_XA_RESOURCE;
import static org.jboss.as.connector.subsystems.datasources.Constants.XADATASOURCE_PROPERTIES;
import static org.jboss.as.connector.subsystems.datasources.Constants.XADATASOURCE_PROPERTY_VALUE;
import static org.jboss.as.connector.subsystems.datasources.Constants.XA_DATASOURCE;
import static org.jboss.as.connector.subsystems.datasources.Constants.XA_DATASOURCE_CLASS;
import static org.jboss.as.connector.subsystems.datasources.Constants.XA_RESOURCE_TIMEOUT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ENABLE;
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.PERSISTENT;
import static org.jboss.as.controller.parsing.ParseUtils.isNoNamespaceAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedAttribute;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.stream.XMLStreamException;
import org.jboss.as.connector.metadata.api.common.Credential;
import org.jboss.as.connector.metadata.api.ds.DsSecurity;
import org.jboss.as.connector.util.AbstractParser;
import org.jboss.as.connector.util.ParserException;
import org.jboss.as.controller.parsing.ParseUtils;
import org.jboss.dmr.ModelNode;
import org.jboss.jca.common.CommonBundle;
import org.jboss.jca.common.api.metadata.Defaults;
import org.jboss.jca.common.api.metadata.common.Capacity;
import org.jboss.jca.common.api.metadata.common.Recovery;
import org.jboss.jca.common.api.metadata.ds.DataSource;
import org.jboss.jca.common.api.metadata.ds.DataSources;
import org.jboss.jca.common.api.metadata.ds.Driver;
import org.jboss.jca.common.api.metadata.ds.DsPool;
import org.jboss.jca.common.api.metadata.ds.DsXaPool;
import org.jboss.jca.common.api.metadata.ds.Statement;
import org.jboss.jca.common.api.metadata.ds.TimeOut;
import org.jboss.jca.common.api.metadata.ds.Validation;
import org.jboss.jca.common.api.metadata.ds.XaDataSource;
import org.jboss.jca.common.api.validator.ValidateException;
import org.jboss.logging.Messages;
import org.jboss.staxmapper.XMLExtendedStreamReader;
/**
* A DsParser.
*
* @author <a href="stefano.maestri@jboss.com">Stefano Maestri</a>
*/
public class DsParser extends AbstractParser {
/**
* The bundle
*/
private static CommonBundle bundle = Messages.getBundle(CommonBundle.class);
public void parse(final XMLExtendedStreamReader reader, final List<ModelNode> list, ModelNode parentAddress) throws Exception {
//iterate over tags
int iterate;
try {
iterate = reader.nextTag();
} catch (XMLStreamException e) {
//founding a non tag..go on. Normally non-tag found at beginning are comments or DTD declaration
iterate = reader.nextTag();
}
switch (iterate) {
case END_ELEMENT: {
// should mean we're done, so ignore it.
break;
}
case START_ELEMENT: {
switch (Tag.forName(reader.getLocalName())) {
case DATASOURCES: {
parseDataSources(reader, list, parentAddress);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
default:
throw new IllegalStateException();
}
}
private void parseDataSources(final XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (Tag.forName(reader.getLocalName()) == Tag.DATASOURCES)
// should mean we're done, so ignore it.
return;
}
case START_ELEMENT: {
switch (DataSources.Tag.forName(reader.getLocalName())) {
case DATASOURCE: {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case DATASOURCES_1_1:
case DATASOURCES_2_0:
parseDataSource_1_0(reader, list, parentAddress);
break;
case DATASOURCES_1_2:
parseDataSource_1_2(reader, list, parentAddress);
break;
case DATASOURCES_3_0:
parseDataSource_3_0(reader, list, parentAddress);
break;
default:
parseDataSource_4_0(reader, list, parentAddress);
break;
}
break;
}
case XA_DATASOURCE: {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case DATASOURCES_1_1:
case DATASOURCES_2_0:
parseXADataSource_1_0(reader, list, parentAddress);
break;
case DATASOURCES_1_2:
parseXADataSource_1_2(reader, list, parentAddress);
break;
case DATASOURCES_3_0:
parseXADataSource_3_0(reader, list, parentAddress);
break;
default:
parseXADataSource_4_0(reader, list, parentAddress);
break;
}
break;
}
case DRIVERS: {
break;
}
case DRIVER: {
parseDriver(reader, list, parentAddress);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDataSource_1_2(final XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
boolean enabled = Defaults.ENABLED.booleanValue();
// Persist the enabled flag because xml default is != from DMR default
boolean persistEnabled = true;
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final DataSource.Attribute attribute = DataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
enabled = Boolean.parseBoolean(value);
//ENABLED.parseAndSetParameter(value, operation, reader);
persistEnabled = true;
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
case JTA: {
final String value = rawAttributeText(reader, JTA.getXmlName());
if (value != null) {
JTA.parseAndSetParameter(value, operation, reader);
}
break;
}
case CONNECTABLE: {
final String value = rawAttributeText(reader, CONNECTABLE.getXmlName());
if (value != null) {
CONNECTABLE.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
if (Constants.STATISTICS_ENABLED.getName().equals(reader.getAttributeLocalName(i))) {
final String value = rawAttributeText(reader, Constants.STATISTICS_ENABLED.getXmlName());
if (value != null) {
Constants.STATISTICS_ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(DATA_SOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> configPropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.DATASOURCE) {
list.add(operation);
list.addAll(configPropertiesOperations);
if (enabled) {
final ModelNode enableOperation = new ModelNode();
enableOperation.get(OP).set(ENABLE);
enableOperation.get(OP_ADDR).set(dsAddress);
enableOperation.get(PERSISTENT).set(persistEnabled);
list.add(enableOperation);
}
return;
} else {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (DataSource.Tag.forName(reader.getLocalName())) {
case CONNECTION_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(CONNECTION_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
CONNECTION_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
configPropertiesOperations.add(configOperation);
break;
}
case CONNECTION_URL: {
String value = rawElementText(reader);
CONNECTION_URL.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER_CLASS: {
String value = rawElementText(reader);
DRIVER_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DATASOURCE_CLASS: {
String value = rawElementText(reader);
DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case POOL: {
parsePool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
parseDsSecurity(reader, operation);
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseXADataSource_1_2(XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
boolean enabled = Defaults.ENABLED.booleanValue();
// Persist the enabled flag because xml default is != from DMR default
boolean persistEnabled = true;
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final XaDataSource.Attribute attribute = XaDataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
enabled = Boolean.parseBoolean(value);
//ENABLED.parseAndSetParameter(value, operation, reader);
persistEnabled = true;
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
if (Constants.STATISTICS_ENABLED.getName().equals(reader.getAttributeLocalName(i))) {
final String value = rawAttributeText(reader, Constants.STATISTICS_ENABLED.getXmlName());
if (value != null) {
Constants.STATISTICS_ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(XA_DATASOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> xadatasourcePropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.XA_DATASOURCE) {
list.add(operation);
list.addAll(xadatasourcePropertiesOperations);
if (enabled) {
final ModelNode enableOperation = new ModelNode();
enableOperation.get(OP).set(ENABLE);
enableOperation.get(OP_ADDR).set(dsAddress);
enableOperation.get(PERSISTENT).set(persistEnabled);
list.add(enableOperation);
}
return;
} else {
if (XaDataSource.Tag.forName(reader.getLocalName()) == XaDataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (XaDataSource.Tag.forName(reader.getLocalName())) {
case XA_DATASOURCE_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(XADATASOURCE_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
XADATASOURCE_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
xadatasourcePropertiesOperations.add(configOperation);
break;
}
case XA_DATASOURCE_CLASS: {
String value = rawElementText(reader);
XA_DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case XA_POOL: {
parseXaPool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
parseDsSecurity(reader, operation);
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
case RECOVERY: {
parseRecovery(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDriver(final XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
final ModelNode driverAddress = parentAddress.clone();
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
String driverName = null;
for (org.jboss.jca.common.api.metadata.ds.Driver.Attribute attribute : Driver.Attribute.values()) {
switch (attribute) {
case NAME: {
driverName = rawAttributeText(reader, DRIVER_NAME.getXmlName());
DRIVER_NAME.parseAndSetParameter(driverName, operation, reader);
break;
}
case MAJOR_VERSION: {
String value = rawAttributeText(reader, DRIVER_MAJOR_VERSION.getXmlName());
DRIVER_MAJOR_VERSION.parseAndSetParameter(value, operation, reader);
break;
}
case MINOR_VERSION: {
String value = rawAttributeText(reader, DRIVER_MINOR_VERSION.getXmlName());
DRIVER_MINOR_VERSION.parseAndSetParameter(value, operation, reader);
break;
}
case MODULE: {
String moduleName = rawAttributeText(reader, DRIVER_MODULE_NAME.getXmlName());
String slot = null;
if (moduleName.contains(":")) {
slot = moduleName.substring(moduleName.indexOf(":") + 1);
moduleName = moduleName.substring(0, moduleName.indexOf(":"));
}
DRIVER_MODULE_NAME.parseAndSetParameter(moduleName, operation, reader);
if (slot != null) {
MODULE_SLOT.parseAndSetParameter(slot, operation, reader);
}
break;
}
default:
break;
}
}
driverAddress.add(JDBC_DRIVER_NAME, driverName);
driverAddress.protect();
operation.get(OP_ADDR).set(driverAddress);
boolean driverClassMatched = false;
boolean xaDatasourceClassMatched = false;
boolean datasourceClassMatched = false;
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.DRIVER) {
list.add(operation);
return;
} else {
if (Driver.Tag.forName(reader.getLocalName()) == Driver.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (Driver.Tag.forName(reader.getLocalName())) {
case DATASOURCE_CLASS: {
if (datasourceClassMatched) {
throw new ParserException(bundle.unexpectedElement(DRIVER_DATASOURCE_CLASS_NAME.getXmlName()));
}
String value = rawElementText(reader);
DRIVER_DATASOURCE_CLASS_NAME.parseAndSetParameter(value, operation, reader);
datasourceClassMatched = true;
break;
}
case XA_DATASOURCE_CLASS: {
if (xaDatasourceClassMatched) {
throw new ParserException(bundle.unexpectedElement(DRIVER_XA_DATASOURCE_CLASS_NAME.getXmlName()));
}
String value = rawElementText(reader);
DRIVER_XA_DATASOURCE_CLASS_NAME.parseAndSetParameter(value, operation, reader);
xaDatasourceClassMatched = true;
break;
}
case DRIVER_CLASS: {
if (driverClassMatched) {
throw new ParserException(bundle.unexpectedElement(DRIVER_CLASS_NAME.getXmlName()));
}
String value = rawElementText(reader);
DRIVER_CLASS_NAME.parseAndSetParameter(value, operation, reader);
driverClassMatched = true;
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseXADataSource_1_0(XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final XaDataSource.Attribute attribute = XaDataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(XA_DATASOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> xadatasourcePropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.XA_DATASOURCE) {
list.add(operation);
list.addAll(xadatasourcePropertiesOperations);
return;
} else {
if (XaDataSource.Tag.forName(reader.getLocalName()) == XaDataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (XaDataSource.Tag.forName(reader.getLocalName())) {
case XA_DATASOURCE_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(XADATASOURCE_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
XADATASOURCE_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
xadatasourcePropertiesOperations.add(configOperation);
break;
}
case XA_DATASOURCE_CLASS: {
String value = rawElementText(reader);
XA_DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case XA_POOL: {
parseXaPool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_PROPERTY: {
String value = rawElementText(reader);
URL_PROPERTY.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
parseDsSecurity(reader, operation);
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
case RECOVERY: {
parseRecovery(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseXADataSource_3_0(XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final XaDataSource.Attribute attribute = XaDataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
case CONNECTABLE: {
final String value = rawAttributeText(reader, CONNECTABLE.getXmlName());
if (value != null) {
CONNECTABLE.parseAndSetParameter(value, operation, reader);
}
break;
}
case TRACKING: {
final String value = rawAttributeText(reader, TRACKING.getXmlName());
if (value != null) {
TRACKING.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
if (Constants.STATISTICS_ENABLED.getName().equals(reader.getAttributeLocalName(i))) {
final String value = rawAttributeText(reader, Constants.STATISTICS_ENABLED.getXmlName());
if (value != null) {
Constants.STATISTICS_ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(XA_DATASOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> xadatasourcePropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.XA_DATASOURCE) {
list.add(operation);
list.addAll(xadatasourcePropertiesOperations);
return;
} else {
if (XaDataSource.Tag.forName(reader.getLocalName()) == XaDataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (XaDataSource.Tag.forName(reader.getLocalName())) {
case XA_DATASOURCE_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(XADATASOURCE_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
XADATASOURCE_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
xadatasourcePropertiesOperations.add(configOperation);
break;
}
case XA_DATASOURCE_CLASS: {
String value = rawElementText(reader);
XA_DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case XA_POOL: {
parseXaPool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_PROPERTY: {
String value = rawElementText(reader);
URL_PROPERTY.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
parseDsSecurity(reader, operation);
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
case RECOVERY: {
parseRecovery(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseXADataSource_4_0(XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final XaDataSource.Attribute attribute = XaDataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
case CONNECTABLE: {
final String value = rawAttributeText(reader, CONNECTABLE.getXmlName());
if (value != null) {
CONNECTABLE.parseAndSetParameter(value, operation, reader);
}
break;
}
case MCP: {
final String value = rawAttributeText(reader, MCP.getXmlName());
if (value != null) {
MCP.parseAndSetParameter(value, operation, reader);
}
break;
}
case ENLISTMENT_TRACE: {
final String value = rawAttributeText(reader, ENLISTMENT_TRACE.getXmlName());
ENLISTMENT_TRACE.parseAndSetParameter(value, operation, reader);
break;
}
case TRACKING: {
final String value = rawAttributeText(reader, TRACKING.getXmlName());
if (value != null) {
TRACKING.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
if (Constants.STATISTICS_ENABLED.getName().equals(reader.getAttributeLocalName(i))) {
final String value = rawAttributeText(reader, Constants.STATISTICS_ENABLED.getXmlName());
if (value != null) {
Constants.STATISTICS_ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(XA_DATASOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> xadatasourcePropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.XA_DATASOURCE) {
list.add(operation);
list.addAll(xadatasourcePropertiesOperations);
return;
} else {
if (XaDataSource.Tag.forName(reader.getLocalName()) == XaDataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (XaDataSource.Tag.forName(reader.getLocalName())) {
case XA_DATASOURCE_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(XADATASOURCE_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
XADATASOURCE_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
xadatasourcePropertiesOperations.add(configOperation);
break;
}
case XA_DATASOURCE_CLASS: {
String value = rawElementText(reader);
XA_DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case XA_POOL: {
parseXaPool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_PROPERTY: {
String value = rawElementText(reader);
URL_PROPERTY.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
switch (Namespace.forUri(reader.getNamespaceURI())) {
// This method is only called for version 4 and later.
case DATASOURCES_4_0:
parseDsSecurity(reader, operation);
break;
default:
parseDsSecurity_5_0(reader, operation);
break;
}
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
case RECOVERY: {
parseRecovery(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDsSecurity(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
boolean securityDomainMatched = false;
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.SECURITY) {
//it's fine, do nothing
return;
} else {
if (DsSecurity.Tag.forName(reader.getLocalName()) == DsSecurity.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
final String localName = reader.getLocalName();
DsSecurity.Tag tag = DsSecurity.Tag.forName(localName);
if (localName == null) break;
if (localName.equals(DsSecurity.Tag.PASSWORD.getLocalName())) {
String value = rawElementText(reader);
PASSWORD.parseAndSetParameter(value, operation, reader);
break;
} else if (localName.equals(DsSecurity.Tag.USER_NAME.getLocalName())) {
String value = rawElementText(reader);
USERNAME.parseAndSetParameter(value, operation, reader);
break;
} else if (localName.equals(DsSecurity.Tag.SECURITY_DOMAIN.getLocalName())) {
if (securityDomainMatched) {
throw new ParserException(bundle.unexpectedElement(SECURITY_DOMAIN.getXmlName()));
}
String value = rawElementText(reader);
SECURITY_DOMAIN.parseAndSetParameter(value, operation, reader);
securityDomainMatched = true;
break;
} else if (localName.equals(DsSecurity.Tag.REAUTH_PLUGIN.getLocalName())) {
parseExtension(reader, tag.getLocalName(), operation, REAUTH_PLUGIN_CLASSNAME, REAUTHPLUGIN_PROPERTIES);
break;
} else if (localName.equals(CREDENTIAL_REFERENCE.getXmlName())) {
CREDENTIAL_REFERENCE.getParser().parseElement(CREDENTIAL_REFERENCE, reader, operation);
break;
} else {
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDsSecurity_5_0(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
boolean securityDomainMatched = false;
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.SECURITY) {
//it's fine, do nothing
return;
} else {
if (DsSecurity.Tag.forName(reader.getLocalName()) == DsSecurity.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
DsSecurity.Tag tag = DsSecurity.Tag.forName(reader.getLocalName());
switch (tag) {
case PASSWORD: {
String value = rawElementText(reader);
PASSWORD.parseAndSetParameter(value, operation, reader);
break;
}
case USER_NAME: {
String value = rawElementText(reader);
USERNAME.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY_DOMAIN: {
if (securityDomainMatched) {
throw new ParserException(bundle.unexpectedElement(SECURITY_DOMAIN.getXmlName()));
}
String value = rawElementText(reader);
SECURITY_DOMAIN.parseAndSetParameter(value, operation, reader);
securityDomainMatched = true;
break;
}
case ELYTRON_ENABLED: {
String value = rawElementText(reader);
value = value == null ? "true" : value;
ELYTRON_ENABLED.parseAndSetParameter(value, operation, reader);
break;
}
case AUTHENTICATION_CONTEXT: {
String value = rawElementText(reader);
AUTHENTICATION_CONTEXT.parseAndSetParameter(value, operation, reader);
break;
}
case REAUTH_PLUGIN: {
parseExtension(reader, tag.getLocalName(), operation, REAUTH_PLUGIN_CLASSNAME, REAUTHPLUGIN_PROPERTIES);
break;
}
case CREDENTIAL_REFERENCE: {
CREDENTIAL_REFERENCE.getParser().parseElement(CREDENTIAL_REFERENCE, reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDataSource_1_0(final XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final DataSource.Attribute attribute = DataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
case JTA: {
final String value = rawAttributeText(reader, JTA.getXmlName());
if (value != null) {
JTA.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(DATA_SOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> configPropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.DATASOURCE) {
list.add(operation);
list.addAll(configPropertiesOperations);
return;
} else {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (DataSource.Tag.forName(reader.getLocalName())) {
case CONNECTION_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(CONNECTION_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
CONNECTION_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
configPropertiesOperations.add(configOperation);
break;
}
case CONNECTION_URL: {
String value = rawElementText(reader);
CONNECTION_URL.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER_CLASS: {
String value = rawElementText(reader);
DRIVER_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DATASOURCE_CLASS: {
String value = rawElementText(reader);
DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case POOL: {
parsePool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
parseDsSecurity(reader, operation);
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDataSource_3_0(final XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final DataSource.Attribute attribute = DataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
case JTA: {
final String value = rawAttributeText(reader, JTA.getXmlName());
if (value != null) {
JTA.parseAndSetParameter(value, operation, reader);
}
break;
}
case CONNECTABLE: {
final String value = rawAttributeText(reader, CONNECTABLE.getXmlName());
if (value != null) {
CONNECTABLE.parseAndSetParameter(value, operation, reader);
}
break;
}
case TRACKING: {
final String value = rawAttributeText(reader, TRACKING.getXmlName());
if (value != null) {
TRACKING.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
if (Constants.STATISTICS_ENABLED.getName().equals(reader.getAttributeLocalName(i))) {
final String value = rawAttributeText(reader, Constants.STATISTICS_ENABLED.getXmlName());
if (value != null) {
Constants.STATISTICS_ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(DATA_SOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> configPropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.DATASOURCE) {
list.add(operation);
list.addAll(configPropertiesOperations);
return;
} else {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (DataSource.Tag.forName(reader.getLocalName())) {
case CONNECTION_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(CONNECTION_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
CONNECTION_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
configPropertiesOperations.add(configOperation);
break;
}
case CONNECTION_URL: {
String value = rawElementText(reader);
CONNECTION_URL.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER_CLASS: {
String value = rawElementText(reader);
DRIVER_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DATASOURCE_CLASS: {
String value = rawElementText(reader);
DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case POOL: {
parsePool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
parseDsSecurity(reader, operation);
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseDataSource_4_0(final XMLExtendedStreamReader reader, final List<ModelNode> list, final ModelNode parentAddress) throws XMLStreamException, ParserException,
ValidateException {
String poolName = null;
final ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
if (!isNoNamespaceAttribute(reader, i)) {
throw unexpectedAttribute(reader, i);
}
final DataSource.Attribute attribute = DataSource.Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ENABLED: {
final String value = rawAttributeText(reader, ENABLED.getXmlName());
if (value != null) {
ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
}
case JNDI_NAME: {
final String jndiName = rawAttributeText(reader, JNDI_NAME.getXmlName());
JNDI_NAME.parseAndSetParameter(jndiName, operation, reader);
break;
}
case POOL_NAME: {
poolName = rawAttributeText(reader, POOLNAME_NAME);
break;
}
case USE_JAVA_CONTEXT: {
final String value = rawAttributeText(reader, USE_JAVA_CONTEXT.getXmlName());
if (value != null) {
USE_JAVA_CONTEXT.parseAndSetParameter(value, operation, reader);
}
break;
}
case SPY: {
final String value = rawAttributeText(reader, SPY.getXmlName());
if (value != null) {
SPY.parseAndSetParameter(value, operation, reader);
}
break;
}
case USE_CCM: {
final String value = rawAttributeText(reader, USE_CCM.getXmlName());
if (value != null) {
USE_CCM.parseAndSetParameter(value, operation, reader);
}
break;
}
case JTA: {
final String value = rawAttributeText(reader, JTA.getXmlName());
if (value != null) {
JTA.parseAndSetParameter(value, operation, reader);
}
break;
}
case CONNECTABLE: {
final String value = rawAttributeText(reader, CONNECTABLE.getXmlName());
if (value != null) {
CONNECTABLE.parseAndSetParameter(value, operation, reader);
}
break;
}
case MCP: {
final String value = rawAttributeText(reader, MCP.getXmlName());
if (value != null) {
MCP.parseAndSetParameter(value, operation, reader);
}
break;
}
case ENLISTMENT_TRACE: {
final String value = rawAttributeText(reader, ENLISTMENT_TRACE.getXmlName());
ENLISTMENT_TRACE.parseAndSetParameter(value, operation, reader);
break;
}
case TRACKING: {
final String value = rawAttributeText(reader, TRACKING.getXmlName());
if (value != null) {
TRACKING.parseAndSetParameter(value, operation, reader);
}
break;
}
default:
if (Constants.STATISTICS_ENABLED.getName().equals(reader.getAttributeLocalName(i))) {
final String value = rawAttributeText(reader, Constants.STATISTICS_ENABLED.getXmlName());
if (value != null) {
Constants.STATISTICS_ENABLED.parseAndSetParameter(value, operation, reader);
}
break;
} else {
throw ParseUtils.unexpectedAttribute(reader, i);
}
}
}
final ModelNode dsAddress = parentAddress.clone();
dsAddress.add(DATA_SOURCE, poolName);
dsAddress.protect();
operation.get(OP_ADDR).set(dsAddress);
List<ModelNode> configPropertiesOperations = new ArrayList<ModelNode>(0);
//elements reading
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSources.Tag.forName(reader.getLocalName()) == DataSources.Tag.DATASOURCE) {
list.add(operation);
list.addAll(configPropertiesOperations);
return;
} else {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (DataSource.Tag.forName(reader.getLocalName())) {
case CONNECTION_PROPERTY: {
String name = rawAttributeText(reader, "name");
String value = rawElementText(reader);
final ModelNode configOperation = new ModelNode();
configOperation.get(OP).set(ADD);
final ModelNode configAddress = dsAddress.clone();
configAddress.add(CONNECTION_PROPERTIES.getName(), name);
configAddress.protect();
configOperation.get(OP_ADDR).set(configAddress);
CONNECTION_PROPERTY_VALUE.parseAndSetParameter(value, configOperation, reader);
configPropertiesOperations.add(configOperation);
break;
}
case CONNECTION_URL: {
String value = rawElementText(reader);
CONNECTION_URL.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER_CLASS: {
String value = rawElementText(reader);
DRIVER_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DATASOURCE_CLASS: {
String value = rawElementText(reader);
DATASOURCE_CLASS.parseAndSetParameter(value, operation, reader);
break;
}
case DRIVER: {
String value = rawElementText(reader);
DATASOURCE_DRIVER.parseAndSetParameter(value, operation, reader);
break;
}
case POOL: {
parsePool(reader, operation);
break;
}
case NEW_CONNECTION_SQL: {
String value = rawElementText(reader);
NEW_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case URL_DELIMITER: {
String value = rawElementText(reader);
URL_DELIMITER.parseAndSetParameter(value, operation, reader);
break;
}
case URL_SELECTOR_STRATEGY_CLASS_NAME: {
String value = rawElementText(reader);
URL_SELECTOR_STRATEGY_CLASS_NAME.parseAndSetParameter(value, operation, reader);
break;
}
case TRANSACTION_ISOLATION: {
String value = rawElementText(reader);
TRANSACTION_ISOLATION.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY: {
switch (Namespace.forUri(reader.getNamespaceURI())) {
// This method is only called for version 4 and later.
case DATASOURCES_4_0:
parseDsSecurity(reader, operation);
break;
default:
parseDsSecurity_5_0(reader, operation);
break;
}
break;
}
case STATEMENT: {
parseStatementSettings(reader, operation);
break;
}
case TIMEOUT: {
parseTimeOutSettings(reader, operation);
break;
}
case VALIDATION: {
parseValidationSetting(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parsePool(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.POOL) {
return;
//it's fine. Do nothing
} else {
if (DsPool.Tag.forName(reader.getLocalName()) == DsPool.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (DsPool.Tag.forName(reader.getLocalName())) {
case MAX_POOL_SIZE: {
String value = rawElementText(reader);
MAX_POOL_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case INITIAL_POOL_SIZE: {
String value = rawElementText(reader);
INITIAL_POOL_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case MIN_POOL_SIZE: {
String value = rawElementText(reader);
MIN_POOL_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case PREFILL: {
String value = rawElementText(reader);
POOL_PREFILL.parseAndSetParameter(value, operation, reader);
break;
}
case FAIR: {
String value = rawElementText(reader);
POOL_FAIR.parseAndSetParameter(value, operation, reader);
break;
}
case USE_STRICT_MIN: {
String value = rawElementText(reader);
POOL_USE_STRICT_MIN.parseAndSetParameter(value, operation, reader);
break;
}
case FLUSH_STRATEGY: {
String value = rawElementText(reader);
POOL_FLUSH_STRATEGY.parseAndSetParameter(value, operation, reader);
break;
}
case ALLOW_MULTIPLE_USERS: {
String value = rawElementText(reader);
ALLOW_MULTIPLE_USERS.parseAndSetParameter(value, operation, reader);
break;
}
case CAPACITY: {
parseCapacity(reader, operation);
break;
}
case CONNECTION_LISTENER: {
parseExtension(reader, reader.getLocalName(), operation, CONNECTION_LISTENER_CLASS, CONNECTION_LISTENER_PROPERTIES);
break;
}
case UNKNOWN: {
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
default: {
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseXaPool(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (XaDataSource.Tag.forName(reader.getLocalName()) == XaDataSource.Tag.XA_POOL) {
return;
//it's fine. Do nothing
} else {
if (DsXaPool.Tag.forName(reader.getLocalName()) == DsXaPool.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (DsXaPool.Tag.forName(reader.getLocalName())) {
case MAX_POOL_SIZE: {
String value = rawElementText(reader);
MAX_POOL_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case INITIAL_POOL_SIZE: {
String value = rawElementText(reader);
INITIAL_POOL_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case MIN_POOL_SIZE: {
String value = rawElementText(reader);
MIN_POOL_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case PREFILL: {
String value = rawElementText(reader);
POOL_PREFILL.parseAndSetParameter(value, operation, reader);
break;
}
case FAIR: {
String value = rawElementText(reader);
POOL_FAIR.parseAndSetParameter(value, operation, reader);
break;
}
case USE_STRICT_MIN: {
String value = rawElementText(reader);
POOL_USE_STRICT_MIN.parseAndSetParameter(value, operation, reader);
break;
}
case FLUSH_STRATEGY: {
String value = rawElementText(reader);
POOL_FLUSH_STRATEGY.parseAndSetParameter(value, operation, reader);
break;
}
case ALLOW_MULTIPLE_USERS: {
String value = rawElementText(reader);
ALLOW_MULTIPLE_USERS.parseAndSetParameter(value, operation, reader);
break;
}
case CONNECTION_LISTENER: {
parseExtension(reader, reader.getLocalName(), operation, CONNECTION_LISTENER_CLASS, CONNECTION_LISTENER_PROPERTIES);
break;
}
case INTERLEAVING: {
//tag presence is sufficient to set it to true
String value = rawElementText(reader);
value = value == null ? "true" : value;
INTERLEAVING.parseAndSetParameter(value, operation, reader);
break;
}
case IS_SAME_RM_OVERRIDE: {
String value = rawElementText(reader);
SAME_RM_OVERRIDE.parseAndSetParameter(value, operation, reader);
break;
}
case NO_TX_SEPARATE_POOLS: {
//tag presence is sufficient to set it to true
String value = rawElementText(reader);
value = value == null ? "true" : value;
NO_TX_SEPARATE_POOL.parseAndSetParameter(value, operation, reader);
break;
}
case PAD_XID: {
String value = rawElementText(reader);
PAD_XID.parseAndSetParameter(value, operation, reader);
break;
}
case WRAP_XA_RESOURCE: {
String value = rawElementText(reader);
WRAP_XA_RESOURCE.parseAndSetParameter(value, operation, reader);
break;
}
case CAPACITY: {
parseCapacity(reader, operation);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseCapacity(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DsPool.Tag.forName(reader.getLocalName()) == DsPool.Tag.CAPACITY ) {
return;
} else {
if (Capacity.Tag.forName(reader.getLocalName()) == Capacity.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (Capacity.Tag.forName(reader.getLocalName())) {
case INCREMENTER: {
parseExtension(reader, reader.getLocalName(), operation, CAPACITY_INCREMENTER_CLASS , CAPACITY_INCREMENTER_PROPERTIES);
break;
}
case DECREMENTER: {
parseExtension(reader, reader.getLocalName(), operation, CAPACITY_DECREMENTER_CLASS , CAPACITY_DECREMENTER_PROPERTIES);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseRecovery(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
for (Recovery.Attribute attribute : Recovery.Attribute.values()) {
switch (attribute) {
case NO_RECOVERY: {
String value = rawAttributeText(reader, NO_RECOVERY.getXmlName());
NO_RECOVERY.parseAndSetParameter(value, operation, reader);
break;
}
default:
break;
}
}
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (XaDataSource.Tag.forName(reader.getLocalName()) == XaDataSource.Tag.RECOVERY) {
return;
} else {
if (Recovery.Tag.forName(reader.getLocalName()) == Recovery.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
Recovery.Tag tag = Recovery.Tag.forName(reader.getLocalName());
switch (tag) {
case RECOVER_CREDENTIAL: {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case DATASOURCES_1_1:
case DATASOURCES_1_2:
case DATASOURCES_2_0:
case DATASOURCES_3_0:
case DATASOURCES_4_0:
parseCredential(reader, operation);
break;
default:
parseCredential_5_0(reader, operation);
break;
}
break;
}
case RECOVER_PLUGIN: {
parseExtension(reader, tag.getLocalName(), operation, RECOVER_PLUGIN_CLASSNAME, RECOVER_PLUGIN_PROPERTIES);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseCredential(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.SECURITY ||
Recovery.Tag.forName(reader.getLocalName()) == Recovery.Tag.RECOVER_CREDENTIAL) {
return;
} else {
if (Credential.Tag.forName(reader.getLocalName()) == Credential.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (Credential.Tag.forName(reader.getLocalName())) {
case PASSWORD: {
String value = rawElementText(reader);
RECOVERY_PASSWORD.parseAndSetParameter(value, operation, reader);
break;
}
case USER_NAME: {
String value = rawElementText(reader);
RECOVERY_USERNAME.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY_DOMAIN: {
String value = rawElementText(reader);
RECOVERY_SECURITY_DOMAIN.parseAndSetParameter(value, operation, reader);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseCredential_5_0(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.SECURITY ||
Recovery.Tag.forName(reader.getLocalName()) == Recovery.Tag.RECOVER_CREDENTIAL) {
return;
} else {
if (Credential.Tag.forName(reader.getLocalName()) == Credential.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (Credential.Tag.forName(reader.getLocalName())) {
case PASSWORD: {
String value = rawElementText(reader);
RECOVERY_PASSWORD.parseAndSetParameter(value, operation, reader);
break;
}
case USER_NAME: {
String value = rawElementText(reader);
RECOVERY_USERNAME.parseAndSetParameter(value, operation, reader);
break;
}
case SECURITY_DOMAIN: {
String value = rawElementText(reader);
RECOVERY_SECURITY_DOMAIN.parseAndSetParameter(value, operation, reader);
break;
}
case ELYTRON_ENABLED: {
String value = rawElementText(reader);
value = value == null ? "true" : value;
RECOVERY_ELYTRON_ENABLED.parseAndSetParameter(value, operation, reader);
break;
}
case AUTHENTICATION_CONTEXT: {
String value = rawElementText(reader);
RECOVERY_AUTHENTICATION_CONTEXT.parseAndSetParameter(value, operation, reader);
break;
}
case CREDENTIAL_REFERENCE:
RECOVERY_CREDENTIAL_REFERENCE.getParser().parseElement(RECOVERY_CREDENTIAL_REFERENCE, reader, operation);
break;
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseValidationSetting(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.VALIDATION) {
return;
} else {
if (Validation.Tag.forName(reader.getLocalName()) == Validation.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
Validation.Tag currTag = Validation.Tag.forName(reader.getLocalName());
switch (currTag) {
case BACKGROUND_VALIDATION: {
String value = rawElementText(reader);
BACKGROUNDVALIDATION.parseAndSetParameter(value, operation, reader);
break;
}
case BACKGROUND_VALIDATION_MILLIS: {
String value = rawElementText(reader);
BACKGROUNDVALIDATIONMILLIS.parseAndSetParameter(value, operation, reader);
break;
}
case CHECK_VALID_CONNECTION_SQL: {
String value = rawElementText(reader);
CHECK_VALID_CONNECTION_SQL.parseAndSetParameter(value, operation, reader);
break;
}
case EXCEPTION_SORTER: {
parseExtension(reader, currTag.getLocalName(), operation, EXCEPTION_SORTER_CLASSNAME, EXCEPTION_SORTER_PROPERTIES);
break;
}
case STALE_CONNECTION_CHECKER: {
parseExtension(reader, currTag.getLocalName(), operation, STALE_CONNECTION_CHECKER_CLASSNAME, STALE_CONNECTION_CHECKER_PROPERTIES);
break;
}
case USE_FAST_FAIL: {
String value = rawElementText(reader);
USE_FAST_FAIL.parseAndSetParameter(value, operation, reader);
break;
}
case VALIDATE_ON_MATCH: {
String value = rawElementText(reader);
VALIDATE_ON_MATCH.parseAndSetParameter(value, operation, reader);
break;
}
case VALID_CONNECTION_CHECKER: {
parseExtension(reader, currTag.getLocalName(), operation, VALID_CONNECTION_CHECKER_CLASSNAME, VALID_CONNECTION_CHECKER_PROPERTIES);
break;
}
default: {
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseTimeOutSettings(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.TIMEOUT) {
return;
} else {
if (TimeOut.Tag.forName(reader.getLocalName()) == TimeOut.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (TimeOut.Tag.forName(reader.getLocalName())) {
case ALLOCATION_RETRY: {
String value = rawElementText(reader);
ALLOCATION_RETRY.parseAndSetParameter(value, operation, reader);
break;
}
case ALLOCATION_RETRY_WAIT_MILLIS: {
String value = rawElementText(reader);
ALLOCATION_RETRY_WAIT_MILLIS.parseAndSetParameter(value, operation, reader);
break;
}
case BLOCKING_TIMEOUT_MILLIS: {
String value = rawElementText(reader);
BLOCKING_TIMEOUT_WAIT_MILLIS.parseAndSetParameter(value, operation, reader);
break;
}
case IDLE_TIMEOUT_MINUTES: {
String value = rawElementText(reader);
IDLETIMEOUTMINUTES.parseAndSetParameter(value, operation, reader);
break;
}
case QUERY_TIMEOUT: {
String value = rawElementText(reader);
QUERY_TIMEOUT.parseAndSetParameter(value, operation, reader);
break;
}
case SET_TX_QUERY_TIMEOUT: {
//tag presence is sufficient to set it to true
String value = rawElementText(reader);
value = value == null ? "true" : value;
SET_TX_QUERY_TIMEOUT.parseAndSetParameter(value, operation, reader);
break;
}
case USE_TRY_LOCK: {
String value = rawElementText(reader);
USE_TRY_LOCK.parseAndSetParameter(value, operation, reader);
break;
}
case XA_RESOURCE_TIMEOUT: {
String value = rawElementText(reader);
XA_RESOURCE_TIMEOUT.parseAndSetParameter(value, operation, reader);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
private void parseStatementSettings(XMLExtendedStreamReader reader, final ModelNode operation) throws XMLStreamException, ParserException,
ValidateException {
while (reader.hasNext()) {
switch (reader.nextTag()) {
case END_ELEMENT: {
if (DataSource.Tag.forName(reader.getLocalName()) == DataSource.Tag.STATEMENT) {
return;
} else {
if (Statement.Tag.forName(reader.getLocalName()) == Statement.Tag.UNKNOWN) {
throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName()));
}
}
break;
}
case START_ELEMENT: {
switch (Statement.Tag.forName(reader.getLocalName())) {
case PREPARED_STATEMENT_CACHE_SIZE: {
String value = rawElementText(reader);
PREPARED_STATEMENTS_CACHE_SIZE.parseAndSetParameter(value, operation, reader);
break;
}
case TRACK_STATEMENTS: {
String value = rawElementText(reader);
TRACK_STATEMENTS.parseAndSetParameter(value, operation, reader);
break;
}
case SHARE_PREPARED_STATEMENTS: {
//tag presence is sufficient to set it to true
String value = rawElementText(reader);
value = value == null ? "true" : value;
SHARE_PREPARED_STATEMENTS.parseAndSetParameter(value, operation, reader);
break;
}
default:
throw new ParserException(bundle.unexpectedElement(reader.getLocalName()));
}
break;
}
}
}
throw new ParserException(bundle.unexpectedEndOfDocument());
}
/**
* A Tag.
*
* @author <a href="stefano.maestri@jboss.com">Stefano Maestri</a>
*/
public enum Tag {
/**
* always first
*/
UNKNOWN(null),
/**
* jboss-ra tag name
*/
DATASOURCES("datasources");
private final String name;
/**
* Create a new Tag.
*
* @param name a name
*/
Tag(final String name) {
this.name = name;
}
/**
* Get the local name of this element.
*
* @return the local name
*/
public String getLocalName() {
return name;
}
private static final Map<String, Tag> MAP;
static {
final Map<String, Tag> map = new HashMap<String, Tag>();
for (Tag element : values()) {
final String name = element.getLocalName();
if (name != null)
map.put(name, element);
}
MAP = map;
}
/**
* Static method to get enum instance given localName string
*
* @param localName a string used as localname (typically tag name as defined in xsd)
* @return the enum instance
*/
public static Tag forName(String localName) {
final Tag element = MAP.get(localName);
return element == null ? UNKNOWN : element;
}
}
}