001: /**
002: * Copyright 2006 Webmedia Group Ltd.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: **/package org.araneaframework.core.util;
016:
017: import java.io.IOException;
018: import java.io.InputStream;
019: import java.net.URL;
020: import java.util.ArrayList;
021: import java.util.Collections;
022: import java.util.Enumeration;
023: import java.util.Iterator;
024: import java.util.List;
025: import org.apache.commons.collections.EnumerationUtils;
026: import org.araneaframework.core.Assert;
027:
028: /**
029: * Utility to determine the classloader that should be used for
030: * loading resources.
031: *
032: * @author "Toomas Römer" <toomas@webmedia.ee>
033: */
034: public abstract class ClassLoaderUtil {
035: /**
036: * Returns the thread context ClassLoader, if available. Otherwise
037: * falls back to the ClassLoader of ClassLoaderUtil.
038: * @return acquired classloader.
039: */
040: public static ClassLoader getDefaultClassLoader() {
041: return (ClassLoader) getClassLoaders().iterator().next();
042: }
043:
044: public static InputStream getResourceAsStream(String name) {
045: Assert.notNullParam(name, "name");
046:
047: URL url = findResource(name);
048: if (url == null)
049: return null;
050:
051: try {
052: return url.openStream();
053: } catch (IOException e) {
054: return null;
055: }
056: }
057:
058: /**
059: * Trys to load class using the ClassLoaders in the order that
060: * getClassLoaders() returns them. On success returns the class.
061: *
062: * @throws ClassNotFoundException
063: */
064: public static Class loadClass(String name)
065: throws ClassNotFoundException {
066: Assert.notNullParam(name, "name");
067:
068: List loaders = getClassLoaders();
069: for (Iterator iter = loaders.iterator(); iter.hasNext();) {
070: ClassLoader loader = (ClassLoader) iter.next();
071: try {
072: return loader.loadClass(name);
073: } catch (ClassNotFoundException e) {
074: if (!iter.hasNext())
075: throw e;
076: }
077: }
078: throw new ClassNotFoundException();
079: }
080:
081: /**
082: * Searches through all the ClassLoaders provided by the getClassLoaders()
083: * for the resource identified by name. Returns the URL of the first
084: * found resource.
085: */
086: public static URL findResource(final String name) {
087: Assert.notNullParam(name, "name");
088:
089: List loaders = getClassLoaders();
090: for (Iterator iter = loaders.iterator(); iter.hasNext();) {
091: ClassLoader loader = (ClassLoader) iter.next();
092: URL url = loader.getResource(name);
093: if (url != null)
094: return url;
095: }
096: return null;
097: }
098:
099: /**
100: * Searches through all the ClassLoaders provided by the getClassLoaders()
101: * for the resources identified by name. Returns an union of all the found
102: * URLs.
103: */
104: public static Enumeration findResources(final String name)
105: throws IOException {
106: Assert.notNullParam(name, "name");
107:
108: List list = new ArrayList();
109: List loaders = getClassLoaders();
110: for (Iterator iter = loaders.iterator(); iter.hasNext();) {
111: ClassLoader loader = (ClassLoader) iter.next();
112: Enumeration resources = loader.getResources(name);
113: list.addAll(EnumerationUtils.toList(resources));
114: }
115: return Collections.enumeration(loaders);
116: }
117:
118: /**
119: * Returns a list of ClassLoaders in the order that Aranea
120: * searches for resources.
121: */
122: public static List getClassLoaders() {
123: List rtrn = new ArrayList();
124: ClassLoader classLoader = Thread.currentThread()
125: .getContextClassLoader();
126: if (classLoader != null) {
127: rtrn.add(classLoader);
128: }
129: rtrn.add(ClassLoaderUtil.class.getClassLoader());
130: return rtrn;
131: }
132: }
|