blob: f7b58ab5876e964259d8874251ca5ec209c07d24 [file] [log] [blame]
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.myrmidon.launcher;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
* Basic Loader that is responsible for all the hackery to get classloader to work.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public final class Main
{
/**
* Magic entry point.
*
* @param args the CLI arguments
* @exception Exception if an error occurs
*/
public final static void main( final String[] args )
throws Exception
{
try
{
//actually try to discover the install directory based on where
// the myrmidon.jar is
final File installDirectory = findInstallDir();
System.setProperty( "myrmidon.home", installDirectory.toString() );
//setup classloader appropriately for myrmidon jar
final File libDir = new File( installDirectory, "lib" );
final URL[] urls = buildURLList( libDir );
final URLClassLoader classLoader = new URLClassLoader( urls );
//load class and retrieve appropriate main method.
final Class clazz = classLoader.loadClass( "org.apache.myrmidon.frontends.CLIMain" );
final Method method = clazz.getMethod( "main", new Class[] { args.getClass() } );
Thread.currentThread().setContextClassLoader( classLoader );
//kick the tires and light the fires....
method.invoke( null, new Object[] { args } );
}
catch( final InvocationTargetException ite )
{
System.err.println( "Error: " + ite.getTargetException().getMessage() );
ite.getTargetException().printStackTrace();
}
catch( final Throwable throwable )
{
System.err.println( "Error: " + throwable.getMessage() );
throwable.printStackTrace();
}
}
private final static URL[] buildURLList( final File dir )
throws Exception
{
final ArrayList urlList = new ArrayList();
final File[] contents = dir.listFiles();
if( null == contents )
{
return new URL[ 0 ];
}
for( int i = 0; i < contents.length; i++ )
{
File file = contents[ i ];
if( !file.isFile() || !file.canRead() )
{
//ignore non-files or unreadable files
continue;
}
final String name = file.getName();
if( !name.endsWith( ".jar" ) && !name.endsWith( ".zip" ) )
{
//Ifnore files in lib dir that are not jars or zips
continue;
}
file = file.getCanonicalFile();
urlList.add( file.toURL() );
}
return (URL[])urlList.toArray( new URL[ 0 ] );
}
/**
* Finds the myrmidon.jar file in the classpath.
*/
private final static File findInstallDir()
throws Exception
{
final String classpath = System.getProperty( "java.class.path" );
final String pathSeparator = System.getProperty( "path.separator" );
final StringTokenizer tokenizer = new StringTokenizer( classpath, pathSeparator );
while( tokenizer.hasMoreTokens() )
{
final String element = tokenizer.nextToken();
if( element.endsWith( "ant.jar" ) )
{
File file = (new File( element )).getAbsoluteFile();
file = file.getParentFile();
if( null != file )
{
file = file.getParentFile();
}
return file;
}
}
throw new Exception( "Unable to locate ant.jar in classpath" );
}
}