import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.List;
import java.util.StringTokenizer;
import javax.management.MBeanServer;
import org.apache.catalina.Globals;
import org.apache.catalina.security.SecurityClassLoad;
+import org.apache.catalina.startup.ClassLoaderFactory.Repository;
+import org.apache.catalina.startup.ClassLoaderFactory.RepositoryType;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
if ((value == null) || (value.equals("")))
return parent;
- ArrayList<String> repositoryLocations = new ArrayList<String>();
- ArrayList<Integer> repositoryTypes = new ArrayList<Integer>();
+ List<Repository> repositories = new ArrayList<Repository>();
int i;
StringTokenizer tokenizer = new StringTokenizer(value, ",");
// Check for a JAR URL repository
try {
new URL(repository);
- repositoryLocations.add(repository);
- repositoryTypes.add(ClassLoaderFactory.IS_URL);
+ repositories.add(
+ new Repository(repository, RepositoryType.URL));
continue;
} catch (MalformedURLException e) {
// Ignore
if (repository.endsWith("*.jar")) {
repository = repository.substring
(0, repository.length() - "*.jar".length());
- repositoryLocations.add(repository);
- repositoryTypes.add(ClassLoaderFactory.IS_GLOB);
+ repositories.add(
+ new Repository(repository, RepositoryType.GLOB));
} else if (repository.endsWith(".jar")) {
- repositoryLocations.add(repository);
- repositoryTypes.add(ClassLoaderFactory.IS_JAR);
+ repositories.add(
+ new Repository(repository, RepositoryType.JAR));
} else {
- repositoryLocations.add(repository);
- repositoryTypes.add(ClassLoaderFactory.IS_DIR);
+ repositories.add(
+ new Repository(repository, RepositoryType.DIR));
}
}
- String[] locations = repositoryLocations.toArray(new String[0]);
- Integer[] types = repositoryTypes.toArray(new Integer[0]);
-
ClassLoader classLoader = ClassLoaderFactory.createClassLoader
- (locations, types, parent);
+ (repositories, parent);
// Retrieving MBean server
MBeanServer mBeanServer = null;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.apache.catalina.loader.StandardClassLoader;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.util.res.StringManager;
/**
private static final Log log = LogFactory.getLog(ClassLoaderFactory.class);
- private static final StringManager sm =
- StringManager.getManager(Constants.Package);
-
- protected static final Integer IS_DIR = Integer.valueOf(0);
- protected static final Integer IS_JAR = Integer.valueOf(1);
- protected static final Integer IS_GLOB = Integer.valueOf(2);
- protected static final Integer IS_URL = Integer.valueOf(3);
-
// --------------------------------------------------------- Public Methods
*
* @exception Exception if an error occurs constructing the class loader
*/
- public static ClassLoader createClassLoader(String locations[],
- Integer types[],
+ public static ClassLoader createClassLoader(List<Repository> repositories,
final ClassLoader parent)
throws Exception {
// Construct the "class path" for this class loader
Set<URL> set = new LinkedHashSet<URL>();
- if (locations != null && types != null && locations.length == types.length) {
- for (int i = 0; i < locations.length; i++) {
- String location = locations[i];
- if ( types[i] == IS_URL ) {
- URL url = new URL(location);
+ if (repositories != null) {
+ for (Repository repository : repositories) {
+ if (repository.getType() == RepositoryType.URL) {
+ URL url = new URL(repository.getLocation());
if (log.isDebugEnabled())
log.debug(" Including URL " + url);
set.add(url);
- } else if ( types[i] == IS_DIR ) {
- File directory = new File(location);
+ } else if (repository.getType() == RepositoryType.DIR) {
+ File directory = new File(repository.getLocation());
directory = new File(directory.getCanonicalPath());
if (!directory.exists() || !directory.isDirectory() ||
!directory.canRead())
if (log.isDebugEnabled())
log.debug(" Including directory " + url);
set.add(url);
- } else if ( types[i] == IS_JAR ) {
- File file=new File(location);
+ } else if (repository.getType() == RepositoryType.JAR) {
+ File file=new File(repository.getLocation());
file = new File(file.getCanonicalPath());
if (!file.exists() || !file.canRead())
continue;
if (log.isDebugEnabled())
log.debug(" Including jar file " + url);
set.add(url);
- } else if ( types[i] == IS_GLOB ) {
- File directory=new File(location);
+ } else if (repository.getType() == RepositoryType.GLOB) {
+ File directory=new File(repository.getLocation());
if (!directory.exists() || !directory.isDirectory() ||
!directory.canRead()) {
- log.warn(sm.getString("classLoaderFactory.badDirectory",
- directory.getAbsolutePath(),
- Boolean.valueOf(directory.exists()),
- Boolean.valueOf(directory.isDirectory()),
- Boolean.valueOf(directory.canRead())));
+ log.warn("Problem with directory [" +
+ directory.getAbsolutePath() + "], exists: [" +
+ directory.exists() + "], isDirectory: [" +
+ directory.isDirectory() + "], canRead: [" +
+ directory.canRead() + "]");
continue;
}
if (log.isDebugEnabled())
}
+ public static enum RepositoryType {
+ DIR,
+ GLOB,
+ JAR,
+ URL
+ }
+
+ public static class Repository {
+ private String location;
+ private RepositoryType type;
+
+ public Repository(String location, RepositoryType type) {
+ this.location = location;
+ this.type = type;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public RepositoryType getType() {
+ return type;
+ }
+ }
}