/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* 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.kabeja;
import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
/**
* @author <a href="mailto:simon.mieth@gmx.de>simon.mieth@gmx.de</a>
*
*/
public class Loader {
public static final String OPTION_MAIN_CLASS="-main";
public static final String OPTION_LIB_FOLDER="-lib";
public static final String OPTION_CLASSES_FOLDER="-classes";
public String mainClass = "org.kabeja.Main";
private Set classpathEntries = new HashSet();
public Loader() {
//default classpath relative to this
this.classpathEntries.add("lib");
this.classpathEntries.add("classes");
}
public static void main(String[] args) {
Loader l = new Loader();
l.launch(args);
}
public void launch(String[] args) {
args = parseMainClass(args);
URLClassLoader cl = new URLClassLoader(getClasspath());
try {
Class clazz = cl.loadClass(this.mainClass);
Object obj = clazz.newInstance();
// init the project
Method method = clazz.getDeclaredMethod("main",
new Class[] { args.getClass() });
method.invoke(obj, new Object[] { args });
} catch (Exception e) {
e.printStackTrace();
}
}
protected URL[] getClasspath() {
List urls = new ArrayList();
Iterator i = this.classpathEntries.iterator();
while(i.hasNext()){
File f = new File((String)i.next());
try {
if (f.isDirectory() && f.exists()) {
File[] files = f.listFiles();
for (int x = 0; x < files.length; x++) {
String name = files[x].getName().toLowerCase();
if (name.endsWith(".jar") || name.endsWith(".zip")) {
urls.add(files[x].toURL());
}
}
}
urls.add(f.toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
return (URL[]) urls.toArray(new URL[urls.size()]);
}
protected String[] parseMainClass(String[] args) {
List list = new ArrayList();
for (int i = 0; i < args.length; i++) {
if (OPTION_MAIN_CLASS.equals(args[i]) && ((i + 1) < args.length)) {
i++;
this.mainClass = args[i];
}else if(OPTION_LIB_FOLDER.equals(args[i])){
i++;
this.addPathEntries(args[i]);
}else if(OPTION_CLASSES_FOLDER.equals(args[i])){
i++;
this.addPathEntries(args[i]);
}else {
list.add(args[i]);
}
}
return (String[]) list.toArray(new String[list.size()]);
}
protected void addPathEntries(String path){
StringTokenizer st = new StringTokenizer(path,":");
while(st.hasMoreElements()){
String el = (String)st.nextElement();
this.classpathEntries.add(el);
}
}
}