org.apache.directory.studio.schemaeditor.PluginUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.schemaeditor.PluginUtils.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.schemaeditor;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import org.apache.directory.api.util.FileUtils;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.MutableAttributeType;
import org.apache.directory.api.ldap.model.schema.MutableObjectClass;
import org.apache.directory.api.ldap.model.schema.ObjectClass;
import org.apache.directory.studio.connection.core.Connection;
import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
import org.apache.directory.studio.schemaeditor.controller.ProjectsHandler;
import org.apache.directory.studio.schemaeditor.model.Project;
import org.apache.directory.studio.schemaeditor.model.Schema;
import org.apache.directory.studio.schemaeditor.model.io.ProjectsExporter;
import org.apache.directory.studio.schemaeditor.model.io.ProjectsImportException;
import org.apache.directory.studio.schemaeditor.model.io.ProjectsImporter;
import org.apache.directory.studio.schemaeditor.model.io.SchemaConnector;
import org.apache.directory.studio.schemaeditor.model.io.XMLSchemaFileImportException;
import org.apache.directory.studio.schemaeditor.model.io.XMLSchemaFileImporter;
import org.apache.directory.studio.schemaeditor.view.ViewUtils;
import org.apache.directory.studio.schemaeditor.view.widget.CoreSchemasSelectionWidget.ServerTypeEnum;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;

