/*
* Copyright (c) 2002-2009 Juwi MacMillan Group GmbH (JuwiMM)
* Bockhorn 1, 29664 Walsrode, Germany
* All rights reserved.
*
* This software is the confidential and proprietary information of JuwiMM
* ("Confidential Information"). You shall not disclose such
* Confidential Information and shall use it only in accordance with the
* terms of the license agreement you entered into with JuwiMM.
*/
package org.tizzit.core.classloading;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import javax.servlet.ServletContext;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* @author <a href="mailto:eduard.siebert@juwimm.com">Eduard Siebert</a>
* company Juwi MacMillan Group GmbH, Walsrode, Germany
* @version $Id$
* @since tizzit-core 07.10.2009
*/
public class ExternalLibClassLoaderManager {
private static final Log log = LogFactory.getLog(ExternalLibClassLoaderManager.class);
private static final String PROPERTY_FILE = "tizzit.properties";
private static ClassLoader externalLibClassLoader = null;
private ExternalLibClassLoaderManager() {
// only allow static usage
}
public static ClassLoader getClassLoader() {
if (externalLibClassLoader == null) { throw new ExternalLibClassLoaderCreationException("'ExternalLibClassLoader' was not initialized on start up!"); }
return ExternalLibClassLoaderManager.externalLibClassLoader;
}
protected static synchronized ClassLoader createExternalLibClassLoader(ServletContext servletContext) {
if (log.isDebugEnabled()) log.debug("createExternalLibClassLoader() -> begin");
// if there is no classloader, create one
if (ExternalLibClassLoaderManager.externalLibClassLoader == null) {
if (log.isDebugEnabled()) log.debug("Creating singelton of 'ExternalLibClassLoader'!");
// create the URL classloader
Properties props = ExternalLibClassLoaderManager.getProperties();
String externalLibPath = props.getProperty("tizzitPropertiesBeanSpring.externalLib.path");
if (log.isDebugEnabled()) log.debug("externalLibPath: " + externalLibPath);
try {
URL[] urls = null;
List<URL> urlList = getURLList(externalLibPath);
if (urlList != null && urlList.size() > 0) {
urls = new URL[urlList.size()];
urlList.toArray(urls);
}
//return new URLClassLoader(urls, ReloadingClassloaderManager.class.getClassLoader());
final ClassLoader classLoader = new ExternalLibClassLoader(urls, ExternalLibClassLoaderManager.class.getClassLoader());
ExternalLibClassLoaderManager.externalLibClassLoader = classLoader;
} catch (Exception e) {
throw new ExternalLibClassLoaderCreationException("Error while creating the ExternalLibClassLoader with path: '" + externalLibPath + "'.", e);
}
}
if (log.isDebugEnabled()) log.debug("createExternalLibClassLoader() -> end");
return ExternalLibClassLoaderManager.externalLibClassLoader;
}
public static List<File> getFileList(String path) throws Exception {
File startFileOrDir = new File(new URI(path));
validateDirectory(startFileOrDir);
List<File> result = getFileList(startFileOrDir);
return result;
}
private static List<File> getFileList(File startDir) throws Exception {
List<File> result = new ArrayList<File>();
File[] filesAndDirs = startDir.listFiles();
List<File> filesDirs = Arrays.asList(filesAndDirs);
for (File file : filesDirs) {
if (file.isDirectory()) {
//recursive call!
if(!file.getName().startsWith("."))
result.addAll(getFileList(file));
} else {
if (log.isDebugEnabled()) log.debug("Adding URL '" + file.getAbsolutePath() + "'.");
result.add(file);
}
}
return result;
}
public static List<URL> getURLList(String path) throws Exception {
List<URL> retVal = null;
List<File> files = getFileList(path);
if (files != null && files.size() > 0) {
retVal = new ArrayList<URL>(files.size());
for (File file : files) {
retVal.add(file.toURL());
}
}
return retVal;
}
private static void validateDirectory(File directory) throws FileNotFoundException {
if (log.isDebugEnabled()) log.debug("validateDirectory() -> begin");
if (directory == null) { throw new IllegalArgumentException("Directory should not be null."); }
if (!directory.exists()) { throw new FileNotFoundException("Directory does not exist: " + directory); }
if (!directory.isDirectory()) { throw new IllegalArgumentException("Is not a directory: " + directory); }
if (!directory.canRead()) { throw new IllegalArgumentException("Directory cannot be read: " + directory); }
if (log.isDebugEnabled()) log.debug("validateDirectory() -> end");
}
private static Properties getProperties() {
Properties props = new Properties();
InputStream in = null;
try {
in = ExternalLibClassLoaderManager.class.getClassLoader().getResourceAsStream(PROPERTY_FILE);
props.load(in);
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
IOUtils.closeQuietly(in);
in = null;
}
return props;
}
}