/*
 * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
//     17/10/2008-1.1  Michael O'Brien
//       - 251005: The default JNDI InitialContextFactory is modified from
//       OC4J: oracle.j2ee.rmi.RMIInitialContextFactory to
//       WebLogic: weblogic.jndi.WLInitialContextFactory
//     cdelahun - Bug 214534: changes for JMSPublishingTransportManager configuration
package org.eclipse.persistence.internal.sessions.factories;

// javase imports
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;

// EclipseLink imports
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.sessions.factories.model.SessionConfigs;
import org.eclipse.persistence.internal.sessions.factories.model.event.SessionEventManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.DefaultSessionLogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.JavaLogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.LogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.LoggingOptionsConfig;
import org.eclipse.persistence.internal.sessions.factories.model.log.ServerLogConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.DatabaseLoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.EISLoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.LoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.StructConverterConfig;
import org.eclipse.persistence.internal.sessions.factories.model.login.XMLLoginConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.CustomServerPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.GlassfishPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.JBossPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.NetWeaver_7_1_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.Oc4jPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.ServerPlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebLogic_6_1_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebLogic_7_0_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebLogic_8_1_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebSphere_4_0_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebSphere_5_0_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebSphere_5_1_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.platform.WebSphere_6_0_PlatformConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.ConnectionPolicyConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.ConnectionPoolConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.PoolsConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.ReadConnectionPoolConfig;
import org.eclipse.persistence.internal.sessions.factories.model.pool.WriteConnectionPoolConfig;
import org.eclipse.persistence.internal.sessions.factories.model.project.ProjectClassConfig;
import org.eclipse.persistence.internal.sessions.factories.model.project.ProjectConfig;
import org.eclipse.persistence.internal.sessions.factories.model.project.ProjectXMLConfig;
import org.eclipse.persistence.internal.sessions.factories.model.property.PropertyConfig;
import org.eclipse.persistence.internal.sessions.factories.model.rcm.RemoteCommandManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.rcm.command.CommandsConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.DefaultSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.NativeSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.SequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.SequencingConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.TableSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.UnaryTableSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.sequencing.XMLFileSequenceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.DatabaseSessionConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.ServerSessionConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.SessionBrokerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.session.SessionConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.JMSPublishingTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.JMSTopicTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.RMIIIOPTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.RMITransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.SunCORBATransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.TransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.UserDefinedTransportManagerConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.discovery.DiscoveryConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.naming.JNDINamingServiceConfig;
import org.eclipse.persistence.internal.sessions.factories.model.transport.naming.RMIRegistryNamingServiceConfig;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.mappings.converters.ObjectTypeConverter;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.oxm.XMLLogin;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeDirectCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.platform.DOMPlatform;
import org.eclipse.persistence.oxm.schema.XMLSchemaClassPathReference;
import org.eclipse.persistence.sessions.JNDIConnector;
import org.eclipse.persistence.sessions.Session;
import static org.eclipse.persistence.sessions.factories.XMLSessionConfigLoader.ECLIPSELINK_SESSIONS_SCHEMA;

/**
 * INTERNAL:
 * This class was generated by the TopLink project class generator.
 * It stores the meta-data (descriptors) that define the session.xml file
 *
 * Modifications were needed to the generated code, therefore, this project
 * should not be regenerated under any circumstances. Any changes must be
 * done manually.
 */
public class XMLSessionConfigProject extends org.eclipse.persistence.sessions.Project {
    // Default null values
    public static final boolean IS_ASYNCHRONOUS_DEFAULT = true;
    public static final boolean REMOVE_CONNECTION_ON_ERROR_DEFAULT = true;
    public static final boolean CACHE_SYNC_DEFAULT = false;
    public static final boolean NATIVE_SEQUENCING_DEFAULT = false;
    public static final boolean BIND_ALL_PARAMETERS_DEFAULT = false;
    public static final boolean CACHE_ALL_STATEMENTS_DEFAULT = false;
    public static final boolean BYTE_ARRAY_BINDING_DEFAULT = true;
    public static final boolean STRING_BINDING_DEFAULT = false;
    public static final boolean STREAMS_FOR_BINDING_DEFAULT = false;
    public static final boolean FORCE_FIELD_NAMES_TO_UPPERCASE_DEFAULT = false;
    public static final boolean OPTIMIZE_DATA_CONVERSION_DEFAULT = true;
    public static final boolean TRIM_STRINGS_DEFAULT = true;
    public static final boolean BATCH_WRITING_DEFAULT = false;
    public static final boolean JDBC20_BATCH_WRITING_DEFAULT = true;
    public static final boolean NATIVE_SQL_DEFAULT = false;
    public static final boolean ENABLE_RUNTIME_SERVICES_DEFAULT = true;
    public static final boolean ENABLE_JTA_DEFAULT = true;
    public static final boolean EXTERNAL_CONNECTION_POOL_DEFAULT = false;
    public static final boolean EXTERNAL_TRANSACTION_CONTROLLER_DEFAULT = false;
    public static final boolean EXCLUSIVE_DEFAULT = true;
    public static final int SEQUENCE_PREALLOCATION_SIZE_DEFAULT = 50;
    public static final int MAX_BATCH_WRITING_SIZE_DEFAULT = 32000;
    public static final int MULTICAST_PORT_DEFAULT = 3121;
    public static final int ANNOUNCEMENT_DELAY_DEFAULT = 1000;
    public static final int MULTICAST_PORT_RMI_CLUSTERING_DEFAULT = 6018;
    public static final int PACKET_TIME_TO_LIVE_DEFAULT = 2;
    public static final int CONNECTION_POOL_MAX_DEFAULT = 10;
    public static final int CONNECTION_POOL_MIN_DEFAULT = 5;
    public static final int READ_CONNECTION_POOL_MAX_DEFAULT = 2;
    public static final int READ_CONNECTION_POOL_MIN_DEFAULT = 2;

    //the default is composite name for consistency with previous TopLink versions
    public static final int DATASOURCE_LOOKUP_TYPE_DEFAULT = JNDIConnector.COMPOSITE_NAME_LOOKUP;
    public static final String SEQUENCE_TABLE_DEFAULT = "SEQUENCE";
    public static final String SEQUENCE_NAME_FIELD_DEFAULT = "SEQ_NAME";
    public static final String SEQUENCE_COUNTER_FIELD_DEFAULT = "SEQ_COUNT";
    public static final String LOG_LEVEL_DEFAULT = "info";
    public static final String MULTICAST_GROUP_ADDRESS_DEFAULT = "226.10.12.64";
    public static final String MULTICAST_GROUP_ADDRESS_RMI_CLUSTERING = "226.18.6.18";
    public static final String TOPIC_CONNECTION_FACTORY_NAME_DEFAULT = "jms/TopLinkTopicConnectionFactory";
    public static final String TOPIC_NAME_DEFAULT = "jms/TopLinkTopic";
    public static final String USERNAME_DEFAULT = "admin";
    public static final String PASSWORD_DEFAULT = "password";
    public static final String ENCRYPTION_CLASS_DEFAULT = "org.eclipse.persistence.internal.security.JCEEncryptor";
    public static final String INITIAL_CONTEXT_FACTORY_NAME_DEFAULT = "weblogic.jndi.WLInitialContextFactory";
    public static final String SEND_MODE_DEFAULT = "Asynchronous";
    public static final String CHANNEL_DEFAULT = "TopLinkCommandChannel";
    public static final String ON_CONNECTION_ERROR_DEFAULT = "DiscardConnection";
    public static final String CUSTOM_SERVER_PLATFORM_CLASS_DEFAULT = "org.eclipse.persistence.platform.server.CustomServerPlatform";
    public static final boolean EXCLUSIVE_CONNECTION_DEFAULT = false;
    public static final boolean LAZY_DEFAULT = true;

