org.geopublishing.geopublisher.GpUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.geopublishing.geopublisher.GpUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Stefan A. Tzeggai.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     Stefan A. Tzeggai - initial API and implementation
 ******************************************************************************/
package org.geopublishing.geopublisher;

import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Set;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.xml.parsers.FactoryConfigurationError;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.lang.SystemUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.geopublishing.atlasViewer.GpCoreUtil;
import org.geopublishing.atlasViewer.dp.DpEntry;
import org.geopublishing.atlasViewer.dp.layer.DpLayerVectorFeatureSource;
import org.geopublishing.geopublisher.GPProps.Keys;

import de.schmitzm.geotools.io.GeoExportUtil;
import de.schmitzm.io.IOUtil;
import de.schmitzm.lang.ResourceProvider;
import de.schmitzm.net.mail.Mailer;
import de.schmitzm.swing.ExceptionDialog;
import de.schmitzm.swing.FileExtensionFilter;
import de.schmitzm.swing.formatter.MbDecimalFormatter;
import de.schmitzm.versionnumber.ReleaseUtil;

public class GpUtil {

    static {
        // https://issues.apache.org/bugzilla/show_bug.cgi?id=27970
        System.setProperty("org.apache.batik.warn_destination", "false");
    }

    private static final Logger LOGGER = Logger.getLogger(GpUtil.class);

    /**
     * {@link FileFilter} for image files (accepts .png, .jpg, .jpeg, .tif,
     * .tiff, .gif).
     */
    public static final FileExtensionFilter IMAGE_FILE_FILTER = new FileExtensionFilter("Images", true, ".png",
            ".jpg", ".jpeg", ".tif", ".tiff", ".gif");

    /**
     * {@link FileFilter} for image files (accepts .png, .jpg, .jpeg, .tif,
     * .tiff, .gif).
     */
    public static final FileExtensionFilter GIS_FILE_FILTER = new FileExtensionFilter("GIS-Data", true, ".shp",
            ".tif", ".tiff", ".a00", ".asc", ".gml");

    /**
     * This Mailer can sends E-Mails to <code>bugreport@wikisquare.de</code> and
     * can not be used to send mails to any other address.
     */
    public static final Mailer bugReportMailer = new Mailer("bugreport", "", "", "mail.wikisquare.de",
            "bugreport@wikisquare.de");

    /**
     * Setting up the logger from a global XML configuration file. This method
     * might be called multiple times.<br/>
     * This method does not do anything if there are already appenders defined.
     */
    public static void initGpLogging() throws FactoryConfigurationError {
        if (Logger.getRootLogger().getAllAppenders().hasMoreElements())
            return;

        DOMConfigurator.configure(GPProps.class.getResource("/geopublishing_log4j.xml"));

        Logger.getRootLogger().addAppender(Logger.getLogger("dummy").getAppender("gpFileLogger"));

        // Apply the LOG level configured in the user-specific application
        // .properties file
        String logLevelStr = GPProps.get(Keys.logLevel);
        if (logLevelStr != null) {
            Logger.getRootLogger().setLevel(Level.toLevel(logLevelStr));
        }

        initBugReporting();
    }

    public static void initBugReporting() {
        ExceptionDialog.setMailDestinationAddress("tzeggai@wikisquare.de");
        ExceptionDialog.setSmtpMailer(bugReportMailer);

        // Add application version number to Exception mails
        ExceptionDialog.addAdditionalAppInfo(ReleaseUtil.getVersionInfo(GpUtil.class));
    }

    /**
     * This {@link IOFileFilter} only return .ttf files
     */
    public static final IOFileFilter FontsFilesFilter = new IOFileFilter() {

        @Override
        public boolean accept(File file) {
            if (file.getName().toLowerCase().endsWith(".ttf"))
                return true;
            return false;
        }

        @Override
        public boolean accept(File dir, String name) {
            return accept(new File(dir, name));
        }

    };

    public static final MbDecimalFormatter MbDecimalFormatter = new MbDecimalFormatter();

    /**
     * {@link ResourceProvider}, der die Lokalisation fuer GUI-Komponenten des
     * Package {@code skrueger.swing} zur Verfuegung stellt. Diese sind in
     * properties-Datein unter {@code skrueger.swing.resource.locales}
     * hinterlegt.
     */
    protected final static ResourceProvider RESOURCE = ResourceProvider
            .newInstance("locales.GeopublisherTranslation", Locale.ENGLISH);

