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: */
018: package org.apache.tools.ant.util;
019:
020: import java.io.File;
021: import org.apache.tools.ant.BuildException;
022: import org.apache.tools.ant.launch.Locator;
023:
024: // CheckStyle:HideUtilityClassConstructorCheck OFF - bc
025:
026: /**
027: * ClassLoader utility methods
028: *
029: */
030: public class LoaderUtils {
031:
032: /** Utilities used for file operations */
033: private static final FileUtils FILE_UTILS = FileUtils
034: .getFileUtils();
035:
036: /**
037: * Set the context classloader
038: *
039: * @param loader the ClassLoader to be used as the context class loader
040: * on the current thread.
041: */
042: public static void setContextClassLoader(ClassLoader loader) {
043: Thread currentThread = Thread.currentThread();
044: currentThread.setContextClassLoader(loader);
045: }
046:
047: /**
048: * JDK1.1 compatible access to set the context class loader.
049: *
050: * @return the ClassLoader instance being used as the context
051: * classloader on the current thread. Returns null on JDK 1.1
052: */
053: public static ClassLoader getContextClassLoader() {
054: Thread currentThread = Thread.currentThread();
055: return currentThread.getContextClassLoader();
056: }
057:
058: /**
059: * Indicates if the context class loader methods are available
060: *
061: * @return true if the get and set methods dealing with the context
062: * classloader are available.
063: */
064: public static boolean isContextLoaderAvailable() {
065: return true;
066: }
067:
068: /**
069: * Normalize a source location
070: *
071: * @param source the source location to be normalized.
072: *
073: * @return the normalized source location.
074: */
075: private static File normalizeSource(File source) {
076: if (source != null) {
077: try {
078: source = FILE_UTILS.normalize(source.getAbsolutePath());
079: } catch (BuildException e) {
080: // relative path
081: }
082: }
083:
084: return source;
085: }
086:
087: /**
088: * Find the directory or jar file the class has been loaded from.
089: *
090: * @param c the class whose location is required.
091: * @return the file or jar with the class or null if we cannot
092: * determine the location.
093: *
094: * @since Ant 1.6
095: */
096: public static File getClassSource(Class c) {
097: return normalizeSource(Locator.getClassSource(c));
098: }
099:
100: /**
101: * Find the directory or a give resource has been loaded from.
102: *
103: * @param c the classloader to be consulted for the source
104: * @param resource the resource whose location is required.
105: *
106: * @return the file with the resource source or null if
107: * we cannot determine the location.
108: *
109: * @since Ant 1.6
110: */
111: public static File getResourceSource(ClassLoader c, String resource) {
112: if (c == null) {
113: c = LoaderUtils.class.getClassLoader();
114: }
115: return normalizeSource(Locator.getResourceSource(c, resource));
116: }
117:
118: /**
119: * Return the resource name of a class name.
120: * @param className the name of the class to convert.
121: * @return the corresponding resource name.
122: * @since Ant 1.7.0.
123: */
124: public static String classNameToResource(String className) {
125: return className.replace('.', '/') + ".class";
126: }
127:
128: /**
129: * Check if a classloader has a classname resource.
130: * @param loader the classloader to look it.
131: * @param className the name of the class to look for.
132: * @return true if the classexists, false otherwise
133: * @since Ant 1.7.0.
134: */
135: public static boolean classExists(ClassLoader loader,
136: String className) {
137: return loader.getResource(classNameToResource(className)) != null;
138: }
139: }
|