package runjettyrun;
/*
* $Id$
* $HeadURL$
*
* ==============================================================================
* 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.
*/
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.webapp.WebAppClassLoader;
import org.eclipse.jetty.webapp.WebAppContext;
/**
* Uses the provided class path ONLY, rather than also supporting the adding of
* the jars in the WEB-INF/lib directory, and the adding of the classes in the
* WEB-INF/classes directory.
*
* @author jsynge
*/
public class ProjectClassLoader extends WebAppClassLoader {
private boolean initialized = false;
private static List<String> classpaths = new ArrayList<String>();
public ProjectClassLoader(WebAppContext context, String projectClassPath,
String excluded) throws IOException {
this(context, projectClassPath, excluded, true);
}
public ProjectClassLoader(WebAppContext context, String projectClassPath,
String excluded, boolean logger) throws IOException {
super(context);
/*
* As reported in these bugs:
*
* http://code.google.com/p/run-jetty-run/issues/detail?id=25
* http://code.google.com/p/run-jetty-run/issues/detail?id=26
*
* the path separator defined by Java (java.io.File.pathSeparator) (and
* used by the run-jetty-run plug-in) may not match the one used by
* Jetty (which is expects it to be either a comma or a semi-colon).
* Rather than move away from the standard path separator, I'm choosing
* to split the projectClassPath, and hand each entry to the super
* class, one at a time.
*/
if(projectClassPath!=null){
StringBuffer excludedString = new StringBuffer();
String[] tokens = projectClassPath.split(String.valueOf(File.pathSeparatorChar));
for(String entry:tokens){
String path = entry;
if(path.startsWith("-y-")|| path.startsWith("-n-")){ //backard compatiable.
path = path.substring(3);
}
if(entry.startsWith("-n-")){
if (logger) excludedString.append("Excluded entry="+ path+" \n");
}else{
if (logger) System.err.println("ProjectClassLoader: entry="+ path);
classpaths.add(path);
super.addClassPath( path);
}
}
System.err.print(excludedString.toString());
}
initialized = true;
}
/**
* code fix for a strange case with Beanshell suuport , see Issue #53 for
* more detail http://code.google.com/p/run-jetty-run/issues/detail?id=53
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class loadClass(String name) throws ClassNotFoundException {
try {
return loadClass(name, false);
} catch (NoClassDefFoundError e) {
throw new ClassNotFoundException(name);
}
}
public void addClassPath(String classPath) throws IOException {
if (initialized) {
/*
* Disable the adding of directories to the class path after
* initialization with the project class path. XXX Except for the
* addition of the WEB-INF/classes
*/
if (!classPath.endsWith("WEB-INF/classes/"))
return;
}
super.addClassPath(classPath);
return;
}
public void addJars(Resource lib) {
if (initialized) {
/*
* Disable the adding of jars (or folders of jars) to the class path
* after initialization with the project class path.
*/
return;
}
super.addJars(lib);
return;
}
/**
* TODO review this later , it's just a temp workaround. :(
* @return
*/
public static List<String> getClasspaths() {
return classpaths;
}
}