diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:14 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:14 -0800 |
commit | 1c0fed63c71ddb230f3b304aac12caffbedf2f21 (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /prefs/src/main | |
parent | 2fb02ef3025449e24e756a7f645ea6eab7a1fd4f (diff) | |
download | libcore-1c0fed63c71ddb230f3b304aac12caffbedf2f21.zip libcore-1c0fed63c71ddb230f3b304aac12caffbedf2f21.tar.gz libcore-1c0fed63c71ddb230f3b304aac12caffbedf2f21.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'prefs/src/main')
17 files changed, 0 insertions, 3634 deletions
diff --git a/prefs/src/main/java/java/util/prefs/AbstractPreferences.java b/prefs/src/main/java/java/util/prefs/AbstractPreferences.java deleted file mode 100644 index 711cc01..0000000 --- a/prefs/src/main/java/java/util/prefs/AbstractPreferences.java +++ /dev/null @@ -1,974 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package java.util.prefs; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.EventListener; -import java.util.EventObject; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.TreeSet; - -import org.apache.harmony.luni.util.Base64; -import org.apache.harmony.prefs.internal.nls.Messages; - -/** - * This abstract class is a partial implementation of the abstract class - * Preferences, which can be used to simplify {@code Preferences} provider's - * implementation. This class defines nine abstract SPI methods, which must be - * implemented by a preference provider. - * - * @since Android 1.0 - */ -public abstract class AbstractPreferences extends Preferences { - /* - * ----------------------------------------------------------- - * Class fields - * ----------------------------------------------------------- - */ - /** - * The unhandled events collection. - */ - private static final List<EventObject> events = new LinkedList<EventObject>(); - - /** - * The event dispatcher thread. - */ - private static final EventDispatcher dispatcher = new EventDispatcher("Preference Event Dispatcher"); //$NON-NLS-1$ - - /* - * ----------------------------------------------------------- - * Class initializer - * ----------------------------------------------------------- - */ - static { - dispatcher.setDaemon(true); - dispatcher.start(); - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - Preferences uroot = Preferences.userRoot(); - Preferences sroot = Preferences.systemRoot(); - try { - uroot.flush(); - } catch (BackingStoreException e) {//ignore - } - try { - sroot.flush(); - } catch (BackingStoreException e) {//ignore - } - } - }); - } - - /* - * ----------------------------------------------------------- - * Instance fields (package-private) - * ----------------------------------------------------------- - */ - /** - * True, if this node is in user preference hierarchy. - */ - boolean userNode; - - /* - * ----------------------------------------------------------- - * Instance fields (private) - * ----------------------------------------------------------- - */ - /** - * Marker class for 'lock' field. - */ - private static class Lock { - } - - /** - * The object used to lock this node. - * - * @since Android 1.0 - */ - protected final Object lock; - - /** - * This field is true if this node is created while it doesn't exist in the - * backing store. This field's default value is false, and it is checked - * when the node creation is completed, and if it is true, the node change - * event will be fired for this node's parent. - * - * @since Android 1.0 - */ - protected boolean newNode; - - /** - * Cached child nodes - */ - private Map<String, AbstractPreferences> cachedNode; - - //the collections of listeners - private List<EventListener> nodeChangeListeners; - private List<EventListener> preferenceChangeListeners; - - //this node's name - private String nodeName; - - //handler to this node's parent - private AbstractPreferences parentPref; - - //true if this node has been removed - private boolean isRemoved; - - //handler to this node's root node - private AbstractPreferences root; - - /* - * ----------------------------------------------------------- - * Constructors - * ----------------------------------------------------------- - */ - /** - * Constructs a new {@code AbstractPreferences} instance using the given parent node - * and node name. - * - * @param parent - * the parent node of the new node or {@code null} to indicate - * that the new node is a root node. - * @param name - * the name of the new node or an empty string to indicate that - * this node is called "root". - * @throws IllegalArgumentException - * if the name contains a slash character or is empty if {@code - * parent} is not {@code null}. - * @since Android 1.0 - */ - protected AbstractPreferences(AbstractPreferences parent, String name) { - if ((null == parent ^ name.length() == 0) || name.indexOf("/") >= 0) { //$NON-NLS-1$ - throw new IllegalArgumentException(); - } - root = null == parent ? this : parent.root; - nodeChangeListeners = new LinkedList<EventListener>(); - preferenceChangeListeners = new LinkedList<EventListener>(); - isRemoved = false; - cachedNode = new HashMap<String, AbstractPreferences>(); - nodeName = name; - parentPref = parent; - lock = new Lock(); - userNode = root.userNode; - } - - /* - * ----------------------------------------------------------- - * Methods - * ----------------------------------------------------------- - */ - /** - * Returns an array of all cached child nodes. - * - * @return the array of cached child nodes. - * @since Android 1.0 - */ - protected final AbstractPreferences[] cachedChildren() { - return cachedNode.values().toArray(new AbstractPreferences[cachedNode.size()]); - } - - /** - * Returns the child node with the specified name or {@code null} if it - * doesn't exist. Implementers can assume that the name supplied to this method - * will be a valid node name string (conforming to the node naming format) and - * will not correspond to a node that has been cached or removed. - * - * @param name - * the name of the desired child node. - * @return the child node with the given name or {@code null} if it doesn't - * exist. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - protected AbstractPreferences getChild(String name) - throws BackingStoreException { - synchronized (lock) { - checkState(); - AbstractPreferences result = null; - String[] childrenNames = childrenNames(); - for (int i = 0; i < childrenNames.length; i++) { - if (childrenNames[i].equals(name)) { - result = childSpi(name); - break; - } - } - return result; - } - - } - - /** - * Returns whether this node has been removed by invoking the method {@code - * removeNode()}. - * - * @return {@code true}, if this node has been removed, {@code false} - * otherwise. - * @since Android 1.0 - */ - protected boolean isRemoved() { - synchronized (lock) { - return isRemoved; - } - } - - /** - * Flushes changes of this node to the backing store. This method should - * only flush this node and should not include the descendant nodes. Any - * implementation that wants to provide functionality to flush all nodes - * at once should override the method {@link #flush() flush()}. - * - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - protected abstract void flushSpi() throws BackingStoreException; - - /** - * Returns the names of all of the child nodes of this node or an empty array if - * this node has no children. The names of cached children are not required to be - * returned. - * - * @return the names of this node's children. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - protected abstract String[] childrenNamesSpi() throws BackingStoreException; - - /** - * Returns the child preference node with the given name, creating it - * if it does not exist. The caller of this method should ensure that the - * given name is valid and that this node has not been removed or cached. - * If the named node has just been removed, the implementation - * of this method must create a new one instead of reactivating the removed - * one. - * <p> - * The new creation is not required to be persisted immediately until the - * flush method will be invoked. - * </p> - * - * @param name - * the name of the child preference to be returned. - * @return the child preference node. - * @since Android 1.0 - */ - protected abstract AbstractPreferences childSpi(String name); - - - /** - * Puts the given key-value pair into this node. Caller of this method - * should ensure that both of the given values are valid and that this - * node has not been removed. - * - * @param name - * the given preference key. - * @param value - * the given preference value. - * @since Android 1.0 - */ - protected abstract void putSpi(String name, String value); - - /** - * Gets the preference value mapped to the given key. The caller of this method - * should ensure that the given key is valid and that this node has not been - * removed. This method should not throw any exceptions but if it does, the - * caller will ignore the exception, regarding it as a {@code null} return value. - * - * @param key - * the given key to be searched for. - * @return the preference value mapped to the given key. - * @since Android 1.0 - */ - protected abstract String getSpi(String key); - - - /** - * Returns an array of all preference keys of this node or an empty array if - * no preferences have been found. The caller of this method should ensure that - * this node has not been removed. - * - * @return the array of all preference keys. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - protected abstract String[] keysSpi() throws BackingStoreException; - - /** - * Removes this node from the preference hierarchy tree. The caller of this - * method should ensure that this node has no child nodes, which means the - * method {@link Preferences#removeNode() Preferences.removeNode()} should - * invoke this method multiple-times in bottom-up pattern. The removal is - * not required to be persisted until after it is flushed. - * - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - protected abstract void removeNodeSpi() throws BackingStoreException; - - /** - * Removes the preference with the specified key. The caller of this method - * should ensure that the given key is valid and that this node has not been - * removed. - * - * @param key - * the key of the preference that is to be removed. - * @since Android 1.0 - */ - protected abstract void removeSpi(String key); - - /** - * Synchronizes this node with the backing store. This method should only - * synchronize this node and should not include the descendant nodes. An - * implementation that wants to provide functionality to synchronize all nodes at once should - * override the method {@link #sync() sync()}. - * - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - protected abstract void syncSpi() throws BackingStoreException; - - /* - * ----------------------------------------------------------- - * Methods inherited from Preferences - * ----------------------------------------------------------- - */ - @Override - public String absolutePath() { - if (parentPref == null) { - return "/"; //$NON-NLS-1$ - } else if (parentPref == root) { - return "/" + nodeName; //$NON-NLS-1$ - } - return parentPref.absolutePath() + "/" + nodeName; //$NON-NLS-1$ - } - - @Override - public String[] childrenNames() throws BackingStoreException { - synchronized (lock) { - checkState(); - TreeSet<String> result = new TreeSet<String>(cachedNode.keySet()); - String[] names = childrenNamesSpi(); - for (int i = 0; i < names.length; i++) { - result.add(names[i]); - } - return result.toArray(new String[0]); - } - } - - @Override - public void clear() throws BackingStoreException { - synchronized (lock) { - String[] keyList = keys(); - for (int i = 0; i < keyList.length; i++) { - remove(keyList[i]); - } - } - } - - @Override - public void exportNode(OutputStream ostream) throws IOException, - BackingStoreException { - if(ostream == null) { - // prefs.5=Stream is null - throw new NullPointerException(Messages.getString("prefs.5")); //$NON-NLS-1$ - } - checkState(); - XMLParser.exportPrefs(this, ostream, false); - - } - - @Override - public void exportSubtree(OutputStream ostream) throws IOException, - BackingStoreException { - if(ostream == null) { - // prefs.5=Stream is null - throw new NullPointerException(Messages.getString("prefs.5")); //$NON-NLS-1$ - } - checkState(); - XMLParser.exportPrefs(this, ostream, true); - } - - @Override - public void flush() throws BackingStoreException { - synchronized (lock) { - flushSpi(); - } - AbstractPreferences[] cc = cachedChildren(); - int i; - for (i = 0; i < cc.length; i++) { - cc[i].flush(); - } - } - - @Override - public String get(String key, String deflt) { - if (key == null) { - throw new NullPointerException(); - } - String result; - synchronized (lock) { - checkState(); - try { - result = getSpi(key); - } catch (Exception e) { - result = null; - } - } - return (result == null ? deflt : result); - } - - @Override - public boolean getBoolean(String key, boolean deflt) { - String result = get(key, null); - if (result == null) { - return deflt; - } else if (result.equalsIgnoreCase("true")) { //$NON-NLS-1$ - return true; - } else if (result.equalsIgnoreCase("false")) { //$NON-NLS-1$ - return false; - } else { - return deflt; - } - } - - @Override - public byte[] getByteArray(String key, byte[] deflt) { - String svalue = get(key, null); - if (svalue == null) { - return deflt; - } - if (svalue.length() == 0) { - return new byte[0]; - } - byte[] dres; - try { - byte[] bavalue = svalue.getBytes("US-ASCII"); //$NON-NLS-1$ - if (bavalue.length % 4 != 0) { - return deflt; - } - dres = Base64.decode(bavalue); - } catch (Exception e) { - dres = deflt; - } - return dres; - } - - @Override - public double getDouble(String key, double deflt) { - String result = get(key, null); - if (result == null) { - return deflt; - } - double dres; - try { - dres = Double.parseDouble(result); - } catch (NumberFormatException e) { - dres = deflt; - } - return dres; - } - - @Override - public float getFloat(String key, float deflt) { - String result = get(key, null); - if (result == null) { - return deflt; - } - float fres; - try { - fres = Float.parseFloat(result); - } catch (NumberFormatException e) { - fres = deflt; - } - return fres; - } - - @Override - public int getInt(String key, int deflt) { - String result = get(key, null); - if (result == null) { - return deflt; - } - int ires; - try { - ires = Integer.parseInt(result); - } catch (NumberFormatException e) { - ires = deflt; - } - return ires; - } - - @Override - public long getLong(String key, long deflt) { - String result = get(key, null); - if (result == null) { - return deflt; - } - long lres; - try { - lres = Long.parseLong(result); - } catch (NumberFormatException e) { - lres = deflt; - } - return lres; - } - - @Override - public boolean isUserNode() { - return root == Preferences.userRoot(); - } - - @Override - public String[] keys() throws BackingStoreException { - synchronized (lock) { - checkState(); - return keysSpi(); - } - } - - @Override - public String name() { - return nodeName; - } - - @Override - public Preferences node(String name) { - AbstractPreferences startNode = null; - synchronized (lock) { - checkState(); - validateName(name); - if ("".equals(name)) { //$NON-NLS-1$ - return this; - } else if ("/".equals(name)) { //$NON-NLS-1$ - return root; - } - if (name.startsWith("/")) { //$NON-NLS-1$ - startNode = root; - name = name.substring(1); - } else { - startNode = this; - } - } - Preferences result = null; - try { - result = startNode.nodeImpl(name, true); - } catch (BackingStoreException e) { - //should not happen - } - return result; - } - - private void validateName(String name) { - if (name.endsWith("/") && name.length() > 1) { //$NON-NLS-1$ - // prefs.6=Name cannot end with '/'\! - throw new IllegalArgumentException(Messages.getString("prefs.6")); //$NON-NLS-1$ - } - if (name.indexOf("//") >= 0) { //$NON-NLS-1$ - // prefs.7=Name cannot contains consecutive '/'\! - throw new IllegalArgumentException( - Messages.getString("prefs.7")); //$NON-NLS-1$ - } - } - - private AbstractPreferences nodeImpl(String path, boolean createNew) - throws BackingStoreException { - StringTokenizer st = new StringTokenizer(path, "/"); //$NON-NLS-1$ - AbstractPreferences currentNode = this; - AbstractPreferences temp = null; - while (st.hasMoreTokens() && null != currentNode) { - String name = st.nextToken(); - synchronized (currentNode.lock) { - temp = currentNode.cachedNode.get(name); - if (temp == null) { - temp = getNodeFromBackend(createNew, currentNode, name); - } - } - - currentNode = temp; - } - return currentNode; - } - - private AbstractPreferences getNodeFromBackend(boolean createNew, - AbstractPreferences currentNode, String name) - throws BackingStoreException { - AbstractPreferences temp; - if (name.length() > MAX_NAME_LENGTH) { - // prefs.8=Name length is too long: {0} - throw new IllegalArgumentException(Messages.getString("prefs.8", //$NON-NLS-1$ - name)); - } - if (createNew) { - temp = currentNode.childSpi(name); - currentNode.cachedNode.put(name, temp); - if (temp.newNode && currentNode.nodeChangeListeners.size() > 0) { - currentNode.notifyChildAdded(temp); - } - } else { - temp = currentNode.getChild(name); - } - return temp; - } - - @Override - public boolean nodeExists(String name) throws BackingStoreException { - AbstractPreferences startNode = null; - synchronized (lock) { - if (isRemoved()) { - if ("".equals(name)) { //$NON-NLS-1$ - return false; - } - // prefs.9=This node has been removed\! - throw new IllegalStateException(Messages.getString("prefs.9")); //$NON-NLS-1$ - } - validateName(name); - if ("".equals(name) || "/".equals(name)) { //$NON-NLS-1$ //$NON-NLS-2$ - return true; - } - if (name.startsWith("/")) { //$NON-NLS-1$ - startNode = root; - name = name.substring(1); - } else { - startNode = this; - } - } - try { - Preferences result = startNode.nodeImpl(name, false); - return null == result ? false : true; - } catch(IllegalArgumentException e) { - return false; - } - } - - @Override - public Preferences parent() { - checkState(); - return parentPref; - } - - private void checkState() { - if (isRemoved()) { - // prefs.9=This node has been removed\! - throw new IllegalStateException(Messages.getString("prefs.9")); //$NON-NLS-1$ - } - } - - @Override - public void put(String key, String value) { - if (null == key || null == value) { - throw new NullPointerException(); - } - if (key.length() > MAX_KEY_LENGTH || value.length() > MAX_VALUE_LENGTH) { - throw new IllegalArgumentException(); - } - synchronized (lock) { - checkState(); - putSpi(key, value); - } - notifyPreferenceChange(key, value); - } - - @Override - public void putBoolean(String key, boolean value) { - String sval = String.valueOf(value); - put(key, sval); - } - - @Override - public void putByteArray(String key, byte[] value) { - try { - put(key, Base64.encode(value, "US-ASCII")); //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); - } - } - - @Override - public void putDouble(String key, double value) { - String sval = Double.toString(value); - put(key, sval); - } - - @Override - public void putFloat(String key, float value) { - String sval = Float.toString(value); - put(key, sval); - } - - @Override - public void putInt(String key, int value) { - String sval = Integer.toString(value); - put(key, sval); - } - - @Override - public void putLong(String key, long value) { - String sval = Long.toString(value); - put(key, sval); - } - - @Override - public void remove(String key) { - synchronized (lock) { - checkState(); - removeSpi(key); - } - notifyPreferenceChange(key, null); - } - - @Override - public void removeNode() throws BackingStoreException { - if (root == this) { - // prefs.A=Cannot remove root node\! - throw new UnsupportedOperationException(Messages.getString("prefs.A")); //$NON-NLS-1$ - } - synchronized (parentPref.lock) { - removeNodeImpl(); - } - } - - private void removeNodeImpl() throws BackingStoreException { - synchronized (lock) { - checkState(); - String[] childrenNames = childrenNamesSpi(); - for (int i = 0; i < childrenNames.length; i++) { - if (null == cachedNode.get(childrenNames[i])) { - AbstractPreferences child = childSpi(childrenNames[i]); - cachedNode.put(childrenNames[i], child); - } - } - AbstractPreferences[] children = cachedNode - .values().toArray(new AbstractPreferences[0]); - for (int i = 0; i < children.length; i++) { - children[i].removeNodeImpl(); - } - removeNodeSpi(); - isRemoved = true; - parentPref.cachedNode.remove(nodeName); - } - if (parentPref.nodeChangeListeners.size() > 0) { - parentPref.notifyChildRemoved(this); - } - } - - @Override - public void addNodeChangeListener(NodeChangeListener ncl) { - if (null == ncl) { - throw new NullPointerException(); - } - checkState(); - synchronized (nodeChangeListeners) { - nodeChangeListeners.add(ncl); - } - } - - @Override - public void addPreferenceChangeListener(PreferenceChangeListener pcl) { - if (null == pcl) { - throw new NullPointerException(); - } - checkState(); - synchronized (preferenceChangeListeners) { - preferenceChangeListeners.add(pcl); - } - } - - @Override - public void removeNodeChangeListener(NodeChangeListener ncl) { - checkState(); - synchronized (nodeChangeListeners) { - int pos; - if ((pos = nodeChangeListeners.indexOf(ncl)) == -1) { - throw new IllegalArgumentException(); - } - nodeChangeListeners.remove(pos); - } - } - - @Override - public void removePreferenceChangeListener(PreferenceChangeListener pcl) { - checkState(); - synchronized (preferenceChangeListeners) { - int pos; - if ((pos = preferenceChangeListeners.indexOf(pcl)) == -1) { - throw new IllegalArgumentException(); - } - preferenceChangeListeners.remove(pos); - } - } - - @Override - public void sync() throws BackingStoreException { - synchronized (lock) { - checkState(); - syncSpi(); - } - AbstractPreferences[] cc = cachedChildren(); - int i; - for (i = 0; i < cc.length; i++) { - cc[i].sync(); - } - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append(isUserNode() ? "User" : "System"); //$NON-NLS-1$ //$NON-NLS-2$ - sb.append(" Preference Node: "); //$NON-NLS-1$ - sb.append(absolutePath()); - return sb.toString(); - } - - private void notifyChildAdded(Preferences child) { - NodeChangeEvent nce = new NodeAddEvent(this, child); - synchronized (events) { - events.add(nce); - events.notifyAll(); - } - } - - private void notifyChildRemoved(Preferences child) { - NodeChangeEvent nce = new NodeRemoveEvent(this, child); - synchronized (events) { - events.add(nce); - events.notifyAll(); - } - } - - private void notifyPreferenceChange(String key, String newValue) { - PreferenceChangeEvent pce = new PreferenceChangeEvent(this, key, - newValue); - synchronized (events) { - events.add(pce); - events.notifyAll(); - } - } - - private static class EventDispatcher extends Thread { - EventDispatcher(String name){ - super(name); - } - - @Override - public void run() { - while (true) { - EventObject event = null; - try { - event = getEventObject(); - } catch (InterruptedException e) { - e.printStackTrace(); - continue; - } - AbstractPreferences pref = (AbstractPreferences) event - .getSource(); - if (event instanceof NodeAddEvent) { - dispatchNodeAdd((NodeChangeEvent) event, - pref.nodeChangeListeners); - } else if (event instanceof NodeRemoveEvent) { - dispatchNodeRemove((NodeChangeEvent) event, - pref.nodeChangeListeners); - } else if (event instanceof PreferenceChangeEvent) { - dispatchPrefChange((PreferenceChangeEvent) event, - pref.preferenceChangeListeners); - } - } - } - - private EventObject getEventObject() throws InterruptedException { - synchronized (events) { - if (events.isEmpty()) { - events.wait(); - } - EventObject event = events.get(0); - events.remove(0); - return event; - } - } - - private void dispatchPrefChange(PreferenceChangeEvent event, - List<EventListener> preferenceChangeListeners) { - synchronized (preferenceChangeListeners) { - Iterator<EventListener> i = preferenceChangeListeners.iterator(); - while (i.hasNext()) { - PreferenceChangeListener pcl = (PreferenceChangeListener) i - .next(); - pcl.preferenceChange(event); - } - } - } - - private void dispatchNodeRemove(NodeChangeEvent event, - List<EventListener> nodeChangeListeners) { - synchronized (nodeChangeListeners) { - Iterator<EventListener> i = nodeChangeListeners.iterator(); - while (i.hasNext()) { - NodeChangeListener ncl = (NodeChangeListener) i.next(); - ncl.childRemoved(event); - } - } - } - - private void dispatchNodeAdd(NodeChangeEvent event, - List<EventListener> nodeChangeListeners) { - synchronized (nodeChangeListeners) { - Iterator<EventListener> i = nodeChangeListeners.iterator(); - while (i.hasNext()) { - NodeChangeListener ncl = (NodeChangeListener) i.next(); - ncl.childAdded(event); - } - } - } - } - - private static class NodeAddEvent extends NodeChangeEvent { - //The base class is NOT serializable, so this class isn't either. - private static final long serialVersionUID = 1L; - - public NodeAddEvent(Preferences p, Preferences c) { - super(p, c); - } - } - - private static class NodeRemoveEvent extends NodeChangeEvent { - //The base class is NOT serializable, so this class isn't either. - private static final long serialVersionUID = 1L; - - public NodeRemoveEvent(Preferences p, Preferences c) { - super(p, c); - } - } -} diff --git a/prefs/src/main/java/java/util/prefs/BackingStoreException.java b/prefs/src/main/java/java/util/prefs/BackingStoreException.java deleted file mode 100644 index e8a805c..0000000 --- a/prefs/src/main/java/java/util/prefs/BackingStoreException.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package java.util.prefs; - - -/** - * An exception to indicate that an error was encountered while accessing the - * backing store. - * - * @since Android 1.0 - */ -public class BackingStoreException extends Exception { - - private static final long serialVersionUID = 859796500401108469L; - - /** - * Constructs a new {@code BackingStoreException} instance with a detailed exception - * message. - * - * @param s - * the detailed exception message. - * @since Android 1.0 - */ - public BackingStoreException (String s) { - super(s); - } - - /** - * Constructs a new {@code BackingStoreException} instance with a nested {@code Throwable}. - * - * @param t - * the nested {@code Throwable}. - * @since Android 1.0 - */ - public BackingStoreException (Throwable t) { - super(t); - } -} - - - diff --git a/prefs/src/main/java/java/util/prefs/FilePreferencesFactoryImpl.java b/prefs/src/main/java/java/util/prefs/FilePreferencesFactoryImpl.java deleted file mode 100644 index cc68e62..0000000 --- a/prefs/src/main/java/java/util/prefs/FilePreferencesFactoryImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package java.util.prefs; - -/** - * The default implementation of <code>PreferencesFactory</code> for the Linux - * platform, using the file system as its back end. - * - * @since Android 1.0 - */ -class FilePreferencesFactoryImpl implements PreferencesFactory { - // user root preferences - private static final Preferences USER_ROOT = new FilePreferencesImpl(true); - - // system root preferences - private static final Preferences SYSTEM_ROOT = new FilePreferencesImpl(false); - - public FilePreferencesFactoryImpl() { - super(); - } - - public Preferences userRoot() { - return USER_ROOT; - } - - public Preferences systemRoot() { - return SYSTEM_ROOT; - } - -} diff --git a/prefs/src/main/java/java/util/prefs/FilePreferencesImpl.java b/prefs/src/main/java/java/util/prefs/FilePreferencesImpl.java deleted file mode 100644 index cf85fa0..0000000 --- a/prefs/src/main/java/java/util/prefs/FilePreferencesImpl.java +++ /dev/null @@ -1,236 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package java.util.prefs; - -import java.io.File; -import java.io.FilenameFilter; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Properties; -import java.util.Set; - -import org.apache.harmony.prefs.internal.nls.Messages; - -/** - * The default implementation of <code>AbstractPreferences</code> for the Linux platform, - * using the file system as its back end. - * - * TODO some sync mechanism with backend, Performance - check file edit date - * - * @since Android 1.0 - */ -class FilePreferencesImpl extends AbstractPreferences { - - /* - * -------------------------------------------------------------- - * Class fields - * -------------------------------------------------------------- - */ - - //prefs file name - private static final String PREFS_FILE_NAME = "prefs.xml"; //$NON-NLS-1$ - - //home directory for user prefs - private static String USER_HOME; - - //home directory for system prefs - private static String SYSTEM_HOME; - - /* - * -------------------------------------------------------------- - * Class initializer - * -------------------------------------------------------------- - */ - static { - AccessController.doPrivileged(new PrivilegedAction<Void>() { - public Void run() { - USER_HOME = System.getProperty("user.home") + "/.java/.userPrefs";//$NON-NLS-1$ //$NON-NLS-2$ - SYSTEM_HOME = System.getProperty("java.home") + "/.systemPrefs";//$NON-NLS-1$//$NON-NLS-2$ - return null; - } - - }); - } - - /* - * -------------------------------------------------------------- - * Instance fields - * -------------------------------------------------------------- - */ - - //file path for this preferences node - private String path; - - //internal cache for prefs key-value pair - private Properties prefs; - - //file represents this preferences node - private File prefsFile; - - //parent dir for this preferences node - private File dir; - - //cache for removed prefs key-value pair - private Set<String> removed = new HashSet<String>(); - - //cache for updated prefs key-value pair - private Set<String> updated = new HashSet<String>(); - - /* - * -------------------------------------------------------------- - * Constructors - * -------------------------------------------------------------- - */ - - /** - * Construct root <code>FilePreferencesImpl</code> instance, construct - * user root if userNode is true, system root otherwise - */ - FilePreferencesImpl(boolean userNode) { - super(null, ""); //$NON-NLS-1$ - this.userNode = userNode; - path = userNode ? USER_HOME : SYSTEM_HOME; - initPrefs(); - } - - /** - * Construct a prefs using given parent and given name - */ - private FilePreferencesImpl(AbstractPreferences parent, String name) { - super(parent, name); - path = ((FilePreferencesImpl) parent).path + File.separator + name; - initPrefs(); - } - - private void initPrefs() { - dir = new File(path); - newNode = (AccessController.doPrivileged(new PrivilegedAction<Boolean>() { - public Boolean run() { - return Boolean.valueOf(!dir.exists()); - } - })).booleanValue(); - prefsFile = new File(path + File.separator + PREFS_FILE_NAME); - prefs = XMLParser.loadFilePrefs(prefsFile); - } - - @Override - protected String[] childrenNamesSpi() throws BackingStoreException { - String[] names = AccessController - .doPrivileged(new PrivilegedAction<String[]>() { - public String[] run() { - return dir.list(new FilenameFilter() { - public boolean accept(File parent, String name) { - return new File(path + File.separator + name).isDirectory(); - } - }); - - } - }); - if (null == names) {// file is not a directory, exception case - // prefs.3=Cannot get children names for {0}! - throw new BackingStoreException( - Messages.getString("prefs.3", toString())); //$NON-NLS-1$ - } - return names; - } - - @Override - protected AbstractPreferences childSpi(String name) { - FilePreferencesImpl child = new FilePreferencesImpl(this, name); - return child; - } - - @Override - protected void flushSpi() throws BackingStoreException { - try { - //if removed, return - if(isRemoved()){ - return; - } - // reload - Properties currentPrefs = XMLParser.loadFilePrefs(prefsFile); - // merge - Iterator<String> it = removed.iterator(); - while (it.hasNext()) { - currentPrefs.remove(it.next()); - } - removed.clear(); - it = updated.iterator(); - while (it.hasNext()) { - Object key = it.next(); - currentPrefs.put(key, prefs.get(key)); - } - updated.clear(); - // flush - prefs = currentPrefs; - XMLParser.flushFilePrefs(prefsFile, prefs); - } catch (Exception e) { - throw new BackingStoreException(e); - } - } - - @Override - protected String getSpi(String key) { - try { - if (null == prefs) { - prefs = XMLParser.loadFilePrefs(prefsFile); - } - return prefs.getProperty(key); - } catch (Exception e) {// if Exception happened, return null - return null; - } - } - - @Override - protected String[] keysSpi() throws BackingStoreException { - return prefs.keySet().toArray(new String[0]); - } - - @Override - protected void putSpi(String name, String value) { - prefs.setProperty(name, value); - updated.add(name); - } - - @Override - protected void removeNodeSpi() throws BackingStoreException { - boolean removeSucceed = (AccessController.doPrivileged(new PrivilegedAction<Boolean>() { - public Boolean run() { - prefsFile.delete(); - return Boolean.valueOf(dir.delete()); - } - })).booleanValue(); - if (!removeSucceed) { - // prefs.4=Cannot remove {0}! - throw new BackingStoreException(Messages.getString("prefs.4", toString())); //$NON-NLS-1$ - } - } - - @Override - protected void removeSpi(String key) { - prefs.remove(key); - updated.remove(key); - removed.add(key); - } - - @Override - protected void syncSpi() throws BackingStoreException { - flushSpi(); - } -} diff --git a/prefs/src/main/java/java/util/prefs/InvalidPreferencesFormatException.java b/prefs/src/main/java/java/util/prefs/InvalidPreferencesFormatException.java deleted file mode 100644 index b31b3a1..0000000 --- a/prefs/src/main/java/java/util/prefs/InvalidPreferencesFormatException.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package java.util.prefs; - -/** - * An exception to indicate that the input XML file is not well-formed or could - * not be validated against the appropriate document type (specified by - * in the {@code Preferences}). - * - * @since Android 1.0 - */ -public class InvalidPreferencesFormatException extends Exception { - - private static final long serialVersionUID = -791715184232119669L; - - /** - * Constructs a new {@code InvalidPreferencesFormatException} instance with a - * detailed exception message. - * - * @param s - * the detailed exception message. - * @since Android 1.0 - */ - public InvalidPreferencesFormatException (String s) { - super(s); - } - - /** - * Constructs a new {@code InvalidPreferencesFormatException} instance with a - * detailed exception message and a nested {@code Throwable}. - * - * @param s - * the detailed exception message. - * @param t - * the nested {@code Throwable}. - * @since Android 1.0 - */ - public InvalidPreferencesFormatException (String s, Throwable t) { - super(s,t); - } - - /** - * Constructs a new {@code InvalidPreferencesFormatException} instance with a nested - * {@code Throwable}. - * - * @param t - * the nested {@code Throwable}. - * @since Android 1.0 - */ - public InvalidPreferencesFormatException (Throwable t) { - super(t); - } -} - - - diff --git a/prefs/src/main/java/java/util/prefs/NodeChangeEvent.java b/prefs/src/main/java/java/util/prefs/NodeChangeEvent.java deleted file mode 100644 index e9824bc..0000000 --- a/prefs/src/main/java/java/util/prefs/NodeChangeEvent.java +++ /dev/null @@ -1,99 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package java.util.prefs; - -import java.io.Serializable; -import java.util.EventObject; -import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; -import java.io.NotSerializableException; -import java.io.IOException; - -/** - * This is the event class to indicate that one child of the preference node has - * been added or deleted. - * <p> - * Please note that the serialization functionality has not yet been implemented, so - * the serialization methods do nothing but throw a {@code NotSerializableException}. - * </p> - * - * @since Android 1.0 - */ -public class NodeChangeEvent extends EventObject implements Serializable { - - private static final long serialVersionUID = 8068949086596572957L; - - private final Preferences parent; - private final Preferences child; - - /** - * Constructs a new {@code NodeChangeEvent} instance. - * - * @param p - * the {@code Preferences} instance that fired this event; this object is - * considered as the event source. - * @param c - * the child {@code Preferences} instance that was added or deleted. - * @since Android 1.0 - */ - public NodeChangeEvent (Preferences p, Preferences c) { - super(p); - parent = p; - child = c; - } - - /** - * Gets the {@code Preferences} instance that fired this event. - * - * @return the {@code Preferences} instance that fired this event. - * @since Android 1.0 - */ - public Preferences getParent() { - return parent; - } - - /** - * Gets the child {@code Preferences} node that was added or removed. - * - * @return the added or removed child {@code Preferences} node. - * @since Android 1.0 - */ - public Preferences getChild() { - return child; - } - - /* - * This method always throws a <code>NotSerializableException</code>, - * because this object cannot be serialized, - */ - private void writeObject (ObjectOutputStream out) throws IOException { - throw new NotSerializableException(); - } - - /* - * This method always throws a <code>NotSerializableException</code>, - * because this object cannot be serialized, - */ - private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException { - throw new NotSerializableException(); - } -} - - - - diff --git a/prefs/src/main/java/java/util/prefs/NodeChangeListener.java b/prefs/src/main/java/java/util/prefs/NodeChangeListener.java deleted file mode 100644 index f16b206..0000000 --- a/prefs/src/main/java/java/util/prefs/NodeChangeListener.java +++ /dev/null @@ -1,54 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package java.util.prefs; - -import java.util.EventListener; -import java.util.prefs.NodeChangeEvent; - -/** - * This interface is used to handle preference node change events. - * The implementation of this interface can be installed by the {@code Preferences} instance. - * - * @see NodeChangeEvent - * - * @since Android 1.0 - */ -public interface NodeChangeListener extends EventListener { - - /** - * This method gets called whenever a child node is added to another node. - * - * @param e - * the node change event. - * @since Android 1.0 - */ - public void childAdded (NodeChangeEvent e); - - /** - * This method gets called whenever a child node is removed from another - * node. - * - * @param e - * the node change event. - * @since Android 1.0 - */ - public void childRemoved (NodeChangeEvent e); -} - - - diff --git a/prefs/src/main/java/java/util/prefs/NodeSet.java b/prefs/src/main/java/java/util/prefs/NodeSet.java deleted file mode 100644 index 7edd030..0000000 --- a/prefs/src/main/java/java/util/prefs/NodeSet.java +++ /dev/null @@ -1,38 +0,0 @@ -package java.util.prefs; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - * - * @since Android 1.0 - */ -class NodeSet implements NodeList { - - ArrayList<Node> list = new ArrayList<Node>(); - - public NodeSet(Iterator<Node> nodes) { - while(nodes.hasNext()) { - list.add(nodes.next()); - } - } - - public int getLength() { - return list.size(); - } - - public Node item(int index) { - Node result = null; - try { - result = list.get(index); - } catch(IndexOutOfBoundsException ioobe) { - // TODO log this event? - return null; - } - - return result; - } -} diff --git a/prefs/src/main/java/java/util/prefs/PreferenceChangeEvent.java b/prefs/src/main/java/java/util/prefs/PreferenceChangeEvent.java deleted file mode 100644 index f0f0787..0000000 --- a/prefs/src/main/java/java/util/prefs/PreferenceChangeEvent.java +++ /dev/null @@ -1,116 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package java.util.prefs; - -import java.io.IOException; -import java.io.NotSerializableException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.EventObject; - -/** - * This is the event class to indicate that a preference has been added, deleted - * or updated. - * <p> - * Please note that the serialization functionality has not yet been implemented, so - * the serialization methods do nothing but throw a {@code NotSerializableException}. - * </p> - * - * @since Android 1.0 - */ -public class PreferenceChangeEvent extends EventObject implements Serializable { - - private static final long serialVersionUID = 793724513368024975L; - - private final Preferences node; - - private final String key; - - private final String value; - - /** - * Construct a new {@code PreferenceChangeEvent} instance. - * - * @param p - * the {@code Preferences} instance that fired this event; this object is - * considered as the event's source. - * @param k - * the changed preference key. - * @param v - * the new value of the changed preference, this value can be - * {@code null}, which means the preference has been removed. - * @since Android 1.0 - */ - public PreferenceChangeEvent(Preferences p, String k, String v) { - super(p); - node = p; - key = k; - value = v; - } - - /** - * Gets the key of the changed preference. - * - * @return the changed preference's key. - * @since Android 1.0 - */ - public String getKey() { - return key; - } - - /** - * Gets the new value of the changed preference or {@code null} if the - * preference has been removed. - * - * @return the new value of the changed preference or null if the preference - * has been removed. - * @since Android 1.0 - */ - public String getNewValue() { - return value; - } - - /** - * Gets the {@code Preferences} instance that fired this event. - * - * @return the {@code Preferences} instance that fired this event. - * @since Android 1.0 - */ - public Preferences getNode() { - return node; - } - - /* - * This method always throws a <code>NotSerializableException</code>, - * because this object cannot be serialized, - */ - private void writeObject(ObjectOutputStream out) throws IOException { - throw new NotSerializableException(); - } - - /* - * This method always throws a <code>NotSerializableException</code>, - * because this object cannot be serialized, - */ - private void readObject(ObjectInputStream in) throws IOException{ - throw new NotSerializableException(); - } -} - - diff --git a/prefs/src/main/java/java/util/prefs/PreferenceChangeListener.java b/prefs/src/main/java/java/util/prefs/PreferenceChangeListener.java deleted file mode 100644 index 28bb763..0000000 --- a/prefs/src/main/java/java/util/prefs/PreferenceChangeListener.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package java.util.prefs; - -import java.util.EventListener; - -/** - * This interface is used to handle preferences change events. The implementation of - * this interface can be installed by the {@code Preferences} instance. - * - * @see PreferenceChangeEvent - * - * @since Android 1.0 - */ -public interface PreferenceChangeListener extends EventListener { - - /** - * This method gets invoked whenever a preference is added, deleted or - * updated. - * - * @param pce - * the event instance which describes the changed {@code Preferences} - * instance and the preference value. - * @since Android 1.0 - */ - void preferenceChange (PreferenceChangeEvent pce); -} - - - diff --git a/prefs/src/main/java/java/util/prefs/Preferences.java b/prefs/src/main/java/java/util/prefs/Preferences.java deleted file mode 100644 index b7a0c70..0000000 --- a/prefs/src/main/java/java/util/prefs/Preferences.java +++ /dev/null @@ -1,1043 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package java.util.prefs; - -// BEGIN android-added -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.Enumeration; -// END android-added - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.security.AccessController; -import java.security.PrivilegedAction; - -import org.apache.harmony.prefs.internal.nls.Messages; - -/** - * An instance of the class {@code Preferences} represents one node in a preference tree, - * which provides a mechanism to store and access configuration data in a - * hierarchical way. Two hierarchy trees are maintained, one for system - * preferences shared by all users and the other for user preferences - * specific to the user. {@code Preferences} hierarchy trees and data are stored - * in an implementation-dependent back-end. - * <p> - * Every node has one name and one unique absolute path following the same - * notational conventions as directories in a file system. The root node's - * name is "", and other node name strings cannot contain the slash character - * and cannot be empty. The root node's absolute path is "/", and all other - * nodes' absolute paths are constructed in the standard way: <parent's absolute - * path> + "/" + <node's name>. Since the set of nodes forms a tree with - * the root node at its base, all absolute paths start with the slash character. - * Every node has one relative path to each of its ancestors. The relative path - * doesn't start with slash: it equals the node's absolute path with leading - * substring removed corresponding to the ancestor's absolute path and a slash. - * </p> - * <p> - * Modification to preferences data may be asynchronous, which means that - * preference update method calls may return immediately instead of blocking. - * The {@code flush()} and {@code sync()} methods force the back-end to - * synchronously perform all pending updates, but the implementation is - * permitted to perform the modifications on the underlying back-end data - * at any time between the moment the request is made and the moment the - * {@code flush()} or {@code sync()} method returns. - * Please note that if JVM exit normally, the implementation must assure all - * modifications are persisted implicitly. - * </p> - * <p> - * When invoking a method that retrieves preferences, the user must provide - * a default value. The default value is returned when the preferences cannot - * be found or the back-end is unavailable. Some other methods will throw - * {@code BackingStoreException} when the back-end is unavailable. - * </p> - * <p> - * Preferences can be exported to and imported from an XML files. - * <p> - * There must be a concrete {@code PreferencesFactory} type for every concrete - * {@code Preferences} type developed. Every J2SE implementation must provide a default - * implementation for every supported platform, and must also provide a means of - * replacing the default implementation. This implementation uses the system property - * {@code java.util.prefs.PreferencesFactory} to detemine which preferences - * implementation to use. - * </p> - * <p> - * The methods of this class are thread-safe. If multiple JVMs are using the same - * back-end concurrently, the back-end won't be corrupted, but no other - * behavior guarantees are made. - * </p> - * - * @since Android 1.0 - */ -public abstract class Preferences { - - /* - * --------------------------------------------------------- - * Class fields - * --------------------------------------------------------- - */ - - /** - * Maximum size in characters allowed for a preferences key. - * - * @since Android 1.0 - */ - public static final int MAX_KEY_LENGTH = 80; - - /** - * Maximum size in characters allowed for a preferences name. - * - * @since Android 1.0 - */ - public static final int MAX_NAME_LENGTH = 80; - - /** - * Maximum size in characters allowed for a preferences value. - * - * @since Android 1.0 - */ - public static final int MAX_VALUE_LENGTH = 8192; - - // BEGIN android-added - /** - * The name of the configuration file where preferences factory class names - * can be specified. - */ - private static final String FACTORY_CONFIGURATION_FILE_NAME = "META-INF/services/java.util.prefs.PreferencesFactory"; //$NON-NLS-1$ - - /** - * The encoding of configuration files - */ - private static final String CONFIGURATION_FILE_ENCODING = "UTF-8"; //$NON-NLS-1$ - - /** - * The comment string used in configuration files - */ - private static final String CONFIGURATION_FILE_COMMENT = "#"; //$NON-NLS-1$ - - // END android-added - - //permission - private static final RuntimePermission PREFS_PERM = new RuntimePermission("preferences"); //$NON-NLS-1$ - - //factory used to get user/system prefs root - private static final PreferencesFactory factory; - - /** - * --------------------------------------------------------- - * Class initializer - * --------------------------------------------------------- - */ - static{ - String factoryClassName = AccessController.doPrivileged(new PrivilegedAction<String>() { - public String run() { - return System.getProperty("java.util.prefs.PreferencesFactory"); //$NON-NLS-1$ - } - }); - // BEGIN android-removed - // if(factoryClassName != null) { - // try { - // ClassLoader loader = Thread.currentThread().getContextClassLoader(); - // if(loader == null){ - // loader = ClassLoader.getSystemClassLoader(); - // } - // Class<?> factoryClass = loader.loadClass(factoryClassName); - // factory = (PreferencesFactory) factoryClass.newInstance(); - // } catch (Exception e) { - // // prefs.10=Cannot initiate PreferencesFactory: {0}. Caused by {1} - // throw new InternalError(Messages.getString("prefs.10", factoryClassName, e)); //$NON-NLS-1$ - // } - // } - // END android-removed - // BEGIN android-added - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (loader == null) { - loader = ClassLoader.getSystemClassLoader(); - } - if (factoryClassName == null) { - Enumeration<URL> en = null; - try { - en = loader.getResources(FACTORY_CONFIGURATION_FILE_NAME); - BufferedReader reader = null; - int commentIndex = 0; - while (en.hasMoreElements()) { - try { - InputStream is = en.nextElement().openStream(); - // Read each line for charset provider class names - // BEGIN android-modified - reader = new BufferedReader(new InputStreamReader(is, - CONFIGURATION_FILE_ENCODING), 8192); - // END android-modified - factoryClassName = reader.readLine(); - commentIndex = factoryClassName.indexOf(CONFIGURATION_FILE_COMMENT); - if (commentIndex > 0) { - factoryClassName = factoryClassName.substring(0, commentIndex).trim(); - } - if (factoryClassName.length() > 0) { - break; - } - } catch (IOException ex) { - // ignore if a resource couldn't be read - } - } - } catch (Exception e) { - // prefs.10=Cannot initiate PreferencesFactory: {0}. Caused by - // {1} - throw new InternalError(Messages.getString("prefs.10", - FACTORY_CONFIGURATION_FILE_NAME, e)); //$NON-NLS-1$ - } - } - - if (factoryClassName == null) { - factoryClassName = "java.util.prefs.FilePreferencesFactoryImpl"; - } - - try { - Class<?> c = loader.loadClass(factoryClassName); - factory = (PreferencesFactory)c.newInstance(); - } catch (Exception e) { - // prefs.10=Cannot initiate PreferencesFactory: {0}. Caused by {1} - throw new InternalError(Messages.getString("prefs.10", factoryClassName, e)); //$NON-NLS-1$ - } - // END android-added - } - - /* - * --------------------------------------------------------- - * Constructors - * --------------------------------------------------------- - */ - - /** - * Default constructor, for use by subclasses only. - * - * @since Android 1.0 - */ - protected Preferences() { - super(); - } - - /* - * --------------------------------------------------------- - * Methods - * --------------------------------------------------------- - */ - - /** - * Gets the absolute path string of this preference node. - * - * @return the preference node's absolute path string. - * @since Android 1.0 - */ - public abstract String absolutePath(); - - /** - * Returns the names of all children of this node or an empty string if this - * node has no children. - * - * @return the names of all children of this node. - * @throws BackingStoreException - * if backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract String[] childrenNames() throws BackingStoreException; - - /** - * Removes all preferences of this node. - * - * @throws BackingStoreException - * if backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void clear() throws BackingStoreException; - - /** - * Exports all of the preferences of this node to a XML document using the given - * output stream. - * <p> - * This XML document uses the UTF-8 encoding and is written according to the - * DTD in its DOCTYPE declaration, which is the following: - * - * <pre> - * <!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd"> - * </pre> - * - * <i>Please note that (unlike the methods of this class that don't concern serialization), this call is not thread-safe.</i> - * </p> - * - * @param ostream - * the output stream to write the XML-formatted data to. - * @throws IOException - * if an error occurs while exporting. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void exportNode (OutputStream ostream) throws IOException, BackingStoreException; - - /** - * Exports all of the preferences of this node and all its descendants to a XML - * document using the given output stream. - * <p> - * This XML document uses the UTF-8 encoding and is written according to the - * DTD in its DOCTYPE declaration, which is the following: - * - * <pre> - * <!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd"> - * </pre> - * - * <i>Please note that (unlike the methods of this class that don't concern serialization), this call is not thread-safe.</i> - * </p> - * - * @param ostream - * the output stream to write the XML-formatted data to. - * @throws IOException - * if an error occurs while exporting. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void exportSubtree (OutputStream ostream) throws IOException, BackingStoreException; - - /** - * Forces all pending updates to this node and its descendants to be - * persisted in the backing store. - * <p> - * If this node has been removed, the invocation of this method only flushes - * this node, not its descendants. - * </p> - * - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - public abstract void flush() throws BackingStoreException; - - /** - * Gets the {@code String} value mapped to the given key or its default value if no - * value is mapped or no backing store is available. - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key or no backing store is available. - * @return the preference value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract String get (String key, String deflt); - - /** - * Gets the {@code boolean} value mapped to the given key or its default value if no - * value is mapped, if the backing store is unavailable, or if the value is invalid. - * <p> - * The only valid values are the {@code String} "true", which represents {@code true} and - * "false", which represents {@code false}, ignoring case. - * </p> - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key, if the backing store is unavailable, or if the - * value is invalid. - * @return the boolean value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract boolean getBoolean (String key, boolean deflt); - - /** - * Gets the {@code byte} array value mapped to the given key or its default value if - * no value is mapped, if the backing store is unavailable, or if the value is an - * invalid string. - * <p> - * To be valid, the value string must be Base64-encoded binary data. The Base64 encoding - * is as defined in <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC - * 2045</a>, section 6.8. - * </p> - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key, if the backing store is unavailable, or if the - * value is invalid. - * @return the byte array value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract byte[] getByteArray (String key, byte[] deflt); - - /** - * Gets the {@code double} value mapped to the given key or its default value if no - * value is mapped, if the backing store is unavailable, or if the value is an invalid - * string. - * <p> - * To be valid, the value string must be a string that can be converted to a {@code double} by - * {@link Double#parseDouble(String) Double.parseDouble(String)}. - * </p> - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key, if the backing store is unavailable, or if the - * value is invalid. - * @return the double value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract double getDouble (String key, double deflt); - - /** - * Gets the {@code float} value mapped to the given key or its default value if no - * value is mapped, if the backing store is unavailable, or if the value is an invalid - * string. - * <p> - * To be valid, the value string must be a string that can be converted to a {@code float} by - * {@link Float#parseFloat(String) Float.parseFloat(String)}. - * </p> - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key, if the backing store is unavailable, or if the - * value is invalid. - * @return the float value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract float getFloat (String key, float deflt); - - /** - * Gets the {@code int} value mapped to the given key or its default value if no - * value is mapped, if the backing store is unavailable, or if the value is an invalid - * string. - * <p> - * To be valid, the value string must be a string that can be converted to an {@code int} by - * {@link Integer#parseInt(String) Integer.parseInt(String)}. - * </p> - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key, if the backing store is unavailable, or if the - * value is invalid. - * @return the integer value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract int getInt (String key, int deflt); - - /** - * Gets the {@code long} value mapped to the given key or its default value if no - * value is mapped, if the backing store is unavailable, or if the value is an invalid - * string. - * <p> - * To be valid, the value string must be a string that can be converted to a {@code long} by - * {@link Long#parseLong(String) Long.parseLong(String)}. - * </p> - * <p> - * Some implementations may store default values in backing stores. In this - * case, if there is no value mapped to the given key, the stored default - * value is returned. - * </p> - * - * @param key - * the preference key. - * @param deflt - * the default value, which will be returned if no value is - * mapped to the given key, if the backing store is unavailable, or if the - * value is invalid. - * @return the long value mapped to the given key. - * @throws IllegalStateException - * if this node has been removed. - * @throws NullPointerException - * if the parameter {@code key} is {@code null}. - * @since Android 1.0 - */ - public abstract long getLong (String key, long deflt); - - /** - * Imports all the preferences from an XML document using the given input - * stream. - * <p> - * This XML document uses the UTF-8 encoding and must be written according to the - * DTD in its DOCTYPE declaration, which must be the following: - * - * <pre> - * <!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd"> - * </pre> - * - * <i>Please note that (unlike the methods of this class that don't concern serialization), this call is not thread-safe.</i> - * </p> - * - * @param istream - * the input stream to read the data from. - * @throws InvalidPreferencesFormatException - * if the data read from the given input stream is not from a - * valid XML document. - * @throws IOException - * if an error occurs while importing. - * @throws SecurityException - * if {@code RuntimePermission("preferences")} is denied by a - * SecurityManager. - * @since Android 1.0 - */ - public static void importPreferences (InputStream istream) throws InvalidPreferencesFormatException, IOException { - checkSecurity(); - if(null == istream){ - // prefs.0=Inputstream cannot be null\! - throw new MalformedURLException(Messages.getString("prefs.0")); //$NON-NLS-1$ - } - XMLParser.importPrefs(istream); - } - - /** - * Returns whether this is a user preference node. - * - * @return {@code true}, if this is a user preference node, {@code false} if - * this is a system preference node. - * @since Android 1.0 - */ - public abstract boolean isUserNode(); - - /** - * Returns all preference keys stored in this node or an empty array if no - * key was found. - * - * @return the list of all preference keys of this node. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract String[] keys() throws BackingStoreException; - - /** - * Returns the name of this node. - * - * @return the name of this node. - * @since Android 1.0 - */ - public abstract String name(); - - /** - * Returns the preference node with the given path name. The path name can - * be relative or absolute. The requested node and its ancestors will - * be created if they do not exist. - * <p> - * The path is treated as relative to this node if it doesn't start with a - * slash, otherwise it will be treated as an absolute path. - * </p> - * - * @param path - * the path name of the requested preference node. - * @return the requested preference node. - * @throws IllegalStateException - * if this node has been removed. - * @throws IllegalArgumentException - * if the path name is invalid. - * @throws NullPointerException - * if the given path is {@code null}. - * @since Android 1.0 - */ - public abstract Preferences node (String path); - - /** - * Returns whether the preference node with the given path name exists. The - * path is treated as relative to this node if it doesn't start with a slash, - * otherwise it is treated as an absolute path. - * <p> - * Please note that if this node has been removed, an invocation of this - * node will throw an {@code IllegalStateException} unless the given path is - * an empty string, which will return {@code false}. - * </p> - * - * @param path - * the path name of the preference node to query. - * @return {@code true}, if the queried preference node exists, {@code false} - * otherwise. - * @throws IllegalStateException - * if this node has been removed and the path is not an empty - * string. - * @throws IllegalArgumentException - * if the path name is invalid. - * @throws NullPointerException - * if the given path is {@code null}. - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @since Android 1.0 - */ - public abstract boolean nodeExists (String path) throws BackingStoreException; - - /** - * Returns the parent preference node of this node or {@code null} if this - * node is the root node. - * - * @return the parent preference node of this node. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract Preferences parent(); - - /** - * Adds a new preference to this node using the given key and value or - * updates the value if a preference with the given key already exists. - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference value for the given key. - * @throws NullPointerException - * if the given key or value is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH} or the value's length is bigger than {@code - * MAX_VALUE_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void put (String key, String value); - - /** - * Adds a new preference with a {@code boolean} value to this node using the given - * key and value or updates the value if a preference with the given key - * already exists. - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference {@code boolean} value for the given key. - * @throws NullPointerException - * if the given key is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void putBoolean (String key, boolean value); - - /** - * Adds a new preference to this node using the given key and the string - * form of the given value or updates the value if a preference with the - * given key already exists. - * <p> - * The string form of the value is the Base64-encoded binary data of the - * given byte array. The Base64 encoding is as defined in <a - * href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>, section 6.8. - * </p> - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference value for the given key. - * @throws NullPointerException - * if the given key or value is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH} or value's length is bigger than three - * quarters of {@code MAX_KEY_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void putByteArray (String key, byte[] value); - - /** - * Adds a new preference to this node using the given key and {@code double} - * value or updates the value if a preference with the - * given key already exists. - * <p> - * The value is stored in its string form, which is the result of invoking - * {@link Double#toString(double) Double.toString(double)}. - * </p> - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference value for the given key. - * @throws NullPointerException - * if the given key is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void putDouble (String key, double value); - - /** - * Adds a new preference to this node using the given key and {@code float} - * value or updates the value if a preference with the - * given key already exists. - * <p> - * The value is stored in its string form, which is the result of invoking - * {@link Float#toString(float) Float.toString(float)}. - * </p> - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference value for the given key. - * @throws NullPointerException - * if the given key is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void putFloat (String key, float value); - - /** - * Adds a new preference to this node using the given key and {@code int} - * value or updates the value if a preference with the - * given key already exists. - * <p> - * The value is stored in its string form, which is the result of invoking - * {@link Integer#toString(int) Integer.toString(int)}. - * </p> - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference value for the given key. - * @throws NullPointerException - * if the given key is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void putInt (String key, int value); - - /** - * Adds a new preference to this node using the given key and {@code long} - * value or updates the value if a preference with the - * given key already exists. - * <p> - * The value is stored in its string form, which is the result of invoking - * {@link Long#toString(long) Long.toString(long)}. - * </p> - * - * @param key - * the preference key to be added or updated. - * @param value - * the preference value for the given key. - * @throws NullPointerException - * if the given key is {@code null}. - * @throws IllegalArgumentException - * if the given key's length is bigger than {@code - * MAX_KEY_LENGTH}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void putLong (String key, long value); - - /** - * Removes the preference mapped to the given key from this node. - * - * @param key - * the key of the preference to be removed. - * @throws NullPointerException - * if the given key is {@code null}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void remove (String key); - - /** - * Removes this preference node with all its descendants. The removal - * won't necessarily be persisted until the method {@code flush()} is invoked. - * - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @throws UnsupportedOperationException - * if this is a root node. - * @since Android 1.0 - */ - public abstract void removeNode() throws BackingStoreException; - - /** - * Registers a {@code NodeChangeListener} instance for this node, which will handle - * {@code NodeChangeEvent}s. {@code NodeChangeEvent}s will be fired when a child node has - * been added to or removed from this node. - * - * @param ncl - * the listener to be registered. - * @throws NullPointerException - * if the given listener is {@code null}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void addNodeChangeListener (NodeChangeListener ncl); - - /** - * Registers a {@code PreferenceChangeListener} instance for this node, which will - * handle {@code PreferenceChangeEvent}s. {@code PreferenceChangeEvent}s will be fired when - * a preference has been added to, removed from, or updated for this node. - * - * @param pcl - * the listener to be registered. - * @throws NullPointerException - * if the given listener is {@code null}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void addPreferenceChangeListener (PreferenceChangeListener pcl); - - /** - * Removes the given {@code NodeChangeListener} instance from this node. - * - * @param ncl - * the listener to be removed. - * @throws IllegalArgumentException - * if the given listener is {@code null}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void removeNodeChangeListener (NodeChangeListener ncl); - - /** - * Removes the given {@code PreferenceChangeListener} instance from this node. - * - * @param pcl - * the listener to be removed. - * @throws IllegalArgumentException - * if the given listener is {@code null}. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void removePreferenceChangeListener (PreferenceChangeListener pcl); - - /** - * Synchronizes the data of this preference node and its descendants with - * the back-end preference store. Any changes found in the back-end data should be reflected - * in this node and its descendants, and at the same time any local changes to this node and - * descendants should be persisted. - * - * @throws BackingStoreException - * if the backing store is unavailable or causes an operation - * failure. - * @throws IllegalStateException - * if this node has been removed. - * @since Android 1.0 - */ - public abstract void sync() throws BackingStoreException; - - /** - * Returns the system preference node for the package of the given class. - * The absolute path of the returned node is one slash followed by the given - * class's full package name, replacing each period character ('.') with - * a slash. For example, the absolute path of the preference associated with - * the class Object would be "/java/lang". As a special case, the unnamed - * package is associated with a preference node "/<unnamed>". This - * method will create the node and its ancestors as needed. Any nodes created - * by this method won't necessarily be persisted until the method {@code flush()} is - * invoked. - * - * @param c - * the given class. - * @return the system preference node for the package of the given class. - * @throws NullPointerException - * if the given class is {@code null}. - * @throws SecurityException - * if the {@code RuntimePermission("preferences")} is denied by - * a SecurityManager. - * @since Android 1.0 - */ - public static Preferences systemNodeForPackage (Class<?> c) { - checkSecurity(); - return factory.systemRoot().node(getNodeName(c)); - } - - /** - * Returns the root node of the system preference hierarchy. - * - * @return the system preference hierarchy root node. - * @throws SecurityException - * if the {@code RuntimePermission("preferences")} is denied by - * a SecurityManager. - * @since Android 1.0 - */ - public static Preferences systemRoot() { - checkSecurity(); - return factory.systemRoot(); - } - - //check the RuntimePermission("preferences") - private static void checkSecurity() { - SecurityManager manager = System.getSecurityManager(); - if(null != manager){ - manager.checkPermission(PREFS_PERM); - } - - } - - /** - * Returns the user preference node for the package of the given class. - * The absolute path of the returned node is one slash followed by the given - * class's full package name, replacing each period character ('.') with - * a slash. For example, the absolute path of the preference associated with - * the class Object would be "/java/lang". As a special case, the unnamed - * package is associated with a preference node "/<unnamed>". This - * method will create the node and its ancestors as needed. Any nodes created - * by this method won't necessarily be persisted until the method {@code flush()} is - * invoked. - * - * @param c - * the given class. - * @return the user preference node for the package of the given class. - * @throws NullPointerException - * if the given class is {@code null}. - * @throws SecurityException - * if the {@code RuntimePermission("preferences")} is denied by - * a SecurityManager. - * @since Android 1.0 - */ - public static Preferences userNodeForPackage (Class<?> c) { - checkSecurity(); - return factory.userRoot().node(getNodeName(c)); - } - - //parse node's absolute path from class instance - private static String getNodeName(Class<?> c){ - // ??? PREFS TODO change back to harmony code once getPackage - // delivers the correct results - // Package p = c.getPackage(); - // if(null == p){ - // return "/<unnamed>"; //$NON-NLS-1$ - // } - // return "/"+p.getName().replace('.', '/'); //$NON-NLS-1$ - int dotIndex = c.getName().lastIndexOf("."); - return "/" + c.getName().substring(0, dotIndex).replace(".", "/"); - } - - /** - * Returns the root node of the user preference hierarchy. - * - * @return the user preference hierarchy root node. - * @throws SecurityException - * if the {@code RuntimePermission("preferences")} is denied by - * a SecurityManager. - * @since Android 1.0 - */ - public static Preferences userRoot() { - checkSecurity(); - return factory.userRoot(); - } - - /** - * Returns a string representation of this node. The format is "User/System - * Preference Node: " followed by this node's absolute path. - * - * @return the string representation of this node. - * @since Android 1.0 - */ - @Override - public abstract String toString(); -} diff --git a/prefs/src/main/java/java/util/prefs/PreferencesFactory.java b/prefs/src/main/java/java/util/prefs/PreferencesFactory.java deleted file mode 100644 index e56dd95..0000000 --- a/prefs/src/main/java/java/util/prefs/PreferencesFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package java.util.prefs; - -/** - * This interface is used by the {@link Preferences} class as factory class to - * create {@code Preferences} instances. This interface can be implemented and installed - * to replace the default preferences implementation. - * - * @since Android 1.0 - */ -public interface PreferencesFactory { - - /** - * Returns the root node of the preferences hierarchy for the calling user - * context. - * - * @return the user preferences hierarchy root node. - * @since Android 1.0 - */ - Preferences userRoot(); - - /** - * Returns the root node of the system preferences hierarchy. - * - * @return the system preferences hierarchy root node. - * @since Android 1.0 - */ - Preferences systemRoot(); -} - - - - diff --git a/prefs/src/main/java/java/util/prefs/XMLParser.java b/prefs/src/main/java/java/util/prefs/XMLParser.java deleted file mode 100644 index 2edfc71..0000000 --- a/prefs/src/main/java/java/util/prefs/XMLParser.java +++ /dev/null @@ -1,621 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package java.util.prefs; - -import java.io.BufferedInputStream; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.StringReader; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.Properties; -import java.util.StringTokenizer; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.FactoryConfigurationError; -import javax.xml.parsers.ParserConfigurationException; -// BEGIN android-removed -// import javax.xml.transform.TransformerException; -// END android-removed - -import org.apache.harmony.prefs.internal.nls.Messages; -// BEGIN android-removed -// import org.apache.xpath.XPathAPI; -// END android-removed -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.EntityResolver; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -// BEGIN android-added -import java.util.ArrayList; -import org.w3c.dom.DocumentType; -import org.w3c.dom.Node; -// END android-added - -/** - * Utility class for importing and exporting {@code Preferences} data from an XML file. - * - * @since Android 1.0 - */ -class XMLParser { - - /* - * Constant - the specified DTD URL - */ - static final String PREFS_DTD_NAME = "http://java.sun.com/dtd/preferences.dtd"; //$NON-NLS-1$ - - /* - * Constant - the DTD string - */ - static final String PREFS_DTD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" //$NON-NLS-1$ - + " <!ELEMENT preferences (root)>" //$NON-NLS-1$ - + " <!ATTLIST preferences EXTERNAL_XML_VERSION CDATA \"0.0\" >" //$NON-NLS-1$ - + " <!ELEMENT root (map, node*) >" //$NON-NLS-1$ - + " <!ATTLIST root type (system|user) #REQUIRED >" //$NON-NLS-1$ - + " <!ELEMENT node (map, node*) >" //$NON-NLS-1$ - + " <!ATTLIST node name CDATA #REQUIRED >" //$NON-NLS-1$ - + " <!ELEMENT map (entry*) >" //$NON-NLS-1$ - + " <!ELEMENT entry EMPTY >" //$NON-NLS-1$ - + " <!ATTLIST entry key CDATA #REQUIRED value CDATA #REQUIRED >"; //$NON-NLS-1$ - - /* - * Constant - the specified header - */ - static final String HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$ - - /* - * Constant - the specified DOCTYPE - */ - static final String DOCTYPE = "<!DOCTYPE preferences SYSTEM"; //$NON-NLS-1$ - - /* - * empty string array constant - */ - private static final String[] EMPTY_SARRAY = new String[0]; - - /* - * Constant - used by FilePreferencesImpl, which is default implementation of Linux platform - */ - private static final String FILE_PREFS = "<!DOCTYPE map SYSTEM 'http://java.sun.com/dtd/preferences.dtd'>"; //$NON-NLS-1$ - - /* - * Constant - specify the DTD version - */ - private static final float XML_VERSION = 1.0f; - - /* - * DOM builder - */ - private static final DocumentBuilder builder; - - /* - * specify the indent level - */ - private static int indent = -1; - - /* - * init DOM builder - */ - static { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - // BEGIN android-changed - factory.setValidating(false); - // END android-changed - try { - builder = factory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw new Error(e); - } - builder.setEntityResolver(new EntityResolver() { - public InputSource resolveEntity(String publicId, String systemId) - throws SAXException, IOException { - if (systemId.equals(PREFS_DTD_NAME)) { - InputSource result = new InputSource(new StringReader( - PREFS_DTD)); - result.setSystemId(PREFS_DTD_NAME); - return result; - } - // prefs.1=Invalid DOCTYPE declaration: {0} - throw new SAXException( - Messages.getString("prefs.1", systemId)); //$NON-NLS-1$ - } - }); - builder.setErrorHandler(new ErrorHandler() { - public void warning(SAXParseException e) throws SAXException { - throw e; - } - - public void error(SAXParseException e) throws SAXException { - throw e; - } - - public void fatalError(SAXParseException e) throws SAXException { - throw e; - } - }); - } - - private XMLParser() {// empty constructor - } - - /*************************************************************************** - * utilities for Preferences export - **************************************************************************/ - static void exportPrefs(Preferences prefs, OutputStream stream, - boolean withSubTree) throws IOException, BackingStoreException { - indent = -1; - // BEGIN android-modified - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(stream, "UTF-8"), 8192); //$NON-NLS-1$ - // END android-modified - out.write(HEADER); - out.newLine(); - out.newLine(); - - out.write(DOCTYPE); - out.write(" '"); //$NON-NLS-1$ - out.write(PREFS_DTD_NAME); - out.write("'>"); //$NON-NLS-1$ - out.newLine(); - out.newLine(); - - flushStartTag( - "preferences", new String[] { "EXTERNAL_XML_VERSION" }, new String[] { String.valueOf(XML_VERSION) }, out); //$NON-NLS-1$ //$NON-NLS-2$ - flushStartTag( - "root", new String[] { "type" }, new String[] { prefs.isUserNode() ? "user" : "system" }, out); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - flushEmptyElement("map", out); //$NON-NLS-1$ - - StringTokenizer ancestors = new StringTokenizer(prefs.absolutePath(), - "/"); //$NON-NLS-1$ - exportNode(ancestors, prefs, withSubTree, out); - - flushEndTag("root", out); //$NON-NLS-1$ - flushEndTag("preferences", out); //$NON-NLS-1$ - out.flush(); - out = null; - } - - private static void exportNode(StringTokenizer ancestors, - Preferences prefs, boolean withSubTree, BufferedWriter out) - throws IOException, BackingStoreException { - if (ancestors.hasMoreTokens()) { - String name = ancestors.nextToken(); - flushStartTag( - "node", new String[] { "name" }, new String[] { name }, out); //$NON-NLS-1$ //$NON-NLS-2$ - if (ancestors.hasMoreTokens()) { - flushEmptyElement("map", out); //$NON-NLS-1$ - exportNode(ancestors, prefs, withSubTree, out); - } else { - exportEntries(prefs, out); - if (withSubTree) { - exportSubTree(prefs, out); - } - } - flushEndTag("node", out); //$NON-NLS-1$ - } - } - - private static void exportSubTree(Preferences prefs, BufferedWriter out) - throws BackingStoreException, IOException { - String[] names = prefs.childrenNames(); - if (names.length > 0) { - for (int i = 0; i < names.length; i++) { - Preferences child = prefs.node(names[i]); - flushStartTag( - "node", new String[] { "name" }, new String[] { names[i] }, out); //$NON-NLS-1$ //$NON-NLS-2$ - exportEntries(child, out); - exportSubTree(child, out); - flushEndTag("node", out); //$NON-NLS-1$ - } - } - } - - private static void exportEntries(Preferences prefs, BufferedWriter out) - throws BackingStoreException, IOException { - String[] keys = prefs.keys(); - String[] values = new String[keys.length]; - for (int i = 0; i < keys.length; i++) { - values[i] = prefs.get(keys[i], null); - } - exportEntries(keys, values, out); - } - - private static void exportEntries(String[] keys, String[] values, - BufferedWriter out) throws IOException { - if (keys.length == 0) { - flushEmptyElement("map", out); //$NON-NLS-1$ - return; - } - flushStartTag("map", out); //$NON-NLS-1$ - for (int i = 0; i < keys.length; i++) { - if (values[i] != null) { - flushEmptyElement( - "entry", new String[] { "key", "value" }, new String[] { keys[i], values[i] }, out); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - flushEndTag("map", out); //$NON-NLS-1$ - } - - private static void flushEndTag(String tagName, BufferedWriter out) - throws IOException { - flushIndent(indent--, out); - out.write("</"); //$NON-NLS-1$ - out.write(tagName); - out.write(">"); //$NON-NLS-1$ - out.newLine(); - } - - private static void flushEmptyElement(String tagName, BufferedWriter out) - throws IOException { - flushIndent(++indent, out); - out.write("<"); //$NON-NLS-1$ - out.write(tagName); - out.write(" />"); //$NON-NLS-1$ - out.newLine(); - indent--; - } - - private static void flushEmptyElement(String tagName, String[] attrKeys, - String[] attrValues, BufferedWriter out) throws IOException { - flushIndent(++indent, out); - out.write("<"); //$NON-NLS-1$ - out.write(tagName); - flushPairs(attrKeys, attrValues, out); - out.write(" />"); //$NON-NLS-1$ - out.newLine(); - indent--; - } - - private static void flushPairs(String[] attrKeys, String[] attrValues, - BufferedWriter out) throws IOException { - for (int i = 0; i < attrKeys.length; i++) { - out.write(" "); //$NON-NLS-1$ - out.write(attrKeys[i]); - out.write("=\""); //$NON-NLS-1$ - out.write(htmlEncode(attrValues[i])); - out.write("\""); //$NON-NLS-1$ - } - } - - private static void flushIndent(int ind, BufferedWriter out) - throws IOException { - for (int i = 0; i < ind; i++) { - out.write(" "); //$NON-NLS-1$ - } - } - - private static void flushStartTag(String tagName, String[] attrKeys, - String[] attrValues, BufferedWriter out) throws IOException { - flushIndent(++indent, out); - out.write("<"); //$NON-NLS-1$ - out.write(tagName); - flushPairs(attrKeys, attrValues, out); - out.write(">"); //$NON-NLS-1$ - out.newLine(); - } - - private static void flushStartTag(String tagName, BufferedWriter out) - throws IOException { - flushIndent(++indent, out); - out.write("<"); //$NON-NLS-1$ - out.write(tagName); - out.write(">"); //$NON-NLS-1$ - out.newLine(); - } - - private static String htmlEncode(String s) { - StringBuffer sb = new StringBuffer(); - char c; - for (int i = 0; i < s.length(); i++) { - c = s.charAt(i); - switch (c) { - case '<': - sb.append("<"); //$NON-NLS-1$ - break; - case '>': - sb.append(">"); //$NON-NLS-1$ - break; - case '&': - sb.append("&"); //$NON-NLS-1$ - break; - case '\\': - sb.append("'"); //$NON-NLS-1$ - break; - case '"': - sb.append("""); //$NON-NLS-1$ - break; - default: - sb.append(c); - } - } - return sb.toString(); - } - - /*************************************************************************** - * utilities for Preferences import - **************************************************************************/ - static void importPrefs(InputStream in) throws IOException, - InvalidPreferencesFormatException { - try { - // load XML document - Document doc = builder.parse(new InputSource(in)); - - // check preferences' export version - Element preferences; - preferences = doc.getDocumentElement(); - String version = preferences.getAttribute("EXTERNAL_XML_VERSION"); //$NON-NLS-1$ - if (version != null && Float.parseFloat(version) > XML_VERSION) { - // prefs.2=This preferences exported version is not supported:{0} - throw new InvalidPreferencesFormatException( - Messages.getString("prefs.2", version)); //$NON-NLS-1$ - } - - // check preferences root's type - Element root = (Element) preferences - .getElementsByTagName("root").item(0); //$NON-NLS-1$ - Preferences prefsRoot = null; - String type = root.getAttribute("type"); //$NON-NLS-1$ - if (type.equals("user")) { //$NON-NLS-1$ - prefsRoot = Preferences.userRoot(); - } else { - prefsRoot = Preferences.systemRoot(); - } - - // load node - loadNode(prefsRoot, root); - } catch (FactoryConfigurationError e) { - throw new InvalidPreferencesFormatException(e); - } catch (SAXException e) { - throw new InvalidPreferencesFormatException(e); - } - // BEGIN android-removed - // catch (TransformerException e) { - // throw new InvalidPreferencesFormatException(e); - // } - // END android-removed - } - - private static void loadNode(Preferences prefs, Element node) { - // BEGIN android-note - // removed throw clause for TransformerException - // END android-note - // load preferences - // BEGIN android-changed - NodeList children = selectNodeList(node, "node"); //$NON-NLS-1$ - NodeList entries = selectNodeList(node, "map/entry"); //$NON-NLS-1$ - // END android-changed - int childNumber = children.getLength(); - Preferences[] prefChildren = new Preferences[childNumber]; - int entryNumber = entries.getLength(); - synchronized (((AbstractPreferences) prefs).lock) { - if (((AbstractPreferences) prefs).isRemoved()) { - return; - } - for (int i = 0; i < entryNumber; i++) { - Element entry = (Element) entries.item(i); - String key = entry.getAttribute("key"); //$NON-NLS-1$ - String value = entry.getAttribute("value"); //$NON-NLS-1$ - prefs.put(key, value); - } - // get children preferences node - for (int i = 0; i < childNumber; i++) { - Element child = (Element) children.item(i); - String name = child.getAttribute("name"); //$NON-NLS-1$ - prefChildren[i] = prefs.node(name); - } - } - - // load children nodes after unlock - for (int i = 0; i < childNumber; i++) { - loadNode(prefChildren[i], (Element) children.item(i)); - } - } - - // BEGIN android-added - // TODO dirty implementation of a method from javax.xml.xpath - // should be replaced with a call to a good impl of this method - private static NodeList selectNodeList(Element documentElement, String string) { - - NodeList result = null; - - ArrayList<Node> input = new ArrayList<Node>(); - - String[] path = string.split("/"); - - NodeList childNodes = documentElement.getChildNodes(); - - if(path[0].equals("entry") || path[0].equals("node")) { - for(int i = 0; i < childNodes.getLength(); i++) { - Object next = childNodes.item(i); - if(next instanceof Element) { - if(((Element) next).getNodeName().equals(path[0]) - && next instanceof Node) { - input.add((Node)next); - } - } - } - } else if(path[0].equals("map") && path[1].equals("entry")) { - for(int i = 0; i < childNodes.getLength(); i++) { - Object next = childNodes.item(i); - if(next instanceof Element) { - if(((Element) next).getNodeName().equals(path[0]) - && next instanceof Node) { - NodeList nextChildNodes = ((Node)next).getChildNodes(); - for(int j = 0; j < nextChildNodes.getLength(); j++) { - Object subnext = nextChildNodes.item(j); - if(subnext instanceof Element) { - if(((Element)subnext).getNodeName().equals(path[1])) { - input.add((Node)subnext); - } - } - } - } - } - } - } - - result = new NodeSet(input.iterator()); - - return result; - } - // END android-added - - /*************************************************************************** - * utilities for FilePreferencesImpl, which is default implementation of Linux platform - **************************************************************************/ - /** - * load preferences from file, if cannot load, create a new one FIXME: need - * lock or not? - * - * @param file the XML file to be read - * @return Properties instance which indicates the preferences key-value pairs - */ - static Properties loadFilePrefs(final File file) { - return AccessController.doPrivileged(new PrivilegedAction<Properties>() { - public Properties run() { - return loadFilePrefsImpl(file); - } - }); - - // try { - // //FIXME: lines below can be deleted, because it is not required to - // persistent at the very beginning - // flushFilePrefs(file, result); - // } catch (IOException e) { - // e.printStackTrace(); - // } - } - - static Properties loadFilePrefsImpl(final File file) { - Properties result = new Properties(); - if (!file.exists()) { - file.getParentFile().mkdirs(); - } else if (file.canRead()) { - InputStream in = null; - FileLock lock = null; - try { - - FileInputStream istream = new FileInputStream(file); - // BEGIN android-modified - in = new BufferedInputStream(istream, 8192); - // END android-modified - FileChannel channel = istream.getChannel(); - lock = channel.lock(0L, Long.MAX_VALUE, true); - Document doc = builder.parse(in); - // BEGIN android-modified - NodeList entries = selectNodeList(doc - .getDocumentElement(), "entry"); //$NON-NLS-1$ - // END android-modified - int length = entries.getLength(); - for (int i = 0; i < length; i++) { - Element node = (Element) entries.item(i); - String key = node.getAttribute("key"); //$NON-NLS-1$ - String value = node.getAttribute("value"); //$NON-NLS-1$ - result.setProperty(key, value); - } - return result; - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - lock.release(); - } catch (Exception e) {//ignore - } - try { - in.close(); - } catch (Exception e) {//ignore - } - } - } else { - file.delete(); - } - return result; - } - - /** - * - * @param file - * @param prefs - * @throws PrivilegedActionException - */ - static void flushFilePrefs(final File file, final Properties prefs) throws PrivilegedActionException { - AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { - public Object run() throws IOException { - flushFilePrefsImpl(file, prefs); - return null; - } - }); - } - - static void flushFilePrefsImpl(File file, Properties prefs) throws IOException { - BufferedWriter out = null; - FileLock lock = null; - try { - FileOutputStream ostream = new FileOutputStream(file); - // BEGIN android-modified - out = new BufferedWriter(new OutputStreamWriter(ostream, "UTF-8"), 8192); //$NON-NLS-1$ - // END android-modified - FileChannel channel = ostream.getChannel(); - lock = channel.lock(); - out.write(HEADER); - out.newLine(); - out.write(FILE_PREFS); - out.newLine(); - if (prefs.size() == 0) { - exportEntries(EMPTY_SARRAY, EMPTY_SARRAY, out); - } else { - String[] keys = prefs.keySet().toArray(new String[prefs.size()]); - int length = keys.length; - String[] values = new String[length]; - for (int i = 0; i < length; i++) { - values[i] = prefs.getProperty(keys[i]); - } - exportEntries(keys, values, out); - } - out.flush(); - } finally { - try { - lock.release(); - } catch (Exception e) {//ignore - } - try { - if (null != out) { - out.close(); - } - } catch (Exception e) {//ignore - } - } - } -} - - diff --git a/prefs/src/main/java/java/util/prefs/package.html b/prefs/src/main/java/java/util/prefs/package.html deleted file mode 100644 index 8a3dd33..0000000 --- a/prefs/src/main/java/java/util/prefs/package.html +++ /dev/null @@ -1,14 +0,0 @@ -<html> - <body> - <p> - This package provides a preferences mechanism, that is, a means of writing - configuration data (key/value pairs) to a persistent data store and - retrieving it from there. There are two different kinds of stores - available: one for storing user data and one for storing system - configuration data. Since the underlying implementation is dependent - on the operating system, this package is designed to allow the installation - of a custom service provider implementation. - </p> - @since Android 1.0 - </body> -</html> diff --git a/prefs/src/main/java/org/apache/harmony/prefs/internal/nls/Messages.java b/prefs/src/main/java/org/apache/harmony/prefs/internal/nls/Messages.java deleted file mode 100644 index cfc7236..0000000 --- a/prefs/src/main/java/org/apache/harmony/prefs/internal/nls/Messages.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * THE FILE HAS BEEN AUTOGENERATED BY MSGTOOL TOOL. - * All changes made to this file manually will be overwritten - * if this tool runs again. Better make changes in the template file. - */ - -// BEGIN android-note -// Redundant code has been removed and is now called from MsgHelp. -// END android-note - -package org.apache.harmony.prefs.internal.nls; - -// BEGIN android-added -import org.apache.harmony.luni.util.MsgHelp; -// END android-added - -/** - * This class retrieves strings from a resource bundle and returns them, - * formatting them with MessageFormat when required. - * <p> - * It is used by the system classes to provide national language support, by - * looking up messages in the <code> - * org.apache.harmony.prefs.internal.nls.messages - * </code> - * resource bundle. Note that if this file is not available, or an invalid key - * is looked up, or resource bundle support is not available, the key itself - * will be returned as the associated message. This means that the <em>KEY</em> - * should a reasonable human-readable (english) string. - * - */ -public class Messages { - - // BEGIN android-changed - private static final String sResource = - "org.apache.harmony.prefs.internal.nls.messages"; - // END android-changed - - /** - * Retrieves a message which has no arguments. - * - * @param msg - * String the key to look up. - * @return String the message for that key in the system message bundle. - */ - static public String getString(String msg) { - // BEGIN android-changed - return MsgHelp.getString(sResource, msg); - // END android-changed - } - - /** - * Retrieves a message which takes 1 argument. - * - * @param msg - * String the key to look up. - * @param arg - * Object the object to insert in the formatted output. - * @return String the message for that key in the system message bundle. - */ - static public String getString(String msg, Object arg) { - return getString(msg, new Object[] { arg }); - } - - /** - * Retrieves a message which takes 1 integer argument. - * - * @param msg - * String the key to look up. - * @param arg - * int the integer to insert in the formatted output. - * @return String the message for that key in the system message bundle. - */ - static public String getString(String msg, int arg) { - return getString(msg, new Object[] { Integer.toString(arg) }); - } - - /** - * Retrieves a message which takes 1 character argument. - * - * @param msg - * String the key to look up. - * @param arg - * char the character to insert in the formatted output. - * @return String the message for that key in the system message bundle. - */ - static public String getString(String msg, char arg) { - return getString(msg, new Object[] { String.valueOf(arg) }); - } - - /** - * Retrieves a message which takes 2 arguments. - * - * @param msg - * String the key to look up. - * @param arg1 - * Object an object to insert in the formatted output. - * @param arg2 - * Object another object to insert in the formatted output. - * @return String the message for that key in the system message bundle. - */ - static public String getString(String msg, Object arg1, Object arg2) { - return getString(msg, new Object[] { arg1, arg2 }); - } - - /** - * Retrieves a message which takes several arguments. - * - * @param msg - * String the key to look up. - * @param args - * Object[] the objects to insert in the formatted output. - * @return String the message for that key in the system message bundle. - */ - static public String getString(String msg, Object[] args) { - // BEGIN android-changed - return MsgHelp.getString(sResource, msg, args); - // END android-changed - } - - // BEGIN android-note - // Duplicate code was dropped in favor of using MsgHelp. - // END android-note -} diff --git a/prefs/src/main/java/org/apache/harmony/prefs/internal/nls/messages.properties b/prefs/src/main/java/org/apache/harmony/prefs/internal/nls/messages.properties deleted file mode 100644 index 8940685..0000000 --- a/prefs/src/main/java/org/apache/harmony/prefs/internal/nls/messages.properties +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# messages for EN locale -prefs.0=Inputstream cannot be null\! -prefs.1=Invalid DOCTYPE declaration: {0} -prefs.10=Cannot initiate PreferencesFactory: {0}. Caused by {1} -prefs.2=This preferences exported version is not supported:{0} -prefs.3=Cannot get children names for {0}! -prefs.4=Cannot remove {0}! -prefs.5=Stream is null -prefs.6=Name cannot end with '/'\! -prefs.7=Name cannot contains consecutive '/'\! -prefs.8=Name length is too long: {0} -prefs.9=This node has been removed\! -prefs.A=Cannot remove root node\! -prefs.B=Enumerate child nodes error\! -prefs.C=Flush error\! -prefs.D=Enumerate keys error\! -prefs.E=Access denied\! -prefs.F=Remove node error\! diff --git a/prefs/src/main/resources/META-INF/services/java.util.prefs.PreferencesFactory b/prefs/src/main/resources/META-INF/services/java.util.prefs.PreferencesFactory deleted file mode 100644 index ebb514c..0000000 --- a/prefs/src/main/resources/META-INF/services/java.util.prefs.PreferencesFactory +++ /dev/null @@ -1 +0,0 @@ -java.util.prefs.FilePreferencesFactoryImpl |