preferences.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 666 行 · 第 1/2 页
JAVA
666 行
/* Preferences - Preference node containing key value entries and subnodes
Copyright (C) 2001 Free Software Foundation, Inc.
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 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 java.util.prefs;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.security.AccessController;
import java.security.Permission;
import java.security.PrivilegedAction;
import gnu.java.util.prefs.*;
/**
* Preference node containing key value entries and subnodes.
* <p>
* There are two preference node trees, a system tree which can be accessed
* by calling <code>systemRoot()</code> containing system preferences usefull
* for all users, and a user tree that can be accessed by calling
* <code>userRoot()</code> containing preferences that can differ between
* different users. How different users are identified is implementation
* depended. It can be determined by Thread, Access Control Context or Subject.
* <p>
* This implementation uses the "java.util.prefs.PreferencesFactory" system
* property to find a class that implement <code>PreferencesFactory</code>
* and initialized that class (if it has a public no arguments contructor)
* to get at the actual system or user root. If the system property is not set,
* or the class cannot be initialized it uses the default implementation
* <code>gnu.java.util.prefs.FileBasedFactory</code>.
* <p>
* Besides the two static method above to get the roots of the system and user
* preference node trees there are also two convenience methods to access the
* default preference node for a particular package an object is in. These are
* <code>userNodeForPackage()</code> and <code>systemNodeForPackage()</code>.
* Both methods take an Object as an argument so accessing preferences values
* can be as easy as calling <code>Preferences.userNodeForPackage(this)</code>.
* <p>
* Note that if a security manager is installed all static methods check for
* <code>RuntimePermission("preferences")</code>. But if this permission is
* given to the code then it can access and change all (user) preference nodes
* and entries. So you should be carefull not to store to sensitive information
* or make security decissions based on preference values since there is no
* more fine grained control over what preference values can be changed once
* code has been given the correct runtime permission.
* <p>
* XXX
*
* @since 1.4
* @author Mark Wielaard (mark@klomp.org)
*/
public abstract class Preferences {
// Static Fields
/**
* Default PreferencesFactory class used when the system property
* "java.util.prefs.PreferencesFactory" is not set.
* <p>
* XXX - Currently set to MemoryBasedPreferencesFactory, should be changed
* when FileBasedPreferences backend works.
*/
private static final String defaultFactoryClass
= "gnu.java.util.prefs.MemoryBasedPreferencesFactory";
/** Permission needed to access system or user root. */
private static final Permission prefsPermission
= new RuntimePermission("preferences");
/**
* The preferences factory object that supplies the system and user root.
* Set and returned by the getFactory() method.
*/
private static PreferencesFactory factory;
/** Maximum node name length. 80 characters. */
public static final int MAX_NAME_LENGTH = 80;
/** Maximum entry key length. 80 characters. */
public static final int MAX_KEY_LENGTH = 80;
/** Maximum entry value length. 8192 characters. */
public static final int MAX_VALUE_LENGTH = 8192;
// Constructors
/**
* Creates a new Preferences node. Can only be used by subclasses.
* Empty implementation.
*/
protected Preferences() {}
// Static methods
/**
* Returns the system preferences root node containing usefull preferences
* for all users. It is save to cache this value since it should always
* return the same preference node.
*
* @return the root system preference node
* @exception SecurityException when a security manager is installed and
* the caller does not have <code>RuntimePermission("preferences")</code>.
*/
public static Preferences systemRoot() throws SecurityException {
// Get the preferences factory and check for permission
PreferencesFactory factory = getFactory();
return factory.systemRoot();
}
/**
* Returns the user preferences root node containing preferences for the
* the current user. How different users are identified is implementation
* depended. It can be determined by Thread, Access Control Context or
* Subject.
*
* @return the root user preference node
* @exception SecurityException when a security manager is installed and
* the caller does not have <code>RuntimePermission("preferences")</code>.
*/
public static Preferences userRoot() throws SecurityException {
// Get the preferences factory and check for permission
PreferencesFactory factory = getFactory();
return factory.userRoot();
}
/**
* Private helper method for <code>systemRoot()</code> and
* <code>userRoot()</code>. Checks security permission and instantiates the
* correct factory if it has not yet been set.
* <p>
* When the preferences factory has not yet been set this method first
* tries to get the system propery "java.util.prefs.PreferencesFactory"
* and tries to initializes that class. If the system property is not set
* or initialization fails it returns an instance of the default factory
* <code>gnu.java.util.prefs.FileBasedPreferencesFactory</code>.
*
* @return the preferences factory to use
* @exception SecurityException when a security manager is installed and
* the caller does not have <code>RuntimePermission("preferences")</code>.
*/
private static PreferencesFactory getFactory() throws SecurityException {
// First check for permission
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(prefsPermission);
}
// Get the factory
if (factory == null) {
// Caller might not have enough permissions
factory = (PreferencesFactory) AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
PreferencesFactory pf = null;
String className = System.getProperty
("java.util.prefs.PreferencesFactory");
if (className != null) {
try {
Class fc = Class.forName(className);
Object o = fc.newInstance();
pf = (PreferencesFactory) o;
} catch (ClassNotFoundException cnfe)
{/*ignore*/}
catch (InstantiationException ie)
{/*ignore*/}
catch (IllegalAccessException iae)
{/*ignore*/}
catch (ClassCastException cce)
{/*ignore*/}
}
return pf;
}
});
// Still no factory? Use our default.
if (factory == null) {
try {
Object o = Class.forName(defaultFactoryClass);
factory = (PreferencesFactory) o;
} catch (ClassNotFoundException cnfe) {
throw new RuntimeException("Couldn't load default factory"
+ " '"+ defaultFactoryClass +"'");
// XXX - when using 1.4 compatible throwables add cause
}
}
}
return factory;
}
/**
* Returns the system preferences node for the package of an object.
* The package node name of the object is determined by dropping the
* class name of the object of the fully quallified class name and
* replacing all '.' to '/' in the package name. If the class of the
* object has no package then the package node name is "<unnamed>".
* The returened node is <code>systemRoot().node(packageNodeName)</code>.
*
* @param o Object whose default system preference node is requested
* @returns system preferences node that should be used by object o
* @exception SecurityException when a security manager is installed and
* the caller does not have <code>RuntimePermission("preferences")</code>.
*/
public static Preferences systemNodeForPackage(Object o)
throws SecurityException
{
return nodeForPackage(o, systemRoot());
}
/**
* Returns the user preferences node for the package of an object.
* The package node name of the object is determined by dropping the
* class name of the object of the fully quallified class name and
* replacing all '.' to '/' in the package name. If the class of the
* object has no package then the package node name is "<unnamed>".
* The returened node is <code>userRoot().node(packageNodeName)</code>.
*
* @param o Object whose default user preference node is requested
* @returns user preferences node that should be used by object o
* @exception SecurityException when a security manager is installed and
* the caller does not have <code>RuntimePermission("preferences")</code>.
*/
public static Preferences userNodeForPackage(Object o)
throws SecurityException
{
return nodeForPackage(o, userRoot());
}
/**
* Private helper method for <code>systemNodeForPackage()</code> and
* <code>userNodeForPackage()</code>. Given the correct system or user
* root it returns the correct Preference node for the package node name
* of the given object.
*/
private static Preferences nodeForPackage(Object o, Preferences root) {
// Get the package path
String className = o.getClass().getName();
String packagePath;
int index = className.lastIndexOf('.');
if(index == -1) {
packagePath = "<unnamed>";
} else {
packagePath = className.substring(0,index).replace('.','/');
}
return root.node(packagePath);
}
/**
* XXX
*/
public static void importPreferences(InputStream is)
throws InvalidPreferencesFormatException,
IOException
{
PreferencesFactory factory = getFactory();
NodeReader reader = new NodeReader(is, factory);
reader.importPreferences();
}
// abstract methods (identification)
/**
* Returns the absolute path name of this preference node.
* The absolute path name of a node is the path name of its parent node
* plus a '/' plus its own name. If the node is the root node and has no
* parent then its name is "" and its absolute path name is "/".
*/
abstract public String absolutePath();
/**
* Returns true if this node comes from the user preferences tree, false
* if it comes from the system preferences tree.
*/
abstract public boolean isUserNode();
/**
* Returns the name of this preferences node. The name of the node cannot
* be null, can be mostly 80 characters and cannot contain any '/'
* characters. The root node has as name "".
*/
abstract public String name();
/**
* Returns the String given by
* <code>
* (isUserNode() ? "User":"System") + " Preference Node: " + absolutePath()
* </code>
*/
abstract public String toString();
// abstract methods (navigation)
/**
* Returns all the direct sub nodes of this preferences node.
* Needs access to the backing store to give a meaningfull answer.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?