    /**
     * Return all langauges that we have at least some .properties translations
     * for.
     */
    public static Set<Locale> getAvailableLocales() {
        return RESOURCE.getAvailableLocales(true);
    }

    /**
     * Convenience method to access the {@link Geopublisher}s translation
     * resources.
     * 
     * @param key
     *            the key for the *Translation.properties file
     * @param values
     *            optional values
     */
    public static String R(String key, Object... values) {
        return RESOURCE.getString(key, values);
    }

    /**
     * Convenience method to access the {@link Geopublisher}s translation
     * resources.
     * 
     * @param key
     *            the key for the *Translation.properties file
     * @param reqLanguage
     *            requested Language/Locale
     * @param values
     *            optional values
     */
    public static String R(final String key, Locale reqLanguage, final Object... values) {
        return RESOURCE.getString(key, reqLanguage, values);
    }

    /**
     * Generates a random ID number with fix number of digits (11) and a leading
     * prefix {@link String}.
     * 
     * @param prefix
     *            A string with at least one char. Without a leading letter,
     *            it's not usable as a valid XML identifier.
     */
    public final static String getRandomID(String prefix) {
        DecimalFormat decimalFormat = new DecimalFormat(prefix + "_00000000000");
        return String.valueOf(decimalFormat.format(Math.abs(GpCoreUtil.RANDOM.nextInt(Integer.MAX_VALUE))));
    }

    /**
     * Stores the Charset defined in {@link DpEntry#getChart} as a .cpg file
     * containing the name of charset. If the file already contains the same
     * content, it is not written (SVN friendly)
     */
    public static void writeCpg(DpLayerVectorFeatureSource dpe) {
        final AtlasConfigEditable ace = (AtlasConfigEditable) dpe.getAtlasConfig();

        final File cpgFile = IOUtil.changeFileExt(ace.getFileFor(dpe), "cpg");

        try {
            GeoExportUtil.writeCharset(cpgFile, dpe.getCharset());
        } catch (Exception e) {
            final String errMessage = "Unable to store the codepage settings for " + dpe
                    + "\nThe export will be continued."; // i8n
            LOGGER.warn(errMessage, e);
            // NULL TODO Null owner not nice
            ExceptionDialog.show(null, e, null, errMessage);
        }

    }

    /**
     * Performs a file OPEN choose as a fallback
     * 
     * @param parent
     *            component for the dialog (can be {@code null})
     * @param startFolder
     *            start folder for the chooser (if {@code null} "/" is used)
     * @param filter
     *            defines which files can be selected. Only the last filter in
     *            the list will be offered due to limitations
     * @return {@code null} if the dialog was not approved
     */
    public static File chooseFileOpenFallback(Component parent, File startFolder, String title,
            FileExtensionFilter... filters) {
        if (startFolder == null)
            startFolder = new File("/");

        if (startFolder.isFile())
            startFolder = startFolder.getParentFile();

        JFileChooser chooser = new JFileChooser(startFolder);
        chooser.setDialogType(JFileChooser.OPEN_DIALOG);

        if (filters != null) {
            chooser.setAcceptAllFileFilterUsed(false);
            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            chooser.setFileFilter(filters[0].toJFileChooserFilter());
        }
        if (title != null)
            chooser.setDialogTitle(title);

        int ret = chooser.showOpenDialog(parent);
        if (ret == JFileChooser.APPROVE_OPTION)
            return chooser.getSelectedFile();
        return null;
    }

    /**
     * this method checks for permission on java.io.tmpdir and changes it to a
     * given path if files in current tmpDir may not be executed. (Possibly due
     * to noexec mountoption on /tmp)
     */
    public static void checkAndResetTmpDir(String path) {
        if (SystemUtils.IS_OS_UNIX) {
            String tmpDir = System.getProperty("java.io.tmpdir");
            try {
                File file = File.createTempFile("geopublisher", "tmpDirTest", new File(tmpDir));
                file.setExecutable(true);
                if (!file.canExecute()) {
                    System.setProperty("java.io.tmpdir", path);
                    LOGGER.debug("tmpDir has no execute rights, changing to " + path);
                }
                FileUtils.deleteQuietly(file);
            } catch (IOException e) {
                LOGGER.log(Level.ERROR, e);
            }
        }
    }

}