| /* SystemProperties.java -- Manage the System properties. | |
| Copyright (C) 2004, 2005 Free Software Foundation | |
| This file is part of GNU Classpath. | |
| GNU Classpath 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, or (at your option) | |
| any later version. | |
| GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| 02110-1301 USA. | |
| Linking this library statically or dynamically with other modules is | |
| making a combined work based on this library. Thus, the terms and | |
| conditions of the GNU General Public License cover the whole | |
| combination. | |
| As a special exception, the copyright holders of this library give you | |
| permission to link this library with independent modules to produce an | |
| executable, regardless of the license terms of these independent | |
| modules, and to copy and distribute the resulting executable under | |
| terms of your choice, provided that you also meet, for each linked | |
| independent module, the terms and conditions of the license of that | |
| module. An independent module is a module which is not derived from | |
| or based on this library. If you modify this library, you may extend | |
| this exception to your version of the library, but you are not | |
| obligated to do so. If you do not wish to do so, delete this | |
| exception statement from your version. */ | |
| package gnu.classpath; | |
| import java.util.Properties; | |
| /** | |
| * The class manages the System properties. This class is only available to | |
| * privileged code (i.e. code loaded by the bootstrap class loader) and | |
| * therefore doesn't do any security checks. | |
| * This class is separated out from java.lang.System to simplify bootstrap | |
| * dependencies and to allow trusted code a simple and efficient mechanism | |
| * to access the system properties. | |
| */ | |
| public class SystemProperties | |
| { | |
| /** | |
| * Stores the current system properties. This can be modified by | |
| * {@link #setProperties(Properties)}, but will never be null, because | |
| * setProperties(null) sucks in the default properties. | |
| */ | |
| private static Properties properties; | |
| /** | |
| * The default properties. Once the default is stabilized, | |
| * it should not be modified; | |
| * instead it is cloned when calling <code>setProperties(null)</code>. | |
| */ | |
| private static final Properties defaultProperties = new Properties(); | |
| private static native void insertSystemProperties(Properties properties); | |
| static | |
| { | |
| insertSystemProperties(defaultProperties); | |
| defaultProperties.put("gnu.classpath.version", | |
| Configuration.CLASSPATH_VERSION); | |
| // Set base URL if not already set. | |
| if (defaultProperties.get("gnu.classpath.home.url") == null) | |
| defaultProperties.put("gnu.classpath.home.url", | |
| "file://" | |
| + defaultProperties.get("gnu.classpath.home") | |
| + "/lib"); | |
| // Set short name if not already set. | |
| if (defaultProperties.get("gnu.classpath.vm.shortname") == null) | |
| { | |
| String value = defaultProperties.getProperty("java.vm.name"); | |
| int index = value.lastIndexOf(' '); | |
| if (index != -1) | |
| value = value.substring(index + 1); | |
| defaultProperties.put("gnu.classpath.vm.shortname", value); | |
| } | |
| // Network properties | |
| if (defaultProperties.get("http.agent") == null) | |
| { | |
| String userAgent = ("gnu-classpath/" | |
| + defaultProperties.getProperty("gnu.classpath.version") | |
| + " (" | |
| + defaultProperties.getProperty("gnu.classpath.vm.shortname") | |
| + "/" | |
| + defaultProperties.getProperty("java.vm.version") | |
| + ")"); | |
| defaultProperties.put("http.agent", userAgent); | |
| } | |
| defaultProperties.put("gnu.cpu.endian", | |
| isWordsBigEndian() ? "big" : "little"); | |
| // XXX FIXME - Temp hack for old systems that set the wrong property | |
| if (defaultProperties.get("java.io.tmpdir") == null) | |
| defaultProperties.put("java.io.tmpdir", | |
| defaultProperties.get("java.tmpdir")); | |
| // Note that we use clone here and not new. Some programs assume | |
| // that the system properties do not have a parent. | |
| properties = (Properties) defaultProperties.clone(); | |
| } | |
| public static String getProperty(String name) | |
| { | |
| return properties.getProperty(name); | |
| } | |
| public static String getProperty(String name, String defaultValue) | |
| { | |
| return properties.getProperty(name, defaultValue); | |
| } | |
| public static String setProperty(String name, String value) | |
| { | |
| return (String) properties.setProperty(name, value); | |
| } | |
| public static Properties getProperties() | |
| { | |
| return properties; | |
| } | |
| public static void setProperties(Properties properties) | |
| { | |
| if (properties == null) | |
| { | |
| // Note that we use clone here and not new. Some programs | |
| // assume that the system properties do not have a parent. | |
| properties = (Properties)defaultProperties.clone(); | |
| } | |
| SystemProperties.properties = properties; | |
| } | |
| /** | |
| * Detect big-endian systems. | |
| * | |
| * @return true if the system is big-endian. | |
| */ | |
| private static native boolean isWordsBigEndian(); | |
| } |