Package org.apache.directory.studio.apacheds.configuration.model.v155

Source Code of org.apache.directory.studio.apacheds.configuration.model.v155.ServerXmlIOV155

/*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you under the Apache License, Version 2.0 (the
*  "License"); you may not use this file except in compliance
*  with the License.  You may obtain a copy of the License at
*    http://www.apache.org/licenses/LICENSE-2.0
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/
package org.apache.directory.studio.apacheds.configuration.model.v155;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.directory.studio.apacheds.configuration.StudioEntityResolver;
import org.apache.directory.studio.apacheds.configuration.model.AbstractServerXmlIO;
import org.apache.directory.studio.apacheds.configuration.model.ServerConfiguration;
import org.apache.directory.studio.apacheds.configuration.model.ServerXmlIO;
import org.apache.directory.studio.apacheds.configuration.model.ServerXmlIOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


/**
* This class implements a parser and a writer for the 'server.xml' file of
* Apache Directory Server version 1.5.5.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$, $Date$
*/
public class ServerXmlIOV155 extends AbstractServerXmlIO implements ServerXmlIO
{
    private static final String ATTRIBUTE_ACCESS_CONTROL_ENABLED = "accessControlEnabled"; //$NON-NLS-1$
    private static final String ATTRIBUTE_ADDRESS = "address"; //$NON-NLS-1$
    private static final String ATTRIBUTE_ALLOW_ANONYMOUS_ACCESS = "allowAnonymousAccess"; //$NON-NLS-1$
    private static final String ATTRIBUTE_ATTRIBUTE_ID = "attributeId"; //$NON-NLS-1$
    private static final String ATTRIBUTE_BACKLOG = "backLog"; //$NON-NLS-1$
    private static final String ATTRIBUTE_CACHE_SIZE = "cacheSize"; //$NON-NLS-1$
    private static final String ATTRIBUTE_DENORMALIZE_OP_ATTRS_ENABLED = "denormalizeOpAttrsEnabled"; //$NON-NLS-1$
    private static final String ATTRIBUTE_ENABLESSL = "enableSSL"; //$NON-NLS-1$
    private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
    private static final String ATTRIBUTE_INSTANCE_ID = "instanceId"; //$NON-NLS-1$
    private static final String ATTRIBUTE_MAXPDUSIZE = "maxPDUSize"; //$NON-NLS-1$
    private static final String ATTRIBUTE_MAX_SIZE_LIMIT = "maxSizeLimit"; //$NON-NLS-1$
    private static final String ATTRIBUTE_MAX_TIME_LIMIT = "maxTimeLimit"; //$NON-NLS-1$
    private static final String ATTRIBUTE_MECH_NAME = "mech-name"; //$NON-NLS-1$
    private static final String ATTRIBUTE_NBTHREADS = "nbThreads"; //$NON-NLS-1$
    private static final String ATTRIBUTE_NTLM_PROVIDER_FQCN = "ntlmProviderFqcn"; //$NON-NLS-1$
    private static final String ATTRIBUTE_PORT = "port"; //$NON-NLS-1$
    private static final String ATTRIBUTE_OPTIMIZER_ENABLED = "optimizerEnabled"; //$NON-NLS-1$
    private static final String ATTRIBUTE_REPLICAID = "replicaId"; //$NON-NLS-1$
    private static final String ATTRIBUTE_SASL_HOST = "saslHost"; //$NON-NLS-1$
    private static final String ATTRIBUTE_SASL_PRINCIPAL = "saslPrincipal"; //$NON-NLS-1$
    private static final String ATTRIBUTE_SEARCH_BASE_DN = "searchBaseDn"; //$NON-NLS-1$
    private static final String ATTRIBUTE_SUFFIX = "suffix"; //$NON-NLS-1$
    private static final String ATTRIBUTE_SYNC_ON_WRITE = "syncOnWrite"; //$NON-NLS-1$
    private static final String ATTRIBUTE_SYNCH_PERIOD_MILLIS = "syncPeriodMillis"; //$NON-NLS-1$
    private static final String ATTRIBUTE_WORKING_DIRECTORY = "workingDirectory"; //$NON-NLS-1$
    private static final String ELEMENT_ACI_AUTHORIZATION_INTERCEPTOR = "aciAuthorizationInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_APACHE_DS = "apacheDS"; //$NON-NLS-1$
    private static final String ELEMENT_AUTHENTICATION_INTERCEPTOR = "authenticationInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_BEANS = "beans"; //$NON-NLS-1$
    private static final String ELEMENT_CHANGE_PASSWORD_SERVER = "changePasswordServer"; //$NON-NLS-1$
    private static final String ELEMENT_COLLECTIVE_ATTRIBUTE_INTERCEPTOR = "collectiveAttributeInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_CRAM_MD5_MECHANISM_HANDLER = "cramMd5MechanismHandler"; //$NON-NLS-1$
    private static final String ELEMENT_DEFAULT_AUTHORIZATION_INTERCEPTOR = "defaultAuthorizationInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_DEFAULT_DIRECTORY_SERVICE = "defaultDirectoryService"; //$NON-NLS-1$
    private static final String ELEMENT_DIGEST_MD5_MECHANISM_HANDLER = "digestMd5MechanismHandler"; //$NON-NLS-1$
    private static final String ELEMENT_DNS_SERVER = "dnsServer"; //$NON-NLS-1$
    private static final String ELEMENT_EVENT_INTERCEPTOR = "eventInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_EXCEPTION_INTERCEPTOR = "exceptionInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_EXTENDED_OPERATION_HANDLERS = "extendedOperationHandlers"; //$NON-NLS-1$
    private static final String ELEMENT_GRACEFUL_SHUTDOWN_HANDLER = "gracefulShutdownHandler"; //$NON-NLS-1$
    private static final String ELEMENT_GSSAPI_MECHANISM_HANDLER = "gssapiMechanismHandler"; //$NON-NLS-1$
    private static final String ELEMENT_INDEXED_ATTRIBUTES = "indexedAttributes"; //$NON-NLS-1$
    private static final String ELEMENT_INTERCEPTORS = "interceptors"; //$NON-NLS-1$
    private static final String ELEMENT_JDBM_INDEX = "jdbmIndex"; //$NON-NLS-1$
    private static final String ELEMENT_JDBM_PARTITION = "jdbmPartition"; //$NON-NLS-1$
    private static final String ELEMENT_KDC_SERVER = "kdcServer"; //$NON-NLS-1$
    private static final String ELEMENT_LAUNCH_DIAGNOSTIC_UI_HANDLER = "launchDiagnosticUiHandler"; //$NON-NLS-1$
    private static final String ELEMENT_LDAP_SERVER = "ldapServer"; //$NON-NLS-1$
    private static final String ELEMENT_NORMALIZATION_INTERCEPTOR = "normalizationInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_NTLM_MECHANISM_HANDLER = "ntlmMechanismHandler"; //$NON-NLS-1$
    private static final String ELEMENT_NTP_SERVER = "ntpServer"; //$NON-NLS-1$
    private static final String ELEMENT_OPERATIONAL_ATTRIBUTE_INTERCEPTOR = "operationalAttributeInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_PARTITIONS = "partitions"; //$NON-NLS-1$
    private static final String ELEMENT_REFERRAL_INTERCEPTOR = "referralInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_REPLICATION_INTERCEPTOR = "replicationInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_SASL_MECHANISM_HANDLERS = "saslMechanismHandlers"; //$NON-NLS-1$
    private static final String ELEMENT_SASL_REALMS = "saslRealms"; //$NON-NLS-1$
    private static final String ELEMENT_SCHEMA_INTERCEPTOR = "schemaInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_SIMPLE_MECHANISM_HANDLER = "simpleMechanismHandler"; //$NON-NLS-1$
    private static final String ELEMENT_START_TLS_HANDLER = "startTlsHandler"; //$NON-NLS-1$
    private static final String ELEMENT_SUBENTRY_INTERCEPTOR = "subentryInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_SYSTEM_PARTITION = "systemPartition"; //$NON-NLS-1$
    private static final String ELEMENT_TCP_TRANSPORT = "tcpTransport"; //$NON-NLS-1$
    private static final String ELEMENT_TRANSPORTS = "transports"; //$NON-NLS-1$
    private static final String ELEMENT_TRIGGER_INTERCEPTOR = "triggerInterceptor"; //$NON-NLS-1$
    private static final String ELEMENT_UDP_TRANSPORT = "udpTransport"; //$NON-NLS-1$
    private static final String ELEMENT_VALUE = "value"; //$NON-NLS-1$
    private static final Namespace NAMESPACE_APACHEDS = new Namespace( null, "http://apacheds.org/config/1.5.5" ); //$NON-NLS-1$
    private static final Namespace NAMESPACE_SPRINGFRAMEWORK = new Namespace( "s", //$NON-NLS-1$
        "http://www.springframework.org/schema/beans" ); //$NON-NLS-1$
    private static final Namespace NAMESPACE_XBEAN_SPRING = new Namespace( "spring", //$NON-NLS-1$
        "http://xbean.apache.org/schemas/spring/1.0" ); //$NON-NLS-1$
    private static final String SUPPORTED_MECHANISM_CRAM_MD5 = "CRAM-MD5"; //$NON-NLS-1$
    private static final String SUPPORTED_MECHANISM_DIGEST_MD5 = "DIGEST-MD5"; //$NON-NLS-1$
    private static final String SUPPORTED_MECHANISM_GSS_SPNEGO = "GSS-SPNEGO"; //$NON-NLS-1$
    private static final String SUPPORTED_MECHANISM_GSSAPI = "GSSAPI"; //$NON-NLS-1$
    private static final String SUPPORTED_MECHANISM_NTLM = "NTLM"; //$NON-NLS-1$
    private static final String SUPPORTED_MECHANISM_SIMPLE = "SIMPLE"; //$NON-NLS-1$
    private static final String VALUE_ADDRESS_0_0_0_0 = "0.0.0.0"; //$NON-NLS-1$
    private static final String VALUE_ADDRESS_LOCALHOST = "localhost"; //$NON-NLS-1$
    private static final String VALUE_BACKLOG = "50"; //$NON-NLS-1$
    private static final String VALUE_CHANGEPASSWORDSERVER_NB_THREADS = "2"; //$NON-NLS-1$
    private static final String VALUE_DEFAULT = "default"; //$NON-NLS-1$
    private static final String VALUE_DIRECTORY_SERVICE = "directoryService"; //$NON-NLS-1$
    private static final String VALUE_EXAMPLE_DOT_COM = "example.com"; //$NON-NLS-1$
    private static final String VALUE_KDCSERVER_NB_THREADS = "4"; //$NON-NLS-1$
    private static final String VALUE_LDAPSERVER_NB_THREADS = "8"; //$NON-NLS-1$
    private static final String VALUE_MAXPDUSIZE = "2000000"; //$NON-NLS-1$
    private static final String VALUE_NTPSERVER_NB_THREADS = "1"; //$NON-NLS-1$
    private static final String VALUE_REPLICAID = "1"; //$NON-NLS-1$


