blob: 981827192476ae2d349647108e11343ef5f5e5c8 [file] [log] [blame]
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.logging;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
/**
* <p>Wrapper around test cases that need to have a custom class loader
* hierarchy assembled. The wrapper is configured by the following
* system properties:</p>
* <ul>
* <li><strong>wrapper.hierarchy</strong> - Descriptive code describing how
* the class loader hierarchy should be assembled:
* <ul>
* <li><strong>API</strong> - Parent class loader contains
* <code>commons-logging-api.jar</code> and child class loader
* contains <code>commons-logging.jar</code>. This is like the
* default configuration for Tomcat 4.1.</li>
* <li><strong>FULL</strong> - Parent class loader contains
* <code>commons-logging.jar</code>. This is what would happen
* if you replaced <code>commons-logging-api.jar</code> with
* <code>commons-logging.jar</code> so that you did not need to
* include the latter with your application.</li>
* </ul>
* The child class loader also unconditionally includes
* <code>commons-logging-tests.jar</code>.</li>
* <li><strong>wrapper.junit</strong> - Fully qualified pathname of the
* JUnit JAR file.</li>
* <li><strong>wrapper.log4j</strong> - Fully qualified pathname of the
* Log4J JAR file, which will be placed in whichever class loader
* <code>commons-logging.jar</code> is placed in, if specified.</li>
* <li><strong>wrapper.target</strong> - Fully qualified pathname of the
* "target" directory created by the build process. This directory
* must contain the <code>commons-logging.jar</code>,
* <code>commons-logging-api.jar</code>, and
* <code>commons-logging-tests.jar</code> files resulting from the
* execution of the <code>compile.tests</code> target.</li>
* <li><strong>wrapper.testcase</strong> - Fully qualified Java class name
* of a TestCase that will ultimately be executed. This class must
* exist in the <code>commons-logging-tests.jar</code> file.</li>
* </ul>
*
* <p>When executed, the system classpath for the wrapper should include
* only the wrapper class itself.</p>
*
* @author Craig R. McClanahan
* @version $Revision$ $Date$
*/
public class Wrapper {
public static void main(String args[]) {
try {
// Create variables we will need
List parentList = new ArrayList();
List childList = new ArrayList();
URL urls[] = null;
// Construct URLs for the various JAR files
File target = new File(System.getProperty("wrapper.target"));
URL commonsLogging =
(new File(target, "commons-logging.jar")).toURL();
URL commonsLoggingApi =
(new File(target, "commons-logging-api.jar")).toURL();
URL commonsLoggingTests =
(new File(target, "commons-logging-tests.jar")).toURL();
URL junit =
(new File(System.getProperty("wrapper.junit"))).toURL();
URL appender = null;
URL log4j = null;
if (System.getProperty("wrapper.log4j") != null) {
log4j =
(new File(System.getProperty("wrapper.log4j"))).toURL();
appender =
(new File(target, "commons-logging-appender.jar")).toURL();
}
// Construct class loader repository lists for supported scenarios
if ("API".equals(System.getProperty("wrapper.hierarchy"))) {
parentList.add(commonsLoggingApi);
childList.add(commonsLogging);
if (log4j != null) {
childList.add(log4j);
childList.add(appender);
}
} else { // Assumes "FULL"
parentList.add(commonsLogging);
if (log4j != null) {
parentList.add(log4j);
childList.add(appender);
}
}
childList.add(commonsLoggingTests);
childList.add(junit);
// Construt the parent and child class loaders
urls = (URL[]) parentList.toArray(new URL[parentList.size()]);
ClassLoader parent =
new URLClassLoader(urls,
ClassLoader.getSystemClassLoader());
urls = (URL[]) childList.toArray(new URL[childList.size()]);
ClassLoader child = new URLClassLoader(urls, parent);
// Execute the test runner for this TestCase
ClassLoader old = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(child);
Class clazz = child.loadClass("junit.textui.TestRunner");
String params[] = new String[1];
params[0] = System.getProperty("wrapper.testcase");
Method method = clazz.getMethod("main",
new Class[] { params.getClass() });
method.invoke(null, new Object[] { params });
Thread.currentThread().setContextClassLoader(old);
} catch (Exception e) {
System.out.println("Wrapper Exception Occurred: " + e);
e.printStackTrace(System.out);
System.exit(1);
}
}
}