org.pdfsam.guiclient.configuration.services.xml.XmlGuiConfigurationService.java Source code

Java tutorial

Introduction

Here is the source code for org.pdfsam.guiclient.configuration.services.xml.XmlGuiConfigurationService.java

Source

/*
 * Created on 10-Oct-2009
 * Copyright (C) 2009 by Andrea Vacondio.
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the 
 * GNU General Public License as published by the Free Software Foundation; 
 * either version 2 of the License.
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 * See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License along with this program; 
 * if not, write to the Free Software Foundation, Inc., 
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package org.pdfsam.guiclient.configuration.services.xml;

import java.awt.Dimension;
import java.awt.Point;
import java.io.File;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Deque;

import javax.swing.JFrame;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.pdfsam.guiclient.configuration.Configuration;
import org.pdfsam.guiclient.configuration.services.GuiConfigurationService;
import org.pdfsam.guiclient.exceptions.ConfigurationException;
import org.pdfsam.guiclient.utils.XmlUtility;
import org.pdfsam.i18n.GettextResource;

/**
 * GUI configuration service where values are read and written on an xml file
 * 
 * @author Andrea Vacondio
 * 
 */
public class XmlGuiConfigurationService implements GuiConfigurationService {

    private static final Logger LOG = Logger.getLogger(XmlGuiConfigurationService.class.getPackage().getName());

    public static final String CONFIGURATION_FILE_NAME = "gui-config.xml";
    private static final String ROOT_NODE = "/pdfsam-gui";
    private static final String EXTENDED_STATE_XPATH = "/gui-settings/extended-state/@value";
    private static final String SELECTED_PLUGIN_XPATH = "/gui-settings/selected-plugin/@class";
    private static final String LOCATION_X_XPATH = "/gui-settings/location/@xvalue";
    private static final String LOCATION_Y_XPATH = "/gui-settings/location/@yvalue";
    private static final String SIZE_WIDTH_XPATH = "/gui-settings/size/@width";
    private static final String SIZE_HEIGHT_XPATH = "/gui-settings/size/@height";
    private static final String VERTICAL_DIVIDER_LOCATION_XPATH = "/gui-settings/vertical-divider/@location";
    private static final String VERTICAL_DIVIDER_HEIGHT_XPATH = "/gui-settings/vertical-divider/@height";
    private static final String VERTICAL_DIVIDER_WIDTH_XPATH = "/gui-settings/vertical-divider/@width";
    private static final String HORIZONTAL_DIVIDER_LOCATION_XPATH = "/gui-settings/horizontal-divider/@location";
    private static final String HORIZONTAL_DIVIDER_HEIGHT_XPATH = "/gui-settings/horizontal-divider/@height";
    private static final String HORIZONTAL_DIVIDER_WIDTH_XPATH = "/gui-settings/horizontal-divider/@width";
    private static final String RECENT_ENVS_NODE_XPATH = "env/@value";
    private static final String RECENT_ENVS_PARENT_XPATH = "/recent_envs/";

    private Document document;
    private int extendedState = JFrame.MAXIMIZED_BOTH;
    private Dimension size;
    private Point locationOnScreen;
    private File configurationFile;
    private int horizontalDividerLocation;
    private Dimension horizontalDividerDimension;
    private int verticalDividerLocation;
    private Dimension verticalDividerDimension;
    private String selectedPlugin;
    private Deque<String> recentEnvironments = new ArrayDeque<String>();

    public XmlGuiConfigurationService() {
        initializeService();
    }