    /**
     * Checks if the Document is valid.
     *
     * @param document
     *      the Document
     * @return
     *      true if the Document is valid, false if not
     */
    protected boolean isValid( Document document )
    {
        Element rootElement = document.getRootElement();

        if ( rootElement != null )
        {
            // Checking if the root element is named 'beans'
            if ( ServerXmlIOV155.ELEMENT_BEANS.equalsIgnoreCase( rootElement.getName() ) )
            {
                // Looking for the 'apacheDS' element
                Element apacheDSElement = rootElement.element( ServerXmlIOV155.ELEMENT_APACHE_DS );
                if ( apacheDSElement != null )
                {
                    // Looking for the 'apacheDS' element
                    Element ldapServiceElement = rootElement.element( ServerXmlIOV155.ELEMENT_LDAP_SERVER );

                    return ( ldapServiceElement != null );
                }

            }
        }

        return false;
    }


    /* (non-Javadoc)
     * @see org.apache.directory.studio.apacheds.configuration.model.ServerXmlIO#parse(java.io.InputStream)
     */
    public ServerConfiguration parse( InputStream is ) throws ServerXmlIOException
    {
        try
        {
            // Reading and creating the document
            SAXReader reader = new SAXReader();
            reader.setEntityResolver( new StudioEntityResolver() );
            Document document = reader.read( is );

            // Parsing the document
            ServerConfigurationV155 serverConfiguration = new ServerConfigurationV155();
            parse( document, serverConfiguration );

            return serverConfiguration;
        }
        catch ( Exception e )
        {
            if ( e instanceof ServerXmlIOException )
            {
                throw ( ServerXmlIOException ) e;
            }
            else
            {
                ServerXmlIOException exception = new ServerXmlIOException( e.getMessage(), e.getCause() );
                exception.setStackTrace( e.getStackTrace() );
                throw exception;
            }
        }
    }


    /**
     * Parses the Document.
     *
     * @param document
     *      the Document
     * @param serverConfiguration
     *      the Server Configuration
     * @throws NumberFormatException
     * @throws BooleanFormatException
     * @throws ServerXmlIOException
     */
    private void parse( Document document, ServerConfigurationV155 serverConfiguration ) throws NumberFormatException,
        BooleanFormatException, ServerXmlIOException
    {
        Element rootElement = document.getRootElement();

        // Reading the 'defaultDirectoryService' Bean
        readDefaultDirectoryServiceBean( rootElement, serverConfiguration );

        // Reading the 'changePasswordServer' Bean
        readChangePasswordServerBean( rootElement, serverConfiguration );

        // Reading the 'kdcServer' Bean
        readKdcServerBean( rootElement, serverConfiguration );

        // Reading the 'ntpServer' Bean
        readNtpServerBean( rootElement, serverConfiguration );

        // Reading the 'dnsServer' Bean
        readDnsServerBean( rootElement, serverConfiguration );

        // Reading the 'ldapServer' Bean
        readLdapServerBean( rootElement, serverConfiguration );
    }


    /**
     * Reads the DefaultDirectoryService Bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws ServerXmlIOException
     * @throws NumberFormatException
     * @throws BooleanFormatException
     */
    private void readDefaultDirectoryServiceBean( Element element, ServerConfigurationV155 serverConfiguration )
        throws ServerXmlIOException, NumberFormatException, BooleanFormatException
    {
        Element defaultDirectoryServiceElement = element.element( ELEMENT_DEFAULT_DIRECTORY_SERVICE );
        if ( defaultDirectoryServiceElement == null )
        {
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorDefaultDirectoryService" ) ); //$NON-NLS-1$
        }
        else
        {
            // Access Control Enabled
            org.dom4j.Attribute accessControlEnabledAttribute = defaultDirectoryServiceElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_ACCESS_CONTROL_ENABLED );
            if ( accessControlEnabledAttribute == null )
            {
                // If the 'accessControlEnabled' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorAccessControlEnabled" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setEnableAccessControl( parseBoolean( accessControlEnabledAttribute.getValue() ) );
            }

            // Denormalize Op Attrs Enabled
            org.dom4j.Attribute denormalizeOpAttrsEnabledAttribute = defaultDirectoryServiceElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_DENORMALIZE_OP_ATTRS_ENABLED );
            if ( denormalizeOpAttrsEnabledAttribute == null )
            {
                // If the 'denormalizeOpAttrsEnabled' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorDenormalizeOpAttrsEnabled" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration
                    .setDenormalizeOpAttr( parseBoolean( denormalizeOpAttrsEnabledAttribute.getValue() ) );
            }

