// Copyright 2000-2004, FreeHEP.
package org.freehep.util;
import java.io.*;
import java.util.*;
/**
* Methods to use factories (a la JAXP).
*
* @author Mark Donszelmann
* @version $Id: Factory.java 8584 2006-08-10 23:06:37Z duns $
*/
public class Factory {
// static class
private Factory() {
}
/**
* Find the correct factory name, based on the following procedure:
* <ol>
* <li>Use the specified system property: factoryName.
* <li>Use the specified property file in JAVA_HOME/lib/<factoryFile> and the
* specified property: factoryName.
* <li>Use the Services API (as detailed in the JAR specification) to look
* for the classname in META-INF/services/<factoryName>.
* <li>Use the specfied default factory: defaultFactory.
* </ol>
*
* @param factoryName name to be used for lookup
* @param factoryFile filename to look for in JAVA_HOME/lib
* @param defaultFactory name of the default factory
* @return the name of the factory according to the procedure above
*/
public static String findFactory(String factoryName, String factoryFile, String defaultFactory) {
// try System Property
String factory = null;
try {
factory = System.getProperty(factoryName);
if (factory != null) {
return factory;
}
} catch(SecurityException securityexception) {
}
// try JAVA_HOME/lib
try {
String javaHome = System.getProperty("java.home");
String configFile = javaHome + File.separator + "lib" + File.separator + factoryFile;
File file = new File(configFile);
if (file.exists()) {
Properties props = new Properties();
props.load(new FileInputStream(file));
factory = props.getProperty(factoryName);
if (factory != null) {
return factory;
}
}
} catch(Exception e) {
e.printStackTrace();
}
// try Services API
String service1 = "meta-inf/services/" + factoryName;
String service2 = "META-INF/services/" + factoryName;
try {
ClassLoader loader = null;
try {
loader = Class.forName("org.freehep.util.Factory").getClassLoader();
} catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
InputStream stream = null;
if (loader == null) {
stream = ClassLoader.getSystemResourceAsStream(service1);
} else {
stream = loader.getResourceAsStream(service1);
}
if (stream == null) {
if (loader == null) {
stream = ClassLoader.getSystemResourceAsStream(service2);
} else {
stream = loader.getResourceAsStream(service2);
}
}
if(stream != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
factory = reader.readLine();
reader.close();
if (factory != null && !factory.equals("")) {
return factory;
}
}
} catch(Exception e) {
e.printStackTrace();
}
return defaultFactory;
}
public static Object loadFactory(String name, String file, String defaultImplementation) {
String factoryName = findFactory(name, file, defaultImplementation);
try {
System.out.println("Loading factory: "+factoryName);
Class factoryClass = Class.forName(factoryName);
return factoryClass.newInstance();
} catch (Exception e) {
System.err.println("Unable to load factory: "+factoryName);
e.printStackTrace();
}
return null;
}
}