/**
 * This class contains helper methods.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class PluginUtils {
    /**
     * Verifies that the given name is syntaxely correct according to the RFC 2252
     * (Lightweight Directory Access Protocol (v3): Attribute Syntax Definitions).
     *
     * @param name
     *      the name to test
     * @return
     *      true if the name is correct, false if the name is not correct.
     */
    public static boolean verifyName(String name) {
        return name.matches("[a-zA-Z]+[a-zA-Z0-9;-]*"); //$NON-NLS-1$
    }

    /**
     * Returns a clone of the given attribute type.
     *
     * @param at
     *      the attribute type to clone
     * @return
     *      a clone of the given attribute type
     */
    public static MutableAttributeType getClone(AttributeType at) {
        MutableAttributeType clone = new MutableAttributeType(at.getOid());
        clone.setNames(at.getNames());
        clone.setSchemaName(at.getSchemaName());
        clone.setDescription(at.getDescription());
        clone.setSuperiorOid(at.getSuperiorOid());
        clone.setUsage(at.getUsage());
        clone.setSyntaxOid(at.getSyntaxOid());
        clone.setSyntaxLength(at.getSyntaxLength());
        clone.setObsolete(at.isObsolete());
        clone.setSingleValued(at.isSingleValued());
        clone.setCollective(at.isCollective());
        clone.setUserModifiable(at.isUserModifiable());
        clone.setEqualityOid(at.getEqualityOid());
        clone.setOrderingOid(at.getOrderingOid());
        clone.setSubstringOid(at.getSubstringOid());

        return clone;
    }

    /**
     * Returns a clone of the given object class.
     *
     * @param oc
     *      the object class to clone
     * @return
     *      a clone of the given object class
     */
    public static MutableObjectClass getClone(ObjectClass oc) {
        MutableObjectClass clone = new MutableObjectClass(oc.getOid());
        clone.setNames(oc.getNames());
        clone.setSchemaName(oc.getSchemaName());
        clone.setDescription(oc.getDescription());
        clone.setSuperiorOids(oc.getSuperiorOids());
        clone.setType(oc.getType());
        clone.setObsolete(oc.isObsolete());
        clone.setMustAttributeTypeOids(oc.getMustAttributeTypeOids());
        clone.setMayAttributeTypeOids(oc.getMayAttributeTypeOids());

        return clone;
    }

    /**
     * Gets the projects file (where is stored information about the loaded projects).
     *
     * @return
     *      the projects File
     */
    private static File getProjectsFile() {
        return Activator.getDefault().getStateLocation().append("projects.xml").toFile(); //$NON-NLS-1$
    }

    /**
     * Gets the temporary projects file.
     *
     * @return
     *      the temporary projects file
     */
    private static File getTempProjectsFile() {
        return Activator.getDefault().getStateLocation().append("projects-temp.xml").toFile(); //$NON-NLS-1$
    }

    /**
     * Loads the projects saved in the Projects File.
     */
    public static void loadProjects() {
        ProjectsHandler projectsHandler = Activator.getDefault().getProjectsHandler();
        File projectsFile = getProjectsFile();
        boolean loadFailed = false;
        Project[] projects = null;

        // We try to load the projects file
        if (projectsFile.exists()) {
            try {
                projects = ProjectsImporter.getProjects(new FileInputStream(projectsFile),
                        projectsFile.getAbsolutePath());
            } catch (ProjectsImportException e) {
                loadFailed = true;
            } catch (FileNotFoundException e) {
                loadFailed = true;
            }

            if (!loadFailed) {
                // If everything went fine, we add the projects
                for (Project project : projects) {
                    projectsHandler.addProject(project);
                }
            } else {
                // If something went wrong, we try to load the temp projects file
                File tempProjectsFile = getTempProjectsFile();

                if (tempProjectsFile.exists()) {
                    try {
                        projects = ProjectsImporter.getProjects(new FileInputStream(tempProjectsFile),
                                projectsFile.getAbsolutePath());

                        loadFailed = false;
                    } catch (ProjectsImportException e) {
                        reportError(Messages.getString("PluginUtils.ErrorLoadingProject"), e, Messages //$NON-NLS-1$
                                .getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                                Messages.getString("PluginUtils.ErrorLoadingProject")); //$NON-NLS-1$
                        return;
                    } catch (FileNotFoundException e) {
                        reportError(Messages.getString("PluginUtils.ErrorLoadingProject"), e, Messages //$NON-NLS-1$
                                .getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                                Messages.getString("PluginUtils.ErrorLoadingProject")); //$NON-NLS-1$
                        return;
                    }

                    // We add the projects
                    for (Project project : projects) {
                        projectsHandler.addProject(project);
                    }
                } else {
                    reportError(Messages.getString("PluginUtils.ErrorLoadingProject"), null, Messages //$NON-NLS-1$
                            .getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                            Messages.getString("PluginUtils.ErrorLoadingProject")); //$NON-NLS-1$
                }

            }
        }
    }

    /**
     * Saves the projects in the Projects File.
     */
    public static void saveProjects() {
        try {
            // Saving the projects to the temp projects file
            OutputFormat outformat = OutputFormat.createPrettyPrint();
            outformat.setEncoding("UTF-8"); //$NON-NLS-1$
            XMLWriter writer = new XMLWriter(new FileOutputStream(getTempProjectsFile()), outformat);
            writer.write(ProjectsExporter
                    .toDocument(Activator.getDefault().getProjectsHandler().getProjects().toArray(new Project[0])));
            writer.flush();

            // Copying the temp projects file to the final location
            String content = FileUtils.readFileToString(getTempProjectsFile(), "UTF-8"); //$NON-NLS-1$
            FileUtils.writeStringToFile(getProjectsFile(), content, "UTF-8"); //$NON-NLS-1$
        } catch (IOException e) {
            // If an error occurs when saving to the temp projects file or
            // when copying the temp projects file to the final location,
            // we try to save the projects directly to the final location.
            try {
                OutputFormat outformat = OutputFormat.createPrettyPrint();
                outformat.setEncoding("UTF-8"); //$NON-NLS-1$
                XMLWriter writer = new XMLWriter(new FileOutputStream(getProjectsFile()), outformat);
                writer.write(ProjectsExporter.toDocument(
                        Activator.getDefault().getProjectsHandler().getProjects().toArray(new Project[0])));
                writer.flush();
            } catch (IOException e2) {
                // If another error occur, we display an error
                reportError(Messages.getString("PluginUtils.ErrorSavingProject"), e2, Messages //$NON-NLS-1$
                        .getString("PluginUtils.ProjectsSavingError"), //$NON-NLS-1$
                        Messages.getString("PluginUtils.ErrorSavingProject")); //$NON-NLS-1$
            }
        }
    }

    /**
     * Logs the given message and exception with the ERROR status level.
     * 
     * @param message
     *      the message
     * @param exception
     *      the exception
     */
    public static void logError(String message, Throwable exception) {
        Activator.getDefault().getLog().log(new Status(Status.ERROR,
                Activator.getDefault().getBundle().getSymbolicName(), Status.OK, message, exception));
    }

    /**
     * Logs the given message and exception with the INFO status level.
     * 
     * @param message
     *      the message
     * @param exception
     *      the exception
     */
    public static void logInfo(Throwable exception, String message, Object... args) {
        String msg = MessageFormat.format(message, args);
        Activator.getDefault().getLog().log(new Status(Status.INFO,
                Activator.getDefault().getBundle().getSymbolicName(), Status.OK, msg, exception));
    }

    /**
     * Logs the given message and exception with the WARNING status level.
     * 
     * @param message
     *      the message
     * @param exception
     *      the exception
     */
    public static void logWarning(String message, Throwable exception) {
        Activator.getDefault().getLog().log(new Status(Status.WARNING,
                Activator.getDefault().getBundle().getSymbolicName(), Status.OK, message, exception));
    }

    /**
     * Loads the 'core' corresponding to the given name.
     *
     * @param schemaName
     *      the name of the 'core' schema
     * @return
     *      the corresponding schema, or null if no schema has been found
     */
    public static Schema loadCoreSchema(ServerTypeEnum serverType, String schemaName) {
        Schema schema = null;

        try {
            URL url = Activator.getDefault().getBundle()
                    .getResource("resources/schemas/" + getFolderName(serverType) + "/" + schemaName + ".xml"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

            if (url == null) {
                reportError(Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + ".", null, //$NON-NLS-1$//$NON-NLS-2$
                        Messages.getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                        Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + "."); //$NON-NLS-1$//$NON-NLS-2$
            } else {
                schema = XMLSchemaFileImporter.getSchema(url.openStream(), url.toString());
            }
        } catch (XMLSchemaFileImportException e) {
            reportError(Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + ".", e, //$NON-NLS-1$//$NON-NLS-2$
                    Messages.getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                    Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + "."); //$NON-NLS-1$//$NON-NLS-2$
        } catch (FileNotFoundException e) {
            reportError(Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + ".", e, //$NON-NLS-1$//$NON-NLS-2$
                    Messages.getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                    Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + "."); //$NON-NLS-1$//$NON-NLS-2$
        } catch (IOException e) {
            reportError(Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + ".", e, //$NON-NLS-1$//$NON-NLS-2$
                    Messages.getString("PluginUtils.ProjectsLoadingError"), //$NON-NLS-1$
                    Messages.getString("PluginUtils.SchemaLoadingError") + schemaName + "."); //$NON-NLS-1$//$NON-NLS-2$
        }

        return schema;
    }

    /**
     * Reports an error.
     * <p>
     * Logs a message and an exception, and displays a Error Dialog with title and message.
     *
     * @param loggerMessage
     *      the message for the logger
     * @param e
     *      the exception to log
     * @param dialogTitle
     *      the title of the Error Dialog (empty string used if <code>null</code>)
     * @param dialogMessage
     *      the message to display in the Error Dialog
     */
    private static void reportError(String loggerMessage, Exception e, String dialogTitle, String dialogMessage) {
        if ((loggerMessage != null) || (e != null)) {
            PluginUtils.logError(loggerMessage, e);
        }

        if (dialogMessage != null) {
            ViewUtils.displayErrorMessageDialog(((dialogTitle == null) ? "" : dialogTitle), dialogMessage); //$NON-NLS-1$
        }
    }

    /**
     * The name of the folder for the given Server Type.
     *
     * @param serverType
     *      the Server Type
     * @return
     *      the name of the folder for the given Server Type
     */
    private static String getFolderName(ServerTypeEnum serverType) {
        if (ServerTypeEnum.APACHE_DS.equals(serverType)) {
            return "apacheds"; //$NON-NLS-1$
        } else if (ServerTypeEnum.OPENLDAP.equals(serverType)) {
            return "openldap"; //$NON-NLS-1$
        }

        // Default
        return null;
    }

    /**
     * Gets a Connection from the given id.
     *
     * @param id
     *      the id of the Connection
     * @return
     *      the corresponding Connection, or null if no connection was found.
     */
    public static Connection getConnection(String id) {
        Connection[] connectionsArray = ConnectionCorePlugin.getDefault().getConnectionManager().getConnections();

        HashMap<String, Connection> connections = new HashMap<String, Connection>();
        for (Connection connection : connectionsArray) {
            connections.put(connection.getId(), connection);
        }

        return connections.get(id);
    }

    /**
     * Gets the List of SchemaConnectors defined using the ExtensionPoint.
     *
     * @return
     *      the List of SchemaConnectors defined using the ExtensionPoint
     */
    public static List<SchemaConnector> getSchemaConnectors() {
        List<SchemaConnector> schemaConnectors = new ArrayList<SchemaConnector>();

        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
                .getExtensionPoint("org.apache.directory.studio.schemaeditor.schemaConnectors"); //$NON-NLS-1$
        IConfigurationElement[] members = extensionPoint.getConfigurationElements();

        if (members != null) {
            // Creating each SchemaConnector
            for (IConfigurationElement member : members) {
                try {
                    SchemaConnector schemaConnector = (SchemaConnector) member.createExecutableExtension("class"); //$NON-NLS-1$
                    schemaConnector.setName(member.getAttribute("name")); //$NON-NLS-1$
                    schemaConnector.setId(member.getAttribute("id")); //$NON-NLS-1$
                    schemaConnector.setDescription(member.getAttribute("description")); //$NON-NLS-1$

                    schemaConnectors.add(schemaConnector);
                } catch (CoreException e) {
                    PluginUtils.logError(Messages.getString("PluginUtils.ConnectorsLoadingError"), e); //$NON-NLS-1$
                    ViewUtils.displayErrorMessageDialog(Messages.getString("PluginUtils.Error"), Messages //$NON-NLS-1$
                            .getString("PluginUtils.ConnectorsLoadingError")); //$NON-NLS-1$
                }
            }
        }

        return schemaConnectors;
    }

    /**
     * Saves the the given value under the given key in the dialog settings.
     *
     * @param key
     *      the key
     * @param value
     *      the value
     */
    public static void saveDialogSettingsHistory(String key, String value) {
        // get current history
        String[] history = loadDialogSettingsHistory(key);
        List<String> list = new ArrayList<String>(Arrays.asList(history));

        // add new value or move to first position
        if (list.contains(value)) {
            list.remove(value);
        }
        list.add(0, value);

        // check history size
        while (list.size() > 20) {
            list.remove(list.size() - 1);
        }

        // save
        history = list.toArray(new String[list.size()]);
        Activator.getDefault().getDialogSettings().put(key, history);
    }

    /**
     * Loads the value of the given key from the dialog settings.
     *
     * @param key the key
     * @return the value
     */
    public static String[] loadDialogSettingsHistory(String key) {
        String[] history = Activator.getDefault().getDialogSettings().getArray(key);
        if (history == null) {
            history = new String[0];
        }
        return history;
    }
}