    public XMLSessionConfigProject() {
        setName("XMLSessionConfigProject");
        addDescriptor(buildSessionConfigsDescriptor());
        addDescriptor(buildSunCORBATransportManagerConfigDescriptor());
        addDescriptor(buildSessionEventManagerConfigDescriptor());
        addDescriptor(buildDefaultSessionLogConfigDescriptor());
        addDescriptor(buildLoggingOptionsConfigDescriptor());
        addDescriptor(buildJavaLogConfigDescriptor());
        addDescriptor(buildServerLogConfigDescriptor());
        addDescriptor(buildLogConfigDescriptor());
        addDescriptor(buildDatabaseLoginConfigDescriptor());
        addDescriptor(buildEISLoginConfigDescriptor());
        addDescriptor(buildXMLLoginConfigDescriptor());
        addDescriptor(buildLoginConfigDescriptor());
        addDescriptor(buildConnectionPolicyConfigDescriptor());
        addDescriptor(buildConnectionPoolConfigDescriptor());
        addDescriptor(buildPoolsConfigDescriptor());
        addDescriptor(buildReadConnectionPoolConfigDescriptor());
        addDescriptor(buildWriteConnectionPoolConfigDescriptor());
        addDescriptor(buildRemoteCommandManagerConfigDescriptor());
        addDescriptor(buildCommandsConfigDescriptor());
        addDescriptor(buildDatabaseSessionConfigDescriptor());
        addDescriptor(buildServerSessionConfigDescriptor());
        addDescriptor(buildSessionBrokerConfigDescriptor());
        addDescriptor(buildSessionConfigDescriptor());
        addDescriptor(buildJMSTopicTransportManagerConfigDescriptor());
        addDescriptor(buildJMSPublishingTransportManagerConfigDescriptor());
        addDescriptor(buildRMIIIOPTransportManagerConfigDescriptor());
        addDescriptor(buildRMITransportManagerConfigDescriptor());
        addDescriptor(buildTransportManagerConfigDescriptor());
        addDescriptor(buildUserDefinedTransportManagerConfigDescriptor());
        addDescriptor(buildDiscoveryConfigDescriptor());
        addDescriptor(buildJNDINamingServiceConfigDescriptor());
        addDescriptor(buildPropertyConfigDescriptor());
        addDescriptor(buildRMIRegistryNamingServiceConfigDescriptor());
        addDescriptor(buildProjectConfigDescriptor());
        addDescriptor(buildProjectClassConfigDescriptor());
        addDescriptor(buildProjectXMLConfigDescriptor());
        addDescriptor(buildStructConverterConfigDescriptor());

        // sequences
        addDescriptor(buildSequencingConfigDescriptor());
        addDescriptor(buildSequenceConfigDescriptor());
        addDescriptor(buildDefaultSequenceConfigDescriptor());
        addDescriptor(buildNativeSequenceConfigDescriptor());
        addDescriptor(buildTableSequenceConfigDescriptor());
        addDescriptor(buildUnaryTableSequenceConfigDescriptor());
        addDescriptor(buildXMLFileSequenceConfigDescriptor());

        // platforms
        addDescriptor(buildServerPlatformConfigDescriptor());
        addDescriptor(buildCustomServerPlatformConfigDescriptor());
        addDescriptor(buildServerPlatformConfigDescriptorFor(Oc4jPlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(GlassfishPlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebLogic_6_1_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebLogic_7_0_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebLogic_8_1_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebSphere_4_0_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebSphere_5_0_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebSphere_5_1_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(WebSphere_6_0_PlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(JBossPlatformConfig.class));
        addDescriptor(buildServerPlatformConfigDescriptorFor(NetWeaver_7_1_PlatformConfig.class));

        // Set the namespaces on all descriptors.
        NamespaceResolver namespaceResolver = new NamespaceResolver();
        namespaceResolver.put("xsi", W3C_XML_SCHEMA_INSTANCE_NS_URI);
        namespaceResolver.put("xsd", W3C_XML_SCHEMA_NS_URI);

        for (Iterator descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
            XMLDescriptor descriptor = (XMLDescriptor)descriptors.next();
            descriptor.setNamespaceResolver(namespaceResolver);
        }

        XMLLogin xmlLogin = new XMLLogin();
        DOMPlatform platform = new DOMPlatform();
        xmlLogin.setDatasourcePlatform(platform);
        this.setDatasourceLogin(xmlLogin);
    }


    public ClassDescriptor buildCommandsConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(CommandsConfig.class);

        XMLDirectMapping cacheSyncMapping = new XMLDirectMapping();
        cacheSyncMapping.setAttributeName("m_cacheSync");
        cacheSyncMapping.setGetMethodName("getCacheSync");
        cacheSyncMapping.setSetMethodName("setCacheSync");
        cacheSyncMapping.setXPath("cache-sync/text()");
        cacheSyncMapping.setNullValue(Boolean.valueOf(CACHE_SYNC_DEFAULT));
        descriptor.addMapping(cacheSyncMapping);

        return descriptor;
    }

    public ClassDescriptor buildConnectionPolicyConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ConnectionPolicyConfig.class);

        XMLDirectMapping exclusiveConnectionMapping = new XMLDirectMapping();
        exclusiveConnectionMapping.setAttributeName("m_useExclusiveConnection");
        exclusiveConnectionMapping.setGetMethodName("getUseExclusiveConnection");
        exclusiveConnectionMapping.setSetMethodName("setUseExclusiveConnection");
        exclusiveConnectionMapping.setXPath("exclusive-connection/text()");
        exclusiveConnectionMapping.setNullValue(Boolean.valueOf(EXCLUSIVE_CONNECTION_DEFAULT));
        descriptor.addMapping(exclusiveConnectionMapping);

        XMLDirectMapping lazyMapping = new XMLDirectMapping();
        lazyMapping.setAttributeName("m_lazy");
        lazyMapping.setGetMethodName("getLazy");
        lazyMapping.setSetMethodName("setLazy");
        lazyMapping.setXPath("lazy/text()");
        lazyMapping.setNullValue(Boolean.valueOf(LAZY_DEFAULT));
        descriptor.addMapping(lazyMapping);

        return descriptor;
    }