            // SynchPeriodMillis
            org.dom4j.Attribute synchPeriodMillisAttribute = defaultDirectoryServiceElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_SYNCH_PERIOD_MILLIS );
            if ( synchPeriodMillisAttribute == null )
            {
                // If the 'synchPeriodMillis' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSyncPeriodMillis" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration
                    .setSynchronizationPeriod( Integer.parseInt( synchPeriodMillisAttribute.getValue() ) );
            }

            // System partition
            readSystemPartition( defaultDirectoryServiceElement, serverConfiguration );

            // Other partitions
            readPartitions( defaultDirectoryServiceElement, serverConfiguration );

            // Interceptors
            readInterceptors( defaultDirectoryServiceElement, serverConfiguration );
        }
    }


    /**
     * Reads the system partition.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readSystemPartition( Element element, ServerConfigurationV155 serverConfiguration )
        throws ServerXmlIOException, NumberFormatException, BooleanFormatException
    {
        // Getting the 'systemPartition' element
        Element systemPartitionElement = element.element( ServerXmlIOV155.ELEMENT_SYSTEM_PARTITION );
        if ( systemPartitionElement == null )
        {
            // If the 'systemPartition' element does not exists,
            // we throw an exception
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSystemPartition" ) ); //$NON-NLS-1$
        }
        else
        {
            // Getting the 'jdbmPartition' element
            Element jdbmPartitionElement = systemPartitionElement.element( ServerXmlIOV155.ELEMENT_JDBM_PARTITION );
            if ( jdbmPartitionElement == null )
            {
                // If the 'jdbmPartition' element does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorJDBMPartition" ) ); //$NON-NLS-1$
            }
            else
            {
                // Creating the system partition
                Partition systemPartition = new Partition();
                systemPartition.setSystemPartition( true );

                // Reading the partition
                readPartition( jdbmPartitionElement, systemPartition );

                // Adding the partition to the server configuration
                serverConfiguration.addPartition( systemPartition );
            }
        }
    }


    /**
     * Reads a partition.
     *
     * @param element
     *      the partition element
     * @param partition
     *      the partition
     * @throws ServerXmlIOException
     * @throws NumberFormatException
     * @throws BooleanFormatException
     */
    private void readPartition( Element element, Partition partition ) throws ServerXmlIOException,
        NumberFormatException, BooleanFormatException
    {
        // Id
        org.dom4j.Attribute idAttribute = element.attribute( ServerXmlIOV155.ATTRIBUTE_ID );
        if ( idAttribute == null )
        {
            // If the 'id' attribute does not exists,
            // we throw an exception
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorId" ) ); //$NON-NLS-1$
        }
        else
        {
            partition.setId( idAttribute.getValue() );
        }

        // Cache Size
        org.dom4j.Attribute cacheSizeAttribute = element.attribute( ServerXmlIOV155.ATTRIBUTE_CACHE_SIZE );
        if ( cacheSizeAttribute == null )
        {
            // If the 'cacheSize' attribute does not exists,
            // we throw an exception
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorCacheSize" ) ); //$NON-NLS-1$
        }
        else
        {
            partition.setCacheSize( Integer.parseInt( cacheSizeAttribute.getValue() ) );
        }

        // Suffix
        org.dom4j.Attribute suffixAttribute = element.attribute( ServerXmlIOV155.ATTRIBUTE_SUFFIX );
        if ( suffixAttribute == null )
        {
            // If the 'suffix' attribute does not exists,
            // we throw an exception
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSuffix" ) ); //$NON-NLS-1$
        }
        else
        {
            partition.setSuffix( suffixAttribute.getValue() );
        }

        // Optimizer Enabled
        org.dom4j.Attribute optimizerEnabledAttribute = element.attribute( ServerXmlIOV155.ATTRIBUTE_OPTIMIZER_ENABLED );
        if ( optimizerEnabledAttribute == null )
        {
            // If the 'optimizeEnabled' attribute does not exists,
            // we throw an exception
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorOptimizerEnabled" ) ); //$NON-NLS-1$
        }
        else
        {
            partition.setEnableOptimizer( parseBoolean( optimizerEnabledAttribute.getValue() ) );
        }

        // Sync On Write
        org.dom4j.Attribute syncOnWriteAttribute = element.attribute( ServerXmlIOV155.ATTRIBUTE_SYNC_ON_WRITE );
        if ( syncOnWriteAttribute == null )
        {
            // If the 'syncOnWrite' attribute does not exists,
            // we throw an exception
            throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSyncOnWrite" ) ); //$NON-NLS-1$
        }
        else
        {
            partition.setSynchronizationOnWrite( parseBoolean( syncOnWriteAttribute.getValue() ) );
        }

        // Indexed attributes
        partition.setIndexedAttributes( readIndexedAttributes( element ) );
    }


    /**
     * Reads and returns the indexed attributes.
     *
     * @param element
     *      the element
     * @return
     *      the list of indexed attributes
     * @throws NumberFormatException
     */
    private List<IndexedAttribute> readIndexedAttributes( Element element ) throws NumberFormatException
    {
        List<IndexedAttribute> indexedAttributes = new ArrayList<IndexedAttribute>();

        // Getting the 'indexedAttributes' element
        Element indexedAttributesElement = element.element( ServerXmlIOV155.ELEMENT_INDEXED_ATTRIBUTES );
        if ( indexedAttributesElement != null )
        {
            // Looping on 'jdbmIndex' elements
            for ( Iterator<?> i = indexedAttributesElement.elementIterator( ServerXmlIOV155.ELEMENT_JDBM_INDEX ); i
                .hasNext(); )
            {
                // Getting the 'jdbmIndex' element
                Element jdbmIndexElement = ( Element ) i.next();

                // Getting the 'attributeId' attribute
                org.dom4j.Attribute attributeIdAttribute = jdbmIndexElement
                    .attribute( ServerXmlIOV155.ATTRIBUTE_ATTRIBUTE_ID );
                if ( attributeIdAttribute != null )
                {
                    // Getting the 'cacheSize' attribute
                    org.dom4j.Attribute cacheSizeAttribute = jdbmIndexElement
                        .attribute( ServerXmlIOV155.ATTRIBUTE_CACHE_SIZE );
                    if ( cacheSizeAttribute != null )
                    {
                        // Adding a new indexed attribute to the list
                        indexedAttributes.add( new IndexedAttribute( attributeIdAttribute.getValue(), Integer
                            .parseInt( cacheSizeAttribute.getValue() ) ) );
                    }
                }
            }
        }

        return indexedAttributes;
    }


    /**
     * Reads the partitions.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws NumberFormatException
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readPartitions( Element element, ServerConfigurationV155 serverConfiguration )
        throws NumberFormatException, ServerXmlIOException, BooleanFormatException
    {
        // Getting the 'partitions'element
        Element partitionsElement = element.element( ServerXmlIOV155.ELEMENT_PARTITIONS );
        if ( partitionsElement != null )
        {
            // Looping on all 'jdbmPartition' tags
            for ( Iterator<?> i = partitionsElement.elementIterator( ServerXmlIOV155.ELEMENT_JDBM_PARTITION ); i
                .hasNext(); )
            {
                // Getting the 'jbdmPartition' element
                Element jdbmPartitionElement = ( Element ) i.next();

                // Creating the partition
                Partition partition = new Partition();

                // Reading the partition
                readPartition( jdbmPartitionElement, partition );

                // Adding the partition to the server configuration
                serverConfiguration.addPartition( partition );
            }
        }
    }


    /**
     * Reads the interceptors.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     */
    private void readInterceptors( Element element, ServerConfigurationV155 serverConfiguration )
    {
        // Getting the 'interceptors
        Element interceptorsElement = element.element( ServerXmlIOV155.ELEMENT_INTERCEPTORS );
        if ( interceptorsElement != null )
        {
            // Looping on all interceptor elements
            for ( Iterator<?> i = interceptorsElement.elementIterator(); i.hasNext(); )
            {
                // Getting the element
                Element interceptorElement = ( Element ) i.next();

                // Checking which interceptor it is
                String interceptorElementName = interceptorElement.getName();
                if ( ServerXmlIOV155.ELEMENT_NORMALIZATION_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.NORMALIZATION );
                }
                else if ( ServerXmlIOV155.ELEMENT_AUTHENTICATION_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.AUTHENTICATION );
                }
                else if ( ServerXmlIOV155.ELEMENT_REFERRAL_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.REFERRAL );
                }
                else if ( ServerXmlIOV155.ELEMENT_ACI_AUTHORIZATION_INTERCEPTOR
                    .equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.ACI_AUTHORIZATION );
                }
                else if ( ServerXmlIOV155.ELEMENT_DEFAULT_AUTHORIZATION_INTERCEPTOR
                    .equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.DEFAULT_AUTHORIZATION );
                }
                else if ( ServerXmlIOV155.ELEMENT_EXCEPTION_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.EXCEPTION );
                }
                else if ( ServerXmlIOV155.ELEMENT_OPERATIONAL_ATTRIBUTE_INTERCEPTOR
                    .equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.OPERATIONAL_ATTRIBUTE );
                }
                else if ( ServerXmlIOV155.ELEMENT_SCHEMA_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.SCHEMA );
                }
                else if ( ServerXmlIOV155.ELEMENT_SUBENTRY_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.SUBENTRY );
                }
                else if ( ServerXmlIOV155.ELEMENT_COLLECTIVE_ATTRIBUTE_INTERCEPTOR
                    .equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.COLLECTIVE_ATTRIBUTE );
                }
                else if ( ServerXmlIOV155.ELEMENT_EVENT_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.EVENT );
                }
                else if ( ServerXmlIOV155.ELEMENT_TRIGGER_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.TRIGGER );
                }
                else if ( ServerXmlIOV155.ELEMENT_REPLICATION_INTERCEPTOR.equalsIgnoreCase( interceptorElementName ) )
                {
                    serverConfiguration.addInterceptor( InterceptorEnum.REPLICATION );
                }
            }
        }
    }


    /**
     * Reads the ChangePasswordServer Bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws NumberFormatException
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readChangePasswordServerBean( Element element, ServerConfigurationV155 serverConfiguration )
        throws NumberFormatException, ServerXmlIOException, BooleanFormatException
    {
        // By default, the protocol is not enabled
        serverConfiguration.setEnableChangePassword( false );

        // Getting the 'changePasswordServer' element
        Element changePasswordServerElement = element.element( ServerXmlIOV155.ELEMENT_CHANGE_PASSWORD_SERVER );
        if ( changePasswordServerElement != null )
        {
            serverConfiguration.setEnableChangePassword( true );

            // Getting the 'transports' element
            Element transportsElement = changePasswordServerElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
            if ( transportsElement != null )
            {
                // Getting the 'tcpTransport' element
                Element tcpTransportElement = transportsElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
                if ( transportsElement != null )
                {
                    // Getting the 'port' attribute
                    org.dom4j.Attribute portAttribute = tcpTransportElement.attribute( ServerXmlIOV155.ATTRIBUTE_PORT );
                    if ( portAttribute != null )
                    {
                        serverConfiguration.setChangePasswordPort( Integer.parseInt( portAttribute.getValue() ) );
                    }
                    else
                    {
                        // If the 'port' attribute does not exists,
                        // we throw an exception
                        throw new ServerXmlIOException( Messages
                            .getString( "ServerXmlIOV155.ErrorChangePasswordServerPort" ) ); //$NON-NLS-1$
                    }
                }
                else
                {
                    // If the 'tcpTransport' element does not exists,
                    // we throw an exception
                    throw new ServerXmlIOException( Messages
                        .getString( "ServerXmlIOV155.ErrorChangePasswordServerPort" ) ); //$NON-NLS-1$
                }
            }
            else
            {
                // If the 'transports' element does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorChangePasswordServerPort" ) ); //$NON-NLS-1$
            }
        }
    }


    /**
     * Reads the KdcServer Bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws NumberFormatException
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readKdcServerBean( Element element, ServerConfigurationV155 serverConfiguration )
        throws NumberFormatException, ServerXmlIOException, BooleanFormatException
    {
        // By default, the protocol is not enabled
        serverConfiguration.setEnableKerberos( false );

        // Getting the 'kdcServer' element
        Element kdcServerElement = element.element( ServerXmlIOV155.ELEMENT_KDC_SERVER );
        if ( kdcServerElement != null )
        {
            serverConfiguration.setEnableKerberos( true );

            // Getting the 'transports' element
            Element transportsElement = kdcServerElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
            if ( transportsElement != null )
            {
                // Getting the 'tcpTransport' element
                Element tcpTransportElement = transportsElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
                if ( transportsElement != null )
                {
                    // Getting the 'port' attribute
                    org.dom4j.Attribute portAttribute = tcpTransportElement.attribute( ServerXmlIOV155.ATTRIBUTE_PORT );
                    if ( portAttribute != null )
                    {
                        serverConfiguration.setKerberosPort( Integer.parseInt( portAttribute.getValue() ) );
                    }
                    else
                    {
                        // If the 'port' attribute does not exists,
                        // we throw an exception
                        throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorKdcServerPort" ) ); //$NON-NLS-1$
                    }
                }
                else
                {
                    // If the 'tcpTransport' element does not exists,
                    // we throw an exception
                    throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorKdcServerPort" ) ); //$NON-NLS-1$
                }
            }
            else
            {
                // If the 'transports' element does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorKdcServerPort" ) ); //$NON-NLS-1$
            }
        }
    }


    /**
     * Reads the NtpServer Bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws NumberFormatException
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readNtpServerBean( Element element, ServerConfigurationV155 serverConfiguration )
        throws NumberFormatException, ServerXmlIOException, BooleanFormatException
    {
        // By default, the protocol is not enabled
        serverConfiguration.setEnableNtp( false );

        // Getting the 'ntpServer' element
        Element ntpServerElement = element.element( ServerXmlIOV155.ELEMENT_NTP_SERVER );
        if ( ntpServerElement != null )
        {
            serverConfiguration.setEnableNtp( true );

            // Getting the 'transports' element
            Element transportsElement = ntpServerElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
            if ( transportsElement != null )
            {
                // Getting the 'tcpTransport' element
                Element tcpTransportElement = transportsElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
                if ( transportsElement != null )
                {
                    // Getting the 'port' attribute
                    org.dom4j.Attribute portAttribute = tcpTransportElement.attribute( ServerXmlIOV155.ATTRIBUTE_PORT );
                    if ( portAttribute != null )
                    {
                        serverConfiguration.setNtpPort( Integer.parseInt( portAttribute.getValue() ) );
                    }
                    else
                    {
                        // If the 'port' attribute does not exists,
                        // we throw an exception
                        throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorNtpServerPort" ) ); //$NON-NLS-1$
                    }
                }
                else
                {
                    // If the 'tcpTransport' element does not exists,
                    // we throw an exception
                    throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorNtpServerPort" ) ); //$NON-NLS-1$
                }
            }
            else
            {
                // If the 'transports' element does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorNtpServerPort" ) ); //$NON-NLS-1$
            }
        }
    }


    /**
     * Reads the DnsServer Bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws NumberFormatException
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readDnsServerBean( Element element, ServerConfigurationV155 serverConfiguration )
        throws NumberFormatException, ServerXmlIOException, BooleanFormatException
    {
        // By default, the protocol is not enabled
        serverConfiguration.setEnableDns( false );

        // Getting the 'dnsServer' element
        Element dnsServerElement = element.element( ServerXmlIOV155.ELEMENT_DNS_SERVER );
        if ( dnsServerElement != null )
        {
            // Getting the 'transports' element
            Element transportsElement = dnsServerElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
            if ( transportsElement != null )
            {
                // Getting the 'tcpTransport' element
                Element tcpTransportElement = transportsElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
                if ( transportsElement != null )
                {
                    // Getting the 'port' attribute
                    org.dom4j.Attribute portAttribute = tcpTransportElement.attribute( ServerXmlIOV155.ATTRIBUTE_PORT );
                    if ( portAttribute != null )
                    {
                        serverConfiguration.setDnsPort( Integer.parseInt( portAttribute.getValue() ) );
                    }
                    else
                    {
                        // If the 'port' attribute does not exists,
                        // we throw an exception
                        throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorDnsServerPort" ) ); //$NON-NLS-1$
                    }
                }
                else
                {
                    // If the 'tcpTransport' element does not exists,
                    // we throw an exception
                    throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorDnsServerPort" ) ); //$NON-NLS-1$
                }
            }
            else
            {
                // If the 'transports' element does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorDnsServerPort" ) ); //$NON-NLS-1$
            }
        }
    }


    /**
     * Reads the LdapServer Bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     * @throws NumberFormatException
     * @throws ServerXmlIOException
     * @throws BooleanFormatException
     */
    private void readLdapServerBean( Element element, ServerConfigurationV155 serverConfiguration )
        throws NumberFormatException, ServerXmlIOException, BooleanFormatException
    {
        // By default, the protocols are not enabled
        serverConfiguration.setEnableLdap( false );
        serverConfiguration.setEnableLdaps( false );

        // Getting the 'ldapServer' element
        Element ldapServerElement = element.element( ServerXmlIOV155.ELEMENT_LDAP_SERVER );
        if ( ldapServerElement != null )
        {
            // Allow Anonymous Access
            org.dom4j.Attribute allowAnonymousAccessAttribute = ldapServerElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_ALLOW_ANONYMOUS_ACCESS );
            if ( allowAnonymousAccessAttribute == null )
            {
                // If the 'allowAnonymousAccess' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorAllowAnonymousAccess" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setAllowAnonymousAccess( parseBoolean( allowAnonymousAccessAttribute.getValue() ) );
            }

            // SaslHost
            org.dom4j.Attribute saslHostAttribute = ldapServerElement.attribute( ServerXmlIOV155.ATTRIBUTE_SASL_HOST );
            if ( saslHostAttribute == null )
            {
                // If the 'saslHost' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSaslHost" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setSaslHost( saslHostAttribute.getValue() );
            }

            // SaslPrincipal
            org.dom4j.Attribute saslPrincipalAttribute = ldapServerElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_SASL_PRINCIPAL );
            if ( saslPrincipalAttribute == null )
            {
                // If the 'saslPrincipal' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSaslPrincipal" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setSaslPrincipal( saslPrincipalAttribute.getValue() );
            }

            // SearchBaseDn
            org.dom4j.Attribute searchBaseDnAttribute = ldapServerElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_SEARCH_BASE_DN );
            if ( searchBaseDnAttribute == null )
            {
                // If the 'searchBaseDn' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorSearchBaseDn" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setSearchBaseDn( searchBaseDnAttribute.getValue() );
            }

            // MaxTimeLimit
            org.dom4j.Attribute maxTimeLimitAttribute = ldapServerElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_MAX_TIME_LIMIT );
            if ( maxTimeLimitAttribute == null )
            {
                // If the 'maxTimeLimit' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorMaxTimeLimit" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setMaxTimeLimit( Integer.parseInt( maxTimeLimitAttribute.getValue() ) );
            }

            // MaxSizeLimit
            org.dom4j.Attribute maxSizeLimitAttribute = ldapServerElement
                .attribute( ServerXmlIOV155.ATTRIBUTE_MAX_SIZE_LIMIT );
            if ( maxSizeLimitAttribute == null )
            {
                // If the 'maxSizeLimit' attribute does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorMaxSizeLimit" ) ); //$NON-NLS-1$
            }
            else
            {
                serverConfiguration.setMaxSizeLimit( Integer.parseInt( maxSizeLimitAttribute.getValue() ) );
            }

            // Getting the 'transports' element
            Element transportsElement = ldapServerElement.element( ServerXmlIOV155.ELEMENT_TRANSPORTS );
            if ( transportsElement != null )
            {
                // Looping on all 'tcpTransport' elements
                for ( Iterator<?> iterator = transportsElement.elementIterator( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT ); iterator
                    .hasNext(); )
                {
                    // Getting the 'tcpTransport' element
                    Element tcpTransportElement = ( Element ) iterator.next();

                    // Getting the 'port' attribute
                    org.dom4j.Attribute portAttribute = tcpTransportElement.attribute( ServerXmlIOV155.ATTRIBUTE_PORT );
                    if ( portAttribute == null )
                    {
                        // If the 'port' attribute does not exists,
                        // we throw an exception
                        throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorLdapServerPort" ) ); //$NON-NLS-1$
                    }

                    // Getting the 'enableSSL' attribute
                    boolean enableSsl = false;
                    org.dom4j.Attribute enableSslAttribut = tcpTransportElement
                        .attribute( ServerXmlIOV155.ATTRIBUTE_ENABLESSL );
                    if ( enableSslAttribut != null )
                    {
                        enableSsl = parseBoolean( enableSslAttribut.getValue() );
                    }

                    // Enabling the right protocol
                    if ( enableSsl )
                    {
                        serverConfiguration.setEnableLdaps( true );
                        serverConfiguration.setLdapsPort( Integer.parseInt( portAttribute.getValue() ) );
                    }
                    else
                    {
                        serverConfiguration.setEnableLdap( true );
                        serverConfiguration.setLdapPort( Integer.parseInt( portAttribute.getValue() ) );
                    }

                }
            }
            else
            {
                // If the 'transports' element does not exists,
                // we throw an exception
                throw new ServerXmlIOException( Messages.getString( "ServerXmlIOV155.ErrorLdapServerPort" ) ); //$NON-NLS-1$
            }

            // Supported Mechanisms
            Element supportedMechanismsElement = ldapServerElement
                .element( ServerXmlIOV155.ELEMENT_SASL_MECHANISM_HANDLERS );
            if ( supportedMechanismsElement != null )
            {
                // Looping on all elements
                for ( Iterator<?> iterator = supportedMechanismsElement.elementIterator(); iterator.hasNext(); )
                {
                    // Getting the  element
                    Element supportedMechanismValueElement = ( Element ) iterator.next();
                    String supportedMechanismValue = supportedMechanismValueElement.getName();
                    org.dom4j.Attribute mechNameAttribute = supportedMechanismValueElement
                        .attribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME );
                    String mechNameValue = ( mechNameAttribute == null ) ? null : mechNameAttribute.getValue();

                    if ( ServerXmlIOV155.ELEMENT_SIMPLE_MECHANISM_HANDLER.equalsIgnoreCase( supportedMechanismValue )
                        && ServerXmlIOV155.SUPPORTED_MECHANISM_SIMPLE.equalsIgnoreCase( mechNameValue ) )
                    {
                        serverConfiguration.addSupportedMechanism( SupportedMechanismEnum.SIMPLE );
                    }
                    else if ( ServerXmlIOV155.ELEMENT_CRAM_MD5_MECHANISM_HANDLER
                        .equalsIgnoreCase( supportedMechanismValue )
                        && ServerXmlIOV155.SUPPORTED_MECHANISM_CRAM_MD5.equalsIgnoreCase( mechNameValue ) )
                    {
                        serverConfiguration.addSupportedMechanism( SupportedMechanismEnum.CRAM_MD5 );
                    }
                    else if ( ServerXmlIOV155.ELEMENT_DIGEST_MD5_MECHANISM_HANDLER
                        .equalsIgnoreCase( supportedMechanismValue )
                        && ServerXmlIOV155.SUPPORTED_MECHANISM_DIGEST_MD5.equalsIgnoreCase( mechNameValue ) )
                    {
                        serverConfiguration.addSupportedMechanism( SupportedMechanismEnum.DIGEST_MD5 );
                    }
                    else if ( ServerXmlIOV155.ELEMENT_GSSAPI_MECHANISM_HANDLER
                        .equalsIgnoreCase( supportedMechanismValue )
                        && ServerXmlIOV155.SUPPORTED_MECHANISM_GSSAPI.equalsIgnoreCase( mechNameValue ) )
                    {
                        serverConfiguration.addSupportedMechanism( SupportedMechanismEnum.GSSAPI );
                    }
                    else if ( ServerXmlIOV155.ELEMENT_NTLM_MECHANISM_HANDLER.equalsIgnoreCase( supportedMechanismValue )
                        && ServerXmlIOV155.SUPPORTED_MECHANISM_NTLM.equalsIgnoreCase( mechNameValue ) )
                    {
                        org.dom4j.Attribute ntlmProviderFcqnAttribute = supportedMechanismValueElement
                            .attribute( ServerXmlIOV155.ATTRIBUTE_NTLM_PROVIDER_FQCN );
                        if ( ntlmProviderFcqnAttribute != null )
                        {
                            SupportedMechanismEnum ntlmSupportedMechanism = SupportedMechanismEnum.NTLM;
                            ntlmSupportedMechanism.setNtlmProviderFqcn( ntlmProviderFcqnAttribute.getValue() );
                            serverConfiguration.addSupportedMechanism( ntlmSupportedMechanism );
                        }
                        else
                        {
                            serverConfiguration.addSupportedMechanism( SupportedMechanismEnum.NTLM );
                        }
                    }
                    else if ( ServerXmlIOV155.ELEMENT_NTLM_MECHANISM_HANDLER.equalsIgnoreCase( supportedMechanismValue )
                        && ServerXmlIOV155.SUPPORTED_MECHANISM_GSS_SPNEGO.equalsIgnoreCase( mechNameValue ) )
                    {
                        org.dom4j.Attribute ntlmProviderFcqnAttribute = supportedMechanismValueElement
                            .attribute( ServerXmlIOV155.ATTRIBUTE_NTLM_PROVIDER_FQCN );
                        if ( ntlmProviderFcqnAttribute != null )
                        {
                            SupportedMechanismEnum gssSpnegoSupportedMechanism = SupportedMechanismEnum.GSS_SPNEGO;
                            gssSpnegoSupportedMechanism.setNtlmProviderFqcn( ntlmProviderFcqnAttribute.getValue() );
                            serverConfiguration.addSupportedMechanism( gssSpnegoSupportedMechanism );
                        }
                        else
                        {
                            serverConfiguration.addSupportedMechanism( SupportedMechanismEnum.GSS_SPNEGO );
                        }
                    }
                }
            }

            // SaslRealms
            Element SaslRealmsElement = ldapServerElement.element( ServerXmlIOV155.ELEMENT_SASL_REALMS );
            if ( SaslRealmsElement != null )
            {
                // Looping on all 'value' elements
                for ( Iterator<?> iterator = SaslRealmsElement.elementIterator( ServerXmlIOV155.ELEMENT_VALUE ); iterator
                    .hasNext(); )
                {
                    // Getting the 'value' element
                    Element saslRealmValueElement = ( Element ) iterator.next();

                    // Adding the SaslRealm value
                    serverConfiguration.addSaslRealm( saslRealmValueElement.getText().trim() );

                }
            }

            // Extended operations
            readExtendedOperations( ldapServerElement, serverConfiguration );

            return;
        }
    }


    /**
     * Reads the extended operations.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     */
    private void readExtendedOperations( Element element, ServerConfigurationV155 serverConfiguration )
    {
        // Getting the 'interceptors
        Element interceptorsElement = element.element( ServerXmlIOV155.ELEMENT_EXTENDED_OPERATION_HANDLERS );
        if ( interceptorsElement != null )
        {
            // Looping on all interceptor elements
            for ( Iterator<?> i = interceptorsElement.elementIterator(); i.hasNext(); )
            {
                // Getting the element
                Element extendedOperationElement = ( Element ) i.next();

                // Checking which extended operation it is
                String extendedOperationElementName = extendedOperationElement.getName();
                if ( ServerXmlIOV155.ELEMENT_START_TLS_HANDLER.equalsIgnoreCase( extendedOperationElementName ) )
                {
                    serverConfiguration.addExtendedOperation( ExtendedOperationEnum.START_TLS );
                }
                if ( ServerXmlIOV155.ELEMENT_GRACEFUL_SHUTDOWN_HANDLER.equalsIgnoreCase( extendedOperationElementName ) )
                {
                    serverConfiguration.addExtendedOperation( ExtendedOperationEnum.GRACEFUL_SHUTDOWN );
                }
                if ( ServerXmlIOV155.ELEMENT_LAUNCH_DIAGNOSTIC_UI_HANDLER
                    .equalsIgnoreCase( extendedOperationElementName ) )
                {
                    serverConfiguration.addExtendedOperation( ExtendedOperationEnum.LAUNCH_DIAGNOSTIC_UI );
                }
            }

        }
    }


    /* (non-Javadoc)
     * @see org.apache.directory.studio.apacheds.configuration.model.ServerXmlIO#toXml(org.apache.directory.studio.apacheds.configuration.model.ServerConfiguration)
     */
    public String toXml( ServerConfiguration serverConfiguration ) throws IOException
    {
        // Creating the document
        Document document = DocumentHelper.createDocument();

        // Creating the root element with its namespaces definitions
        Element root = document.addElement( new QName( ServerXmlIOV155.ELEMENT_BEANS, NAMESPACE_XBEAN_SPRING ) );
        root.add( NAMESPACE_SPRINGFRAMEWORK );
        root.add( NAMESPACE_APACHEDS );

        // DefaultDirectoryService Bean
        createDefaultDirectoryServiceBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // ChangePasswordServer Bean
        createChangePasswordServerBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // KdcServer Bean
        createKdcServerBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // NtpServer Bean
        createNtpServerBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // DnsServer Bean
        createDnsServerBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // LdapServer Bean
        createLdapServerBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // ApacheDS Bean
        createApacheDSBean( root, ( ServerConfigurationV155 ) serverConfiguration );

        // Creating the output stream we're going to put the XML in
        OutputStream os = new ByteArrayOutputStream();
        OutputFormat outformat = OutputFormat.createPrettyPrint();
        outformat.setEncoding( "UTF-8" ); //$NON-NLS-1$

        // Writing the XML.
        XMLWriter writer = new XMLWriter( os, outformat );
        writer.write( document );
        writer.flush();
        writer.close();

        return os.toString();
    }


    /**
     * Creates the DefaultDirectoryService bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createDefaultDirectoryServiceBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        // Adding the 'defaultDirectoryService' element
        Element defaultDirectoryServiceElement = root.addElement( ServerXmlIOV155.ELEMENT_DEFAULT_DIRECTORY_SERVICE );

        // Id
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID,
            ServerXmlIOV155.VALUE_DIRECTORY_SERVICE );

        // InstanceId
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_INSTANCE_ID,
            ServerXmlIOV155.VALUE_DEFAULT );

        // ReplicaId
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_REPLICAID,
            ServerXmlIOV155.VALUE_REPLICAID );

        // WorkingDirectory
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_WORKING_DIRECTORY,
            ServerXmlIOV155.VALUE_EXAMPLE_DOT_COM );

        // AllowAnonymousAccess
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ALLOW_ANONYMOUS_ACCESS, "" //$NON-NLS-1$
            + serverConfiguration.isAllowAnonymousAccess() );

        // AccessControlEnabled
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ACCESS_CONTROL_ENABLED, "" //$NON-NLS-1$
            + serverConfiguration.isEnableAccessControl() );

        // DenormalizeOpAttrsEnabled
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_DENORMALIZE_OP_ATTRS_ENABLED, "" //$NON-NLS-1$
            + serverConfiguration.isDenormalizeOpAttr() );

        // SynchPeriodMillis
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_SYNCH_PERIOD_MILLIS, "" //$NON-NLS-1$
            + serverConfiguration.getSynchronizationPeriod() );

        // MaxPDUSize
        defaultDirectoryServiceElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MAXPDUSIZE,
            ServerXmlIOV155.VALUE_MAXPDUSIZE );

        // Adding the 'systemPartition' element
        Element systemPartitionElement = defaultDirectoryServiceElement
            .addElement( ServerXmlIOV155.ELEMENT_SYSTEM_PARTITION );

        // Adding System Partition Bean
        createSystemPartitionBean( systemPartitionElement, serverConfiguration );

        // Adding the 'partitions' element
        Element partitionsElement = defaultDirectoryServiceElement.addElement( ServerXmlIOV155.ELEMENT_PARTITIONS );

        // Adding User Partitions Beans
        createUserPartitions( partitionsElement, serverConfiguration );

        // Adding the 'interceptors' element
        Element interceptorsElement = defaultDirectoryServiceElement.addElement( ServerXmlIOV155.ELEMENT_INTERCEPTORS );

        // Adding Interceptors Beans
        createInterceptors( interceptorsElement, serverConfiguration );
    }


    /**
     * Creates the system partition bean.
     *
     * @param systemPartitionElement
     *      the systemPartition element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createSystemPartitionBean( Element systemPartitionElement, ServerConfigurationV155 serverConfiguration )
    {
        // Looping on partitions to find the system partition
        Partition systemPartition = null;
        for ( Partition partition : serverConfiguration.getPartitions() )
        {
            if ( partition.isSystemPartition() )
            {
                systemPartition = partition;
                break;
            }
        }

        if ( systemPartition != null )
        {
            createPartition( systemPartitionElement, systemPartition );
        }
    }


    /**
     * Creates the user partition beans.
     *
     * @param partitionsElement
     *      the partitions element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createUserPartitions( Element partitionsElement, ServerConfigurationV155 serverConfiguration )
    {
        // Looping on partitions
        for ( Partition partition : serverConfiguration.getPartitions() )
        {
            if ( !partition.isSystemPartition() )
            {
                createPartition( partitionsElement, partition );
            }
        }
    }


    /**
     * Creates the partition bean.
     *
     * @param element
     *      the element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createPartition( Element element, Partition partition )
    {
        // Adding the 'jdbmPartition' element
        Element jdbmPartitionElement = element.addElement( ServerXmlIOV155.ELEMENT_JDBM_PARTITION );

        // Id
        jdbmPartitionElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID, partition.getId() );

        // CacheSize
        jdbmPartitionElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_CACHE_SIZE, "" + partition.getCacheSize() ); //$NON-NLS-1$

        // Suffix
        jdbmPartitionElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_SUFFIX, partition.getSuffix() );

        // OptimizerEnabled
        jdbmPartitionElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_OPTIMIZER_ENABLED, "" //$NON-NLS-1$
            + partition.isEnableOptimizer() );

        // SyncOnWrite
        jdbmPartitionElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_SYNC_ON_WRITE, "" //$NON-NLS-1$
            + partition.isSynchronizationOnWrite() );

        // IndexedAttributes
        createIndexedAttributes( jdbmPartitionElement, partition.getIndexedAttributes() );
    }


    /**
     * Creates the indexed attributes bean.
     *
     * @param element
     *      the element
     * @param indexedAttributes
     *      the indexed attributes list
     */
    private void createIndexedAttributes( Element element, List<IndexedAttribute> indexedAttributes )
    {
        // Adding the 'indexedAttribute' element
        Element indexedAttributeElement = element.addElement( ServerXmlIOV155.ELEMENT_INDEXED_ATTRIBUTES );

        if ( indexedAttributes != null )
        {
            // Looping on indexed attributes
            for ( IndexedAttribute indexedAttribute : indexedAttributes )
            {
                // Adding the 'jdbmIndex' element
                Element jdbmIndexElement = indexedAttributeElement.addElement( ServerXmlIOV155.ELEMENT_JDBM_INDEX );
                jdbmIndexElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ATTRIBUTE_ID, indexedAttribute
                    .getAttributeId() );
                jdbmIndexElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_CACHE_SIZE, "" //$NON-NLS-1$
                    + indexedAttribute.getCacheSize() );
            }
        }
    }


    /**
     * Creates the interceptor beans.
     *
     * @param interceptorsElement
     *      the interceptors element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createInterceptors( Element interceptorsElement, ServerConfigurationV155 serverConfiguration )
    {
        List<InterceptorEnum> interceptors = serverConfiguration.getInterceptors();

        if ( interceptors.contains( InterceptorEnum.NORMALIZATION ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_NORMALIZATION_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.AUTHENTICATION ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_AUTHENTICATION_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.REFERRAL ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_REFERRAL_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.ACI_AUTHORIZATION ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_ACI_AUTHORIZATION_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.DEFAULT_AUTHORIZATION ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_DEFAULT_AUTHORIZATION_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.EXCEPTION ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_EXCEPTION_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.OPERATIONAL_ATTRIBUTE ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_OPERATIONAL_ATTRIBUTE_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.SCHEMA ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_SCHEMA_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.SUBENTRY ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_SUBENTRY_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.COLLECTIVE_ATTRIBUTE ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_COLLECTIVE_ATTRIBUTE_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.EVENT ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_EVENT_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.TRIGGER ) )
        {
            interceptorsElement.addElement( ServerXmlIOV155.ELEMENT_TRIGGER_INTERCEPTOR );
        }
        if ( interceptors.contains( InterceptorEnum.REPLICATION ) )
        {
            // TODO support replication interceptor
            //            interceptorsElement.addElement( "replicationInterceptor" );
        }
    }


    /**
     * Creates the ChangePasswordServer bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createChangePasswordServerBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        if ( serverConfiguration.isEnableChangePassword() )
        {
            // Adding the 'changePasswordServer' element
            Element changePasswordServerElement = root.addElement( ServerXmlIOV155.ELEMENT_CHANGE_PASSWORD_SERVER );

            // Id
            changePasswordServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID,
                ServerXmlIOV155.ELEMENT_CHANGE_PASSWORD_SERVER );

            // Adding 'transports' element
            Element transportsElement = changePasswordServerElement.addElement( ServerXmlIOV155.ELEMENT_TRANSPORTS );

            // Adding 'tcpTransport' element
            Element tcpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT );

            // Port
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getChangePasswordPort() );

            // NbThreads
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NBTHREADS,
                ServerXmlIOV155.VALUE_CHANGEPASSWORDSERVER_NB_THREADS );

            // BackLog
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_BACKLOG, ServerXmlIOV155.VALUE_BACKLOG );

            // Adding 'udpTransport' element
            Element udpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_UDP_TRANSPORT );

            // Port
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getChangePasswordPort() );

            // NbThreads
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NBTHREADS,
                ServerXmlIOV155.VALUE_CHANGEPASSWORDSERVER_NB_THREADS );

            // BackLog
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_BACKLOG, ServerXmlIOV155.VALUE_BACKLOG );

            // Adding 'directoryService' element
            changePasswordServerElement.addElement( ServerXmlIOV155.VALUE_DIRECTORY_SERVICE ).setText(
                "#directoryService" ); //$NON-NLS-1$
        }
    }


    /**
     * Creates the KdcServer bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createKdcServerBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        if ( serverConfiguration.isEnableKerberos() )
        {
            // Adding the 'kdcServer' element
            Element kdcServerElement = root.addElement( ServerXmlIOV155.ELEMENT_KDC_SERVER );

            // Id
            kdcServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID, ServerXmlIOV155.ELEMENT_KDC_SERVER );

            // Adding 'transports' element
            Element transportsElement = kdcServerElement.addElement( ServerXmlIOV155.ELEMENT_TRANSPORTS );

            // Adding 'tcpTransport' element
            Element tcpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT );

            // Port
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getKerberosPort() );

            // NbThreads
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NBTHREADS,
                ServerXmlIOV155.VALUE_KDCSERVER_NB_THREADS );

            // BackLog
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_BACKLOG, ServerXmlIOV155.VALUE_BACKLOG );

            // Adding 'udpTransport' element
            Element udpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_UDP_TRANSPORT );

            // Port
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getKerberosPort() );

            // NbThreads
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NBTHREADS,
                ServerXmlIOV155.VALUE_CHANGEPASSWORDSERVER_NB_THREADS );

            // BackLog
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_BACKLOG, ServerXmlIOV155.VALUE_BACKLOG );

            // Adding 'directoryService' element
            kdcServerElement.addElement( ServerXmlIOV155.VALUE_DIRECTORY_SERVICE ).setText( "#directoryService" ); //$NON-NLS-1$
        }
    }


    /**
     * Creates the NtpServer bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createNtpServerBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        if ( serverConfiguration.isEnableNtp() )
        {
            // Adding the 'ntpServer' element
            Element ntpServerElement = root.addElement( ServerXmlIOV155.ELEMENT_NTP_SERVER );

            // Id
            ntpServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID, ServerXmlIOV155.ELEMENT_NTP_SERVER );

            // Adding 'transports' element
            Element transportsElement = ntpServerElement.addElement( ServerXmlIOV155.ELEMENT_TRANSPORTS );

            // Adding 'tcpTransport' element
            Element tcpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT );

            // Port
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getNtpPort() );

            // Adding 'udpTransport' element
            Element udpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_UDP_TRANSPORT );

            // Port
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getNtpPort() );

            // NbThreads
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NBTHREADS,
                ServerXmlIOV155.VALUE_NTPSERVER_NB_THREADS );
        }
    }


    /**
     * Creates the DnsServer bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createDnsServerBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        if ( serverConfiguration.isEnableDns() )
        {
            // Adding the 'dnsServer' element
            Element dnsServerElement = root.addElement( ServerXmlIOV155.ELEMENT_DNS_SERVER );

            // Id
            dnsServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID, ServerXmlIOV155.ELEMENT_DNS_SERVER );

            // Adding 'transports' element
            Element transportsElement = dnsServerElement.addElement( ServerXmlIOV155.ELEMENT_TRANSPORTS );

            // Adding 'tcpTransport' element
            Element tcpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT );

            // Port
            tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getDnsPort() );

            // Adding 'udpTransport' element
            Element udpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_UDP_TRANSPORT );

            // Port
            udpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                + serverConfiguration.getDnsPort() );

            // Adding 'directoryService' element
            dnsServerElement.addElement( ServerXmlIOV155.VALUE_DIRECTORY_SERVICE ).setText( "#directoryService" ); //$NON-NLS-1$
        }
    }


    /**
     * Creates the LdapServer bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createLdapServerBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        // Adding the 'ldapServer' element
        Element ldapServerElement = root.addElement( ServerXmlIOV155.ELEMENT_LDAP_SERVER );

        // Id
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID, ServerXmlIOV155.ELEMENT_LDAP_SERVER );

        // AllowAnonymousAccess
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ALLOW_ANONYMOUS_ACCESS, "" //$NON-NLS-1$
            + serverConfiguration.isAllowAnonymousAccess() );

        // SaslHost
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_SASL_HOST, "" + serverConfiguration.getSaslHost() ); //$NON-NLS-1$

        // SaslPrincipal
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_SASL_PRINCIPAL, "" //$NON-NLS-1$
            + serverConfiguration.getSaslPrincipal() );

        // SearchBaseDn
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_SEARCH_BASE_DN, "ou=users,ou=system" ); //$NON-NLS-1$

        // MaxTimeLimit
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MAX_TIME_LIMIT, "" //$NON-NLS-1$
            + serverConfiguration.getMaxTimeLimit() );

        // MaxSizeLimit
        ldapServerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MAX_SIZE_LIMIT, "" //$NON-NLS-1$
            + serverConfiguration.getMaxSizeLimit() );

        // Transports
        if ( serverConfiguration.isEnableLdap() || serverConfiguration.isEnableLdaps() )
        {
            // Adding 'transports' element
            Element transportsElement = ldapServerElement.addElement( ServerXmlIOV155.ELEMENT_TRANSPORTS );

            // LDAP
            if ( serverConfiguration.isEnableLdap() )
            {
                // Adding 'tcpTransport' element
                Element tcpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT );

                // Address
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ADDRESS,
                    ServerXmlIOV155.VALUE_ADDRESS_0_0_0_0 );

                // Port
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                    + serverConfiguration.getLdapPort() );

                // NbThreads
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NBTHREADS,
                    ServerXmlIOV155.VALUE_LDAPSERVER_NB_THREADS );

                // BackLog
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_BACKLOG, ServerXmlIOV155.VALUE_BACKLOG );

                // EnableSSL
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ENABLESSL, "" + false ); //$NON-NLS-1$
            }

            // LDAPS
            if ( serverConfiguration.isEnableLdaps() )
            {
                // Adding 'tcpTransport' element
                Element tcpTransportElement = transportsElement.addElement( ServerXmlIOV155.ELEMENT_TCP_TRANSPORT );

                // Address
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ADDRESS,
                    ServerXmlIOV155.VALUE_ADDRESS_LOCALHOST );

                // Port
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_PORT, "" //$NON-NLS-1$
                    + serverConfiguration.getLdapsPort() );

                // EnableSSL
                tcpTransportElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ENABLESSL, "" + true ); //$NON-NLS-1$
            }
        }

        // Adding 'directoryService' element
        ldapServerElement.addElement( ServerXmlIOV155.VALUE_DIRECTORY_SERVICE ).setText( "#directoryService" ); //$NON-NLS-1$

        // Adding 'saslMechanismHandlers' element
        Element saslMechanismHandlersElement = ldapServerElement
            .addElement( ServerXmlIOV155.ELEMENT_SASL_MECHANISM_HANDLERS );

        // Adding each supported mechanism
        for ( SupportedMechanismEnum supportedMechanism : serverConfiguration.getSupportedMechanisms() )
        {
            switch ( supportedMechanism )
            {
                case SIMPLE:
                    Element simpleMechanismHandlerElement = saslMechanismHandlersElement
                        .addElement( ServerXmlIOV155.ELEMENT_SIMPLE_MECHANISM_HANDLER );
                    simpleMechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME,
                        ServerXmlIOV155.SUPPORTED_MECHANISM_SIMPLE );
                    break;
                case CRAM_MD5:
                    Element cramMd5MechanismHandlerElement = saslMechanismHandlersElement
                        .addElement( ServerXmlIOV155.ELEMENT_CRAM_MD5_MECHANISM_HANDLER );
                    cramMd5MechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME,
                        ServerXmlIOV155.SUPPORTED_MECHANISM_CRAM_MD5 );
                    break;
                case DIGEST_MD5:
                    Element digestMd5MechanismHandlerElement = saslMechanismHandlersElement
                        .addElement( ServerXmlIOV155.ELEMENT_DIGEST_MD5_MECHANISM_HANDLER );
                    digestMd5MechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME,
                        ServerXmlIOV155.SUPPORTED_MECHANISM_DIGEST_MD5 );
                    break;
                case GSSAPI:
                    Element gssapiMechanismHandlerElement = saslMechanismHandlersElement
                        .addElement( ServerXmlIOV155.ELEMENT_GSSAPI_MECHANISM_HANDLER );
                    gssapiMechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME,
                        ServerXmlIOV155.SUPPORTED_MECHANISM_GSSAPI );
                    break;
                case NTLM:
                    Element ntlmMechanismHandlerElement = saslMechanismHandlersElement
                        .addElement( ServerXmlIOV155.ELEMENT_NTLM_MECHANISM_HANDLER );
                    ntlmMechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME,
                        ServerXmlIOV155.SUPPORTED_MECHANISM_NTLM );
                    ntlmMechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NTLM_PROVIDER_FQCN,
                        supportedMechanism.getNtlmProviderFqcn() );
                    break;
                case GSS_SPNEGO:
                    Element gssSpnegoMechanismHandlerElement = saslMechanismHandlersElement
                        .addElement( ServerXmlIOV155.ELEMENT_NTLM_MECHANISM_HANDLER );
                    gssSpnegoMechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_MECH_NAME,
                        ServerXmlIOV155.SUPPORTED_MECHANISM_GSS_SPNEGO );
                    gssSpnegoMechanismHandlerElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_NTLM_PROVIDER_FQCN,
                        supportedMechanism.getNtlmProviderFqcn() );
                    break;
            }
        }

        // Adding 'SaslRealms' element
        Element saslRealmsElement = ldapServerElement.addElement( ServerXmlIOV155.ELEMENT_SASL_REALMS );

        // Adding each SaslRealm item
        for ( String saslRealm : serverConfiguration.getSaslRealms() )
        {
            saslRealmsElement.addElement( new QName( ServerXmlIOV155.ELEMENT_VALUE, NAMESPACE_SPRINGFRAMEWORK ) )
                .setText( saslRealm );
        }

        // Adding 'ExtendedOperations' element
        Element extendedOperationsElement = ldapServerElement
            .addElement( ServerXmlIOV155.ELEMENT_EXTENDED_OPERATION_HANDLERS );

        // Adding each extended operation item
        List<ExtendedOperationEnum> extendedOperations = serverConfiguration.getExtendedOperations();
        if ( extendedOperations.contains( ExtendedOperationEnum.START_TLS ) )
        {
            extendedOperationsElement.addElement( ServerXmlIOV155.ELEMENT_START_TLS_HANDLER );
        }
        if ( extendedOperations.contains( ExtendedOperationEnum.GRACEFUL_SHUTDOWN ) )
        {
            extendedOperationsElement.addElement( ServerXmlIOV155.ELEMENT_GRACEFUL_SHUTDOWN_HANDLER );
        }
        if ( extendedOperations.contains( ExtendedOperationEnum.LAUNCH_DIAGNOSTIC_UI ) )
        {
            extendedOperationsElement.addElement( ServerXmlIOV155.ELEMENT_LAUNCH_DIAGNOSTIC_UI_HANDLER );
        }
    }


    /**
     * Creates the ApacheDS bean.
     *
     * @param root
     *      the root element
     * @param serverConfiguration
     *      the server configuration
     */
    private void createApacheDSBean( Element root, ServerConfigurationV155 serverConfiguration )
    {
        // Adding the 'apacheDS' element
        Element apacheDSElement = root.addElement( ServerXmlIOV155.ELEMENT_APACHE_DS );

        // Id
        apacheDSElement.addAttribute( ServerXmlIOV155.ATTRIBUTE_ID, ServerXmlIOV155.ELEMENT_APACHE_DS );

        // Adding 'ldapService' element
        apacheDSElement.addElement( ServerXmlIOV155.ELEMENT_LDAP_SERVER ).setText( "#ldapServer" ); //$NON-NLS-1$
    }
}
TOP

Related Classes of org.apache.directory.studio.apacheds.configuration.model.v155.ServerXmlIOV155

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.