    /**
     * Initialization
     * 
     * @throws ConfigurationException
     */
    private void initializeService() {
        LOG.info(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                "Loading user interface configuration") + "..");
        configurationFile = new File(XmlConfigurationService.DEFAULT_CONFIG_DIRECTORY, CONFIGURATION_FILE_NAME);
        if (!configurationFile.exists()) {
            LOG.warn(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                    "Unable to find configuration file for the user interface"));
        } else {
            try {
                document = XmlUtility.parseXmlFile(configurationFile);
                if (document != null) {
                    iniExtendedState();
                    selectedPlugin = XmlUtility.getXmlValue(document, ROOT_NODE + SELECTED_PLUGIN_XPATH);
                    initDimension();
                    initLocationOnScreen();
                    initDividersLocation();
                    initHorizontalDividerDimension();
                    initVerticalDividerDimension();
                    initRecentEnvs();
                }
            } catch (DocumentException e) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error reading the configuration file for the user interface"), e);
            } finally {
                document = null;
            }
        }
    }

    /**
     * Initialization of recent environments
     */
    private void initRecentEnvs() {
        recentEnvironments = new ArrayDeque<String>();
        for (String env : XmlUtility.getXmlValues(document,
                ROOT_NODE + RECENT_ENVS_PARENT_XPATH + RECENT_ENVS_NODE_XPATH)) {
            recentEnvironments.addLast(env);
        }
    }

    /**
     * Initialization of the dividers location
     */
    private void initDividersLocation() {
        String verticalLocation = XmlUtility.getXmlValue(document, ROOT_NODE + VERTICAL_DIVIDER_LOCATION_XPATH);
        String horizontalLocation = XmlUtility.getXmlValue(document, ROOT_NODE + HORIZONTAL_DIVIDER_LOCATION_XPATH);
        if (verticalLocation.length() > 0) {
            try {
                verticalDividerLocation = Integer.parseInt(verticalLocation);
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface vertical divider location"), nfe);
            }
        }
        if (horizontalLocation.length() > 0) {
            try {
                horizontalDividerLocation = Integer.parseInt(horizontalLocation);
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface horizontal divider location"), nfe);
            }
        }
    }

    /**
     * Initialization of the extended state
     */
    private void iniExtendedState() {
        String state = XmlUtility.getXmlValue(document, ROOT_NODE + EXTENDED_STATE_XPATH);
        if (state.length() > 0) {
            try {
                extendedState = Integer.parseInt(state);
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface extended state"), nfe);
            }
        }
    }

    /**
     * Initialization of the dimension
     */
    private void initDimension() {
        String width = XmlUtility.getXmlValue(document, ROOT_NODE + SIZE_WIDTH_XPATH);
        String height = XmlUtility.getXmlValue(document, ROOT_NODE + SIZE_HEIGHT_XPATH);
        if (width.length() > 0 && height.length() > 0) {
            try {
                size = new Dimension(Integer.parseInt(width), Integer.parseInt(height));
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface size"), nfe);
            }
        }
    }

    /**
     * Initialization of the horizontal divider dimension
     */
    private void initHorizontalDividerDimension() {
        String width = XmlUtility.getXmlValue(document, ROOT_NODE + HORIZONTAL_DIVIDER_WIDTH_XPATH);
        String height = XmlUtility.getXmlValue(document, ROOT_NODE + HORIZONTAL_DIVIDER_HEIGHT_XPATH);
        if (width.length() > 0 && height.length() > 0) {
            try {
                horizontalDividerDimension = new Dimension(Integer.parseInt(width), Integer.parseInt(height));
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface horizontal divider size"), nfe);
            }
        }
    }

    /**
     * Initialization of the horizontal divider dimension
     */
    private void initVerticalDividerDimension() {
        String width = XmlUtility.getXmlValue(document, ROOT_NODE + VERTICAL_DIVIDER_WIDTH_XPATH);
        String height = XmlUtility.getXmlValue(document, ROOT_NODE + VERTICAL_DIVIDER_HEIGHT_XPATH);
        if (width.length() > 0 && height.length() > 0) {
            try {
                verticalDividerDimension = new Dimension(Integer.parseInt(width), Integer.parseInt(height));
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface vertical divider size"), nfe);
            }
        }
    }

    /**
     * Initialization of the location
     */
    private void initLocationOnScreen() {
        String x = XmlUtility.getXmlValue(document, ROOT_NODE + LOCATION_X_XPATH);
        String y = XmlUtility.getXmlValue(document, ROOT_NODE + LOCATION_Y_XPATH);
        if (x.length() > 0 && y.length() > 0) {
            try {
                locationOnScreen = new Point(Integer.parseInt(x), Integer.parseInt(y));
            } catch (NumberFormatException nfe) {
                LOG.error(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                        "Error initializing the user interface location"), nfe);
            }
        }
    }

    public int getExtendedState() {
        return extendedState;
    }

    public void setExtendedState(int extendedState) {
        this.extendedState = extendedState;
    }

    public Dimension getSize() {
        return size;
    }

    public void setSize(Dimension size) {
        this.size = size;
    }

    public Point getLocationOnScreen() {
        return locationOnScreen;
    }

    public void setLocationOnScreen(Point locationOnScreen) {
        this.locationOnScreen = locationOnScreen;
    }

    public int getHorizontalDividerLocation() {
        return horizontalDividerLocation;
    }

    public void setHorizontalDividerLocation(int horizontalDividerLocation) {
        this.horizontalDividerLocation = horizontalDividerLocation;
    }

    public int getVerticalDividerLocation() {
        return verticalDividerLocation;
    }

    public void setVerticalDividerLocation(int verticalDividerLocation) {
        this.verticalDividerLocation = verticalDividerLocation;
    }

    public Dimension getHorizontalDividerDimension() {
        return horizontalDividerDimension;
    }

    public void setHorizontalDividerDimension(Dimension horizontalDividerDimension) {
        this.horizontalDividerDimension = horizontalDividerDimension;
    }

    public Dimension getVerticalDividerDimension() {
        return verticalDividerDimension;
    }

    public void setVerticalDividerDimension(Dimension verticalDividerDimension) {
        this.verticalDividerDimension = verticalDividerDimension;
    }

    public String getSelectedPlugin() {
        return selectedPlugin;
    }

    public void setSelectedPlugin(String selectedPlugin) {
        this.selectedPlugin = selectedPlugin;
    }

    public Collection<String> getRecentEnvironments() {
        return recentEnvironments;
    }

    public void addRecentEnvironment(String envPath) {
        if (envPath != null) {
            if (recentEnvironments.contains(envPath)) {
                recentEnvironments.remove(envPath);
            } else {
                while (recentEnvironments.size() > 8) {
                    recentEnvironments.removeLast();
                }
            }
            recentEnvironments.addFirst(envPath);
        }
    }

    public void save() throws IOException {
        if (configurationFile != null) {
            File parentDirectory = new File(XmlConfigurationService.DEFAULT_CONFIG_DIRECTORY);
            if (!parentDirectory.isDirectory() || !parentDirectory.exists()) {
                parentDirectory.mkdirs();
            }

            Document document = DocumentHelper.createDocument();
            Element root = document.addElement(ROOT_NODE.replaceAll("/", ""));
            XmlUtility.processXPath(root, EXTENDED_STATE_XPATH, Integer.toString(extendedState));
            XmlUtility.processXPath(root, SELECTED_PLUGIN_XPATH, selectedPlugin);

            if (size != null) {
                XmlUtility.processXPath(root, SIZE_WIDTH_XPATH, Integer.toString((int) size.getWidth()));
                XmlUtility.processXPath(root, SIZE_HEIGHT_XPATH, Integer.toString((int) size.getHeight()));
            }

            if (locationOnScreen != null) {
                XmlUtility.processXPath(root, LOCATION_X_XPATH, Integer.toString((int) locationOnScreen.getX()));
                XmlUtility.processXPath(root, LOCATION_Y_XPATH, Integer.toString((int) locationOnScreen.getY()));
            }

            if (horizontalDividerLocation > 0) {
                XmlUtility.processXPath(root, HORIZONTAL_DIVIDER_LOCATION_XPATH,
                        Integer.toString(horizontalDividerLocation));
            }

            if (horizontalDividerDimension != null) {
                XmlUtility.processXPath(root, HORIZONTAL_DIVIDER_WIDTH_XPATH,
                        Integer.toString((int) horizontalDividerDimension.getWidth()));
                XmlUtility.processXPath(root, HORIZONTAL_DIVIDER_HEIGHT_XPATH,
                        Integer.toString((int) horizontalDividerDimension.getHeight()));
            }

            if (verticalDividerLocation > 0) {
                XmlUtility.processXPath(root, VERTICAL_DIVIDER_LOCATION_XPATH,
                        Integer.toString(verticalDividerLocation));
            }

            if (verticalDividerDimension != null) {
                XmlUtility.processXPath(root, VERTICAL_DIVIDER_WIDTH_XPATH,
                        Integer.toString((int) verticalDividerDimension.getWidth()));
                XmlUtility.processXPath(root, VERTICAL_DIVIDER_HEIGHT_XPATH,
                        Integer.toString((int) verticalDividerDimension.getHeight()));
            }

            Element recentEnvNode = XmlUtility.processXPath(root, RECENT_ENVS_PARENT_XPATH, null);
            String[] recentEnvTokens = StringUtils.splitByWholeSeparator(RECENT_ENVS_NODE_XPATH, "/@");
            XmlUtility.addXmlNodesAndAttribute(recentEnvNode, recentEnvTokens[0], recentEnvTokens[1],
                    recentEnvironments);

            LOG.debug(GettextResource.gettext(Configuration.getInstance().getI18nResourceBundle(),
                    "Saving GUI configuration") + "..");
            XmlUtility.writeXmlFile(document, configurationFile);
        }
    }

}