/*
* Copyright 2001-2008 The Apache Software Foundation.
*
* 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.
*
*/
package org.apache.juddi.v3.client.cryptor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.juddi.v3.client.ClassUtil;
import org.apache.juddi.v3.client.config.Property;
/**
* Used to create the org.apache.juddi.cryptor.Cryptor implementation as
* specified by the 'juddi.cryptor' property. Defaults to
* org.apache.juddi.cryptor.DefaultCryptor if an implementation is not
* specified.
*
* @author Steve Viens (sviens@apache.org)
* @author <a href="mailto:jfaath@apache.org">Jeff Faath</a>
*/
public abstract class CryptorFactory { private static final Log log = LogFactory.getLog(CryptorFactory.class);
// the shared Cryptor instance
private static Cryptor cryptor = null; private static Map<String, Cryptor> cache = new HashMap<String, Cryptor>();
/**
* Returns a crypto provider with the matching classname, throws if not
* possible
*
* @param className
* @return a Cryptor instance
* @throws Exception
*/
public static Cryptor getCryptor(String className) throws Exception {
if (cache.containsKey(className)) { return cache.get(className);
}
Class<?> cryptorClass = null;
try {
// Use Loader to locate & load the Cryptor implementation
cryptorClass = ClassUtil.forName(className, CryptorFactory.class); } catch (ClassNotFoundException e) { log.error("The specified Cryptor class '" + className + "' was not found in classpath."); log.error(e); throw e; }
try {
// try to instantiate the Cryptor implementation
cryptor = (Cryptor) cryptorClass.newInstance(); cache.put(className, cryptor); } catch (Exception e) { log.error("Exception while attempting to instantiate the implementation of Cryptor: " + cryptorClass.getName() + "\n" + e.getMessage()); log.error(e); throw e; } return cryptor;
}
/**
* Returns a new instance of a CryptorFactory.
*
* @return Cryptor
*/
public static synchronized Cryptor getCryptor() {
if (cryptor == null) { cryptor = createCryptor();
}
return cryptor;
}
/*
* Returns a new instance of a Cryptor.
*
* @return Cryptor
*/
private static synchronized Cryptor createCryptor() {
if (cryptor != null) { return cryptor;
}
// grab class name of the Cryptor implementation to create
String className = Property.DEFAULT_CRYPTOR;
// write the Cryptor implementation name to the log
log.debug("Cryptor Implementation = " + className); Class<?> cryptorClass = null;
try {
// Use Loader to locate & load the Cryptor implementation
cryptorClass = ClassUtil.forName(className, CryptorFactory.class); } catch (ClassNotFoundException e) { log.error("The specified Cryptor class '" + className + "' was not found in classpath."); log.error(e); } if (cryptorClass != null) {
try {
// try to instantiate the Cryptor implementation
cryptor = (Cryptor) cryptorClass.newInstance(); } catch (Exception e) { log.error("Exception while attempting to instantiate the implementation of Cryptor: " + cryptorClass.getName() + "\n" + e.getMessage()); log.error(e); }
}
return cryptor;
}
protected static String loadKeyFromFile(String provider) {
String fs = System.getProperty("juddi.encryptionKeyFile." + provider); if (fs == null || fs.length() == 0) { return null;
}
File cwd = new File("."); log.debug("CWD="+cwd.getAbsolutePath()); File f = new File(fs); if (f.exists() && f.isFile()) { BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(f)); String line = null; StringBuilder stringBuilder = new StringBuilder(); String ls = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { stringBuilder.append(line); stringBuilder.append(ls);
}
reader.close(); return stringBuilder.toString().trim(); } catch (Exception ex) { log.warn("the system property juddi.encryptionKeyFile." + provider+" is defined, however there was an error reading the file!", ex);
} finally {
if (reader != null) {
try {
reader.close(); } catch (Exception ex) { }
}
}
} else { log.warn("the system property juddi.encryptionKeyFile." + provider+" is defined, however that file either couldn't be found or isn't a file");
}
return null;
}
}