KickJava   Java API By Example, From Geeks To Geeks.

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


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 JDK12Hooks extends JDKHooks {
72     /**
73      * The thread context class loader is available for JDK 1.2
74      * or later, if certain security conditions are met.
75      *
76      * @return The thread context class loader, if available.
77      * Otherwise return null.
78      */

79     public ClassLoader JavaDoc getThreadContextClassLoader() {
80         ClassLoader JavaDoc classLoader;
81         
82         try {
83             classLoader = Thread.currentThread().getContextClassLoader();
84         } catch (SecurityException JavaDoc e) {
85             /**
86              * SecurityException is thrown when
87              * a) the context class loader isn't an ancestor of the
88              * calling class's class loader, or
89              * b) if security permissions are restricted.
90              *
91              * For (a), ignore and keep going. We cannot help but also
92              * ignore (b) with the logic below, but other calls elsewhere
93              * (to obtain a class loader) will re-trigger this exception
94              * where we can make a distinction.
95              */

96             classLoader = null; // ignore
97
}
98         
99         // Return the selected class loader
100
return classLoader;
101     }
102     
103     /**
104      * The system class loader is available for JDK 1.2
105      * or later, if certain security conditions are met.
106      *
107      * @return The system class loader, if available.
108      * Otherwise return null.
109      */

110     public ClassLoader JavaDoc getSystemClassLoader() {
111         ClassLoader JavaDoc classLoader;
112         
113         try {
114             classLoader = ClassLoader.getSystemClassLoader();
115         } catch (SecurityException JavaDoc e) {
116             /**
117              * Ignore and keep going.
118              */

119             classLoader = null; // ignore
120
}
121         
122         // Return the selected class loader
123
return classLoader;
124     }
125
126     /**
127      * Implement ClassLoader.getResources for JDK 1.2
128      */

129     public Enumeration JavaDoc getResources(ClassLoader JavaDoc loader,
130                                     String JavaDoc resourceName)
131         throws IOException JavaDoc
132     {
133         /**
134          * The simple answer is/was:
135          * return loader.getResources(resourceName);
136          *
137          * However, some classloaders overload the behavior of getResource
138          * (loadClass, etc) such that the order of returned results changes
139          * from normally expected behavior.
140          *
141          * Example: locate classes/resources from child ClassLoaders first,
142          * parents last (in some J2EE environs).
143          *
144          * The resource returned by getResource() should be the same as the
145          * first resource returned by getResources(). Unfortunately, this
146          * is not, and cannot be: getResources() is 'final' in the current
147          * JDK's (1.2, 1.3, 1.4).
148          *
149          * To address this, the implementation of this method will
150          * return an Enumeration such that the first element is the
151          * results of getResource, and all trailing elements are
152          * from getResources. On each iteration, we check so see
153          * if the resource (from getResources) matches the first resource,
154          * and eliminate the redundent element.
155          */

156         
157         final URL first = (URL)loader.getResource(resourceName);
158         final Enumeration JavaDoc rest = loader.getResources(resourceName);
159         
160         return new Enumeration JavaDoc() {
161             private boolean firstDone = (first == null);
162             private URL next = getNext();
163             
164             public Object JavaDoc nextElement() {
165                 URL o = next;
166                 next = getNext();
167                 return o;
168             }
169
170             public boolean hasMoreElements() {
171                 return next != null;
172             }
173             
174             private URL getNext() {
175                 URL n;
176                 
177                 if (!firstDone) {
178                     /**
179                      * First time through, use results of getReference()
180                      * if they were non-null.
181                      */

182                     firstDone = true;
183                     n = first;
184                 } else {
185                     /**
186                      * Subsequent times through,
187                      * use results of getReferences()
188                      * but take out anything that matches 'first'.
189                      *
190                      * Iterate through list until we find one that
191                      * doesn't match 'first'.
192                      */

193                     n = null;
194                     while (rest.hasMoreElements() && n == null) {
195                         n = (URL)rest.nextElement();
196                         if (first != null &&
197                             n != null &&
198                             n.equals(first))
199                         {
200                             n = null;
201                         }
202                     }
203                 }
204                 
205                 return n;
206             }
207         };
208     }
209 }
210
Popular Tags