org.pdfsam.guiclient.GuiClient.java Source code

Java tutorial

Introduction

Here is the source code for org.pdfsam.guiclient.GuiClient.java

Source

/*
 * Created on 08-Nov-2007
 * Copyright (C) 2006 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;

import java.awt.Point;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLDecoder;
import java.util.Properties;

import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import org.pdfsam.guiclient.business.thumbnails.ThumbnailCreatorsRegisty;
import org.pdfsam.guiclient.configuration.Configuration;
import org.pdfsam.guiclient.configuration.GuiConfiguration;
import org.pdfsam.guiclient.gui.frames.JMainFrame;
import org.pdfsam.guiclient.utils.filters.JarFilter;

/**
 * GUI Client for the console
 * 
 * @author a.vacondio
 * 
 */
public class GuiClient {

    private static final long serialVersionUID = -3608998690519362986L;

    private static final Logger log = Logger.getLogger(GuiClient.class.getPackage().getName());
    private static final String PROPERTY_FILE = "pdfsam.properties";

    private static final String NO_GUI_RESTORE_ARG = "-skipGui";

    public static final String AUTHOR = "Andrea Vacondio";
    public static final String UNIXNAME = "pdfsam";

    private static final String NAME = "PDF Split and Merge";
    private static final String VERSION_TYPE_PROPERTY = "pdfsam.version";
    private static final String VERSION_TYPE_DEFAULT = "basic";

    private static final String VERSION_PROPERTY = "pdfsam.jar.version";
    private static final String VERSION_DEFAULT = "1.0.0";

    private static final String BUILDDATE_PROPERTY = "pdfsam.builddate";
    private static final String BUILDDATE_DEFAULT = "";

    private static final String BRANCH_PROPERTY = "pdfsam.branch";
    private static final String BRANCH_DEFAULT = "1";

    private static JMainFrame clientGUI;
    private static Properties defaultProps = new Properties();

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            loadApplicationProperties();
            loadExtendedLibraries();
            clientGUI = new JMainFrame();
            initializeUserInterface(args.length > 0 && NO_GUI_RESTORE_ARG.equalsIgnoreCase(args[0]));
            clientGUI.setVisible(true);
            initializeExtendedState();
        } catch (Throwable t) {
            log.fatal("Error:", t);
        }
    }

    /**
     * load application properties
     */
    private static void loadApplicationProperties() {
        try {
            InputStream is = GuiClient.class.getClassLoader().getResourceAsStream(PROPERTY_FILE);
            defaultProps.load(is);
        } catch (Exception e) {
            log.error("Unable to load pdfsam properties.", e);
        }
    }

    /**
     * Loads the libraries in the "ext" subdirectory
     */
    private static void loadExtendedLibraries() {
        try {
            String configSearchPath = new File(URLDecoder
                    .decode(GuiClient.class.getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8"))
                            .getParent();
            File currentDir = new File(configSearchPath, "ext");
            File[] fileList = currentDir.listFiles(new JarFilter(false));
            if (!ArrayUtils.isEmpty(fileList)) {
                URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
                for (File currentFile : fileList) {
                    addJar(currentFile.toURI().toURL(), urlClassLoader);
                }
                ThumbnailCreatorsRegisty.reload(urlClassLoader);
            }
        } catch (Exception e) {
            log.error("Unable to load extended libraries.", e);
        }
    }

    private static void addJar(URL jarUrl, URLClassLoader loader) throws SecurityException, NoSuchMethodException,
            IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
        method.setAccessible(true);
        method.invoke(loader, new Object[] { jarUrl });
    }

    /**
     * @return application version
     */
    public static String getVersion() {
        return defaultProps.getProperty(VERSION_PROPERTY, VERSION_DEFAULT);
    }

    /**
     * @return application name
     */
    public static String getApplicationName() {
        return NAME + " " + defaultProps.getProperty(VERSION_TYPE_PROPERTY, VERSION_TYPE_DEFAULT);
    }

    /**
     * @return application version type (basic or enhanced)
     */
    public static String getVersionType() {
        return defaultProps.getProperty(VERSION_TYPE_PROPERTY, VERSION_TYPE_DEFAULT);
    }

    /**
     * @return application build date
     */
    public static String getBuildDate() {
        return defaultProps.getProperty(BUILDDATE_PROPERTY, BUILDDATE_DEFAULT);
    }

    /**
     * @return application branch
     */
    public static String getBranch() {
        return defaultProps.getProperty(BRANCH_PROPERTY, BRANCH_DEFAULT);
    }

    private static void initializeExtendedState() {
        clientGUI.setExtendedState(GuiConfiguration.getInstance().getExtendedState());
    }

    /**
     * User interface initialization
     */
    private static void initializeUserInterface(boolean skipGui) {

        if (!skipGui) {
            if (GuiConfiguration.getInstance().getSize() != null) {
                clientGUI.setSize(GuiConfiguration.getInstance().getSize());
            }

            Point locationOnScreen = GuiConfiguration.getInstance().getLocationOnScreen();
            //see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6189461
            if (locationOnScreen != null && locationOnScreen.x != -32000 && locationOnScreen.y != -32000) {
                clientGUI.setLocation(locationOnScreen);
            }

            if (GuiConfiguration.getInstance().getHorizontalDividerDimension() != null) {
                clientGUI.setHorizontalDividerDimension(
                        GuiConfiguration.getInstance().getHorizontalDividerDimension());
            }
            if (GuiConfiguration.getInstance().getHorizontalDividerLocation() > 0) {
                clientGUI.setHorizontalDividerLocation(
                        GuiConfiguration.getInstance().getHorizontalDividerLocation());
            } else {
                clientGUI.setHorizontalDividerLocation(155);
            }

            if (GuiConfiguration.getInstance().getVerticalDividerDimension() != null) {
                clientGUI.setVerticalDividerDimension(GuiConfiguration.getInstance().getVerticalDividerDimension());
            }
            if (GuiConfiguration.getInstance().getVerticalDividerLocation() > 0) {
                clientGUI.setVerticalDividerLocation(GuiConfiguration.getInstance().getVerticalDividerLocation());
            }

            String selectedPlugin = GuiConfiguration.getInstance().getSelectedPlugin();
            if (selectedPlugin != null && selectedPlugin.length() > 0) {
                // If a default environment is set, the plugin set on it has precedence
                String defaultEnv = Configuration.getInstance().getDefaultEnvironment();
                if (defaultEnv == null || defaultEnv.length() <= 0) {
                    clientGUI.getTreePanel().setSelectedPlugin(selectedPlugin);
                }
            }
        }
        clientGUI.rebuildRecentEnvironmentsMenu();

    }
}