/*
 * Copyright (c) 1998, 2021 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.FALSE);
        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.FALSE);
        descriptor.addMapping(exclusiveConnectionMapping);

        XMLDirectMapping lazyMapping = new XMLDirectMapping();
        lazyMapping.setAttributeName("m_lazy");
        lazyMapping.setGetMethodName("getLazy");
        lazyMapping.setSetMethodName("setLazy");
        lazyMapping.setXPath("lazy/text()");
        lazyMapping.setNullValue(Boolean.TRUE);
        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(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(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(DATASOURCE_LOOKUP_TYPE_DEFAULT);
        ObjectTypeConverter converter = new ObjectTypeConverter();
        converter.addConversionValue("string", JNDIConnector.STRING_LOOKUP);
        converter.addConversionValue("composite-name", JNDIConnector.COMPOSITE_NAME_LOOKUP);
        converter.addConversionValue("compound-name", 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.FALSE);
        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.FALSE);
        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.TRUE);
        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.FALSE);
        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.FALSE);
        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.FALSE);
        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.TRUE);
        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.TRUE);
        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.FALSE);
        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.TRUE);
        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(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.FALSE);
        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(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(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(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.FALSE);
        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.FALSE);
        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(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(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.TRUE);
        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.TRUE);
        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.TRUE);
        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(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;
    }
}