    public ClassDescriptor buildConnectionPoolConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ConnectionPoolConfig.class);

        XMLDirectMapping nameMapping = new XMLDirectMapping();
        nameMapping.setAttributeName("m_name");
        nameMapping.setGetMethodName("getName");
        nameMapping.setSetMethodName("setName");
        nameMapping.setXPath("name/text()");
        descriptor.addMapping(nameMapping);

        XMLDirectMapping maxConnectionsMapping = new XMLDirectMapping();
        maxConnectionsMapping.setAttributeName("m_maxConnections");
        maxConnectionsMapping.setGetMethodName("getMaxConnections");
        maxConnectionsMapping.setSetMethodName("setMaxConnections");
        maxConnectionsMapping.setXPath("max-connections/text()");
        maxConnectionsMapping.setNullValue(Integer.valueOf(CONNECTION_POOL_MAX_DEFAULT));
        descriptor.addMapping(maxConnectionsMapping);

        XMLDirectMapping minConnectionsMapping = new XMLDirectMapping();
        minConnectionsMapping.setAttributeName("m_minConnections");
        minConnectionsMapping.setGetMethodName("getMinConnections");
        minConnectionsMapping.setSetMethodName("setMinConnections");
        minConnectionsMapping.setXPath("min-connections/text()");
        minConnectionsMapping.setNullValue(Integer.valueOf(CONNECTION_POOL_MIN_DEFAULT));
        descriptor.addMapping(minConnectionsMapping);

        XMLCompositeObjectMapping loginConfigMapping = new XMLCompositeObjectMapping();
        loginConfigMapping.setReferenceClass(LoginConfig.class);
        loginConfigMapping.setAttributeName("m_loginConfig");
        loginConfigMapping.setGetMethodName("getLoginConfig");
        loginConfigMapping.setSetMethodName("setLoginConfig");
        loginConfigMapping.setXPath("login");
        descriptor.addMapping(loginConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildCustomServerPlatformConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(CustomServerPlatformConfig.class);
        descriptor.getInheritancePolicy().setParentClass(ServerPlatformConfig.class);

        XMLDirectMapping serverClassMapping = new XMLDirectMapping();
        serverClassMapping.setAttributeName("m_serverClassName");
        serverClassMapping.setGetMethodName("getServerClassName");
        serverClassMapping.setSetMethodName("setServerClassName");
        serverClassMapping.setXPath("server-class/text()");
        serverClassMapping.setNullValue(CUSTOM_SERVER_PLATFORM_CLASS_DEFAULT);
        descriptor.addMapping(serverClassMapping);

        XMLDirectMapping externalTransactionControllerMapping = new XMLDirectMapping();
        externalTransactionControllerMapping.setAttributeName("m_externalTransactionControllerClass");
        externalTransactionControllerMapping.setGetMethodName("getExternalTransactionControllerClass");
        externalTransactionControllerMapping.setSetMethodName("setExternalTransactionControllerClass");
        externalTransactionControllerMapping.setXPath("external-transaction-controller-class/text()");
        descriptor.addMapping(externalTransactionControllerMapping);

        return descriptor;
    }

    public ClassDescriptor buildDatabaseLoginConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(DatabaseLoginConfig.class);
        descriptor.getInheritancePolicy().setParentClass(LoginConfig.class);

        XMLDirectMapping driverClassMapping = new XMLDirectMapping();
        driverClassMapping.setAttributeName("m_driverClass");
        driverClassMapping.setGetMethodName("getDriverClass");
        driverClassMapping.setSetMethodName("setDriverClass");
        driverClassMapping.setXPath("driver-class/text()");
        descriptor.addMapping(driverClassMapping);

        XMLDirectMapping connectionURLMapping = new XMLDirectMapping();
        connectionURLMapping.setAttributeName("m_connectionURL");
        connectionURLMapping.setGetMethodName("getConnectionURL");
        connectionURLMapping.setSetMethodName("setConnectionURL");
        connectionURLMapping.setXPath("connection-url/text()");
        descriptor.addMapping(connectionURLMapping);

        XMLDirectMapping datasourceMapping = new XMLDirectMapping();
        datasourceMapping.setAttributeName("m_datasource");
        datasourceMapping.setGetMethodName("getDatasource");
        datasourceMapping.setSetMethodName("setDatasource");
        datasourceMapping.setXPath("datasource/text()");
        descriptor.addMapping(datasourceMapping);

        XMLDirectMapping lookupTypeMapping = new XMLDirectMapping();
        lookupTypeMapping.setAttributeName("m_lookupType");
        lookupTypeMapping.setGetMethodName("getLookupType");
        lookupTypeMapping.setSetMethodName("setLookupType");
        lookupTypeMapping.setNullValue(Integer.valueOf(DATASOURCE_LOOKUP_TYPE_DEFAULT));
        ObjectTypeConverter converter = new ObjectTypeConverter();
        converter.addConversionValue("string", Integer.valueOf(JNDIConnector.STRING_LOOKUP));
        converter.addConversionValue("composite-name", Integer.valueOf(JNDIConnector.COMPOSITE_NAME_LOOKUP));
        converter.addConversionValue("compound-name", Integer.valueOf(JNDIConnector.COMPOUND_NAME_LOOKUP));
        lookupTypeMapping.setConverter(converter);
        lookupTypeMapping.setXPath("datasource/@lookup");
        descriptor.addMapping(lookupTypeMapping);

        XMLDirectMapping bindAllParametersMapping = new XMLDirectMapping();
        bindAllParametersMapping.setAttributeName("m_bindAllParameters");
        bindAllParametersMapping.setGetMethodName("getBindAllParameters");
        bindAllParametersMapping.setSetMethodName("setBindAllParameters");
        bindAllParametersMapping.setXPath("bind-all-parameters/text()");
        bindAllParametersMapping.setNullValue(Boolean.valueOf(BIND_ALL_PARAMETERS_DEFAULT));
        descriptor.addMapping(bindAllParametersMapping);

        XMLDirectMapping cacheAllStatementsMapping = new XMLDirectMapping();
        cacheAllStatementsMapping.setAttributeName("m_cacheAllStatements");
        cacheAllStatementsMapping.setGetMethodName("getCacheAllStatements");
        cacheAllStatementsMapping.setSetMethodName("setCacheAllStatements");
        cacheAllStatementsMapping.setXPath("cache-all-statements/text()");
        cacheAllStatementsMapping.setNullValue(Boolean.valueOf(CACHE_ALL_STATEMENTS_DEFAULT));
        descriptor.addMapping(cacheAllStatementsMapping);

        XMLDirectMapping byteArrayBindingMapping = new XMLDirectMapping();
        byteArrayBindingMapping.setAttributeName("m_byteArrayBinding");
        byteArrayBindingMapping.setGetMethodName("getByteArrayBinding");
        byteArrayBindingMapping.setSetMethodName("setByteArrayBinding");
        byteArrayBindingMapping.setXPath("byte-array-binding/text()");
        byteArrayBindingMapping.setNullValue(Boolean.valueOf(BYTE_ARRAY_BINDING_DEFAULT));
        descriptor.addMapping(byteArrayBindingMapping);

        XMLDirectMapping stringBindingMapping = new XMLDirectMapping();
        stringBindingMapping.setAttributeName("m_stringBinding");
        stringBindingMapping.setGetMethodName("getStringBinding");
        stringBindingMapping.setSetMethodName("setStringBinding");
        stringBindingMapping.setXPath("string-binding/text()");
        stringBindingMapping.setNullValue(Boolean.valueOf(STRING_BINDING_DEFAULT));
        descriptor.addMapping(stringBindingMapping);

        XMLDirectMapping streamsForBindingMapping = new XMLDirectMapping();
        streamsForBindingMapping.setAttributeName("m_streamsForBinding");
        streamsForBindingMapping.setGetMethodName("getStreamsForBinding");
        streamsForBindingMapping.setSetMethodName("setStreamsForBinding");
        streamsForBindingMapping.setXPath("streams-for-binding/text()");
        streamsForBindingMapping.setNullValue(Boolean.valueOf(STREAMS_FOR_BINDING_DEFAULT));
        descriptor.addMapping(streamsForBindingMapping);

        XMLDirectMapping forceFieldNamesToUppercaseMapping = new XMLDirectMapping();
        forceFieldNamesToUppercaseMapping.setAttributeName("m_forceFieldNamesToUppercase");
        forceFieldNamesToUppercaseMapping.setGetMethodName("getForceFieldNamesToUppercase");
        forceFieldNamesToUppercaseMapping.setSetMethodName("setForceFieldNamesToUppercase");
        forceFieldNamesToUppercaseMapping.setXPath("force-field-names-to-upper-case/text()");
        forceFieldNamesToUppercaseMapping.setNullValue(Boolean.valueOf(FORCE_FIELD_NAMES_TO_UPPERCASE_DEFAULT));
        descriptor.addMapping(forceFieldNamesToUppercaseMapping);

        XMLDirectMapping optimizeDataConversionMapping = new XMLDirectMapping();
        optimizeDataConversionMapping.setAttributeName("m_optimizeDataConversion");
        optimizeDataConversionMapping.setGetMethodName("getOptimizeDataConversion");
        optimizeDataConversionMapping.setSetMethodName("setOptimizeDataConversion");
        optimizeDataConversionMapping.setXPath("optimize-data-conversion/text()");
        optimizeDataConversionMapping.setNullValue(Boolean.valueOf(OPTIMIZE_DATA_CONVERSION_DEFAULT));
        descriptor.addMapping(optimizeDataConversionMapping);

        XMLDirectMapping trimStringsMapping = new XMLDirectMapping();
        trimStringsMapping.setAttributeName("m_trimStrings");
        trimStringsMapping.setGetMethodName("getTrimStrings");
        trimStringsMapping.setSetMethodName("setTrimStrings");
        trimStringsMapping.setXPath("trim-strings/text()");
        trimStringsMapping.setNullValue(Boolean.valueOf(TRIM_STRINGS_DEFAULT));
        descriptor.addMapping(trimStringsMapping);

        XMLDirectMapping batchWritingMapping = new XMLDirectMapping();
        batchWritingMapping.setAttributeName("m_batchWriting");
        batchWritingMapping.setGetMethodName("getBatchWriting");
        batchWritingMapping.setSetMethodName("setBatchWriting");
        batchWritingMapping.setXPath("batch-writing/text()");
        batchWritingMapping.setNullValue(Boolean.valueOf(BATCH_WRITING_DEFAULT));
        descriptor.addMapping(batchWritingMapping);

        XMLDirectMapping jdbc20BatchWritingMapping = new XMLDirectMapping();
        jdbc20BatchWritingMapping.setAttributeName("m_jdbcBatchWriting");
        jdbc20BatchWritingMapping.setGetMethodName("getJdbcBatchWriting");
        jdbc20BatchWritingMapping.setSetMethodName("setJdbcBatchWriting");
        jdbc20BatchWritingMapping.setXPath("jdbc-batch-writing/text()");
        jdbc20BatchWritingMapping.setNullValue(Boolean.valueOf(JDBC20_BATCH_WRITING_DEFAULT));
        descriptor.addMapping(jdbc20BatchWritingMapping);

        XMLDirectMapping maxBatchWritingSizeMapping = new XMLDirectMapping();
        maxBatchWritingSizeMapping.setAttributeName("m_maxBatchWritingSize");
        maxBatchWritingSizeMapping.setGetMethodName("getMaxBatchWritingSize");
        maxBatchWritingSizeMapping.setSetMethodName("setMaxBatchWritingSize");
        maxBatchWritingSizeMapping.setXPath("max-batch-writing-size/text()");
        maxBatchWritingSizeMapping.setNullValue(Integer.valueOf(MAX_BATCH_WRITING_SIZE_DEFAULT));
        descriptor.addMapping(maxBatchWritingSizeMapping);

        XMLDirectMapping nativeSQLMapping = new XMLDirectMapping();
        nativeSQLMapping.setAttributeName("m_nativeSQL");
        nativeSQLMapping.setGetMethodName("getNativeSQL");
        nativeSQLMapping.setSetMethodName("setNativeSQL");
        nativeSQLMapping.setXPath("native-sql/text()");
        nativeSQLMapping.setNullValue(Boolean.valueOf(NATIVE_SQL_DEFAULT));
        descriptor.addMapping(nativeSQLMapping);

        XMLCompositeObjectMapping structConverterConfigMapping = new XMLCompositeObjectMapping();
        structConverterConfigMapping.setReferenceClass(StructConverterConfig.class);
        structConverterConfigMapping.setAttributeName("m_structConverterConfig");
        structConverterConfigMapping.setGetMethodName("getStructConverterConfig");
        structConverterConfigMapping.setSetMethodName("setStructConverterConfig");
        structConverterConfigMapping.setXPath("struct-converters");
        descriptor.addMapping(structConverterConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildDatabaseSessionConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(DatabaseSessionConfig.class);
        descriptor.getInheritancePolicy().setParentClass(SessionConfig.class);

        XMLCompositeObjectMapping primaryProject = new XMLCompositeObjectMapping();
        primaryProject.setReferenceClass(ProjectConfig.class);
        primaryProject.setAttributeName("m_primaryProject");
        primaryProject.setGetMethodName("getPrimaryProject");
        primaryProject.setSetMethodName("setPrimaryProject");
        primaryProject.setXPath("primary-project");
        descriptor.addMapping(primaryProject);

        XMLCompositeCollectionMapping additionalProjects = new XMLCompositeCollectionMapping();
        additionalProjects.setReferenceClass(ProjectConfig.class);
        additionalProjects.setAttributeName("m_additionalProjects");
        additionalProjects.setGetMethodName("getAdditionalProjects");
        additionalProjects.setSetMethodName("setAdditionalProjects");
        additionalProjects.setXPath("additional-project");
        descriptor.addMapping(additionalProjects);

        XMLCompositeObjectMapping loginConfigMapping = new XMLCompositeObjectMapping();
        loginConfigMapping.setReferenceClass(LoginConfig.class);
        loginConfigMapping.setAttributeName("m_loginConfig");
        loginConfigMapping.setGetMethodName("getLoginConfig");
        loginConfigMapping.setSetMethodName("setLoginConfig");
        loginConfigMapping.setXPath("login");
        descriptor.addMapping(loginConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildStructConverterConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(StructConverterConfig.class);

        XMLCompositeDirectCollectionMapping convertersMapping = new XMLCompositeDirectCollectionMapping();
        convertersMapping.setAttributeName("m_structConverterClasses");
        convertersMapping.setGetMethodName("getStructConverterClasses");
        convertersMapping.setSetMethodName("setStructConverterClasses");
        convertersMapping.setXPath("struct-converter/text()");
        descriptor.addMapping(convertersMapping);

        return descriptor;
    }

    public ClassDescriptor buildDefaultSessionLogConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(DefaultSessionLogConfig.class);
        descriptor.getInheritancePolicy().setParentClass(LogConfig.class);

        XMLDirectMapping logLevelMapping = new XMLDirectMapping();
        logLevelMapping.setAttributeName("m_logLevel");
        logLevelMapping.setGetMethodName("getLogLevel");
        logLevelMapping.setSetMethodName("setLogLevel");
        logLevelMapping.setXPath("log-level/text()");
        logLevelMapping.setNullValue(LOG_LEVEL_DEFAULT);
        descriptor.addMapping(logLevelMapping);

        XMLDirectMapping filenameMapping = new XMLDirectMapping();
        filenameMapping.setAttributeName("m_filename");
        filenameMapping.setGetMethodName("getFilename");
        filenameMapping.setSetMethodName("setFilename");
        filenameMapping.setXPath("file-name/text()");
        descriptor.addMapping(filenameMapping);

        XMLCompositeObjectMapping loginConfigMapping = new XMLCompositeObjectMapping();
        loginConfigMapping.setReferenceClass(LoggingOptionsConfig.class);
        loginConfigMapping.setAttributeName("m_loggingOptions");
        loginConfigMapping.setGetMethodName("getLoggingOptions");
        loginConfigMapping.setSetMethodName("setLoggingOptions");
        loginConfigMapping.setXPath("logging-options");
        descriptor.addMapping(loginConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildLoggingOptionsConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(LoggingOptionsConfig.class);

        XMLDirectMapping shouldLogExceptionStackTraceMapping = new XMLDirectMapping();
        shouldLogExceptionStackTraceMapping.setAttributeName("m_logExceptionStacktrace");
        shouldLogExceptionStackTraceMapping.setGetMethodName("getShouldLogExceptionStackTrace");
        shouldLogExceptionStackTraceMapping.setSetMethodName("setShouldLogExceptionStackTrace");
        shouldLogExceptionStackTraceMapping.setXPath("log-exception-stacktrace/text()");
        descriptor.addMapping(shouldLogExceptionStackTraceMapping);

        XMLDirectMapping shouldPrintThreadMapping = new XMLDirectMapping();
        shouldPrintThreadMapping.setAttributeName("m_printThread");
        shouldPrintThreadMapping.setGetMethodName("getShouldPrintThread");
        shouldPrintThreadMapping.setSetMethodName("setShouldPrintThread");
        shouldPrintThreadMapping.setXPath("print-thread/text()");
        descriptor.addMapping(shouldPrintThreadMapping);

        XMLDirectMapping shouldPrintSessionMapping = new XMLDirectMapping();
        shouldPrintSessionMapping.setAttributeName("m_printSession");
        shouldPrintSessionMapping.setGetMethodName("getShouldPrintSession");
        shouldPrintSessionMapping.setSetMethodName("setShouldPrintSession");
        shouldPrintSessionMapping.setXPath("print-session/text()");
        descriptor.addMapping(shouldPrintSessionMapping);

        XMLDirectMapping shouldPrintConnectionMapping = new XMLDirectMapping();
        shouldPrintConnectionMapping.setAttributeName("m_printConnection");
        shouldPrintConnectionMapping.setGetMethodName("getShouldPrintConnection");
        shouldPrintConnectionMapping.setSetMethodName("setShouldPrintConnection");
        shouldPrintConnectionMapping.setXPath("print-connection/text()");
        descriptor.addMapping(shouldPrintConnectionMapping);

        XMLDirectMapping shouldPrintDateMapping = new XMLDirectMapping();
        shouldPrintDateMapping.setAttributeName("m_printDate");
        shouldPrintDateMapping.setGetMethodName("getShouldPrintDate");
        shouldPrintDateMapping.setSetMethodName("setShouldPrintDate");
        shouldPrintDateMapping.setXPath("print-date/text()");
        descriptor.addMapping(shouldPrintDateMapping);

        return descriptor;
    }

    public ClassDescriptor buildDiscoveryConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(DiscoveryConfig.class);

        XMLDirectMapping multicastGroupAddressMapping = new XMLDirectMapping();
        multicastGroupAddressMapping.setAttributeName("m_multicastGroupAddress");
        multicastGroupAddressMapping.setGetMethodName("getMulticastGroupAddress");
        multicastGroupAddressMapping.setSetMethodName("setMulticastGroupAddress");
        multicastGroupAddressMapping.setXPath("multicast-group-address/text()");
        multicastGroupAddressMapping.setNullValue(MULTICAST_GROUP_ADDRESS_DEFAULT);
        descriptor.addMapping(multicastGroupAddressMapping);

        XMLDirectMapping multicastPortMapping = new XMLDirectMapping();
        multicastPortMapping.setAttributeName("m_multicastPort");
        multicastPortMapping.setGetMethodName("getMulticastPort");
        multicastPortMapping.setSetMethodName("setMulticastPort");
        multicastPortMapping.setXPath("multicast-port/text()");
        multicastPortMapping.setNullValue(Integer.valueOf(MULTICAST_PORT_DEFAULT));
        descriptor.addMapping(multicastPortMapping);

        XMLDirectMapping announcementDelayMapping = new XMLDirectMapping();
        announcementDelayMapping.setAttributeName("m_announcementDelay");
        announcementDelayMapping.setGetMethodName("getAnnouncementDelay");
        announcementDelayMapping.setSetMethodName("setAnnouncementDelay");
        announcementDelayMapping.setXPath("announcement-delay/text()");
        announcementDelayMapping.setNullValue(Integer.valueOf(ANNOUNCEMENT_DELAY_DEFAULT));
        descriptor.addMapping(announcementDelayMapping);

        XMLDirectMapping packetTimeToLiveMapping = new XMLDirectMapping();
        packetTimeToLiveMapping.setAttributeName("m_packetTimeToLive");
        packetTimeToLiveMapping.setGetMethodName("getPacketTimeToLive");
        packetTimeToLiveMapping.setSetMethodName("setPacketTimeToLive");
        packetTimeToLiveMapping.setXPath("packet-time-to-live/text()");
        packetTimeToLiveMapping.setNullValue(Integer.valueOf(PACKET_TIME_TO_LIVE_DEFAULT));
        descriptor.addMapping(packetTimeToLiveMapping);

        return descriptor;
    }

    public ClassDescriptor buildEISLoginConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(EISLoginConfig.class);
        descriptor.getInheritancePolicy().setParentClass(LoginConfig.class);

        XMLDirectMapping connectionSpecClassMapping = new XMLDirectMapping();
        connectionSpecClassMapping.setAttributeName("m_connectionSpecClass");
        connectionSpecClassMapping.setGetMethodName("getConnectionSpecClass");
        connectionSpecClassMapping.setSetMethodName("setConnectionSpecClass");
        connectionSpecClassMapping.setXPath("connection-spec-class/text()");
        descriptor.addMapping(connectionSpecClassMapping);

        XMLDirectMapping connectionFactoryURLMapping = new XMLDirectMapping();
        connectionFactoryURLMapping.setAttributeName("m_connectionFactoryURL");
        connectionFactoryURLMapping.setGetMethodName("getConnectionFactoryURL");
        connectionFactoryURLMapping.setSetMethodName("setConnectionFactoryURL");
        connectionFactoryURLMapping.setXPath("connection-factory-url/text()");
        descriptor.addMapping(connectionFactoryURLMapping);

        return descriptor;
    }

    public ClassDescriptor buildXMLLoginConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(XMLLoginConfig.class);
        descriptor.getInheritancePolicy().setParentClass(LoginConfig.class);

        return descriptor;
    }

    public ClassDescriptor buildJMSPublishingTransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(JMSPublishingTransportManagerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(TransportManagerConfig.class);

        XMLDirectMapping topicHostURLMapping = new XMLDirectMapping();
        topicHostURLMapping.setAttributeName("m_topicHostURL");
        topicHostURLMapping.setGetMethodName("getTopicHostURL");
        topicHostURLMapping.setSetMethodName("setTopicHostURL");
        topicHostURLMapping.setXPath("topic-host-url/text()");
        descriptor.addMapping(topicHostURLMapping);

        XMLDirectMapping topicConnectionFactoryNameMapping = new XMLDirectMapping();
        topicConnectionFactoryNameMapping.setAttributeName("m_topicConnectionFactoryName");
        topicConnectionFactoryNameMapping.setGetMethodName("getTopicConnectionFactoryName");
        topicConnectionFactoryNameMapping.setSetMethodName("setTopicConnectionFactoryName");
        topicConnectionFactoryNameMapping.setXPath("topic-connection-factory-name/text()");
        topicConnectionFactoryNameMapping.setNullValue(TOPIC_CONNECTION_FACTORY_NAME_DEFAULT);
        descriptor.addMapping(topicConnectionFactoryNameMapping);

        XMLDirectMapping topicNameMapping = new XMLDirectMapping();
        topicNameMapping.setAttributeName("m_topicName");
        topicNameMapping.setGetMethodName("getTopicName");
        topicNameMapping.setSetMethodName("setTopicName");
        topicNameMapping.setXPath("topic-name/text()");
        topicNameMapping.setNullValue(TOPIC_NAME_DEFAULT);
        descriptor.addMapping(topicNameMapping);

        XMLCompositeObjectMapping jndiNamingServiceConfigMapping = new XMLCompositeObjectMapping();
        jndiNamingServiceConfigMapping.setReferenceClass(JNDINamingServiceConfig.class);
        jndiNamingServiceConfigMapping.setAttributeName("m_jndiNamingServiceConfig");
        jndiNamingServiceConfigMapping.setGetMethodName("getJNDINamingServiceConfig");
        jndiNamingServiceConfigMapping.setSetMethodName("setJNDINamingServiceConfig");
        jndiNamingServiceConfigMapping.setXPath("jndi-naming-service");
        descriptor.addMapping(jndiNamingServiceConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildJMSTopicTransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(JMSTopicTransportManagerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(JMSPublishingTransportManagerConfig.class);

        return descriptor;
    }

    public ClassDescriptor buildJNDINamingServiceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(JNDINamingServiceConfig.class);

        XMLDirectMapping urlMapping = new XMLDirectMapping();
        urlMapping.setAttributeName("m_url");
        urlMapping.setGetMethodName("getURL");
        urlMapping.setSetMethodName("setURL");
        urlMapping.setXPath("url/text()");
        descriptor.addMapping(urlMapping);

        XMLDirectMapping usernameMapping = new XMLDirectMapping();
        usernameMapping.setAttributeName("m_username");
        usernameMapping.setGetMethodName("getUsername");
        usernameMapping.setSetMethodName("setUsername");
        usernameMapping.setXPath("user-name/text()");
        usernameMapping.setNullValue(USERNAME_DEFAULT);
        descriptor.addMapping(usernameMapping);

        XMLDirectMapping encryptionClassMapping = new XMLDirectMapping();
        encryptionClassMapping.setAttributeName("m_encryptionClass");
        encryptionClassMapping.setGetMethodName("getEncryptionClass");
        encryptionClassMapping.setSetMethodName("setEncryptionClass");
        encryptionClassMapping.setXPath("encryption-class/text()");
        encryptionClassMapping.setNullValue(ENCRYPTION_CLASS_DEFAULT);
        descriptor.addMapping(encryptionClassMapping);

        XMLDirectMapping passwordMapping = new XMLDirectMapping();
        passwordMapping.setAttributeName("m_encryptedPassword");
        passwordMapping.setGetMethodName("getEncryptedPassword");
        passwordMapping.setSetMethodName("setEncryptedPassword");
        passwordMapping.setXPath("password/text()");
        passwordMapping.setNullValue(PASSWORD_DEFAULT);
        descriptor.addMapping(passwordMapping);

        XMLDirectMapping initialContextFactoryNameMapping = new XMLDirectMapping();
        initialContextFactoryNameMapping.setAttributeName("m_initialContextFactoryName");
        initialContextFactoryNameMapping.setGetMethodName("getInitialContextFactoryName");
        initialContextFactoryNameMapping.setSetMethodName("setInitialContextFactoryName");
        initialContextFactoryNameMapping.setXPath("initial-context-factory-name/text()");
        initialContextFactoryNameMapping.setNullValue(INITIAL_CONTEXT_FACTORY_NAME_DEFAULT);
        descriptor.addMapping(initialContextFactoryNameMapping);

        XMLCompositeCollectionMapping propertiesMapping = new XMLCompositeCollectionMapping();
        propertiesMapping.setReferenceClass(PropertyConfig.class);
        propertiesMapping.setAttributeName("m_propertyConfigs");
        propertiesMapping.setGetMethodName("getPropertyConfigs");
        propertiesMapping.setSetMethodName("setPropertyConfigs");
        propertiesMapping.setXPath("property");
        descriptor.addMapping(propertiesMapping);

        return descriptor;
    }

    public ClassDescriptor buildJavaLogConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(JavaLogConfig.class);
        descriptor.getInheritancePolicy().setParentClass(LogConfig.class);

        XMLCompositeObjectMapping loginConfigMapping = new XMLCompositeObjectMapping();
        loginConfigMapping.setReferenceClass(LoggingOptionsConfig.class);
        loginConfigMapping.setAttributeName("m_loggingOptions");
        loginConfigMapping.setGetMethodName("getLoggingOptions");
        loginConfigMapping.setSetMethodName("setLoggingOptions");
        loginConfigMapping.setXPath("logging-options");
        descriptor.addMapping(loginConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildServerLogConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ServerLogConfig.class);
        descriptor.getInheritancePolicy().setParentClass(LogConfig.class);
        return descriptor;
    }

    public ClassDescriptor buildLogConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(LogConfig.class);

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(DefaultSessionLogConfig.class, "eclipselink-log");
        descriptor.getInheritancePolicy().addClassIndicator(JavaLogConfig.class, "java-log");
        descriptor.getInheritancePolicy().addClassIndicator(ServerLogConfig.class, "server-log");

        return descriptor;
    }

    public ClassDescriptor buildLoginConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(LoginConfig.class);

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(EISLoginConfig.class, "eis-login");
        descriptor.getInheritancePolicy().addClassIndicator(XMLLoginConfig.class, "xml-login");
        descriptor.getInheritancePolicy().addClassIndicator(DatabaseLoginConfig.class, "database-login");

        XMLDirectMapping platformClassMapping = new XMLDirectMapping();
        platformClassMapping.setAttributeName("m_platformClass");
        platformClassMapping.setGetMethodName("getPlatformClass");
        platformClassMapping.setSetMethodName("setPlatformClass");
        platformClassMapping.setXPath("platform-class/text()");
        platformClassMapping.setConverter(new Converter(){
            private Map platformList;
            private String oldPrefix = "oracle.toplink.";
            private String newPrefix = "org.eclipse.persistence.";
            private String oldOxmPrefix = oldPrefix + "ox.";
            private String newOxmPrefix = newPrefix + "oxm.";
            @Override
            public Object convertObjectValueToDataValue(Object objectValue, Session session){
                //if this code is writin out, write out the converted value
                return objectValue;
            }

            @Override
            public Object convertDataValueToObjectValue(Object dataValue, Session session){
                if(dataValue == null) {
                    return null;
                }
                // convert deprecated platforms to new platforms
                if(((String)dataValue).startsWith(oldPrefix)) {
                    if(((String)dataValue).startsWith(oldOxmPrefix)) {
                        dataValue = ((String)dataValue).replaceFirst(oldOxmPrefix, newOxmPrefix);
                    } else {
                        dataValue = ((String)dataValue).replaceFirst(oldPrefix, newPrefix);
                    }
                }
                Object result = platformList.get(dataValue);
                if (result == null){
                    return dataValue;
                }else{
                    return result;
                }
            }

            @Override
            public boolean isMutable(){
                return false;
            }

            @Override
            public void initialize(DatabaseMapping mapping, Session session){
                this.platformList = new HashMap();
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.AccessPlatform", "org.eclipse.persistence.platform.database.AccessPlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.AttunityPlatform", "org.eclipse.persistence.platform.database.AttunityPlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.CloudscapePlatform", "org.eclipse.persistence.platform.database.CloudscapePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.DatabasePlatform", "org.eclipse.persistence.platform.database.DatabasePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.DB2MainframePlatform", "org.eclipse.persistence.platform.database.DB2MainframePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.DB2Platform", "org.eclipse.persistence.platform.database.DB2Platform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.DBasePlatform", "org.eclipse.persistence.platform.database.DBasePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.HSQLPlatform", "org.eclipse.persistence.platform.database.HSQLPlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.InformixPlatform", "org.eclipse.persistence.platform.database.InformixPlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.OraclePlatform", "org.eclipse.persistence.platform.database.OraclePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.PointBasePlatform", "org.eclipse.persistence.platform.database.PointBasePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.SQLAnyWherePlatform", "org.eclipse.persistence.platform.database.SQLAnywherePlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.SQLServerPlatform", "org.eclipse.persistence.platform.database.SQLServerPlatform");
                this.platformList.put("org.eclipse.persistence.internal.databaseaccess.SybasePlatform", "org.eclipse.persistence.platform.database.SybasePlatform");
                this.platformList.put("org.eclipse.persistence.oraclespecific.Oracle8Platform", "org.eclipse.persistence.platform.database.oracle.Oracle8Platform");
                this.platformList.put("org.eclipse.persistence.oraclespecific.Oracle9Platform", "org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
                this.platformList.put("org.eclipse.persistence.platform.database.SQLAnyWherePlatform", "org.eclipse.persistence.platform.database.SQLAnywherePlatform");
            }

        });
        descriptor.addMapping(platformClassMapping);

        XMLDirectMapping usernameMapping = new XMLDirectMapping();
        usernameMapping.setAttributeName("m_username");
        usernameMapping.setGetMethodName("getUsername");
        usernameMapping.setSetMethodName("setUsername");
        usernameMapping.setXPath("user-name/text()");
        descriptor.addMapping(usernameMapping);

        XMLDirectMapping encryptionClassMapping = new XMLDirectMapping();
        encryptionClassMapping.setAttributeName("m_encryptionClass");
        encryptionClassMapping.setGetMethodName("getEncryptionClass");
        encryptionClassMapping.setSetMethodName("setEncryptionClass");
        encryptionClassMapping.setXPath("encryption-class/text()");
        encryptionClassMapping.setNullValue(ENCRYPTION_CLASS_DEFAULT);
        descriptor.addMapping(encryptionClassMapping);

        XMLDirectMapping passwordMapping = new XMLDirectMapping();
        passwordMapping.setAttributeName("m_password");
        passwordMapping.setGetMethodName("getEncryptedPassword");
        passwordMapping.setSetMethodName("setEncryptedPassword");
        passwordMapping.setXPath("password/text()");
        descriptor.addMapping(passwordMapping);

        XMLDirectMapping tableQualifierMapping = new XMLDirectMapping();
        tableQualifierMapping.setAttributeName("m_tableQualifier");
        tableQualifierMapping.setGetMethodName("getTableQualifier");
        tableQualifierMapping.setSetMethodName("setTableQualifier");
        tableQualifierMapping.setXPath("table-qualifier/text()");
        descriptor.addMapping(tableQualifierMapping);

        XMLDirectMapping externalConnectionPoolMapping = new XMLDirectMapping();
        externalConnectionPoolMapping.setAttributeName("m_externalConnectionPooling");
        externalConnectionPoolMapping.setGetMethodName("getExternalConnectionPooling");
        externalConnectionPoolMapping.setSetMethodName("setExternalConnectionPooling");
        externalConnectionPoolMapping.setXPath("external-connection-pooling/text()");
        externalConnectionPoolMapping.setNullValue(Boolean.valueOf(EXTERNAL_CONNECTION_POOL_DEFAULT));
        descriptor.addMapping(externalConnectionPoolMapping);

        XMLDirectMapping externalTransactionControllerMapping = new XMLDirectMapping();
        externalTransactionControllerMapping.setAttributeName("m_externalTransactionController");
        externalTransactionControllerMapping.setGetMethodName("getExternalTransactionController");
        externalTransactionControllerMapping.setSetMethodName("setExternalTransactionController");
        externalTransactionControllerMapping.setXPath("external-transaction-controller/text()");
        externalTransactionControllerMapping.setNullValue(Boolean.valueOf(EXTERNAL_TRANSACTION_CONTROLLER_DEFAULT));
        descriptor.addMapping(externalTransactionControllerMapping);

        XMLCompositeObjectMapping sequencingMapping = new XMLCompositeObjectMapping();
        sequencingMapping.setAttributeName("m_sequencingConfig");
        sequencingMapping.setSetMethodName("setSequencingConfig");
        sequencingMapping.setGetMethodName("getSequencingConfig");
        sequencingMapping.setReferenceClass(SequencingConfig.class);
        sequencingMapping.setXPath("sequencing");
        descriptor.addMapping(sequencingMapping);

        XMLCompositeCollectionMapping propertiesMapping = new XMLCompositeCollectionMapping();
        propertiesMapping.setReferenceClass(PropertyConfig.class);
        propertiesMapping.setAttributeName("m_propertyConfigs");
        propertiesMapping.setGetMethodName("getPropertyConfigs");
        propertiesMapping.setSetMethodName("setPropertyConfigs");
        propertiesMapping.setXPath("property");
        descriptor.addMapping(propertiesMapping);

        return descriptor;
    }

    public ClassDescriptor buildPoolsConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(PoolsConfig.class);

        XMLCompositeObjectMapping readConnectionPoolConfigMapping = new XMLCompositeObjectMapping();
        readConnectionPoolConfigMapping.setReferenceClass(ReadConnectionPoolConfig.class);
        readConnectionPoolConfigMapping.setAttributeName("m_readConnectionPoolConfig");
        readConnectionPoolConfigMapping.setGetMethodName("getReadConnectionPoolConfig");
        readConnectionPoolConfigMapping.setSetMethodName("setReadConnectionPoolConfig");
        readConnectionPoolConfigMapping.setXPath("read-connection-pool");
        descriptor.addMapping(readConnectionPoolConfigMapping);

        XMLCompositeObjectMapping writeConnectionPoolConfigMapping = new XMLCompositeObjectMapping();
        writeConnectionPoolConfigMapping.setReferenceClass(WriteConnectionPoolConfig.class);
        writeConnectionPoolConfigMapping.setAttributeName("m_writeConnectionPoolConfig");
        writeConnectionPoolConfigMapping.setGetMethodName("getWriteConnectionPoolConfig");
        writeConnectionPoolConfigMapping.setSetMethodName("setWriteConnectionPoolConfig");
        writeConnectionPoolConfigMapping.setXPath("write-connection-pool");
        descriptor.addMapping(writeConnectionPoolConfigMapping);

        XMLCompositeObjectMapping sequenceConnectionPoolConfigMapping = new XMLCompositeObjectMapping();
        sequenceConnectionPoolConfigMapping.setReferenceClass(ConnectionPoolConfig.class);
        sequenceConnectionPoolConfigMapping.setAttributeName("m_sequenceConnectionPoolConfig");
        sequenceConnectionPoolConfigMapping.setGetMethodName("getSequenceConnectionPoolConfig");
        sequenceConnectionPoolConfigMapping.setSetMethodName("setSequenceConnectionPoolConfig");
        sequenceConnectionPoolConfigMapping.setXPath("sequence-connection-pool");
        descriptor.addMapping(sequenceConnectionPoolConfigMapping);

        XMLCompositeCollectionMapping connectionPoolConfigsMapping = new XMLCompositeCollectionMapping();
        connectionPoolConfigsMapping.setReferenceClass(ConnectionPoolConfig.class);
        connectionPoolConfigsMapping.setAttributeName("m_connectionPoolConfigs");
        connectionPoolConfigsMapping.setGetMethodName("getConnectionPoolConfigs");
        connectionPoolConfigsMapping.setSetMethodName("setConnectionPoolConfigs");
        connectionPoolConfigsMapping.setXPath("connection-pool");
        descriptor.addMapping(connectionPoolConfigsMapping);

        return descriptor;
    }

    public ClassDescriptor buildProjectClassConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ProjectClassConfig.class);
        descriptor.getInheritancePolicy().setParentClass(ProjectConfig.class);
        return descriptor;
    }

    public ClassDescriptor buildProjectConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ProjectConfig.class);

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(ProjectXMLConfig.class, "xml");
        descriptor.getInheritancePolicy().addClassIndicator(ProjectClassConfig.class, "class");

        XMLDirectMapping projectStringMapping = new XMLDirectMapping();
        projectStringMapping.setAttributeName("m_projectString");
        projectStringMapping.setGetMethodName("getProjectString");
        projectStringMapping.setSetMethodName("setProjectString");
        projectStringMapping.setXPath("text()");
        descriptor.addMapping(projectStringMapping);

        return descriptor;
    }

    public ClassDescriptor buildProjectXMLConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ProjectXMLConfig.class);
        descriptor.getInheritancePolicy().setParentClass(ProjectConfig.class);
        return descriptor;
    }

    public ClassDescriptor buildPropertyConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(PropertyConfig.class);

        XMLDirectMapping nameMapping = new XMLDirectMapping();
        nameMapping.setAttributeName("m_name");
        nameMapping.setGetMethodName("getName");
        nameMapping.setSetMethodName("setName");
        nameMapping.setXPath("@name");
        descriptor.addMapping(nameMapping);

        XMLDirectMapping valueMapping = new XMLDirectMapping();
        valueMapping.setAttributeName("m_value");
        valueMapping.setGetMethodName("getValue");
        valueMapping.setSetMethodName("setValue");
        valueMapping.setXPath("@value");
        descriptor.addMapping(valueMapping);

        return descriptor;
    }


    public ClassDescriptor buildRMIIIOPTransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(RMIIIOPTransportManagerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(RMITransportManagerConfig.class);
        return descriptor;
    }


    public ClassDescriptor buildRMIRegistryNamingServiceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(RMIRegistryNamingServiceConfig.class);

        XMLDirectMapping urlMapping = new XMLDirectMapping();
        urlMapping.setAttributeName("m_url");
        urlMapping.setGetMethodName("getURL");
        urlMapping.setSetMethodName("setURL");
        urlMapping.setXPath("url/text()");
        descriptor.addMapping(urlMapping);

        return descriptor;
    }

    public ClassDescriptor buildRMITransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(RMITransportManagerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(TransportManagerConfig.class);

        XMLDirectMapping sendModeMapping = new XMLDirectMapping();
        sendModeMapping.setAttributeName("m_sendMode");
        sendModeMapping.setGetMethodName("getSendMode");
        sendModeMapping.setSetMethodName("setSendMode");
        sendModeMapping.setXPath("send-mode/text()");
        sendModeMapping.setNullValue(SEND_MODE_DEFAULT);
        descriptor.addMapping(sendModeMapping);

        XMLCompositeObjectMapping discoveryConfigMapping = new XMLCompositeObjectMapping();
        discoveryConfigMapping.setReferenceClass(DiscoveryConfig.class);
        discoveryConfigMapping.setAttributeName("m_discoveryConfig");
        discoveryConfigMapping.setGetMethodName("getDiscoveryConfig");
        discoveryConfigMapping.setSetMethodName("setDiscoveryConfig");
        discoveryConfigMapping.setXPath("discovery");
        descriptor.addMapping(discoveryConfigMapping);

        XMLCompositeObjectMapping jndiNamingServiceConfigMapping = new XMLCompositeObjectMapping();
        jndiNamingServiceConfigMapping.setReferenceClass(JNDINamingServiceConfig.class);
        jndiNamingServiceConfigMapping.setAttributeName("m_jndiNamingServiceConfig");
        jndiNamingServiceConfigMapping.setGetMethodName("getJNDINamingServiceConfig");
        jndiNamingServiceConfigMapping.setSetMethodName("setJNDINamingServiceConfig");
        jndiNamingServiceConfigMapping.setXPath("jndi-naming-service");
        descriptor.addMapping(jndiNamingServiceConfigMapping);

        XMLCompositeObjectMapping rmiRegistryNamingServiceConfigMapping = new XMLCompositeObjectMapping();
        rmiRegistryNamingServiceConfigMapping.setReferenceClass(RMIRegistryNamingServiceConfig.class);
        rmiRegistryNamingServiceConfigMapping.setAttributeName("m_rmiRegistryNamingServiceConfig");
        rmiRegistryNamingServiceConfigMapping.setGetMethodName("getRMIRegistryNamingServiceConfig");
        rmiRegistryNamingServiceConfigMapping.setSetMethodName("setRMIRegistryNamingServiceConfig");
        rmiRegistryNamingServiceConfigMapping.setXPath("rmi-registry-naming-service");
        descriptor.addMapping(rmiRegistryNamingServiceConfigMapping);

        return descriptor;
    }

    public ClassDescriptor buildReadConnectionPoolConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ReadConnectionPoolConfig.class);
        XMLDirectMapping nameMapping = new XMLDirectMapping();
        nameMapping.setAttributeName("m_name");
        nameMapping.setGetMethodName("getName");
        nameMapping.setSetMethodName("setName");
        nameMapping.setXPath("name/text()");
        descriptor.addMapping(nameMapping);

        XMLDirectMapping maxConnectionsMapping = new XMLDirectMapping();
        maxConnectionsMapping.setAttributeName("m_maxConnections");
        maxConnectionsMapping.setGetMethodName("getMaxConnections");
        maxConnectionsMapping.setSetMethodName("setMaxConnections");
        maxConnectionsMapping.setXPath("max-connections/text()");
        maxConnectionsMapping.setNullValue(Integer.valueOf(READ_CONNECTION_POOL_MAX_DEFAULT));
        descriptor.addMapping(maxConnectionsMapping);

        XMLDirectMapping minConnectionsMapping = new XMLDirectMapping();
        minConnectionsMapping.setAttributeName("m_minConnections");
        minConnectionsMapping.setGetMethodName("getMinConnections");
        minConnectionsMapping.setSetMethodName("setMinConnections");
        minConnectionsMapping.setXPath("min-connections/text()");
        minConnectionsMapping.setNullValue(Integer.valueOf(READ_CONNECTION_POOL_MIN_DEFAULT));
        descriptor.addMapping(minConnectionsMapping);

        XMLCompositeObjectMapping loginConfigMapping = new XMLCompositeObjectMapping();
        loginConfigMapping.setReferenceClass(LoginConfig.class);
        loginConfigMapping.setAttributeName("m_loginConfig");
        loginConfigMapping.setGetMethodName("getLoginConfig");
        loginConfigMapping.setSetMethodName("setLoginConfig");
        loginConfigMapping.setXPath("login");
        descriptor.addMapping(loginConfigMapping);

        XMLDirectMapping exclusiveMapping = new XMLDirectMapping();
        exclusiveMapping.setAttributeName("m_exclusive");
        exclusiveMapping.setGetMethodName("getExclusive");
        exclusiveMapping.setSetMethodName("setExclusive");
        exclusiveMapping.setXPath("exclusive/text()");
        exclusiveMapping.setNullValue(Boolean.valueOf(EXCLUSIVE_DEFAULT));
        descriptor.addMapping(exclusiveMapping);

        return descriptor;
    }

    public ClassDescriptor buildRemoteCommandManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(RemoteCommandManagerConfig.class);

        XMLDirectMapping channelMapping = new XMLDirectMapping();
        channelMapping.setAttributeName("m_channel");
        channelMapping.setGetMethodName("getChannel");
        channelMapping.setSetMethodName("setChannel");
        channelMapping.setXPath("channel/text()");
        channelMapping.setNullValue(CHANNEL_DEFAULT);
        descriptor.addMapping(channelMapping);

        XMLCompositeObjectMapping commandsConfigMapping = new XMLCompositeObjectMapping();
        commandsConfigMapping.setReferenceClass(CommandsConfig.class);
        commandsConfigMapping.setAttributeName("m_commandsConfig");
        commandsConfigMapping.setGetMethodName("getCommandsConfig");
        commandsConfigMapping.setSetMethodName("setCommandsConfig");
        commandsConfigMapping.setXPath("commands");
        descriptor.addMapping(commandsConfigMapping);

        XMLCompositeObjectMapping transportManagerMapping = new XMLCompositeObjectMapping();
        transportManagerMapping.setReferenceClass(TransportManagerConfig.class);
        transportManagerMapping.setAttributeName("m_transportManager");
        transportManagerMapping.setGetMethodName("getTransportManagerConfig");
        transportManagerMapping.setSetMethodName("setTransportManagerConfig");
        transportManagerMapping.setXPath("transport");
        descriptor.addMapping(transportManagerMapping);

        return descriptor;
    }

    public ClassDescriptor buildServerPlatformConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ServerPlatformConfig.class);

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(CustomServerPlatformConfig.class, "custom-platform");
        descriptor.getInheritancePolicy().addClassIndicator(Oc4jPlatformConfig.class, "oc4j-platform");
        descriptor.getInheritancePolicy().addClassIndicator(GlassfishPlatformConfig.class, "glassfish-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebLogic_6_1_PlatformConfig.class, "weblogic-61-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebLogic_7_0_PlatformConfig.class, "weblogic-70-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebLogic_8_1_PlatformConfig.class, "weblogic-81-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebSphere_4_0_PlatformConfig.class, "websphere-40-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebSphere_5_0_PlatformConfig.class, "websphere-50-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebSphere_5_1_PlatformConfig.class, "websphere-51-platform");
        descriptor.getInheritancePolicy().addClassIndicator(WebSphere_6_0_PlatformConfig.class, "websphere-60-platform");
        descriptor.getInheritancePolicy().addClassIndicator(JBossPlatformConfig.class, "jboss-platform");
        descriptor.getInheritancePolicy().addClassIndicator(NetWeaver_7_1_PlatformConfig.class, "netweaver-71-platform");


        XMLDirectMapping enableRuntimeServicesMapping = new XMLDirectMapping();
        enableRuntimeServicesMapping.setAttributeName("m_enableRuntimeServices");
        enableRuntimeServicesMapping.setGetMethodName("getEnableRuntimeServices");
        enableRuntimeServicesMapping.setSetMethodName("setEnableRuntimeServices");
        enableRuntimeServicesMapping.setXPath("enable-runtime-services/text()");
        enableRuntimeServicesMapping.setNullValue(Boolean.valueOf(ENABLE_RUNTIME_SERVICES_DEFAULT));
        descriptor.addMapping(enableRuntimeServicesMapping);

        XMLDirectMapping enableJTAMapping = new XMLDirectMapping();
        enableJTAMapping.setAttributeName("m_enableJTA");
        enableJTAMapping.setGetMethodName("getEnableJTA");
        enableJTAMapping.setSetMethodName("setEnableJTA");
        enableJTAMapping.setXPath("enable-jta/text()");
        enableJTAMapping.setNullValue(Boolean.valueOf(ENABLE_JTA_DEFAULT));
        descriptor.addMapping(enableJTAMapping);

        return descriptor;
    }

    public ClassDescriptor buildServerPlatformConfigDescriptorFor(Class serverPlatformClass) {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(serverPlatformClass);
        descriptor.getInheritancePolicy().setParentClass(ServerPlatformConfig.class);
        return descriptor;
    }

    public ClassDescriptor buildServerSessionConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(ServerSessionConfig.class);
        descriptor.getInheritancePolicy().setParentClass(DatabaseSessionConfig.class);

        XMLCompositeObjectMapping poolsConfigMapping = new XMLCompositeObjectMapping();
        poolsConfigMapping.setReferenceClass(PoolsConfig.class);
        poolsConfigMapping.setAttributeName("m_poolsConfig");
        poolsConfigMapping.setGetMethodName("getPoolsConfig");
        poolsConfigMapping.setSetMethodName("setPoolsConfig");
        poolsConfigMapping.setXPath("connection-pools");
        descriptor.addMapping(poolsConfigMapping);

        XMLCompositeObjectMapping connectionPolicyMapping = new XMLCompositeObjectMapping();
        connectionPolicyMapping.setReferenceClass(ConnectionPolicyConfig.class);
        connectionPolicyMapping.setAttributeName("m_connectionPolicyConfig");
        connectionPolicyMapping.setGetMethodName("getConnectionPolicyConfig");
        connectionPolicyMapping.setSetMethodName("setConnectionPolicyConfig");
        connectionPolicyMapping.setXPath("connection-policy");
        descriptor.addMapping(connectionPolicyMapping);

        return descriptor;
    }

    public ClassDescriptor buildSessionBrokerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SessionBrokerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(SessionConfig.class);

        XMLCompositeDirectCollectionMapping sessionNamesMapping = new XMLCompositeDirectCollectionMapping();
        sessionNamesMapping.setAttributeName("m_sessionNames");
        sessionNamesMapping.setGetMethodName("getSessionNames");
        sessionNamesMapping.setSetMethodName("setSessionNames");
        sessionNamesMapping.setXPath("session-name/text()");
        descriptor.addMapping(sessionNamesMapping);

        return descriptor;
    }

    public ClassDescriptor buildSessionConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SessionConfig.class);

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(DatabaseSessionConfig.class, "database-session");
        descriptor.getInheritancePolicy().addClassIndicator(ServerSessionConfig.class, "server-session");
        descriptor.getInheritancePolicy().addClassIndicator(SessionBrokerConfig.class, "session-broker");

        XMLDirectMapping nameMapping = new XMLDirectMapping();
        nameMapping.setAttributeName("m_name");
        nameMapping.setGetMethodName("getName");
        nameMapping.setSetMethodName("setName");
        nameMapping.setXPath("name/text()");
        descriptor.addMapping(nameMapping);

        XMLCompositeObjectMapping serverPlatformConfigMapping = new XMLCompositeObjectMapping();
        serverPlatformConfigMapping.setReferenceClass(ServerPlatformConfig.class);
        serverPlatformConfigMapping.setAttributeName("m_serverPlatformConfig");
        serverPlatformConfigMapping.setGetMethodName("getServerPlatformConfig");
        serverPlatformConfigMapping.setSetMethodName("setServerPlatformConfig");
        serverPlatformConfigMapping.setXPath("server-platform");
        descriptor.addMapping(serverPlatformConfigMapping);

        XMLCompositeObjectMapping remoteCommandManagerConfigMapping = new XMLCompositeObjectMapping();
        remoteCommandManagerConfigMapping.setReferenceClass(RemoteCommandManagerConfig.class);
        remoteCommandManagerConfigMapping.setAttributeName("m_remoteCommandManagerConfig");
        remoteCommandManagerConfigMapping.setGetMethodName("getRemoteCommandManagerConfig");
        remoteCommandManagerConfigMapping.setSetMethodName("setRemoteCommandManagerConfig");
        remoteCommandManagerConfigMapping.setXPath("remote-command");
        descriptor.addMapping(remoteCommandManagerConfigMapping);


        XMLCompositeObjectMapping sessionEventManagerConfigMapping = new XMLCompositeObjectMapping();
        sessionEventManagerConfigMapping.setReferenceClass(SessionEventManagerConfig.class);
        sessionEventManagerConfigMapping.setAttributeName("m_sessionEventManagerConfig");
        sessionEventManagerConfigMapping.setGetMethodName("getSessionEventManagerConfig");
        sessionEventManagerConfigMapping.setSetMethodName("setSessionEventManagerConfig");
        sessionEventManagerConfigMapping.setXPath("event-listener-classes");
        descriptor.addMapping(sessionEventManagerConfigMapping);

        XMLDirectMapping profilerMapping = new XMLDirectMapping();
        profilerMapping.setAttributeName("m_profiler");
        profilerMapping.setGetMethodName("getProfiler");
        profilerMapping.setSetMethodName("setProfiler");
        profilerMapping.setXPath("profiler/text()");
        descriptor.addMapping(profilerMapping);

        XMLDirectMapping exceptionHandlerClassMapping = new XMLDirectMapping();
        exceptionHandlerClassMapping.setAttributeName("m_exceptionHandlerClass");
        exceptionHandlerClassMapping.setGetMethodName("getExceptionHandlerClass");
        exceptionHandlerClassMapping.setSetMethodName("setExceptionHandlerClass");
        exceptionHandlerClassMapping.setXPath("exception-handler-class/text()");
        descriptor.addMapping(exceptionHandlerClassMapping);

        XMLCompositeObjectMapping logConfigMapping = new XMLCompositeObjectMapping();
        logConfigMapping.setReferenceClass(LogConfig.class);
        logConfigMapping.setAttributeName("m_logConfig");
        logConfigMapping.setGetMethodName("getLogConfig");
        logConfigMapping.setSetMethodName("setLogConfig");
        logConfigMapping.setXPath("logging");
        descriptor.addMapping(logConfigMapping);

        XMLDirectMapping sessionCustomizerClassMapping = new XMLDirectMapping();
        sessionCustomizerClassMapping.setAttributeName("m_sessionCustomizerClass");
        sessionCustomizerClassMapping.setGetMethodName("getSessionCustomizerClass");
        sessionCustomizerClassMapping.setSetMethodName("setSessionCustomizerClass");
        sessionCustomizerClassMapping.setXPath("session-customizer-class/text()");
        descriptor.addMapping(sessionCustomizerClassMapping);

        return descriptor;
    }

    public ClassDescriptor buildSessionEventManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SessionEventManagerConfig.class);

        XMLCompositeDirectCollectionMapping sessionEventListenersMapping = new XMLCompositeDirectCollectionMapping();
        sessionEventListenersMapping.setAttributeName("m_sessionEventListeners");
        sessionEventListenersMapping.setGetMethodName("getSessionEventListeners");
        sessionEventListenersMapping.setSetMethodName("setSessionEventListeners");
        sessionEventListenersMapping.setXPath("event-listener-class/text()");
        descriptor.addMapping(sessionEventListenersMapping);

        return descriptor;
    }


    public ClassDescriptor buildSunCORBATransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SunCORBATransportManagerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(TransportManagerConfig.class);
        return descriptor;
    }

    public ClassDescriptor buildSessionConfigsDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setDefaultRootElement("sessions");
        descriptor.setJavaClass(SessionConfigs.class);
        descriptor.setSchemaReference(new XMLSchemaClassPathReference(ECLIPSELINK_SESSIONS_SCHEMA));

        XMLDirectMapping versionMapping = new XMLDirectMapping();
        versionMapping.setAttributeName("m_version");
        versionMapping.setGetMethodName("getVersion");
        versionMapping.setSetMethodName("setVersion");
        versionMapping.setXPath("@version");
        descriptor.addMapping(versionMapping);

        XMLCompositeCollectionMapping sessionConfigsMapping = new XMLCompositeCollectionMapping();
        sessionConfigsMapping.setReferenceClass(SessionConfig.class);
        sessionConfigsMapping.setAttributeName("m_sessionConfigs");
        sessionConfigsMapping.setGetMethodName("getSessionConfigs");
        sessionConfigsMapping.setSetMethodName("setSessionConfigs");
        sessionConfigsMapping.setXPath("session");
        descriptor.addMapping(sessionConfigsMapping);

        return descriptor;
    }

    public ClassDescriptor buildTransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(TransportManagerConfig.class);

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(RMITransportManagerConfig.class, "rmi-transport");
        descriptor.getInheritancePolicy().addClassIndicator(RMIIIOPTransportManagerConfig.class, "rmi-iiop-transport");
        descriptor.getInheritancePolicy().addClassIndicator(JMSPublishingTransportManagerConfig.class, "jms-publishing-transport");
        descriptor.getInheritancePolicy().addClassIndicator(JMSTopicTransportManagerConfig.class, "jms-topic-transport");
        descriptor.getInheritancePolicy().addClassIndicator(SunCORBATransportManagerConfig.class, "sun-corba-transport");
        descriptor.getInheritancePolicy().addClassIndicator(UserDefinedTransportManagerConfig.class, "user-defined-transport");

        XMLDirectMapping onConnectionErrorMapping = new XMLDirectMapping();
        onConnectionErrorMapping.setAttributeName("m_onConnectionError");
        onConnectionErrorMapping.setGetMethodName("getOnConnectionError");
        onConnectionErrorMapping.setSetMethodName("setOnConnectionError");
        onConnectionErrorMapping.setXPath("on-connection-error/text()");
        onConnectionErrorMapping.setNullValue(ON_CONNECTION_ERROR_DEFAULT);
        descriptor.addMapping(onConnectionErrorMapping);

        return descriptor;
    }

    public ClassDescriptor buildUserDefinedTransportManagerConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(UserDefinedTransportManagerConfig.class);
        descriptor.getInheritancePolicy().setParentClass(TransportManagerConfig.class);

        XMLDirectMapping transportClassMapping = new XMLDirectMapping();
        transportClassMapping.setAttributeName("m_transportClass");
        transportClassMapping.setGetMethodName("getTransportClass");
        transportClassMapping.setSetMethodName("setTransportClass");
        transportClassMapping.setXPath("transport-class/text()");
        descriptor.addMapping(transportClassMapping);

        return descriptor;
    }

    public ClassDescriptor buildWriteConnectionPoolConfigDescriptor() {
        XMLDescriptor descriptor = (XMLDescriptor)buildConnectionPoolConfigDescriptor();
        descriptor.setJavaClass(WriteConnectionPoolConfig.class);
        return descriptor;
    }

    public ClassDescriptor buildSequencingConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SequencingConfig.class);
        descriptor.setDefaultRootElement("sequencing");

        XMLCompositeObjectMapping defaultSequenceMapping = new XMLCompositeObjectMapping();
        defaultSequenceMapping.setAttributeName("m_defaultSequenceConfig");
        defaultSequenceMapping.setSetMethodName("setDefaultSequenceConfig");
        defaultSequenceMapping.setGetMethodName("getDefaultSequenceConfig");
        defaultSequenceMapping.setReferenceClass(SequenceConfig.class);
        defaultSequenceMapping.setXPath("default-sequence");
        descriptor.addMapping(defaultSequenceMapping);

        XMLCompositeCollectionMapping sequencesMapping = new XMLCompositeCollectionMapping();
        sequencesMapping.setAttributeName("sequenceConfigs");
        sequencesMapping.setSetMethodName("setSequenceConfigs");
        sequencesMapping.setGetMethodName("getSequenceConfigs");
        sequencesMapping.setReferenceClass(SequenceConfig.class);
        sequencesMapping.setXPath("sequences/sequence");
        descriptor.addMapping(sequencesMapping);

        return descriptor;
    }

    public ClassDescriptor buildSequenceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(SequenceConfig.class);
        descriptor.setDefaultRootElement("sequence");

        descriptor.getInheritancePolicy().setClassIndicatorField(new XMLField("@xsi:type"));
        descriptor.getInheritancePolicy().addClassIndicator(DefaultSequenceConfig.class, "default-sequence");
        descriptor.getInheritancePolicy().addClassIndicator(NativeSequenceConfig.class, "native-sequence");
        descriptor.getInheritancePolicy().addClassIndicator(TableSequenceConfig.class, "table-sequence");
        descriptor.getInheritancePolicy().addClassIndicator(UnaryTableSequenceConfig.class, "unary-table-sequence");
        descriptor.getInheritancePolicy().addClassIndicator(XMLFileSequenceConfig.class, "xmlfile-sequence");

        XMLDirectMapping nameMapping = new XMLDirectMapping();
        nameMapping.setAttributeName("m_name");
        nameMapping.setGetMethodName("getName");
        nameMapping.setSetMethodName("setName");
        nameMapping.setXPath("name/text()");
        nameMapping.setNullValue("");
        descriptor.addMapping(nameMapping);

        XMLDirectMapping preallocationSizeMapping = new XMLDirectMapping();
        preallocationSizeMapping.setAttributeName("m_preallocationSize");
        preallocationSizeMapping.setGetMethodName("getPreallocationSize");
        preallocationSizeMapping.setSetMethodName("setPreallocationSize");
        preallocationSizeMapping.setXPath("preallocation-size/text()");
        preallocationSizeMapping.setNullValue(Integer.valueOf(50));
        descriptor.addMapping(preallocationSizeMapping);

        return descriptor;
    }

    public ClassDescriptor buildDefaultSequenceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(DefaultSequenceConfig.class);

        descriptor.getInheritancePolicy().setParentClass(SequenceConfig.class);

        return descriptor;
    }

    public ClassDescriptor buildNativeSequenceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(NativeSequenceConfig.class);

        descriptor.getInheritancePolicy().setParentClass(SequenceConfig.class);

        return descriptor;
    }

    public ClassDescriptor buildTableSequenceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(TableSequenceConfig.class);

        descriptor.getInheritancePolicy().setParentClass(SequenceConfig.class);

        XMLDirectMapping tableNameMapping = new XMLDirectMapping();
        tableNameMapping.setAttributeName("m_table");
        tableNameMapping.setGetMethodName("getTable");
        tableNameMapping.setSetMethodName("setTable");
        tableNameMapping.setXPath("table/text()");
        tableNameMapping.setNullValue("SEQUENCE");
        descriptor.addMapping(tableNameMapping);

        XMLDirectMapping nameFieldNameMapping = new XMLDirectMapping();
        nameFieldNameMapping.setAttributeName("m_nameField");
        nameFieldNameMapping.setGetMethodName("getNameField");
        nameFieldNameMapping.setSetMethodName("setNameField");
        nameFieldNameMapping.setXPath("name-field/text()");
        nameFieldNameMapping.setNullValue("SEQ_NAME");
        descriptor.addMapping(nameFieldNameMapping);

        XMLDirectMapping counterFieldNameMapping = new XMLDirectMapping();
        counterFieldNameMapping.setAttributeName("m_counterField");
        counterFieldNameMapping.setGetMethodName("getCounterField");
        counterFieldNameMapping.setSetMethodName("setCounterField");
        counterFieldNameMapping.setXPath("counter-field/text()");
        counterFieldNameMapping.setNullValue("SEQ_COUNT");
        descriptor.addMapping(counterFieldNameMapping);

        return descriptor;
    }

    public ClassDescriptor buildUnaryTableSequenceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(UnaryTableSequenceConfig.class);

        descriptor.getInheritancePolicy().setParentClass(SequenceConfig.class);

        XMLDirectMapping counterFieldNameMapping = new XMLDirectMapping();
        counterFieldNameMapping.setAttributeName("m_counterField");
        counterFieldNameMapping.setGetMethodName("getCounterField");
        counterFieldNameMapping.setSetMethodName("setCounterField");
        counterFieldNameMapping.setXPath("counter-field/text()");
        counterFieldNameMapping.setNullValue("SEQ_COUNT");
        descriptor.addMapping(counterFieldNameMapping);

        return descriptor;
    }

    public ClassDescriptor buildXMLFileSequenceConfigDescriptor() {
        XMLDescriptor descriptor = new XMLDescriptor();
        descriptor.setJavaClass(XMLFileSequenceConfig.class);

        descriptor.getInheritancePolicy().setParentClass(SequenceConfig.class);

        return descriptor;
    }
}
