Annotation of java/classes/org/w3c/util/ObservableProperties.java, revision 1.2
1.1 abaird 1: // ObservableProperties.java
1.2 ! abaird 2: // $Id: ObservableProperties.java,v 1.1 1996/09/19 15:58:01 abaird Exp $
1.1 abaird 3: // (c) COPYRIGHT MIT and INRIA, 1996.
4: // Please first read the full copyright statement in file COPYRIGHT.html
5:
6: package w3c.util;
7:
8: import java.util.* ;
9: import java.io.File ;
10:
11: /**
12: * An enhanced property class that provides support to monitor changes.
13: * This class extends the basic properties class of Java, by providing
14: * monitoring support. It also provides more type conversion.
15: * @see PropertyMonitoring
16: */
17:
18: public class ObservableProperties extends Properties {
19: PropertyMonitoring observers[] = null ;
20: int observers_count = 0 ;
21:
22: /**
23: * Subscribe for property monitoring.
24: * @param observer The object that handles the PropertyMonitoring
25: * interface.
26: */
27:
28: public synchronized void registerObserver (PropertyMonitoring o) {
29: // Try looking for an empty slot:
30: for (int i = 0 ; i < observers.length ; i++) {
31: if ( observers[i] == null ) {
32: observers[i] = o ;
33: return ;
34: }
35: }
36: // Add the observer to the registered oned, resizing array if needed
37: if ( observers_count + 1 >= observers.length ) {
38: PropertyMonitoring m[]=new PropertyMonitoring[observers.length*2];
39: System.arraycopy (observers, 0, m, 0, observers.length) ;
40: observers = m ;
41: }
42: observers[observers_count++] = o;
43: }
44:
45: /**
46: * Unsubscribe this object from the observers list.
47: * @param observer The observer to unsubscribe.
48: * @return A boolean <strong>true</strong> if object was succesfully
49: * unsubscribed, <strong>false</strong> otherwise.
50: */
51:
52: public synchronized boolean unregisterObserver (PropertyMonitoring o) {
53: for (int i = 0 ; i < observers.length ; i++) {
54: if ( observers[i] == o ) {
55: observers[i] = null ;
56: return true ;
57: }
58: }
59: return false ;
60: }
61:
62: /**
63: * Update a property value.
64: * Assign a value to a property. If the property value has really changed
65: * notify our observers of the change.
66: * @param name The name of the property to assign.
67: * @param value The new value for this property, or <strong>null</strong>
68: * if the property setting is to be cancelled.
69: * @return A boolean <strong>true</strong> if change was accepted by
70: * our observers, <strong>false</strong> otherwise.
71: */
72:
73: public synchronized boolean putValue (String name, String value) {
74: // If null value, remove the prop definition:
75: if ( value == null ) {
76: super.remove(name) ;
77: return true ;
78: }
79: // Otherwise, proceed:
80: String old = (String) get (value) ;
81: if ( (old == null) || (! old.equals (value)) ) {
82: super.put (name, value) ;
83: for (int i = 0 ; i < observers.length ; i++) {
84: if ( observers[i] == null )
85: continue ;
86: if ( ! observers[i].propertyChanged (name) ) {
87: if ( old != null )
88: super.put (name, old) ;
89: return false ;
90: }
91: }
92: }
93: return true ;
94: }
95:
96: /**
97: * Get this property value, as a boolean.
98: * @param name The name of the property to be fetched.
99: * @param def The default value, if the property isn't defined.
100: * @return A Boolean instance.
101: */
102:
103: public boolean getBoolean(String name, boolean def) {
104: String v = getProperty(name, null);
105: if ( v != null )
106: return "true".equalsIgnoreCase(v) ? true : false ;
107: return def ;
108: }
109:
110: /**
111: * Get this property value, as a String.
112: * @param name The name of the property to be fetched.
113: * @param def The default value, if the property isn't defined.
114: * @return An instance of String.
115: */
116:
117: public String getString(String name, String def) {
118: String v = getProperty (name, null);
119: if ( v != null )
120: return v ;
121: return def ;
122: }
123:
124: /**
125: * Get this property as a String array.
126: * By convention, properties that are get as string arrays should be
127: * encoded as a <strong>|</strong> separated list of Strings.
128: * @param name The property's name.
129: * @param def The default value (if undefined).
130: * @return A String array, or <strong>null</strong> if the property
131: * is undefined.
132: */
133:
134: public String[] getStringArray(String name, String def[]) {
135: String v = getProperty(name, null);
136: if ( v == null )
137: return def;
138: // Parse the property value:
139: StringTokenizer st = new StringTokenizer(v, "|");
140: int len = st.countTokens();
141: String ret[] = new String[len];
142: for (int i = 0 ; i < ret.length ; i++) {
143: ret[i] = st.nextToken();
144: }
145: return ret;
146: }
147:
148: /**
149: * Get this property value, as an integer.
150: * @param name The name of the property to be fetched.
151: * @param def The default value, if the property isn't defined.
1.2 ! abaird 152: * @return An integer value.
1.1 abaird 153: */
154:
155: public int getInteger(String name, int def) {
156: String v = getProperty (name, null);
157: if ( v != null ) {
158: try {
159: if (v.startsWith("0x")) {
160: return Integer.valueOf(v.substring(2), 16).intValue();
161: }
162: if (v.startsWith("#")) {
163: return Integer.valueOf(v.substring(1), 16).intValue();
164: }
165: return Integer.valueOf(v).intValue();
166: } catch (NumberFormatException e) {
167: }
168: }
169: return def ;
1.2 ! abaird 170: }
! 171:
! 172: /**
! 173: * Get this property value, as a double.
! 174: * @param name The name of the property.
! 175: * @param def The default value if undefined.
! 176: * @return A double value.
! 177: */
! 178:
! 179: public double getDouble(String name, double def) {
! 180: String v = getProperty(name, null);
! 181: if ( v != null ) {
! 182: try {
! 183: return Double.valueOf(v).doubleValue();
! 184: } catch (NumberFormatException ex) {
! 185: }
! 186: }
! 187: return def;
1.1 abaird 188: }
189:
190: /**
191: * Get this property value, as a File.
192: * @param name The name of the property to be fetched.
193: * @param def The default value, if the property isn't defined.
194: * @return An instance of File.
195: */
196:
197: public File getFile(String name, File def) {
198: String v = getProperty(name, null);
199: if ( v != null )
200: return new File (v) ;
201: return def ;
202: }
203:
204: /**
205: * Build an httpdProperties instance from a Properties instance.
206: * @param props The Properties instance.
207: */
208:
209: public ObservableProperties(Properties props) {
210: super (props) ;
211: this.observers = new PropertyMonitoring[5] ;
212: this.observers_count = 0 ;
213: }
214:
215: }
216:
217:
Webmaster