001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.discovery.jdk;
018
019 import java.io.IOException;
020 import java.net.URL;
021 import java.util.Enumeration;
022
023
024 /**
025 * @author Richard A. Sitze
026 */
027 public class JDK11Hooks extends JDKHooks {
028 private static final ClassLoader systemClassLoader
029 = new PsuedoSystemClassLoader();
030
031 /**
032 * Get the system property
033 *
034 * @param propName name of the property
035 * @return value of the property
036 */
037 public String getSystemProperty(final String propName) {
038 return System.getProperty(propName);
039 }
040
041 /**
042 * The thread context class loader is available for JDK 1.2
043 * or later, if certain security conditions are met.
044 *
045 * @return The thread context class loader, if available.
046 * Otherwise return null.
047 */
048 public ClassLoader getThreadContextClassLoader() {
049 return null;
050 }
051
052 /**
053 * The system class loader is available for JDK 1.2
054 * or later, if certain security conditions are met.
055 *
056 * @return The system class loader, if available.
057 * Otherwise return null.
058 */
059 public ClassLoader getSystemClassLoader() {
060 return systemClassLoader;
061 }
062
063 /**
064 * Implement ClassLoader.getResources for JDK 1.1
065 *
066 * On JDK1.1 there is no getResources() method. We emulate this by
067 * using introspection and doing the lookup ourself, using the list
068 * of URLs, via getURLs().
069 */
070 public Enumeration getResources(ClassLoader loader,
071 String resourceName)
072 throws IOException
073 {
074 /**
075 * The simple answer is/was:
076 * return loader.getResources(resourceName);
077 *
078 * However, some classloaders overload the behavior of getResource
079 * (loadClass, etc) such that the order of returned results changes
080 * from normally expected behavior.
081 *
082 * Example: locate classes/resources from child ClassLoaders first,
083 * parents last (in some J2EE environs).
084 *
085 * The resource returned by getResource() should be the same as the
086 * first resource returned by getResources(). Unfortunately, this
087 * is not, and cannot be: getResources() is 'final' in the current
088 * JDK's (1.2, 1.3, 1.4).
089 *
090 * To address this, the implementation of this method will
091 * return an Enumeration such that the first element is the
092 * results of getResource, and all trailing elements are
093 * from getResources. On each iteration, we check so see
094 * if the resource (from getResources) matches the first resource,
095 * and eliminate the redundent element.
096 */
097
098 final URL first = (URL)loader.getResource(resourceName);
099 final Enumeration rest = loader.getResources(resourceName);
100
101 return new Enumeration() {
102 private boolean firstDone = (first == null);
103 private URL next = getNext();
104
105 public Object nextElement() {
106 URL o = next;
107 next = getNext();
108 return o;
109 }
110
111 public boolean hasMoreElements() {
112 return next != null;
113 }
114
115 private URL getNext() {
116 URL n;
117
118 if (!firstDone) {
119 /**
120 * First time through, use results of getReference()
121 * if they were non-null.
122 */
123 firstDone = true;
124 n = first;
125 } else {
126 /**
127 * Subsequent times through,
128 * use results of getReferences()
129 * but take out anything that matches 'first'.
130 *
131 * Iterate through list until we find one that
132 * doesn't match 'first'.
133 */
134 n = null;
135 while (rest.hasMoreElements() && n == null) {
136 n = (URL)rest.nextElement();
137 if (first != null &&
138 n != null &&
139 n.equals(first))
140 {
141 n = null;
142 }
143 }
144 }
145
146 return n;
147 }
148 };
149 }
150 }