KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > go > trove > util > Utils


1 /* ====================================================================
2  * Trove - Copyright (c) 1997-2000 Walt Disney Internet Group
3  * ====================================================================
4  * The Tea Software License, Version 1.1
5  *
6  * Copyright (c) 2000 Walt Disney Internet Group. All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in
17  * the documentation and/or other materials provided with the
18  * distribution.
19  *
20  * 3. The end-user documentation included with the redistribution,
21  * if any, must include the following acknowledgment:
22  * "This product includes software developed by the
23  * Walt Disney Internet Group (http://opensource.go.com/)."
24  * Alternately, this acknowledgment may appear in the software itself,
25  * if and wherever such third-party acknowledgments normally appear.
26  *
27  * 4. The names "Tea", "TeaServlet", "Kettle", "Trove" and "BeanDoc" must
28  * not be used to endorse or promote products derived from this
29  * software without prior written permission. For written
30  * permission, please contact opensource@dig.com.
31  *
32  * 5. Products derived from this software may not be called "Tea",
33  * "TeaServlet", "Kettle" or "Trove", nor may "Tea", "TeaServlet",
34  * "Kettle", "Trove" or "BeanDoc" appear in their name, without prior
35  * written permission of the Walt Disney Internet Group.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE WALT DISNEY INTERNET GROUP OR ITS
41  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
42  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
43  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
44  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
45  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
46  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
47  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48  * ====================================================================
49  *
50  * For more information about Tea, please see http://opensource.go.com/.
51  */

52
53 package com.go.trove.util;
54
55 import java.util.*;
56 import java.io.Serializable JavaDoc;
57 import java.io.ObjectStreamException JavaDoc;
58 import java.lang.reflect.InvocationTargetException JavaDoc;
59 import java.lang.reflect.Method JavaDoc;
60 import java.lang.ref.Reference JavaDoc;
61 import java.lang.ref.WeakReference JavaDoc;
62
63 /******************************************************************************
64  * Some generic utilities.
65  *
66  * @author Brian S O'Neill
67  * @version
68  * <!--$$Revision:--> 28 <!-- $-->, <!--$$JustDate:--> 00/12/18 <!-- $-->
69  * @see java.util.Collections
70  */

