phex.utils.SystemProperties.java Source code

Java tutorial

Introduction

Here is the source code for phex.utils.SystemProperties.java

Source

/*
 *  PHEX - The pure-java Gnutella-servent.
 *  Copyright (C) 2001 - 2008 Phex Development Group
 *
 *  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, 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 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
 * 
 *  --- SVN Information ---
 *  $Id: SystemProperties.java 4416 2009-03-22 17:12:33Z ArneBab $
 */
package phex.utils;

import java.io.File;
import java.io.IOException;
import java.security.Security;

import org.apache.commons.lang.SystemUtils;

import phex.common.Environment;
import phex.common.log.NLogger;
import phex.prefs.core.ProxyPrefs;

public class SystemProperties {
    public static final String PHEX_CONFIG_PATH_SYSPROP = "phex.config.path";
    private volatile static File phexConfigRoot;

    /**
     * For a HTTPURLConnection java uses configured proxy settings.
     */
    public static void updateProxyProperties() {
        System.setProperty("http.agent", Environment.getPhexVendor());
        if (ProxyPrefs.UseHttp.get().booleanValue()) {
            System.setProperty("http.proxyHost", ProxyPrefs.HttpHost.get());
            System.setProperty("http.proxyPort", ProxyPrefs.HttpPort.get().toString());
        } else {
            System.setProperty("http.proxyHost", "");
            System.setProperty("http.proxyPort", "");
        }

        // cache DNS name lookups for only 30 minutes
        System.setProperty("networkaddress.cache.ttl", "1800");
        Security.setProperty("networkaddress.cache.ttl", "1800");
    }

    /**
     * Sets the directory into which Phex adds its configuration files. When
     * configRoot is null the directory is set to:<br>
     * {user.home}/phex on windows systems and<br>
     * {user.home}/.phex on unix and mac systems.
     * 
     * @deprecated since Phex 3.0, drop support once 2.x is not in use anymore
     */
    @Deprecated
    private static File getOldPhexConfigRoot() {
        StringBuffer path = new StringBuffer(20);
        path.append(System.getProperty("user.home"));
        path.append(File.separator);

        //phex config files are hidden on all UNIX systems (also MacOSX. Since
        //there are many UNIX like operation systems with Java support out there,
        //we can not recognize the OS through it's name. Thus we check if the
        //root of the filesystem starts with "/" since only UNIX uses such
        //filesystem conventions
        if (File.separatorChar == '/') {
            path.append('.');
        }
        // I2P:
        // Avoid interference with Phex by having a differently named config directory.
        path.append("i2phex");
        File configRoot = new File(path.toString());
        return configRoot;
    }

    /**
     * @deprecated since Phex 3.0, drop support once 2.x is not in use anymore
     */
    @Deprecated
    public static void migratePhexConfigRoot() {
        File oldRoot = getOldPhexConfigRoot();
        if (oldRoot.exists()) {
            try {
                File newRoot = getPhexConfigRoot();
                if (!oldRoot.equals(newRoot)) {
                    FileUtils.copyDirectory(oldRoot, newRoot, true);
                    // FileUtils.deleteDirectory( oldRoot ); // commented out to avoid deleting the old phex config directory. 
                }
            } catch (IOException exp) {
                NLogger.error(SystemProperties.class, exp, exp);
            }
        }
    }

    /**
     * Returns the full path to the Phex directory of the user's home. This
     * directory is plattform dependent.
     * - Unix: ~/.phex/
     * - OSX: ~/Library/Application Support/Phex/
     * - Windows: ..../Documents and Settings/username/Application Data/Phex/
     * @throws RuntimeException in case creating a possible missing Phex config root fails
     *         or the phexConfigRoot is not a directory.
     */
    public static File getPhexConfigRoot() {
        if (phexConfigRoot == null) {
            phexConfigRoot = initPhexConfigRoot();
        }
        if (phexConfigRoot.exists()) {
            if (!phexConfigRoot.isDirectory()) {
                throw new RuntimeException(
                        "Config location is not a directory: " + phexConfigRoot.getAbsolutePath());
            }
        } else {
            try {
                FileUtils.forceMkdir(phexConfigRoot);
            } catch (IOException exp) {
                throw new RuntimeException("Failed creating config directory: " + phexConfigRoot.getAbsolutePath());
            }
        }
        return phexConfigRoot;
    }

    private static File initPhexConfigRoot() {
        // to prevent problems wait with assigning userPath...
        String tmpUserPath = System.getProperty(PHEX_CONFIG_PATH_SYSPROP);
        if (StringUtils.isEmpty(tmpUserPath)) {
            if (SystemUtils.IS_OS_WINDOWS) {
                String appDataEnv = System.getenv("APPDATA");
                if (StringUtils.isEmpty(appDataEnv)) {
                    tmpUserPath = System.getProperty("user.home") + File.separator + "Application Data";
                }
                // I2P:
                // Avoid interference with Phex by having a differently named config directory.
                tmpUserPath = appDataEnv + File.separator + "I2Phex" + File.separator;
            } else if (SystemUtils.IS_OS_MAC_OSX) {
                tmpUserPath = System.getProperty("user.home") + File.separator + "Library" + File.separator
                        + "Application Support";
                // I2P:
                // Avoid interference with Phex by having a differently named config directory.
                tmpUserPath = tmpUserPath + File.separator + "I2Phex" + File.separator;
            } else {
                // I2P:
                // Avoid interference with Phex by having a differently named config directory.
                tmpUserPath = System.getProperty("user.home") + File.separator + ".i2phex" + File.separator;
            }
        } else {
            if (!tmpUserPath.endsWith(File.separator)) {
                tmpUserPath = tmpUserPath + File.separator;
            }
        }
        File dir = new File(tmpUserPath);
        return dir;
    }
}