org.geowebcache.storage.DefaultStorageFinder.java Source code

Java tutorial

Introduction

Here is the source code for org.geowebcache.storage.DefaultStorageFinder.java

Source

/**
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 *  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 Lesser General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * @author Arne Kepp / The Open Planning Project 2009
 *  
 */

package org.geowebcache.storage;

import java.io.File;

import javax.servlet.ServletContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.geowebcache.config.ConfigurationException;
import org.geowebcache.util.ApplicationContextProvider;
import org.geowebcache.util.GWCVars;
import org.springframework.web.context.WebApplicationContext;

/**
 * Locates the position of the GeoWebCache file cache inspecting system variables, the servlet
 * context and environment variables
 */
public class DefaultStorageFinder {
    public final static String GWC_CACHE_DIR = "GEOWEBCACHE_CACHE_DIR";

    public final static String GS_DATA_DIR = "GEOSERVER_DATA_DIR";

    public final static String GWC_METASTORE_DISABLED = "GWC_METASTORE_DISABLED";

    public final static String GWC_METASTORE_JDBC_URL = "GWC_METASTORE_JDBC_URL";

    public final static String GWC_METASTORE_USERNAME = "GWC_METASTORE_USERNAME";

    public final static String GWC_METASTORE_PASSWORD = "GWC_METASTORE_PASSWORD";

    public final static String GWC_METASTORE_DRIVER_CLASS = "GWC_METASTORE_DRIVER_CLASS";

    public final static String GWC_BLANK_TILE_PATH = "GWC_BLANK_TILE_PATH";

    private static Log log = LogFactory.getLog(org.geowebcache.storage.DefaultStorageFinder.class);

    private String defaultPrefix = null;

    private WebApplicationContext context = null;

    public DefaultStorageFinder(ApplicationContextProvider provider) {
        context = provider.getApplicationContext();
    }

    public synchronized String getDefaultPath() throws ConfigurationException {
        if (this.defaultPrefix == null) {
            determineDefaultPrefix();
            if (this.defaultPrefix == null) {
                throw new ConfigurationException("Unable to find writable path for cache.");
            }
        }

        return this.defaultPrefix;
    }

    public String findEnvVar(String varStr) {
        return GWCVars.findEnvVar(context, varStr);
    }

    /**
     * Looks for <br>
     * 1) GEOWEBCACHE_CACHE_DIR<br>
     * 2) GEOSERVER_DATA_DIR<br>
     * 3) %TEMP%, $TEMP<br>
     * <br>
     * Using<br>
     * A) Java environment variable<br>
     * B) Servlet context parameter<br>
     * C) System environment variable<br>
     * 
     */
    private void determineDefaultPrefix() {
        ServletContext serlvCtx = context.getServletContext();

        final String[] typeStrs = { "Java environment variable ", "Servlet context parameter ",
                "System environment variable " };

        final String[] varStrs = { GWC_CACHE_DIR, GS_DATA_DIR, "TEMP", "TMP" };

        String msgPrefix = null;
        int iVar = 0;
        for (int i = 0; i < varStrs.length && defaultPrefix == null; i++) {
            for (int j = 0; j < typeStrs.length && defaultPrefix == null; j++) {
                String value = null;
                String varStr = varStrs[i];
                String typeStr = typeStrs[j];

                switch (j) {
                case 0:
                    value = System.getProperty(varStr);
                    break;
                case 1:
                    value = serlvCtx.getInitParameter(varStr);
                    break;
                case 2:
                    value = System.getenv(varStr);
                    break;
                }

                if (value == null || value.equalsIgnoreCase("")) {
                    if (log.isDebugEnabled()) {
                        log.debug(typeStr + varStr + " is unset");
                    }
                    continue;
                }

                File fh = new File(value);

                // Being a bit pessimistic here
                msgPrefix = "Found " + typeStr + varStr + " set to " + value;

                if (!fh.exists()) {
                    log.error(msgPrefix + " , but this path does not exist");
                    continue;
                }
                if (!fh.isDirectory()) {
                    log.error(msgPrefix + " , which is not a directory");
                    continue;
                }
                if (!fh.canWrite()) {
                    log.error(msgPrefix + " , which is not writeable");
                    continue;
                }

                // Sweet, we can work with this
                this.defaultPrefix = value;
                iVar = i;
            }
        }
        String logMsg;

        if (this.defaultPrefix == null) {
            String tmpDir = System.getProperty("java.io.tmpdir");
            if (tmpDir != null) {
                File temp = new File(tmpDir, "geowebcache");
                logMsg = "Reverting to java.io.tmpdir " + this.defaultPrefix + " for storage. " + "Please set "
                        + GWC_CACHE_DIR + ".";
                if (!temp.exists() && !temp.mkdirs()) {
                    throw new RuntimeException("Can't create " + temp.getAbsolutePath());
                }
                this.defaultPrefix = temp.getAbsolutePath();
            } else {
                logMsg = "Unable to determine temp directory. Proceeding with undefined results.";
            }
        } else {
            switch (iVar) {
            case 0: // GEOWEBCACHE_CACHE_DIR, do nothing
                break;

            case 1: // GEOSERVER_DATA_DIR, prefix
                this.defaultPrefix = this.defaultPrefix + File.separator + "gwc";
                break;

            case 2: // TEMP directories
            case 3:
                this.defaultPrefix = this.defaultPrefix + File.separator + "geowebcache";
            }

            logMsg = msgPrefix + ", using it as the default prefix.";
        }

        String warnStr = "*** " + logMsg + " ***";
        StringBuilder stars = new StringBuilder();
        for (int i = 0; i < warnStr.length(); i++) {
            stars.append("*");
        }

        log.info(stars.toString());
        log.info(warnStr);
        log.info(stars.toString());
    }
}