KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > commons > discovery > jdk > JDK11Hooks


1 /*
2  * $Header$
3  * $Revision$
4  * $Date$
5  *
6  * ====================================================================
7  *
8  * The Apache Software License, Version 1.1
9  *
10  * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
11  * reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  *
17  * 1. Redistributions of source code must retain the above copyright
18  * notice, this list of conditions and the following disclaimer.
19  *
20  * 2. Redistributions in binary form must reproduce the above copyright
21  * notice, this list of conditions and the following disclaimer in
22  * the documentation and/or other materials provided with the
23  * distribution.
24  *
25  * 3. The end-user documentation included with the redistribution, if
26  * any, must include the following acknowlegement:
27  * "This product includes software developed by the
28  * Apache Software Foundation (http://www.apache.org/)."
29  * Alternately, this acknowlegement may appear in the software itself,
30  * if and wherever such third-party acknowlegements normally appear.
31  *
32  * 4. The names "The Jakarta Project", "Commons", and "Apache Software
33  * Foundation" must not be used to endorse or promote products derived
34  * from this software without prior written permission. For written
35  * permission, please contact apache@apache.org.
36  *
37  * 5. Products derived from this software may not be called "Apache"
38  * nor may "Apache" appear in their names without prior written
39  * permission of the Apache Group.
40  *
41  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52  * SUCH DAMAGE.
53  * ====================================================================
54  *
55  * This software consists of voluntary contributions made by many
56  * individuals on behalf of the Apache Software Foundation. For more
57  * information on the Apache Software Foundation, please see
58  * <http://www.apache.org/>.
59  *
60  */

61
62 package org.apache.commons.discovery.jdk;
63
64 import java.util.Enumeration JavaDoc;
65 import java.io.IOException JavaDoc;
66
67
68 /**
69  * @author Richard A. Sitze
70  */

71 class JDK11Hooks extends JDKHooks {
72     private static final ClassLoader JavaDoc systemClassLoader
73         = new PsuedoSystemClassLoader();
74
75
76     /**
77      * The thread context class loader is available for JDK 1.2
78      * or later, if certain security conditions are met.
79      *
80      * @return The thread context class loader, if available.
81      * Otherwise return null.
82      */

83     public ClassLoader JavaDoc getThreadContextClassLoader() {
84         return null;
85     }
86     
87     /**
88      * The system class loader is available for JDK 1.2
89      * or later, if certain security conditions are met.
90      *
91      * @return The system class loader, if available.
92      * Otherwise return null.
93      */

94     public ClassLoader JavaDoc getSystemClassLoader() {
95         return systemClassLoader;
96     }
97
98     /**
99      * Implement ClassLoader.getResources for JDK 1.1
100      *
101      * On JDK1.1 there is no getResources() method. We emulate this by
102      * using introspection and doing the lookup ourself, using the list
103      * of URLs, via getURLs().
104      */

105     public Enumeration JavaDoc getResources(ClassLoader JavaDoc loader,
106                                     String JavaDoc resourceName)
107         throws IOException JavaDoc
108     {
109         /**
110          * The simple answer is/was:
111          * return loader.getResources(resourceName);
112          *
113          * However, some classloaders overload the behavior of getResource
114          * (loadClass, etc) such that the order of returned results changes
115          * from normally expected behavior.
116          *
117          * Example: locate classes/resources from child ClassLoaders first,
118          * parents last (in some J2EE environs).
119          *
120          * The resource returned by getResource() should be the same as the
121          * first resource returned by getResources(). Unfortunately, this
122          * is not, and cannot be: getResources() is 'final' in the current
123          * JDK's (1.2, 1.3, 1.4).
124          *
125          * To address this, the implementation of this method will
126          * return an Enumeration such that the first element is the
127          * results of getResource, and all trailing elements are
128          * from getResources. On each iteration, we check so see
129          * if the resource (from getResources) matches the first resource,
130          * and eliminate the redundent element.
131          */

132         
133         final URL first = (URL)loader.getResource(resourceName);
134         final Enumeration JavaDoc rest = loader.getResources(resourceName);
135         
136         return new Enumeration JavaDoc() {
137             private boolean firstDone = (first == null);
138             private URL next = getNext();
139             
140             public Object JavaDoc nextElement() {
141                 URL o = next;
142                 next = getNext();
143                 return o;
144             }
145
146             public boolean hasMoreElements() {
147                 return next != null;
148             }
149             
150             private URL getNext() {
151                 URL n;
152                 
153                 if (!firstDone) {
154                     /**
155                      * First time through, use results of getReference()
156                      * if they were non-null.
157                      */

158                     firstDone = true;
159                     n = first;
160                 } else {
161                     /**
162                      * Subsequent times through,
163                      * use results of getReferences()
164                      * but take out anything that matches 'first'.
165                      *
166                      * Iterate through list until we find one that
167                      * doesn't match 'first'.
168                      */

169                     n = null;
170                     while (rest.hasMoreElements() && n == null) {
171                         n = (URL)rest.nextElement();
172                         if (first != null &&
173                             n != null &&
174                             n.equals(first))
175                         {
176                             n = null;
177                         }
178                     }
179                 }
180                 
181                 return n;
182             }
183         };
184     }
185 }
186
Popular Tags