71 public class Utils {
72     // The choice of determining whether these constants are public or
73
// private is based on the design of the java.util.Collections class.
74
// For consistency, the "empty" fields are public, and the comparators are
75
// accessed from static methods.
76

77     public static final Enumeration EMPTY_ENUMERATION = new EmptyEnum();
78
79     /** This Map is already provided in JDK1.3. */
80     public static final Map EMPTY_MAP = new EmptyMap();
81
82     /**
83      * Similar to EMPTY_MAP, except the put operation is supported, but the
84      * values are immediately forgotten.
85      */

86     public static final Map VOID_MAP = new VoidMap();
87
88     private static final Comparator NULL_LOW_ORDER = new NullLowOrder();
89
90     private static final Comparator NULL_HIGH_ORDER = new NullHighOrder();
91
92     private static final Comparator NULL_EQUAL_ORDER = new NullEqualOrder();
93
94     private static FlyweightSet cFlyweightSet;
95     
96     /**
97      * Returns a Comparator that uses a Comparable object's natural ordering,
98      * except null values are always considered low order. This Comparator
99      * allows naturally ordered TreeMaps to support null values.
100      */

101     public static Comparator nullLowOrder() {
102         return NULL_LOW_ORDER;
103     }
104
105     /**
106      * Returns a Comparator that wraps the given Comparator except null values
107      * are always considered low order. This fixes Comparators that don't
108      * support comparisons against null and allows them to be used in TreeMaps.
109      */

110     public static Comparator nullLowOrder(Comparator c) {
111         return new NullLowOrderC(c);
112     }
113
114     /**
115      * Returns a Comparator that uses a Comparable object's natural ordering,
116      * except null values are always considered high order. This Comparator
117      * allows naturally ordered TreeMaps to support null values.
118      */

119     public static Comparator nullHighOrder() {
120         return NULL_HIGH_ORDER;
121     }
122
123     /**
124      * Returns a Comparator that wraps the given Comparator except null values
125      * are always considered high order. This fixes Comparators that don't
126      * support comparisons against null and allows them to be used in TreeMaps.
127      */

128     public static Comparator nullHighOrder(Comparator c) {
129         return new NullHighOrderC(c);
130     }
131
132     /**
133      * Returns a Comparator that uses a Comparable object's natural ordering,
134      * except null values are always considered equal order. This Comparator
135      * should not be used in a TreeMap, but can be used in a sorter.
136      */

137     public static Comparator nullEqualOrder() {
138         return NULL_EQUAL_ORDER;
139     }
140     
141     /**
142      * Returns a Comparator that wraps the given Comparator except null values
143      * are always considered equal order. This Comparator should not be used in
144      * a TreeMap, but can be used in a sorter.
145      */

146     public static Comparator nullEqualOrder(Comparator c) {
147         return new NullEqualOrderC(c);
148     }
149
150     /**
151      * Returns a Comparator that wraps the given Comparator, but orders in
152      * reverse.
153      */

154     public static Comparator reverseOrder(Comparator c) {
155         return new ReverseOrderC(c);
156     }
157
158     /**
159      * Just like {@link String#intern() String.intern}, except it generates
160      * flyweights for any kind of object, and it does not prevent them from
161      * being garbage collected. Calling intern on a String does not use the
162      * same String pool used by String.intern because those Strings are not
163      * always garbage collected. Some virtual machines free up Strings from the
164      * interned String pool, others do not.
165      * <p>
166      * For objects that do not customize the hashCode and equals methods,
167      * calling intern is not very useful because the object returned will
168      * always be the same as the one passed in.
169      * <p>
170      * The object type returned from intern is guaranteed to be exactly the
171      * same type as the one passed in. Calling intern on null returns null.
172      *
173      * @param obj Object to intern
174      * @return Interned object.
175      * @see FlyweightSet
176      */

177     public static Object JavaDoc intern(Object JavaDoc obj) {
178         FlyweightSet set;
179         if ((set = cFlyweightSet) == null) {
180             synchronized (Utils.class) {
181                 if ((set = cFlyweightSet) == null) {
182                     set = new FlyweightSet();
183                 }
184             }
185             cFlyweightSet = set;
186         }
187         return set.put(obj);
188     }
189
190     protected Utils() {
191     }
192
193     private static class EmptyEnum implements Enumeration, Serializable JavaDoc {
194         public boolean hasMoreElements() {
195             return false;
196         }
197         
198         public Object JavaDoc nextElement() throws NoSuchElementException {
199             throw new NoSuchElementException();
200         }
201
202         // Serializable singleton classes should always do this.
203
private Object JavaDoc readResolve() throws ObjectStreamException JavaDoc {
204             return EMPTY_ENUMERATION;
205         }
206     };
207
208     private static class EmptyMap implements Map, Serializable JavaDoc {
209         public int size() {
210             return 0;
211         }
212
213         public boolean isEmpty() {
214             return true;
215         }
216
217         public boolean containsKey(Object JavaDoc key) {
218             return false;
219         }
220
221         public boolean containsValue(Object JavaDoc value) {
222             return false;
223         }
224         
225         public Object JavaDoc get(Object JavaDoc key) {
226             return null;
227         }
228
229         public Object JavaDoc put(Object JavaDoc key, Object JavaDoc value) {
230             throw new UnsupportedOperationException JavaDoc
231                 ("Cannot put into immutable empty map");
232         }
233
234         public Object JavaDoc remove(Object JavaDoc key) {
235             return null;
236         }
237
238         public void putAll(Map map) {
239             throw new UnsupportedOperationException JavaDoc
240                 ("Cannot put into immutable empty map");
241         }
242
243         public void clear() {
244         }
245
246         public Set keySet() {
247             return Collections.EMPTY_SET;
248         }
249
250         public Collection values() {
251             return Collections.EMPTY_LIST;
252         }
253
254         public Set entrySet() {
255             return Collections.EMPTY_SET;
256         }
257
258         // Serializable singleton classes should always do this.
259
private Object JavaDoc readResolve() throws ObjectStreamException JavaDoc {
260             return EMPTY_MAP;
261         }
262     }
263
264     private static class VoidMap extends EmptyMap {
265         public Object JavaDoc put(Object JavaDoc key, Object JavaDoc value) {
266             return null;
267         }
268
269         public void putAll(Map map) {
270         }
271
272         // Serializable singleton classes should always do this.
273
private Object JavaDoc readResolve() throws ObjectStreamException JavaDoc {
274             return VOID_MAP;
275         }
276     }
277
278     private static class NullLowOrder implements Comparator, Serializable JavaDoc {
279         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
280             if (obj1 != null) {
281                 return (obj2 != null) ? ((Comparable JavaDoc)obj1).compareTo(obj2) : 1;
282             }
283             else {
284                 return (obj2 != null) ? -1 : 0;
285             }
286         }
287
288         // Serializable singleton classes should always do this.
289
private Object JavaDoc readResolve() throws ObjectStreamException JavaDoc {
290             return NULL_LOW_ORDER;
291         }
292     }
293
294     private static class NullLowOrderC implements Comparator, Serializable JavaDoc {
295         private Comparator c;
296
297         public NullLowOrderC(Comparator c) {
298             this.c = c;
299         }
300
301         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
302             if (obj1 != null) {
303                 return (obj2 != null) ? c.compare(obj1, obj2) : 1;
304             }
305             else {
306                 return (obj2 != null) ? -1 : 0;
307             }
308         }
309     }
310
311     private static class NullHighOrder implements Comparator, Serializable JavaDoc {
312         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
313             if (obj1 != null) {
314                 return (obj2 != null) ? ((Comparable JavaDoc)obj1).compareTo(obj2): -1;
315             }
316             else {
317                 return (obj2 != null) ? 1 : 0;
318             }
319         }
320
321         // Serializable singleton classes should always do this.
322
private Object JavaDoc readResolve() throws ObjectStreamException JavaDoc {
323             return NULL_HIGH_ORDER;
324         }
325     }
326
327     private static class NullHighOrderC implements Comparator, Serializable JavaDoc {
328         private Comparator c;
329
330         public NullHighOrderC(Comparator c) {
331             this.c = c;
332         }
333
334         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
335             if (obj1 != null) {
336                 return (obj2 != null) ? c.compare(obj1, obj2) : -1;
337             }
338             else {
339                 return (obj2 != null) ? 1 : 0;
340             }
341         }
342     }
343
344     private static class NullEqualOrder implements Comparator, Serializable JavaDoc {
345         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
346             return (obj1 != null && obj2 != null) ?
347                 ((Comparable JavaDoc)obj1).compareTo(obj2) : 0;
348         }
349
350         // Serializable singleton classes should always do this.
351
private Object JavaDoc readResolve() throws ObjectStreamException JavaDoc {
352             return NULL_EQUAL_ORDER;
353         }
354     }
355     
356     private static class NullEqualOrderC implements Comparator, Serializable JavaDoc {
357         private Comparator c;
358
359         public NullEqualOrderC(Comparator c) {
360             this.c = c;
361         }
362
363         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
364             return (obj1 != null && obj2 != null) ? c.compare(obj1, obj2) : 0;
365         }
366     }
367
368     private static class ReverseOrderC implements Comparator, Serializable JavaDoc {
369         private Comparator c;
370
371         public ReverseOrderC(Comparator c) {
372             this.c = c;
373         }
374
375         public int compare(Object JavaDoc obj1, Object JavaDoc obj2) {
376             return c.compare(obj2, obj1);
377         }
378     }
379 }
380
Popular Tags