/* * IronJacamar, a Java EE Connector Architecture implementation * Copyright 2014, 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 Eclipse Public License 1.0 as * published by the Free Software Foundation. * * 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 Eclipse * Public License for more details. * * You should have received a copy of the Eclipse 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.ironjacamar.common.metadata.ds; import org.ironjacamar.common.api.metadata.Defaults; import org.ironjacamar.common.api.metadata.common.Capacity; import org.ironjacamar.common.api.metadata.common.Extension; import org.ironjacamar.common.api.metadata.common.FlushStrategy; import org.ironjacamar.common.api.metadata.common.Recovery; import org.ironjacamar.common.api.metadata.ds.Credential; import org.ironjacamar.common.api.metadata.ds.DataSource; import org.ironjacamar.common.api.metadata.ds.DataSources; import org.ironjacamar.common.api.metadata.ds.Driver; import org.ironjacamar.common.api.metadata.ds.DsPool; import org.ironjacamar.common.api.metadata.ds.DsSecurity; import org.ironjacamar.common.api.metadata.ds.DsXaPool; import org.ironjacamar.common.api.metadata.ds.Statement; import org.ironjacamar.common.api.metadata.ds.Statement.TrackStatementsEnum; import org.ironjacamar.common.api.metadata.ds.Timeout; import org.ironjacamar.common.api.metadata.ds.TransactionIsolation; import org.ironjacamar.common.api.metadata.ds.Validation; import org.ironjacamar.common.api.metadata.ds.XaDataSource; import org.ironjacamar.common.api.validator.ValidateException; import org.ironjacamar.common.metadata.MetadataParser; import org.ironjacamar.common.metadata.ParserException; import org.ironjacamar.common.metadata.common.AbstractParser; import org.ironjacamar.common.metadata.common.CommonXML; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; /** * A datasource parser * * @author <a href="jesper.pedersen@ironjacamar.org">Jesper Pedersen</a> */ public class DsParser extends AbstractParser implements MetadataParser<DataSources> { /** * Parse a -ds.xml file * @param reader The reader * @return The datasource definitions * @exception Exception Thrown if an error occurs */ public DataSources parse(XMLStreamReader reader) throws Exception { DataSources dataSources = null; //iterate over tags int iterate; try { iterate = reader.nextTag(); } catch (XMLStreamException e) { //found 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 (reader.getLocalName()) { case XML.ELEMENT_DATASOURCES : { dataSources = parseDataSources(reader); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } default : throw new IllegalStateException(); } return dataSources; } /** * Store a -ds.xml file * @param metadata The datasource definitions * @param writer The writer * @exception Exception Thrown if an error occurs */ public void store(DataSources metadata, XMLStreamWriter writer) throws Exception { if (metadata != null && writer != null) { writer.writeStartElement(XML.ELEMENT_DATASOURCES); if (metadata.getDataSource() != null && !metadata.getDataSource().isEmpty()) { for (DataSource ds : metadata.getDataSource()) { storeDataSource(ds, writer); } } if (metadata.getXaDataSource() != null && !metadata.getXaDataSource().isEmpty()) { for (XaDataSource xads : metadata.getXaDataSource()) { storeXaDataSource(xads, writer); } } if (metadata.getDrivers() != null && !metadata.getDrivers().isEmpty()) { writer.writeStartElement(XML.ELEMENT_DRIVERS); for (Driver drv : metadata.getDrivers()) { storeDriver(drv, writer); } writer.writeEndElement(); } writer.writeEndElement(); } } /** * Parse datasource * @param reader The reader * @return The result * @exception XMLStreamException XMLStreamException * @exception ParserException ParserException * @exception ValidateException ValidateException */ protected DataSources parseDataSources(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { List<DataSource> datasource = new ArrayList<DataSource>(); List<XaDataSource> xaDataSource = new ArrayList<XaDataSource>(); Map<String, Driver> drivers = new HashMap<String, Driver>(); boolean driversMatched = false; while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_DATASOURCES.equals(reader.getLocalName())) { return new DatasourcesImpl(datasource, xaDataSource, drivers); } else { switch (reader.getLocalName()) { case XML.ELEMENT_DATASOURCE : case XML.ELEMENT_XA_DATASOURCE : case XML.ELEMENT_DRIVERS : case XML.ELEMENT_DRIVER : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_DATASOURCE : { datasource.add(parseDataSource(reader)); break; } case XML.ELEMENT_XA_DATASOURCE : { xaDataSource.add(parseXADataSource(reader)); break; } case XML.ELEMENT_DRIVERS : { driversMatched = true; break; } case XML.ELEMENT_DRIVER : { Driver driver = parseDriver(reader); drivers.put(driver.getName(), driver); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse driver * @param reader The reader * @return The result * @exception XMLStreamException XMLStreamException * @exception ParserException ParserException * @exception ValidateException ValidateException */ protected Driver parseDriver(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { String driverClass = null; String dataSourceClass = null; String xaDataSourceClass = null; //attributes reading String name = null; Integer majorVersion = null; Integer minorVersion = null; String module = null; Map<String, String> expressions = new HashMap<String, String>(); for (int i = 0; i < reader.getAttributeCount(); i++) { switch (reader.getAttributeLocalName(i)) { case XML.ATTRIBUTE_NAME : { name = attributeAsString(reader, XML.ATTRIBUTE_NAME, expressions); break; } case XML.ATTRIBUTE_MAJOR_VERSION : { majorVersion = attributeAsInt(reader, XML.ATTRIBUTE_MAJOR_VERSION, expressions); break; } case XML.ATTRIBUTE_MINOR_VERSION : { minorVersion = attributeAsInt(reader, XML.ATTRIBUTE_MINOR_VERSION, expressions); break; } case XML.ATTRIBUTE_MODULE : { module = attributeAsString(reader, XML.ATTRIBUTE_MODULE, expressions); break; } default : break; } } //elements reading while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_DRIVER.equals(reader.getLocalName())) { return new DriverImpl(name, majorVersion, minorVersion, module, driverClass, dataSourceClass, xaDataSourceClass, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_DATASOURCE_CLASS : case XML.ELEMENT_XA_DATASOURCE_CLASS : case XML.ELEMENT_DRIVER_CLASS : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_DATASOURCE_CLASS : { dataSourceClass = elementAsString(reader, XML.ELEMENT_DATASOURCE_CLASS, expressions); break; } case XML.ELEMENT_XA_DATASOURCE_CLASS : { xaDataSourceClass = elementAsString(reader, XML.ELEMENT_XA_DATASOURCE_CLASS, expressions); break; } case XML.ELEMENT_DRIVER_CLASS : { driverClass = elementAsString(reader, XML.ELEMENT_DRIVER_CLASS, expressions); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse security * @param reader The reader * @return The result * @exception XMLStreamException XMLStreamException * @exception ParserException ParserException * @exception ValidateException ValidateException */ protected DsSecurity parseDsSecurity(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { String userName = null; String password = null; String securityDomain = null; Extension reauthPlugin = null; Map<String, String> expressions = new HashMap<String, String>(); while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_SECURITY.equals(reader.getLocalName())) { return new DsSecurityImpl(userName, password, securityDomain, reauthPlugin, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_PASSWORD : case XML.ELEMENT_USER_NAME : case XML.ELEMENT_SECURITY_DOMAIN : case XML.ELEMENT_REAUTH_PLUGIN : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_PASSWORD : { password = elementAsString(reader, XML.ELEMENT_PASSWORD, expressions); break; } case XML.ELEMENT_USER_NAME : { userName = elementAsString(reader, XML.ELEMENT_USER_NAME, expressions); break; } case XML.ELEMENT_SECURITY_DOMAIN : { securityDomain = elementAsString(reader, XML.ELEMENT_SECURITY_DOMAIN, expressions); break; } case XML.ELEMENT_REAUTH_PLUGIN : { reauthPlugin = parseExtension(reader, XML.ELEMENT_REAUTH_PLUGIN); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse validation * @param reader The reader * @return The result * @exception XMLStreamException XMLStreamException * @exception ParserException ParserException * @exception ValidateException ValidateException */ protected Validation parseValidationSetting(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { Boolean validateOnMatch = Defaults.VALIDATE_ON_MATCH; Boolean useFastFail = Defaults.USE_CCM; Long backgroundValidationMillis = null; Extension staleConnectionChecker = null; Boolean backgroundValidation = Defaults.BACKGROUND_VALIDATION; String checkValidConnectionSql = null; Extension validConnectionChecker = null; Extension exceptionSorter = null; Map<String, String> expressions = new HashMap<String, String>(); while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_VALIDATION.equals(reader.getLocalName())) { return new ValidationImpl(backgroundValidation, backgroundValidationMillis, useFastFail, validConnectionChecker, checkValidConnectionSql, validateOnMatch, staleConnectionChecker, exceptionSorter, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_BACKGROUND_VALIDATION : case XML.ELEMENT_BACKGROUND_VALIDATION_MILLIS : case XML.ELEMENT_CHECK_VALID_CONNECTION_SQL : case XML.ELEMENT_EXCEPTION_SORTER : case XML.ELEMENT_STALE_CONNECTION_CHECKER : case XML.ELEMENT_USE_FAST_FAIL : case XML.ELEMENT_VALIDATE_ON_MATCH : case XML.ELEMENT_VALID_CONNECTION_CHECKER : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_BACKGROUND_VALIDATION : { backgroundValidation = elementAsBoolean(reader, XML.ELEMENT_BACKGROUND_VALIDATION, expressions); break; } case XML.ELEMENT_BACKGROUND_VALIDATION_MILLIS : { backgroundValidationMillis = elementAsLong(reader, XML.ELEMENT_BACKGROUND_VALIDATION_MILLIS, expressions); break; } case XML.ELEMENT_CHECK_VALID_CONNECTION_SQL : { checkValidConnectionSql = elementAsString(reader, XML.ELEMENT_CHECK_VALID_CONNECTION_SQL, expressions); break; } case XML.ELEMENT_EXCEPTION_SORTER : { exceptionSorter = parseExtension(reader, XML.ELEMENT_EXCEPTION_SORTER); break; } case XML.ELEMENT_STALE_CONNECTION_CHECKER : { staleConnectionChecker = parseExtension(reader, XML.ELEMENT_STALE_CONNECTION_CHECKER); break; } case XML.ELEMENT_USE_FAST_FAIL : { useFastFail = elementAsBoolean(reader, XML.ELEMENT_USE_FAST_FAIL, expressions); break; } case XML.ELEMENT_VALIDATE_ON_MATCH : { validateOnMatch = elementAsBoolean(reader, XML.ELEMENT_VALIDATE_ON_MATCH, expressions); break; } case XML.ELEMENT_VALID_CONNECTION_CHECKER : { validConnectionChecker = parseExtension(reader, XML.ELEMENT_VALID_CONNECTION_CHECKER); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse timeout * @param reader The reader * @return The result * @exception XMLStreamException XMLStreamException * @exception ParserException ParserException * @exception ValidateException ValidateException */ protected Timeout parseTimeoutSettings(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { Long blockingTimeoutMillis = null; Integer idleTimeoutMinutes = null; Boolean setTxQuertTimeout = Defaults.SET_TX_QUERY_TIMEOUT; Long queryTimeout = null; Integer allocationRetry = null; Long allocationRetryWaitMillis = null; Long useTryLock = null; Integer xaResourceTimeout = null; Map<String, String> expressions = new HashMap<String, String>(); while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_TIMEOUT.equals(reader.getLocalName())) { return new TimeoutImpl(blockingTimeoutMillis, idleTimeoutMinutes, allocationRetry, allocationRetryWaitMillis, xaResourceTimeout, setTxQuertTimeout, queryTimeout, useTryLock, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_ALLOCATION_RETRY : case XML.ELEMENT_ALLOCATION_RETRY_WAIT_MILLIS : case XML.ELEMENT_BLOCKING_TIMEOUT_MILLIS : case XML.ELEMENT_IDLE_TIMEOUT_MINUTES : case XML.ELEMENT_QUERY_TIMEOUT : case XML.ELEMENT_SET_TX_QUERY_TIMEOUT : case XML.ELEMENT_USE_TRY_LOCK : case XML.ELEMENT_XA_RESOURCE_TIMEOUT : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_ALLOCATION_RETRY : { allocationRetry = elementAsInteger(reader, XML.ELEMENT_ALLOCATION_RETRY, expressions); break; } case XML.ELEMENT_ALLOCATION_RETRY_WAIT_MILLIS : { allocationRetryWaitMillis = elementAsLong(reader, XML.ELEMENT_ALLOCATION_RETRY_WAIT_MILLIS, expressions); break; } case XML.ELEMENT_BLOCKING_TIMEOUT_MILLIS : { blockingTimeoutMillis = elementAsLong(reader, XML.ELEMENT_BLOCKING_TIMEOUT_MILLIS, expressions); break; } case XML.ELEMENT_IDLE_TIMEOUT_MINUTES : { idleTimeoutMinutes = elementAsInteger(reader, XML.ELEMENT_IDLE_TIMEOUT_MINUTES, expressions); break; } case XML.ELEMENT_QUERY_TIMEOUT : { queryTimeout = elementAsLong(reader, XML.ELEMENT_QUERY_TIMEOUT, expressions); break; } case XML.ELEMENT_SET_TX_QUERY_TIMEOUT : { setTxQuertTimeout = elementAsBoolean(reader, XML.ELEMENT_SET_TX_QUERY_TIMEOUT, expressions); break; } case XML.ELEMENT_USE_TRY_LOCK : { useTryLock = elementAsLong(reader, XML.ELEMENT_USE_TRY_LOCK, expressions); break; } case XML.ELEMENT_XA_RESOURCE_TIMEOUT : { xaResourceTimeout = elementAsInteger(reader, XML.ELEMENT_XA_RESOURCE_TIMEOUT, expressions); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse statement * @param reader The reader * @return The result * @exception XMLStreamException XMLStreamException * @exception ParserException ParserException * @exception ValidateException ValidateException */ protected Statement parseStatementSettings(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { Long preparedStatementsCacheSize = null; Boolean sharePreparedStatements = Defaults.SHARE_PREPARED_STATEMENTS; TrackStatementsEnum trackStatements = null; Map<String, String> expressions = new HashMap<String, String>(); while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_STATEMENT.equals(reader.getLocalName())) { return new StatementImpl(sharePreparedStatements, preparedStatementsCacheSize, trackStatements, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_PREPARED_STATEMENT_CACHE_SIZE : case XML.ELEMENT_TRACK_STATEMENTS : case XML.ELEMENT_SHARE_PREPARED_STATEMENTS : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_PREPARED_STATEMENT_CACHE_SIZE : { preparedStatementsCacheSize = elementAsLong(reader, XML.ELEMENT_PREPARED_STATEMENT_CACHE_SIZE, expressions); break; } case XML.ELEMENT_TRACK_STATEMENTS : { String elementString = elementAsString(reader, XML.ELEMENT_TRACK_STATEMENTS, expressions); trackStatements = TrackStatementsEnum.valueOf(elementString == null ? "FALSE" : elementString .toUpperCase(Locale.US)); break; } case XML.ELEMENT_SHARE_PREPARED_STATEMENTS : { sharePreparedStatements = elementAsBoolean(reader, XML.ELEMENT_SHARE_PREPARED_STATEMENTS, expressions); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * * parse a {@link CommonPool} object * * @param reader reader * @return the parsed {@link CommonPool} object * @throws XMLStreamException XMLStreamException * @throws ParserException ParserException * @throws ValidateException ValidateException */ protected DsPool parsePool(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { String type = Defaults.TYPE; String janitor = Defaults.JANITOR; Integer minPoolSize = Defaults.MIN_POOL_SIZE; Integer initialPoolSize = Defaults.INITIAL_POOL_SIZE; Integer maxPoolSize = Defaults.MAX_POOL_SIZE; Boolean prefill = Defaults.PREFILL; FlushStrategy flushStrategy = Defaults.FLUSH_STRATEGY; Capacity capacity = null; Extension connectionListener = null; Map<String, String> expressions = new HashMap<String, String>(); for (int i = 0; i < reader.getAttributeCount(); i++) { switch (reader.getAttributeLocalName(i)) { case XML.ATTRIBUTE_TYPE : { type = attributeAsString(reader, XML.ATTRIBUTE_TYPE, expressions); break; } case XML.ATTRIBUTE_JANITOR : { janitor = attributeAsString(reader, XML.ATTRIBUTE_JANITOR, expressions); break; } default : break; } } while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_POOL.equals(reader.getLocalName())) { return new DsPoolImpl(type, janitor, minPoolSize, initialPoolSize, maxPoolSize, prefill, flushStrategy, capacity, connectionListener, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_MAX_POOL_SIZE : case XML.ELEMENT_INITIAL_POOL_SIZE : case XML.ELEMENT_MIN_POOL_SIZE : case XML.ELEMENT_PREFILL : case XML.ELEMENT_FLUSH_STRATEGY : case XML.ELEMENT_CAPACITY : case XML.ELEMENT_CONNECTION_LISTENER : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_MAX_POOL_SIZE : { maxPoolSize = elementAsInteger(reader, XML.ELEMENT_MAX_POOL_SIZE, expressions); break; } case XML.ELEMENT_INITIAL_POOL_SIZE : { initialPoolSize = elementAsInteger(reader, XML.ELEMENT_INITIAL_POOL_SIZE, expressions); break; } case XML.ELEMENT_MIN_POOL_SIZE : { minPoolSize = elementAsInteger(reader, XML.ELEMENT_MIN_POOL_SIZE, expressions); break; } case XML.ELEMENT_PREFILL : { prefill = elementAsBoolean(reader, XML.ELEMENT_PREFILL, expressions); break; } case XML.ELEMENT_FLUSH_STRATEGY : { flushStrategy = elementAsFlushStrategy(reader, expressions); break; } case XML.ELEMENT_CAPACITY : { capacity = parseCapacity(reader); break; } case XML.ELEMENT_CONNECTION_LISTENER : { connectionListener = parseExtension(reader, XML.ELEMENT_CONNECTION_LISTENER); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * * parse a {@link CommonXaPool} object * * @param reader reader * @return the parsed {@link CommonXaPool} object * @throws XMLStreamException XMLStreamException * @throws ParserException ParserException * @throws ValidateException ValidateException */ protected DsXaPool parseXaPool(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { String type = Defaults.TYPE; String janitor = Defaults.JANITOR; Integer minPoolSize = Defaults.MIN_POOL_SIZE; Integer initialPoolSize = Defaults.INITIAL_POOL_SIZE; Integer maxPoolSize = Defaults.MAX_POOL_SIZE; Boolean prefill = Defaults.PREFILL; FlushStrategy flushStrategy = Defaults.FLUSH_STRATEGY; Capacity capacity = null; Extension connectionListener = null; Boolean isSameRmOverride = Defaults.IS_SAME_RM_OVERRIDE; Boolean padXid = Defaults.PAD_XID; Boolean wrapXaDataSource = Defaults.WRAP_XA_RESOURCE; Map<String, String> expressions = new HashMap<String, String>(); for (int i = 0; i < reader.getAttributeCount(); i++) { switch (reader.getAttributeLocalName(i)) { case XML.ATTRIBUTE_TYPE : { type = attributeAsString(reader, XML.ATTRIBUTE_TYPE, expressions); break; } case XML.ATTRIBUTE_JANITOR : { janitor = attributeAsString(reader, XML.ATTRIBUTE_JANITOR, expressions); break; } default : break; } } while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_XA_POOL.equals(reader.getLocalName())) { return new DsXaPoolImpl(type, janitor, minPoolSize, initialPoolSize, maxPoolSize, prefill, flushStrategy, isSameRmOverride, padXid, wrapXaDataSource, capacity, connectionListener, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_MAX_POOL_SIZE : case XML.ELEMENT_INITIAL_POOL_SIZE : case XML.ELEMENT_MIN_POOL_SIZE : case XML.ELEMENT_IS_SAME_RM_OVERRIDE : case XML.ELEMENT_PAD_XID : case XML.ELEMENT_WRAP_XA_RESOURCE : case XML.ELEMENT_PREFILL : case XML.ELEMENT_FLUSH_STRATEGY : case XML.ELEMENT_CAPACITY : case XML.ELEMENT_CONNECTION_LISTENER : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_MAX_POOL_SIZE : { maxPoolSize = elementAsInteger(reader, XML.ELEMENT_MAX_POOL_SIZE, expressions); break; } case XML.ELEMENT_INITIAL_POOL_SIZE : { initialPoolSize = elementAsInteger(reader, XML.ELEMENT_INITIAL_POOL_SIZE, expressions); break; } case XML.ELEMENT_MIN_POOL_SIZE : { minPoolSize = elementAsInteger(reader, XML.ELEMENT_MIN_POOL_SIZE, expressions); break; } case XML.ELEMENT_IS_SAME_RM_OVERRIDE : { isSameRmOverride = elementAsBoolean(reader, XML.ELEMENT_IS_SAME_RM_OVERRIDE, expressions); break; } case XML.ELEMENT_PAD_XID : { padXid = elementAsBoolean(reader, XML.ELEMENT_PAD_XID, expressions); break; } case XML.ELEMENT_WRAP_XA_RESOURCE : { wrapXaDataSource = elementAsBoolean(reader, XML.ELEMENT_WRAP_XA_RESOURCE, expressions); break; } case XML.ELEMENT_PREFILL : { prefill = elementAsBoolean(reader, XML.ELEMENT_PREFILL, expressions); break; } case XML.ELEMENT_FLUSH_STRATEGY : { flushStrategy = elementAsFlushStrategy(reader, expressions); break; } case XML.ELEMENT_CAPACITY : { capacity = parseCapacity(reader); break; } case XML.ELEMENT_CONNECTION_LISTENER : { connectionListener = parseExtension(reader, XML.ELEMENT_CONNECTION_LISTENER); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse a XA datasource * @param reader The reader * @return The XA datasource * @exception XMLStreamException Thrown if a stream error occurs * @exception ParserException Thrown if a parser error occurs * @exception ValidateException Thrown if a validation error occurs */ protected org.ironjacamar.common.api.metadata.ds.XaDataSource parseXADataSource(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { TransactionIsolation transactionIsolation = null; Map<String, String> xaDataSourceProperty = new HashMap<String, String>(); Timeout timeoutSettings = null; DsSecurity securitySettings = null; Statement statementSettings = null; Validation validationSettings = null; String urlDelimiter = null; String urlProperty = null; String urlSelectorStrategyClassName = null; String newConnectionSql = null; DsXaPool xaPool = null; Recovery recovery = null; String xaDataSourceClass = null; String driver = null; //attributes reading String id = null; Boolean enabled = Defaults.ENABLED; String jndiName = null; Boolean spy = Defaults.SPY; Boolean useCcm = Defaults.USE_CCM; Boolean connectable = Defaults.CONNECTABLE; Boolean tracking = Defaults.TRACKING; Map<String, String> expressions = new HashMap<String, String>(); for (int i = 0; i < reader.getAttributeCount(); i++) { switch (reader.getAttributeLocalName(i)) { case XML.ATTRIBUTE_ENABLED : { enabled = attributeAsBoolean(reader, XML.ATTRIBUTE_ENABLED, Defaults.ENABLED, expressions); break; } case XML.ATTRIBUTE_JNDI_NAME : { jndiName = attributeAsString(reader, XML.ATTRIBUTE_JNDI_NAME, expressions); break; } case XML.ATTRIBUTE_ID : { id = attributeAsString(reader, XML.ATTRIBUTE_ID, expressions); break; } case XML.ATTRIBUTE_SPY : { spy = attributeAsBoolean(reader, XML.ATTRIBUTE_SPY, Defaults.SPY, expressions); break; } case XML.ATTRIBUTE_USE_CCM : { useCcm = attributeAsBoolean(reader, XML.ATTRIBUTE_USE_CCM, Defaults.USE_CCM, expressions); break; } case XML.ATTRIBUTE_CONNECTABLE : { connectable = attributeAsBoolean(reader, XML.ATTRIBUTE_CONNECTABLE, Defaults.CONNECTABLE, expressions); break; } case XML.ATTRIBUTE_TRACKING : { tracking = attributeAsBoolean(reader, XML.ATTRIBUTE_TRACKING, Defaults.TRACKING, expressions); break; } default : break; } } //elements reading while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_XA_DATASOURCE.equals(reader.getLocalName())) { return new XADataSourceImpl(transactionIsolation, timeoutSettings, securitySettings, statementSettings, validationSettings, urlDelimiter, urlProperty, urlSelectorStrategyClassName, id, enabled, jndiName, spy, useCcm, connectable, tracking, xaDataSourceProperty, xaDataSourceClass, driver, newConnectionSql, xaPool, recovery, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_XA_DATASOURCE_PROPERTY : case XML.ELEMENT_XA_DATASOURCE_CLASS : case XML.ELEMENT_DRIVER : case XML.ELEMENT_XA_POOL : case XML.ELEMENT_NEW_CONNECTION_SQL : case XML.ELEMENT_URL_DELIMITER : case XML.ELEMENT_URL_PROPERTY : case XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME : case XML.ELEMENT_TRANSACTION_ISOLATION : case XML.ELEMENT_SECURITY : case XML.ELEMENT_STATEMENT : case XML.ELEMENT_TIMEOUT : case XML.ELEMENT_VALIDATION : case XML.ELEMENT_RECOVERY : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_XA_DATASOURCE_PROPERTY : { parseConfigProperty(xaDataSourceProperty, reader, XML.ELEMENT_XA_DATASOURCE_PROPERTY, expressions); break; } case XML.ELEMENT_XA_DATASOURCE_CLASS : { xaDataSourceClass = elementAsString(reader, XML.ELEMENT_XA_DATASOURCE_CLASS, expressions); break; } case XML.ELEMENT_DRIVER : { driver = elementAsString(reader, XML.ELEMENT_DRIVER, expressions); break; } case XML.ELEMENT_XA_POOL : { xaPool = parseXaPool(reader); break; } case XML.ELEMENT_NEW_CONNECTION_SQL : { newConnectionSql = elementAsString(reader, XML.ELEMENT_NEW_CONNECTION_SQL, expressions); break; } case XML.ELEMENT_URL_DELIMITER : { urlDelimiter = elementAsString(reader, XML.ELEMENT_URL_DELIMITER, expressions); break; } case XML.ELEMENT_URL_PROPERTY : { urlProperty = elementAsString(reader, XML.ELEMENT_URL_PROPERTY, expressions); break; } case XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME : { urlSelectorStrategyClassName = elementAsString(reader, XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME, expressions); break; } case XML.ELEMENT_TRANSACTION_ISOLATION : { String str = elementAsString(reader, XML.ELEMENT_TRANSACTION_ISOLATION, expressions); transactionIsolation = TransactionIsolation.forName(str); if (transactionIsolation == null) { transactionIsolation = TransactionIsolation.customLevel(str); } break; } case XML.ELEMENT_SECURITY : { securitySettings = parseDsSecurity(reader); break; } case XML.ELEMENT_STATEMENT : { statementSettings = parseStatementSettings(reader); break; } case XML.ELEMENT_TIMEOUT : { timeoutSettings = parseTimeoutSettings(reader); break; } case XML.ELEMENT_VALIDATION : { validationSettings = parseValidationSetting(reader); break; } case XML.ELEMENT_RECOVERY : { recovery = parseRecovery(reader); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Parse a datasource * @param reader The reader * @return The datasource * @exception XMLStreamException Thrown if a stream error occurs * @exception ParserException Thrown if a parser error occurs * @exception ValidateException Thrown if a validation error occurs */ protected DataSource parseDataSource(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { String connectionUrl = null; String driverClass = null; String dataSourceClass = null; String driver = null; TransactionIsolation transactionIsolation = null; Map<String, String> connectionProperties = new HashMap<String, String>(); Timeout timeoutSettings = null; DsSecurity securitySettings = null; Statement statementSettings = null; Validation validationSettings = null; String urlDelimiter = null; String urlSelectorStrategyClassName = null; String newConnectionSql = null; DsPool pool = null; //attributes reading String id = null; Boolean enabled = Defaults.ENABLED; String jndiName = null; Boolean spy = Defaults.SPY; Boolean useCcm = Defaults.USE_CCM; Boolean jta = Defaults.JTA; Boolean connectable = Defaults.CONNECTABLE; Boolean tracking = Defaults.TRACKING; Map<String, String> expressions = new HashMap<String, String>(); for (int i = 0; i < reader.getAttributeCount(); i++) { switch (reader.getAttributeLocalName(i)) { case XML.ATTRIBUTE_ENABLED : { enabled = attributeAsBoolean(reader, XML.ATTRIBUTE_ENABLED, Defaults.ENABLED, expressions); break; } case XML.ATTRIBUTE_JNDI_NAME : { jndiName = attributeAsString(reader, XML.ATTRIBUTE_JNDI_NAME, expressions); break; } case XML.ATTRIBUTE_ID : { id = attributeAsString(reader, XML.ATTRIBUTE_ID, expressions); break; } case XML.ATTRIBUTE_SPY : { spy = attributeAsBoolean(reader, XML.ATTRIBUTE_SPY, Defaults.SPY, expressions); break; } case XML.ATTRIBUTE_USE_CCM : { useCcm = attributeAsBoolean(reader, XML.ATTRIBUTE_USE_CCM, Defaults.USE_CCM, expressions); break; } case XML.ATTRIBUTE_JTA : { jta = attributeAsBoolean(reader, XML.ATTRIBUTE_JTA, Defaults.JTA, expressions); break; } case XML.ATTRIBUTE_CONNECTABLE : { connectable = attributeAsBoolean(reader, XML.ATTRIBUTE_CONNECTABLE, Defaults.CONNECTABLE, expressions); break; } case XML.ATTRIBUTE_TRACKING : { tracking = attributeAsBoolean(reader, XML.ATTRIBUTE_TRACKING, Defaults.TRACKING, expressions); break; } default : break; } } //elements reading while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { if (XML.ELEMENT_DATASOURCE.equals(reader.getLocalName())) { return new DataSourceImpl(connectionUrl, driverClass, dataSourceClass, driver, transactionIsolation, connectionProperties, timeoutSettings, securitySettings, statementSettings, validationSettings, urlDelimiter, urlSelectorStrategyClassName, newConnectionSql, id, enabled, jndiName, spy, useCcm, jta, connectable, tracking, pool, !expressions.isEmpty() ? expressions : null); } else { switch (reader.getLocalName()) { case XML.ELEMENT_CONNECTION_PROPERTY : case XML.ELEMENT_CONNECTION_URL : case XML.ELEMENT_DRIVER_CLASS : case XML.ELEMENT_DATASOURCE_CLASS : case XML.ELEMENT_DRIVER : case XML.ELEMENT_POOL : case XML.ELEMENT_NEW_CONNECTION_SQL : case XML.ELEMENT_URL_DELIMITER : case XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME : case XML.ELEMENT_TRANSACTION_ISOLATION : case XML.ELEMENT_SECURITY : case XML.ELEMENT_STATEMENT : case XML.ELEMENT_TIMEOUT : case XML.ELEMENT_VALIDATION : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } break; } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_CONNECTION_PROPERTY : { parseConfigProperty(connectionProperties, reader, XML.ELEMENT_CONNECTION_PROPERTY, expressions); break; } case XML.ELEMENT_CONNECTION_URL : { connectionUrl = elementAsString(reader, XML.ELEMENT_CONNECTION_URL, expressions); break; } case XML.ELEMENT_DRIVER_CLASS : { driverClass = elementAsString(reader, XML.ELEMENT_DRIVER_CLASS, expressions); break; } case XML.ELEMENT_DATASOURCE_CLASS : { dataSourceClass = elementAsString(reader, XML.ELEMENT_DATASOURCE_CLASS, expressions); break; } case XML.ELEMENT_DRIVER : { driver = elementAsString(reader, XML.ELEMENT_DRIVER, expressions); break; } case XML.ELEMENT_POOL : { pool = parsePool(reader); break; } case XML.ELEMENT_NEW_CONNECTION_SQL : { newConnectionSql = elementAsString(reader, XML.ELEMENT_NEW_CONNECTION_SQL, expressions); break; } case XML.ELEMENT_URL_DELIMITER : { urlDelimiter = elementAsString(reader, XML.ELEMENT_URL_DELIMITER, expressions); break; } case XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME : { urlSelectorStrategyClassName = elementAsString(reader, XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME, expressions); break; } case XML.ELEMENT_TRANSACTION_ISOLATION : { String str = elementAsString(reader, XML.ELEMENT_TRANSACTION_ISOLATION, expressions); transactionIsolation = TransactionIsolation.forName(str); if (transactionIsolation == null) { transactionIsolation = TransactionIsolation.customLevel(str); } break; } case XML.ELEMENT_SECURITY : { securitySettings = parseDsSecurity(reader); break; } case XML.ELEMENT_STATEMENT : { statementSettings = parseStatementSettings(reader); break; } case XML.ELEMENT_TIMEOUT : { timeoutSettings = parseTimeoutSettings(reader); break; } case XML.ELEMENT_VALIDATION : { validationSettings = parseValidationSetting(reader); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * * Parse recovery tag * * @param reader reader * @return the parsed recovery object * @throws XMLStreamException in case of error * @throws ParserException in case of error * @throws ValidateException in case of error */ @Override protected Recovery parseRecovery(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { Boolean noRecovery = Defaults.NO_RECOVERY; Credential security = null; Extension plugin = null; Map<String, String> expressions = new HashMap<String, String>(); for (int i = 0; i < reader.getAttributeCount(); i++) { switch (reader.getAttributeLocalName(i)) { case XML.ATTRIBUTE_NO_RECOVERY : { noRecovery = attributeAsBoolean(reader, XML.ATTRIBUTE_NO_RECOVERY, Boolean.FALSE, expressions); break; } default : break; } } while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_RECOVERY : return new RecoveryImpl(security, plugin, noRecovery, !expressions.isEmpty() ? expressions : null); case XML.ELEMENT_RECOVERY_CREDENTIAL : case XML.ELEMENT_RECOVERY_PLUGIN : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_RECOVERY_CREDENTIAL : { security = parseCredential(reader); break; } case XML.ELEMENT_RECOVERY_PLUGIN : { plugin = parseExtension(reader, XML.ELEMENT_RECOVERY_PLUGIN); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * * parse credential tag * * @param reader reader * @return the parse Object * @throws XMLStreamException in case of error * @throws ParserException in case of error * @throws ValidateException in case of error */ @Override protected Credential parseCredential(XMLStreamReader reader) throws XMLStreamException, ParserException, ValidateException { String userName = null; String password = null; String securityDomain = null; Map<String, String> expressions = new HashMap<String, String>(); while (reader.hasNext()) { switch (reader.nextTag()) { case END_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_SECURITY : case XML.ELEMENT_RECOVERY_CREDENTIAL : return new CredentialImpl(userName, password, securityDomain, !expressions.isEmpty() ? expressions : null); case XML.ELEMENT_USER_NAME : case XML.ELEMENT_PASSWORD : case XML.ELEMENT_SECURITY_DOMAIN : break; default : throw new ParserException(bundle.unexpectedEndTag(reader.getLocalName())); } } case START_ELEMENT : { switch (reader.getLocalName()) { case XML.ELEMENT_USER_NAME : { userName = elementAsString(reader, XML.ELEMENT_USER_NAME, expressions); break; } case XML.ELEMENT_PASSWORD : { password = elementAsString(reader, XML.ELEMENT_PASSWORD, expressions); break; } case XML.ELEMENT_SECURITY_DOMAIN : { securityDomain = elementAsString(reader, XML.ELEMENT_SECURITY_DOMAIN, expressions); break; } default : throw new ParserException(bundle.unexpectedElement(reader.getLocalName())); } break; } } } throw new ParserException(bundle.unexpectedEndOfDocument()); } /** * Store a datasource * @param ds The datasource * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeDataSource(DataSource ds, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_DATASOURCE); if (ds.isJTA() != null && (ds.hasExpression(XML.ATTRIBUTE_JTA) || !Defaults.JTA.equals(ds.isJTA()))) writer.writeAttribute(XML.ATTRIBUTE_JTA, ds.getValue(XML.ATTRIBUTE_JTA, ds.isJTA().toString())); if (ds.getJndiName() != null) writer.writeAttribute(XML.ATTRIBUTE_JNDI_NAME, ds.getValue(XML.ATTRIBUTE_JNDI_NAME, ds.getJndiName())); if (ds.getId() != null) writer.writeAttribute(XML.ATTRIBUTE_ID, ds.getValue(XML.ATTRIBUTE_ID, ds.getId())); if (ds.isEnabled() != null && (ds.hasExpression(XML.ATTRIBUTE_ENABLED) || !Defaults.ENABLED.equals(ds.isEnabled()))) writer.writeAttribute(XML.ATTRIBUTE_ENABLED, ds.getValue(XML.ATTRIBUTE_ENABLED, ds.isEnabled().toString())); if (ds.isSpy() != null && (ds.hasExpression(XML.ATTRIBUTE_SPY) || !Defaults.SPY.equals(ds.isSpy()))) writer.writeAttribute(XML.ATTRIBUTE_SPY, ds.getValue(XML.ATTRIBUTE_SPY, ds.isSpy().toString())); if (ds.isUseCcm() != null && (ds.hasExpression(XML.ATTRIBUTE_USE_CCM) || !Defaults.USE_CCM.equals(ds.isUseCcm()))) writer.writeAttribute(XML.ATTRIBUTE_USE_CCM, ds.getValue(XML.ATTRIBUTE_USE_CCM, ds.isUseCcm().toString())); if (ds.isConnectable() != null && (ds.hasExpression(XML.ATTRIBUTE_CONNECTABLE) || !Defaults.CONNECTABLE.equals(ds.isConnectable()))) writer.writeAttribute(XML.ATTRIBUTE_CONNECTABLE, ds.getValue(XML.ATTRIBUTE_CONNECTABLE, ds.isConnectable().toString())); if (ds.isTracking() != null) writer.writeAttribute(XML.ATTRIBUTE_TRACKING, ds.getValue(XML.ATTRIBUTE_TRACKING, ds.isTracking().toString())); if (ds.getConnectionUrl() != null) { writer.writeStartElement(XML.ELEMENT_CONNECTION_URL); writer.writeCharacters(ds.getValue(XML.ELEMENT_CONNECTION_URL, ds.getConnectionUrl())); writer.writeEndElement(); } if (ds.getDriverClass() != null) { writer.writeStartElement(XML.ELEMENT_DRIVER_CLASS); writer.writeCharacters(ds.getValue(XML.ELEMENT_DRIVER_CLASS, ds.getDriverClass())); writer.writeEndElement(); } if (ds.getDataSourceClass() != null) { writer.writeStartElement(XML.ELEMENT_DATASOURCE_CLASS); writer.writeCharacters(ds.getValue(XML.ELEMENT_DATASOURCE_CLASS, ds.getDataSourceClass())); writer.writeEndElement(); } if (ds.getDriver() != null) { writer.writeStartElement(XML.ELEMENT_DRIVER); writer.writeCharacters(ds.getValue(XML.ELEMENT_DRIVER, ds.getDriver())); writer.writeEndElement(); } if (ds.getConnectionProperties() != null && !ds.getConnectionProperties().isEmpty()) { Iterator<Map.Entry<String, String>> it = ds.getConnectionProperties().entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); writer.writeStartElement(XML.ELEMENT_CONNECTION_PROPERTY); writer.writeAttribute(XML.ATTRIBUTE_NAME, entry.getKey()); writer.writeCharacters(ds.getValue(XML.ELEMENT_CONNECTION_PROPERTY, entry.getKey(), entry.getValue())); writer.writeEndElement(); } } if (ds.getNewConnectionSql() != null) { writer.writeStartElement(XML.ELEMENT_NEW_CONNECTION_SQL); writer.writeCharacters(ds.getValue(XML.ELEMENT_NEW_CONNECTION_SQL, ds.getNewConnectionSql())); writer.writeEndElement(); } if (ds.getTransactionIsolation() != null) { writer.writeStartElement(XML.ELEMENT_TRANSACTION_ISOLATION); writer.writeCharacters(ds.getValue(XML.ELEMENT_TRANSACTION_ISOLATION, ds.getTransactionIsolation().toString())); writer.writeEndElement(); } if (ds.getUrlDelimiter() != null) { writer.writeStartElement(XML.ELEMENT_URL_DELIMITER); writer.writeCharacters(ds.getValue(XML.ELEMENT_URL_DELIMITER, ds.getUrlDelimiter())); writer.writeEndElement(); } if (ds.getUrlSelectorStrategyClassName() != null) { writer.writeStartElement(XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME); writer.writeCharacters(ds.getValue(XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME, ds.getUrlSelectorStrategyClassName())); writer.writeEndElement(); } if (ds.getPool() != null) storePool(ds.getPool(), writer); if (ds.getSecurity() != null) storeSecurity(ds.getSecurity(), writer); if (ds.getValidation() != null) storeValidation(ds.getValidation(), writer); if (ds.getTimeout() != null) storeTimeout(ds.getTimeout(), writer); if (ds.getStatement() != null) storeStatement(ds.getStatement(), writer); writer.writeEndElement(); } /** * Store a XA datasource * @param xads The XA datasource * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeXaDataSource(XaDataSource xads, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_XA_DATASOURCE); if (xads.getJndiName() != null) writer.writeAttribute(XML.ATTRIBUTE_JNDI_NAME, xads.getValue(XML.ATTRIBUTE_JNDI_NAME, xads.getJndiName())); if (xads.getId() != null) writer.writeAttribute(XML.ATTRIBUTE_ID, xads.getValue(XML.ATTRIBUTE_ID, xads.getId())); if (xads.isEnabled() != null && (xads.hasExpression(XML.ATTRIBUTE_ENABLED) || !Defaults.ENABLED.equals(xads.isEnabled()))) writer.writeAttribute(XML.ATTRIBUTE_ENABLED, xads.getValue(XML.ATTRIBUTE_ENABLED, xads.isEnabled().toString())); if (xads.isSpy() != null && (xads.hasExpression(XML.ATTRIBUTE_SPY) || !Defaults.SPY.equals(xads.isSpy()))) writer.writeAttribute(XML.ATTRIBUTE_SPY, xads.getValue(XML.ATTRIBUTE_SPY, xads.isSpy().toString())); if (xads.isUseCcm() != null && (xads.hasExpression(XML.ATTRIBUTE_USE_CCM) || !Defaults.USE_CCM.equals(xads.isUseCcm()))) writer.writeAttribute(XML.ATTRIBUTE_USE_CCM, xads.getValue(XML.ATTRIBUTE_USE_CCM, xads.isUseCcm().toString())); if (xads.isConnectable() != null && (xads.hasExpression(XML.ATTRIBUTE_CONNECTABLE) || !Defaults.CONNECTABLE.equals(xads.isConnectable()))) writer.writeAttribute(XML.ATTRIBUTE_CONNECTABLE, xads.getValue(XML.ATTRIBUTE_CONNECTABLE, xads.isConnectable().toString())); if (xads.isTracking() != null) writer.writeAttribute(XML.ATTRIBUTE_TRACKING, xads.getValue(XML.ATTRIBUTE_TRACKING, xads.isTracking().toString())); if (xads.getXaDataSourceProperty() != null && !xads.getXaDataSourceProperty().isEmpty()) { Iterator<Map.Entry<String, String>> it = xads.getXaDataSourceProperty().entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); writer.writeStartElement(XML.ELEMENT_XA_DATASOURCE_PROPERTY); writer.writeAttribute(XML.ATTRIBUTE_NAME, entry.getKey()); writer.writeCharacters(xads.getValue(XML.ELEMENT_XA_DATASOURCE_PROPERTY, entry.getKey(), entry.getValue())); writer.writeEndElement(); } } if (xads.getXaDataSourceClass() != null) { writer.writeStartElement(XML.ELEMENT_XA_DATASOURCE_CLASS); writer.writeCharacters(xads.getValue(XML.ELEMENT_XA_DATASOURCE_CLASS, xads.getXaDataSourceClass())); writer.writeEndElement(); } if (xads.getDriver() != null) { writer.writeStartElement(XML.ELEMENT_DRIVER); writer.writeCharacters(xads.getValue(XML.ELEMENT_DRIVER, xads.getDriver())); writer.writeEndElement(); } if (xads.getUrlDelimiter() != null) { writer.writeStartElement(XML.ELEMENT_URL_DELIMITER); writer.writeCharacters(xads.getValue(XML.ELEMENT_URL_DELIMITER, xads.getUrlDelimiter())); writer.writeEndElement(); } if (xads.getUrlProperty() != null) { writer.writeStartElement(XML.ELEMENT_URL_PROPERTY); writer.writeCharacters(xads.getValue(XML.ELEMENT_URL_PROPERTY, xads.getUrlProperty())); writer.writeEndElement(); } if (xads.getUrlSelectorStrategyClassName() != null) { writer.writeStartElement(XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME); writer.writeCharacters(xads.getValue(XML.ELEMENT_URL_SELECTOR_STRATEGY_CLASS_NAME, xads.getUrlSelectorStrategyClassName())); writer.writeEndElement(); } if (xads.getNewConnectionSql() != null) { writer.writeStartElement(XML.ELEMENT_NEW_CONNECTION_SQL); writer.writeCharacters(xads.getValue(XML.ELEMENT_NEW_CONNECTION_SQL, xads.getNewConnectionSql())); writer.writeEndElement(); } if (xads.getTransactionIsolation() != null) { writer.writeStartElement(XML.ELEMENT_TRANSACTION_ISOLATION); writer.writeCharacters(xads.getValue(XML.ELEMENT_TRANSACTION_ISOLATION, xads.getTransactionIsolation().toString())); writer.writeEndElement(); } if (xads.getXaPool() != null) storeXaPool(xads.getXaPool(), writer); if (xads.getSecurity() != null) storeSecurity(xads.getSecurity(), writer); if (xads.getValidation() != null) storeValidation(xads.getValidation(), writer); if (xads.getTimeout() != null) storeTimeout(xads.getTimeout(), writer); if (xads.getStatement() != null) storeStatement(xads.getStatement(), writer); if (xads.getRecovery() != null) storeRecovery(xads.getRecovery(), writer); writer.writeEndElement(); } /** * Store a driver * @param drv The driver * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeDriver(Driver drv, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_DRIVER); if (drv.getName() != null) writer.writeAttribute(XML.ATTRIBUTE_NAME, drv.getValue(XML.ATTRIBUTE_NAME, drv.getName())); if (drv.getModule() != null) writer.writeAttribute(XML.ATTRIBUTE_MODULE, drv.getValue(XML.ATTRIBUTE_MODULE, drv.getModule())); if (drv.getMajorVersion() != null) writer.writeAttribute(XML.ATTRIBUTE_MAJOR_VERSION, drv.getValue(XML.ATTRIBUTE_MAJOR_VERSION, drv.getMajorVersion().toString())); if (drv.getMinorVersion() != null) writer.writeAttribute(XML.ATTRIBUTE_MINOR_VERSION, drv.getValue(XML.ATTRIBUTE_MINOR_VERSION, drv.getMinorVersion().toString())); if (drv.getDriverClass() != null) { writer.writeStartElement(XML.ELEMENT_DRIVER_CLASS); writer.writeCharacters(drv.getValue(XML.ELEMENT_DRIVER_CLASS, drv.getDriverClass())); writer.writeEndElement(); } if (drv.getDataSourceClass() != null) { writer.writeStartElement(XML.ELEMENT_DATASOURCE_CLASS); writer.writeCharacters(drv.getValue(XML.ELEMENT_DATASOURCE_CLASS, drv.getDataSourceClass())); writer.writeEndElement(); } if (drv.getXaDataSourceClass() != null) { writer.writeStartElement(XML.ELEMENT_XA_DATASOURCE_CLASS); writer.writeCharacters(drv.getValue(XML.ELEMENT_XA_DATASOURCE_CLASS, drv.getXaDataSourceClass())); writer.writeEndElement(); } writer.writeEndElement(); } /** * Store a pool * @param pool The pool * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storePool(DsPool pool, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_POOL); if (pool.getMinPoolSize() != null && (pool.hasExpression(XML.ELEMENT_MIN_POOL_SIZE) || !Defaults.MIN_POOL_SIZE.equals(pool.getMinPoolSize()))) { writer.writeStartElement(XML.ELEMENT_MIN_POOL_SIZE); writer.writeCharacters(pool.getValue(XML.ELEMENT_MIN_POOL_SIZE, pool.getMinPoolSize().toString())); writer.writeEndElement(); } if (pool.getInitialPoolSize() != null) { writer.writeStartElement(XML.ELEMENT_INITIAL_POOL_SIZE); writer.writeCharacters(pool.getValue(XML.ELEMENT_INITIAL_POOL_SIZE, pool.getInitialPoolSize().toString())); writer.writeEndElement(); } if (pool.getMaxPoolSize() != null && (pool.hasExpression(XML.ELEMENT_MAX_POOL_SIZE) || !Defaults.MAX_POOL_SIZE.equals(pool.getMaxPoolSize()))) { writer.writeStartElement(XML.ELEMENT_MAX_POOL_SIZE); writer.writeCharacters(pool.getValue(XML.ELEMENT_MAX_POOL_SIZE, pool.getMaxPoolSize().toString())); writer.writeEndElement(); } if (pool.isPrefill() != null && (pool.hasExpression(XML.ELEMENT_PREFILL) || !Defaults.PREFILL.equals(pool.isPrefill()))) { writer.writeStartElement(XML.ELEMENT_PREFILL); writer.writeCharacters(pool.getValue(XML.ELEMENT_PREFILL, pool.isPrefill().toString())); writer.writeEndElement(); } if (pool.getFlushStrategy() != null && (pool.hasExpression(XML.ELEMENT_FLUSH_STRATEGY) || !Defaults.FLUSH_STRATEGY.equals(pool.getFlushStrategy()))) { writer.writeStartElement(XML.ELEMENT_FLUSH_STRATEGY); writer.writeCharacters(pool.getValue(XML.ELEMENT_FLUSH_STRATEGY, pool.getFlushStrategy().toString())); writer.writeEndElement(); } if (pool.getCapacity() != null) storeCapacity(pool.getCapacity(), writer); if (pool.getConnectionListener() != null) { writer.writeStartElement(XML.ELEMENT_CONNECTION_LISTENER); writer.writeAttribute(XML.ATTRIBUTE_CLASS_NAME, pool.getConnectionListener().getValue(XML.ATTRIBUTE_CLASS_NAME, pool.getConnectionListener().getClassName())); if (!pool.getConnectionListener().getConfigPropertiesMap().isEmpty()) { Iterator<Map.Entry<String, String>> it = pool.getConnectionListener().getConfigPropertiesMap().entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); writer.writeStartElement(XML.ELEMENT_CONFIG_PROPERTY); writer.writeAttribute(XML.ATTRIBUTE_NAME, entry.getKey()); writer.writeCharacters(pool.getConnectionListener().getValue(XML.ELEMENT_CONFIG_PROPERTY, entry.getKey(), entry.getValue())); writer.writeEndElement(); } } writer.writeEndElement(); } writer.writeEndElement(); } /** * Store a XA pool * @param pool The pool * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeXaPool(DsXaPool pool, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_XA_POOL); if (pool.getMinPoolSize() != null && (pool.hasExpression(XML.ELEMENT_MIN_POOL_SIZE) || !Defaults.MIN_POOL_SIZE.equals(pool.getMinPoolSize()))) { writer.writeStartElement(XML.ELEMENT_MIN_POOL_SIZE); writer.writeCharacters(pool.getValue(XML.ELEMENT_MIN_POOL_SIZE, pool.getMinPoolSize().toString())); writer.writeEndElement(); } if (pool.getInitialPoolSize() != null) { writer.writeStartElement(XML.ELEMENT_INITIAL_POOL_SIZE); writer.writeCharacters(pool.getValue(XML.ELEMENT_INITIAL_POOL_SIZE, pool.getInitialPoolSize().toString())); writer.writeEndElement(); } if (pool.getMaxPoolSize() != null && (pool.hasExpression(XML.ELEMENT_MAX_POOL_SIZE) || !Defaults.MAX_POOL_SIZE.equals(pool.getMaxPoolSize()))) { writer.writeStartElement(XML.ELEMENT_MAX_POOL_SIZE); writer.writeCharacters(pool.getValue(XML.ELEMENT_MAX_POOL_SIZE, pool.getMaxPoolSize().toString())); writer.writeEndElement(); } if (pool.isPrefill() != null && (pool.hasExpression(XML.ELEMENT_PREFILL) || !Defaults.PREFILL.equals(pool.isPrefill()))) { writer.writeStartElement(XML.ELEMENT_PREFILL); writer.writeCharacters(pool.getValue(XML.ELEMENT_PREFILL, pool.isPrefill().toString())); writer.writeEndElement(); } if (pool.getFlushStrategy() != null && (pool.hasExpression(XML.ELEMENT_FLUSH_STRATEGY) || !Defaults.FLUSH_STRATEGY.equals(pool.getFlushStrategy()))) { writer.writeStartElement(XML.ELEMENT_FLUSH_STRATEGY); writer.writeCharacters(pool.getValue(XML.ELEMENT_FLUSH_STRATEGY, pool.getFlushStrategy().toString())); writer.writeEndElement(); } if (pool.getCapacity() != null) storeCapacity(pool.getCapacity(), writer); if (pool.getConnectionListener() != null) { storeExtension(pool.getConnectionListener(), writer, XML.ELEMENT_CONNECTION_LISTENER); } if (pool.isIsSameRmOverride() != null) { writer.writeStartElement(XML.ELEMENT_IS_SAME_RM_OVERRIDE); writer.writeCharacters(pool.getValue(XML.ELEMENT_IS_SAME_RM_OVERRIDE, pool.isIsSameRmOverride().toString())); writer.writeEndElement(); } if (pool.isPadXid() != null && (pool.hasExpression(XML.ELEMENT_PAD_XID) || !Defaults.PAD_XID.equals(pool.isPadXid()))) { writer.writeStartElement(XML.ELEMENT_PAD_XID); writer.writeCharacters(pool.getValue(XML.ELEMENT_PAD_XID, pool.isPadXid().toString())); writer.writeEndElement(); } if (pool.isWrapXaResource() != null && (pool.hasExpression(XML.ELEMENT_WRAP_XA_RESOURCE) || !Defaults.WRAP_XA_RESOURCE.equals(pool.isWrapXaResource()))) { writer.writeStartElement(XML.ELEMENT_WRAP_XA_RESOURCE); writer.writeCharacters(pool.getValue(XML.ELEMENT_WRAP_XA_RESOURCE, pool.isWrapXaResource().toString())); writer.writeEndElement(); } writer.writeEndElement(); } /** * Store security * @param s The security * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeSecurity(DsSecurity s, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_SECURITY); if (s.getUserName() != null) { writer.writeStartElement(XML.ELEMENT_USER_NAME); writer.writeCharacters(s.getValue(XML.ELEMENT_USER_NAME, s.getUserName())); writer.writeEndElement(); writer.writeStartElement(XML.ELEMENT_PASSWORD); writer.writeCharacters(s.getValue(XML.ELEMENT_PASSWORD, s.getPassword())); writer.writeEndElement(); } else if (s.getSecurityDomain() != null) { writer.writeStartElement(XML.ELEMENT_SECURITY_DOMAIN); writer.writeCharacters(s.getValue(XML.ELEMENT_SECURITY_DOMAIN, s.getSecurityDomain())); writer.writeEndElement(); } if (s.getReauthPlugin() != null) { storeExtension(s.getReauthPlugin(), writer, XML.ELEMENT_REAUTH_PLUGIN); } writer.writeEndElement(); } /** * Store validation * @param v The validation * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeValidation(Validation v, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_VALIDATION); if (v.getValidConnectionChecker() != null) { storeExtension(v.getValidConnectionChecker(), writer, XML.ELEMENT_VALID_CONNECTION_CHECKER); } if (v.getCheckValidConnectionSql() != null) { writer.writeStartElement(XML.ELEMENT_CHECK_VALID_CONNECTION_SQL); writer.writeCharacters(v.getValue(XML.ELEMENT_CHECK_VALID_CONNECTION_SQL, v.getCheckValidConnectionSql())); writer.writeEndElement(); } if (v.isValidateOnMatch() != null) { writer.writeStartElement(XML.ELEMENT_VALIDATE_ON_MATCH); writer.writeCharacters(v.getValue(XML.ELEMENT_VALIDATE_ON_MATCH, v.isValidateOnMatch().toString())); writer.writeEndElement(); } if (v.isBackgroundValidation() != null) { writer.writeStartElement(XML.ELEMENT_BACKGROUND_VALIDATION); writer.writeCharacters(v.getValue(XML.ELEMENT_BACKGROUND_VALIDATION, v.isBackgroundValidation().toString())); writer.writeEndElement(); } if (v.getBackgroundValidationMillis() != null) { writer.writeStartElement(XML.ELEMENT_BACKGROUND_VALIDATION_MILLIS); writer.writeCharacters(v.getValue(XML.ELEMENT_BACKGROUND_VALIDATION_MILLIS, v.getBackgroundValidationMillis().toString())); writer.writeEndElement(); } if (v.isUseFastFail() != null) { writer.writeStartElement(XML.ELEMENT_USE_FAST_FAIL); writer.writeCharacters(v.getValue(XML.ELEMENT_USE_FAST_FAIL, v.isUseFastFail().toString())); writer.writeEndElement(); } if (v.getStaleConnectionChecker() != null) { storeExtension(v.getStaleConnectionChecker(), writer, XML.ELEMENT_STALE_CONNECTION_CHECKER); } if (v.getExceptionSorter() != null) { storeExtension(v.getExceptionSorter(), writer, XML.ELEMENT_EXCEPTION_SORTER); } writer.writeEndElement(); } /** * Store timeout * @param t The timeout * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeTimeout(Timeout t, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_TIMEOUT); if (t.getBlockingTimeoutMillis() != null) { writer.writeStartElement(XML.ELEMENT_BLOCKING_TIMEOUT_MILLIS); writer.writeCharacters(t.getValue(XML.ELEMENT_BLOCKING_TIMEOUT_MILLIS, t.getBlockingTimeoutMillis().toString())); writer.writeEndElement(); } if (t.getIdleTimeoutMinutes() != null) { writer.writeStartElement(XML.ELEMENT_IDLE_TIMEOUT_MINUTES); writer.writeCharacters(t.getValue(XML.ELEMENT_IDLE_TIMEOUT_MINUTES, t.getIdleTimeoutMinutes().toString())); writer.writeEndElement(); } if (t.isSetTxQueryTimeout() != null && Boolean.TRUE.equals(t.isSetTxQueryTimeout())) { writer.writeEmptyElement(XML.ELEMENT_SET_TX_QUERY_TIMEOUT); } if (t.getQueryTimeout() != null) { writer.writeStartElement(XML.ELEMENT_QUERY_TIMEOUT); writer.writeCharacters(t.getValue(XML.ELEMENT_QUERY_TIMEOUT, t.getQueryTimeout().toString())); writer.writeEndElement(); } if (t.getUseTryLock() != null) { writer.writeStartElement(XML.ELEMENT_USE_TRY_LOCK); writer.writeCharacters(t.getValue(XML.ELEMENT_USE_TRY_LOCK, t.getUseTryLock().toString())); writer.writeEndElement(); } if (t.getAllocationRetry() != null) { writer.writeStartElement(XML.ELEMENT_ALLOCATION_RETRY); writer.writeCharacters(t.getValue(XML.ELEMENT_ALLOCATION_RETRY, t.getAllocationRetry().toString())); writer.writeEndElement(); } if (t.getAllocationRetryWaitMillis() != null) { writer.writeStartElement(XML.ELEMENT_ALLOCATION_RETRY_WAIT_MILLIS); writer.writeCharacters(t.getValue(XML.ELEMENT_ALLOCATION_RETRY_WAIT_MILLIS, t.getAllocationRetryWaitMillis().toString())); writer.writeEndElement(); } if (t.getXaResourceTimeout() != null) { writer.writeStartElement(XML.ELEMENT_XA_RESOURCE_TIMEOUT); writer.writeCharacters(t.getValue(XML.ELEMENT_XA_RESOURCE_TIMEOUT, t.getXaResourceTimeout().toString())); writer.writeEndElement(); } writer.writeEndElement(); } /** * Store statement * @param s The statement * @param writer The writer * @exception Exception Thrown if an error occurs */ protected void storeStatement(Statement s, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_STATEMENT); if (s.getTrackStatements() != null) { writer.writeStartElement(XML.ELEMENT_TRACK_STATEMENTS); writer.writeCharacters(s.getValue(XML.ELEMENT_TRACK_STATEMENTS, s.getTrackStatements().toString())); writer.writeEndElement(); } if (s.getPreparedStatementsCacheSize() != null) { writer.writeStartElement(XML.ELEMENT_PREPARED_STATEMENT_CACHE_SIZE); writer.writeCharacters(s.getValue(XML.ELEMENT_PREPARED_STATEMENT_CACHE_SIZE, s.getPreparedStatementsCacheSize().toString())); writer.writeEndElement(); } if (s.isSharePreparedStatements() != null && Boolean.TRUE.equals(s.isSharePreparedStatements())) { writer.writeEmptyElement(XML.ELEMENT_SHARE_PREPARED_STATEMENTS); } writer.writeEndElement(); } /** * Store recovery * @param r The recovery * @param writer The writer * @exception Exception Thrown if an error occurs */ @Override protected void storeRecovery(Recovery r, XMLStreamWriter writer) throws Exception { writer.writeStartElement(XML.ELEMENT_RECOVERY); if (r.isNoRecovery() != null) writer.writeAttribute(XML.ATTRIBUTE_NO_RECOVERY, r.getValue(XML.ATTRIBUTE_NO_RECOVERY, r.isNoRecovery().toString())); if (r.getCredential() != null) { writer.writeStartElement(XML.ELEMENT_RECOVERY_CREDENTIAL); Credential c = (Credential)r.getCredential(); if (c.getUserName() != null) { writer.writeStartElement(XML.ELEMENT_USER_NAME); writer.writeCharacters(c.getValue(XML.ELEMENT_USER_NAME, c.getUserName())); writer.writeEndElement(); writer.writeStartElement(XML.ELEMENT_PASSWORD); writer.writeCharacters(c.getValue(XML.ELEMENT_PASSWORD, c.getPassword())); writer.writeEndElement(); } else { writer.writeStartElement(XML.ELEMENT_SECURITY_DOMAIN); writer.writeCharacters(c.getValue(XML.ELEMENT_SECURITY_DOMAIN, c.getSecurityDomain())); writer.writeEndElement(); } writer.writeEndElement(); } if (r.getPlugin() != null) { storeExtension(r.getPlugin(), writer, CommonXML.ELEMENT_RECOVERY_PLUGIN); } writer.writeEndElement(); } }