org.apache.directory.studio.ldapservers.LdapServersManagerIO.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.ldapservers.LdapServersManagerIO.java

Source

/*
 *  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.ldapservers;

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 java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.directory.studio.ldapservers.model.LdapServer;
import org.apache.directory.studio.ldapservers.model.LdapServerAdapterExtension;
import org.apache.directory.studio.ldapservers.model.UnknownLdapServerAdapterExtension;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * This class is used to read/write the 'servers.xml' file.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class LdapServersManagerIO {
    // XML tags and attributes
    private static final String LDAP_SERVERS_TAG = "ldapServers"; //$NON-NLS-1$
    private static final String LDAP_SERVER_TAG = "ldapServer"; //$NON-NLS-1$
    private static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
    private static final String NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
    private static final String ADAPTER_ID_ATTRIBUTE = "adapterId"; //$NON-NLS-1$
    private static final String ADAPTER_NAME_ATTRIBUTE = "adapterName"; //$NON-NLS-1$
    private static final String ADAPTER_VENDOR_ATTRIBUTE = "adapterVendor"; //$NON-NLS-1$
    private static final String ADAPTER_VERSION_ATTRIBUTE = "adapterVersion"; //$NON-NLS-1$
    private static final String CONFIGURATION_PARAMETERS_TAG = "configurationParameters"; //$NON-NLS-1$
    private static final String ENTRY_TAG = "entry"; //$NON-NLS-1$
    private static final String KEY_ATTRIBUTE = "key"; //$NON-NLS-1$
    private static final String TYPE_ATTRIBUTE = "type"; //$NON-NLS-1$
    private static final String VALUE_ATTRIBUTE = "value"; //$NON-NLS-1$

    /**
     * Reads the given input stream.
     *
     * @param stream
     *      the input stream
     * @return
     *      the list of LDAP Servers found in the input stream
     * @throws LdapServersManagerIOException
     */
    public static List<LdapServer> read(InputStream stream) throws LdapServersManagerIOException {
        List<LdapServer> servers = new ArrayList<LdapServer>();

        SAXReader saxReader = new SAXReader();
        Document document = null;

        try {
            document = saxReader.read(stream);
        } catch (DocumentException e) {
            throw new LdapServersManagerIOException(e.getMessage());
        }

        Element rootElement = document.getRootElement();
        if (!rootElement.getName().equals(LDAP_SERVERS_TAG)) {
            throw new LdapServersManagerIOException(
                    Messages.getString("LdapServersManagerIO.ErrorNotValidServersFile")); //$NON-NLS-1$
        }

        for (Iterator<?> i = rootElement.elementIterator(LDAP_SERVER_TAG); i.hasNext();) {
            servers.add(readLdapServer((Element) i.next()));
        }

        return servers;
    }

    /**
     * Reads an LDAP Server element.
     *
     * @param element
     *      the element
     * @return
     *      the corresponding {@link LdapServer}
     */
    private static LdapServer readLdapServer(Element element) {
        LdapServer server = new LdapServer();

        // ID
        Attribute idAttribute = element.attribute(ID_ATTRIBUTE);
        if (idAttribute != null) {
            server.setId(idAttribute.getValue());
        }

        // Name
        Attribute nameAttribute = element.attribute(NAME_ATTRIBUTE);
        if (nameAttribute != null) {
            server.setName(nameAttribute.getValue());
        }

        // Adapter ID
        Attribute adapterIdAttribute = element.attribute(ADAPTER_ID_ATTRIBUTE);
        if (adapterIdAttribute != null) {
            // Getting the id
            String adapterId = adapterIdAttribute.getValue();

            // Looking for the correct LDAP Server Adapter Extension object
            LdapServerAdapterExtension ldapServerAdapterExtension = LdapServerAdapterExtensionsManager.getDefault()
                    .getLdapServerAdapterExtensionById(adapterId);
            if (ldapServerAdapterExtension != null) {
                // The Adapter Extension has been found
                // Assigning it to the server
                server.setLdapServerAdapterExtension(ldapServerAdapterExtension);
            } else {
                // The Adapter Extension has not been found
                // Creating an "unknown" Adapter Extension
                UnknownLdapServerAdapterExtension unknownLdapServerAdapterExtension = new UnknownLdapServerAdapterExtension();

                // Adapter Id
                unknownLdapServerAdapterExtension.setId(adapterId);

                // Adapter Name
                Attribute adapterNameAttribute = element.attribute(ADAPTER_NAME_ATTRIBUTE);
                if (adapterNameAttribute != null) {
                    unknownLdapServerAdapterExtension.setName(adapterNameAttribute.getValue());
                }

                // Adapter Vendor
                Attribute adapterVendorAttribute = element.attribute(ADAPTER_VENDOR_ATTRIBUTE);
                if (adapterVendorAttribute != null) {
                    unknownLdapServerAdapterExtension.setVendor(adapterVendorAttribute.getValue());
                }

                // Adapter Version
                Attribute adapterVersionAttribute = element.attribute(ADAPTER_VERSION_ATTRIBUTE);
                if (adapterVersionAttribute != null) {
                    unknownLdapServerAdapterExtension.setVersion(adapterVersionAttribute.getValue());
                }

                // Assigning the "unknown" Adapter Extension to the server
                server.setLdapServerAdapterExtension(unknownLdapServerAdapterExtension);
            }
        } else {
            // TODO No Adapter ID, throw an error ?
        }

        // Configuration Parameters
        Element configurationParametersElement = element.element(CONFIGURATION_PARAMETERS_TAG);
        if (configurationParametersElement != null) {
            for (Iterator<?> i = configurationParametersElement.elementIterator(ENTRY_TAG); i.hasNext();) {
                readConfigurationParameter(server, (Element) i.next());
            }
        }

        return server;
    }

    /**
     * Reads a configuration parameter.
     *
     * @param server the server
     * @param element the element
     */
    private static void readConfigurationParameter(LdapServer server, Element element) {
        // Key
        Attribute keyAttribute = element.attribute(KEY_ATTRIBUTE);
        String key = null;
        if (keyAttribute != null) {
            key = keyAttribute.getValue();

            // Value
            Attribute valueAttribute = element.attribute(VALUE_ATTRIBUTE);
            String value = null;
            if (valueAttribute != null) {
                value = valueAttribute.getValue();
            }

            // Type
            Attribute typeAttribute = element.attribute(TYPE_ATTRIBUTE);
            String type = null;
            if (typeAttribute != null) {
                type = typeAttribute.getValue();
            }

            // Integer value
            if ((type != null) && (type.equalsIgnoreCase(Integer.class.getCanonicalName()))) {
                server.putConfigurationParameter(key, Integer.parseInt(value));
            }
            // Boolean value
            else if ((type != null) && (type.equalsIgnoreCase(Boolean.class.getCanonicalName()))) {
                server.putConfigurationParameter(key, Boolean.parseBoolean(value));
            }
            // String value (default type)
            else {
                server.putConfigurationParameter(key, value);
            }
        }
    }

    /**
     * Writes the list of servers to the given stream.
     *
     * @param servers
     *      the servers
     * @param outputStream
     *      the output stream
     * @throws IOException
     *      if an error occurs when writing to the stream
     */
    public static void write(List<LdapServer> servers, OutputStream outputStream) throws IOException {
        // Creating the Document
        Document document = DocumentHelper.createDocument();

        // Creating the root element
        Element root = document.addElement(LDAP_SERVERS_TAG);

        if (servers != null) {
            for (LdapServer server : servers) {
                addLdapServer(server, root);
            }
        }

        // Writing the file to the stream
        OutputFormat outformat = OutputFormat.createPrettyPrint();
        outformat.setEncoding("UTF-8"); //$NON-NLS-1$
        XMLWriter writer = new XMLWriter(outputStream, outformat);
        writer.write(document);
        writer.flush();
    }

    /**
     * Adds the XML representation of the LDAP Server to the given parent. 
     *
     * @param server
     *      the server
     * @param parent
     *      the parent element
     */
    private static void addLdapServer(LdapServer server, Element parent) {
        // Server element
        Element serverElement = parent.addElement(LDAP_SERVER_TAG);

        // ID
        serverElement.addAttribute(ID_ATTRIBUTE, server.getId());

        // Name
        serverElement.addAttribute(NAME_ATTRIBUTE, server.getName());

        // Adapter ID
        serverElement.addAttribute(ADAPTER_ID_ATTRIBUTE, server.getLdapServerAdapterExtension().getId());

        // Adapter Name
        serverElement.addAttribute(ADAPTER_NAME_ATTRIBUTE, server.getLdapServerAdapterExtension().getName());

        // Adapter Vendor
        serverElement.addAttribute(ADAPTER_VENDOR_ATTRIBUTE, server.getLdapServerAdapterExtension().getVendor());

        // Adapter Version
        serverElement.addAttribute(ADAPTER_VERSION_ATTRIBUTE, server.getLdapServerAdapterExtension().getVersion());

        // Configuration Parameters
        Map<String, Object> configurationParametersMap = server.getConfigurationParameters();
        if ((configurationParametersMap != null) && (configurationParametersMap.size() > 0)) {
            addConfigurationParameters(configurationParametersMap, serverElement);
        }
    }

    /**
     * Adds the XML representation of the configuration elements to the given parent. 
     *
     * @param map the configuration elements map
     * @param element the parent element
     */
    private static void addConfigurationParameters(Map<String, Object> map, Element parent) {
        // Configuration Parameters element
        Element configurationParametersElement = parent.addElement(CONFIGURATION_PARAMETERS_TAG);

        // Get the keys of the map
        Set<Entry<String, Object>> entriesSet = map.entrySet();

        for (Entry<String, Object> entry : entriesSet) {
            // Entry element
            Element entryElement = configurationParametersElement.addElement(ENTRY_TAG);

            // Key
            entryElement.addAttribute(KEY_ATTRIBUTE, entry.getKey());

            // Value
            Object value = entry.getValue();
            entryElement.addAttribute(VALUE_ATTRIBUTE, value.toString());

            // Type
            if (value.getClass() != String.class) {
                entryElement.addAttribute(TYPE_ATTRIBUTE, value.getClass().getCanonicalName());
            }
        }
    }
}