net.rptools.maptool.client.AppSetup.java Source code

Java tutorial

Introduction

Here is the source code for net.rptools.maptool.client.AppSetup.java

Source

/*
 * This software copyright by various authors including the RPTools.net
 * development team, and licensed under the LGPL Version 3 or, at your option,
 * any later version.
 *
 * Portions of this software were originally covered under the Apache Software
 * License, Version 1.1 or Version 2.0.
 *
 * See the file LICENSE elsewhere in this distribution for license details.
 */

package net.rptools.maptool.client;

import java.awt.EventQueue;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JOptionPane;
import javax.swing.JTextPane;

import net.rptools.lib.FileUtil;
import net.rptools.maptool.model.AssetManager;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.jdesktop.swingworker.SwingWorker;

/**
 * Executes only the first time the application is run.
 */
public class AppSetup {
    private static final Logger log = Logger.getLogger(AppSetup.class);

    public static void install() {
        File appDir = AppUtil.getAppHome();

        // Only init once
        if (appDir.listFiles().length > 0) {
            return;
        }
        try {
            installDefaultTokens();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public static void installDefaultTokens() throws IOException {
        installLibrary("Default", AppSetup.class.getClassLoader().getResource("default_images.zip"));
    }

    /**
     * Overwrites any existing README file in the ~/.maptool/resource directory with the one from the current MapTool
     * JAR file. This way any updates to the README will eventually be seen by the user, although only when a new
     * directory is added to the resource library...
     * 
     * @throws IOException
     */
    private static void createREADME() throws IOException {
        File outFilename = new File(AppConstants.UNZIP_DIR, "README");
        InputStream inStream = null;
        OutputStream outStream = null;
        try {
            inStream = AppSetup.class.getResourceAsStream("README");
            outStream = new BufferedOutputStream(new FileOutputStream(outFilename));
            IOUtils.copy(inStream, outStream);
        } finally {
            IOUtils.closeQuietly(inStream);
            IOUtils.closeQuietly(outStream);
        }
    }

    public static void installLibrary(String libraryName, URL resourceFile) throws IOException {
        createREADME();
        File unzipDir = new File(AppConstants.UNZIP_DIR, libraryName);
        FileUtil.unzip(resourceFile, unzipDir);
        installLibrary(libraryName, unzipDir);
    }

    public static void installLibrary(final String libraryName, final File root) throws IOException {
        // Add as a resource root
        AppPreferences.addAssetRoot(root);
        if (MapTool.getFrame() != null) {
            MapTool.getFrame().addAssetRoot(root);

            // License
            File licenseFile = new File(root, "License.txt");
            if (!licenseFile.exists()) {
                licenseFile = new File(root, "license.txt");
            }
            if (licenseFile.exists()) {
                final File licenseFileFinal = licenseFile;
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        try {
                            JTextPane pane = new JTextPane();
                            pane.setPage(licenseFileFinal.toURI().toURL());
                            JOptionPane.showMessageDialog(MapTool.getFrame(), pane, "License for " + libraryName,
                                    JOptionPane.INFORMATION_MESSAGE);
                        } catch (MalformedURLException e) {
                            log.error("Could not load license file: " + licenseFileFinal, e);
                        } catch (IOException e) {
                            log.error("Could not load license file: " + licenseFileFinal, e);
                        }
                    }
                });
            }
        }
        new SwingWorker<Object, Object>() {
            @Override
            protected Object doInBackground() throws Exception {
                AssetManager.searchForImageReferences(root, AppConstants.IMAGE_FILE_FILTER);
                return null;
            }
        }.execute();
    }
}