All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.intarsys.tools.reflect.ClassLoaderTools Maven / Gradle / Ivy

There is a newer version: 4.11
Show newest version
package de.intarsys.tools.reflect;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

import de.intarsys.tools.string.StringTools;

/**
 * Tool methods for handling {@link ClassLoader} instances.
 */
public class ClassLoaderTools {

	public static ClassLoader createClassLoader(ClassLoader parent,
			File baseDir, String classpath, String classpathScan,
			String classpathScanExclude) {
		URL[] urlArray = createURLs(baseDir, classpath, classpathScan,
				classpathScanExclude);
		URLClassLoader classLoader = new URLClassLoader(urlArray, parent);
		return classLoader;
	}

	public static void createURL(List urls, File file) {
		if (file.isFile()) {
			try {
				urls.add(new URL("file", "", file.getAbsolutePath())); //$NON-NLS-1$ //$NON-NLS-2$
			} catch (MalformedURLException e) {
				// couldn't possibly happen
			}
		} else {
			try {
				urls.add(new URL("file", "", file.getAbsolutePath() //$NON-NLS-1$ //$NON-NLS-2$
						+ "/")); //$NON-NLS-1$
			} catch (MalformedURLException e) {
				// couldn't possibly happen
			}
		}
	}

	public static URL[] createURLs(File baseDir, String classpath,
			String classpathScan, String classpathScanExclude) {
		List urls = new ArrayList();
		//
		if (!StringTools.isEmpty(classpath)) {
			String[] names = classpath.split(";");
			for (String name : names) {
				File file = new File(name);
				if (!file.isAbsolute()) {
					file = new File(baseDir, name);
				}
				createURL(urls, file);
			}
		}
		//
		if (!StringTools.isEmpty(classpathScan)) {
			String[] names = classpathScan.split(";");
			List exclude;
			if (StringTools.isEmpty(classpathScanExclude)) {
				exclude = new ArrayList();
			} else {
				exclude = Arrays.asList(classpathScanExclude.split(";"));
			}
			for (String name : names) {
				File file = new File(name);
				if (!file.isAbsolute()) {
					file = new File(baseDir, name);
				}
				createURLScanJar(urls, file, exclude);
			}
		}
		//
		URL[] urlArray = urls.toArray(new URL[urls.size()]);
		return urlArray;
	}

	public static URL[] createURLs(URL codebase, String classpath,
			boolean relativeOnly) throws IOException {
		String codebaseString = codebase.toString();
		List urls = new ArrayList();
		//
		if (!StringTools.isEmpty(classpath)) {
			StringTokenizer st = new StringTokenizer(classpath, ";");
			while (st.hasMoreElements()) {
				String name = st.nextToken();
				URL newUrl = new URL(codebase, name.trim());
				if (relativeOnly) {
					if (!newUrl.toString().startsWith(codebaseString)) {
						throw new IOException("url " + newUrl
								+ " not relative to " + codebaseString);
					}
				}
				urls.add(newUrl);
			}
		}
		//
		URL[] urlArray = urls.toArray(new URL[urls.size()]);
		return urlArray;
	}

	public static void createURLScanJar(List result, File directory,
			final List exclude) {
		File[] jarFiles = directory.listFiles(new FileFilter() {
			public boolean accept(File path) {
				return (path.isFile() && path.canRead()
						&& path.getName().toLowerCase().endsWith(".jar") && !exclude
						.contains(path.getName()));
			}
		});
		if (jarFiles != null) {
			for (File file : jarFiles) {
				try {
					result.add(new URL("file", "", file.getAbsolutePath())); //$NON-NLS-1$ //$NON-NLS-2$
				} catch (MalformedURLException e) {
					// couldn't possibly happen
				}
			}
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy