/**
* Copyright 2007-2008 University Of Southern California
*
* 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 edu.isi.pegasus.planner.selector.replica;
import edu.isi.pegasus.planner.selector.ReplicaSelector;
import edu.isi.pegasus.planner.common.PegasusProperties;
import edu.isi.pegasus.common.util.DynamicLoader;
/**
* A factory class to load the appropriate type of Replica Selector, as
* specified by the user at runtime in properties. Each invocation of the
* factory results in a ReplicaSelector being instantiated.
*
* @author Karan Vahi
* @version $Revision$
*/
public class ReplicaSelectorFactory {
/**
* The default package where the all the implementing classes provided with
* the VDS reside.
*/
public static final String DEFAULT_PACKAGE_NAME =
"edu.isi.pegasus.planner.selector.replica";
/**
* The name of the class in the DEFAULT package, that corresponds to the
* default replica selector.
*/
public static final String DEFAULT_REPLICA_SELECTOR = "Default";
/**
* A no hassle factory method that loads the replica selector specified
* in the properties. The properties are obtained from the property
* singleton. A default replica selector is loaded if property is not
* specified in the properties.
*
* @return the instance of the class implementing this interface.
*
* @exception ReplicaSelectorFactoryException that chains any error that
* might occur during the instantiation
*
* @see #DEFAULT_PACKAGE_NAME
* @see #DEFAULT_REPLICA_SELECTOR
*/
public static ReplicaSelector loadInstance()
throws ReplicaSelectorFactoryException {
return loadInstance( PegasusProperties.getInstance());
}
/**
* Loads the implementing class corresponding to the mode specified by the user
* at runtime in the properties file. A default replica selector is loaded
* if property is not specified in the properties.
*
* @param properties the <code>PegasusProperties</code> object containing all
* the properties required by Pegasus.
*
* @return the instance of the class implementing this interface.
*
* @exception ReplicaSelectorFactoryException that chains any error that
* might occur during the instantiation
*
* @see #DEFAULT_PACKAGE_NAME
* @see #DEFAULT_REPLICA_SELECTOR
*/
public static ReplicaSelector loadInstance(PegasusProperties properties)
throws ReplicaSelectorFactoryException {
String className = null;
//sanity check
try{
if(properties == null){
throw new RuntimeException("Invalid properties passed");
}
//figure out the implementing class
//that needs to be instantiated.
className = properties.getReplicaSelector();
className = (className == null || className.trim().length() < 2)?
DEFAULT_REPLICA_SELECTOR:
className;
}
catch( Exception e ){
throw new
ReplicaSelectorFactoryException( "Instantiating ReplicaSelector ",e );
}
return loadInstance(properties,className);
}
/**
* Loads the implementing class corresponding to the class. If the package
* name is not specified with the class, then class is assumed to be
* in the DEFAULT_PACKAGE. The properties object passed should not be null.
*
* @param className the name of the class that implements the mode. It is the
* name of the class, not the complete name with package. That
* is added by itself.
* @param properties the <code>PegasusProperties</code> object containing all
* the properties required by Pegasus.
*
* @return the instance of the class implementing this interface.
*
* @exception ReplicaSelectorFactoryException that chains any error that
* might occur during the instantiation
*
* @see #DEFAULT_PACKAGE_NAME
*/
public static ReplicaSelector loadInstance(PegasusProperties properties,
String className)
throws ReplicaSelectorFactoryException{
ReplicaSelector rs = null;
try{
//some sanity checks
if(properties == null){
throw new RuntimeException("Invalid properties passed");
}
if(className == null){
throw new RuntimeException("Invalid className specified");
}
//prepend the package name
className = (className.indexOf('.') == -1)?
//pick up from the default package
DEFAULT_PACKAGE_NAME + "." + className:
//load directly
className;
//try loading the class dynamically
DynamicLoader dl = new DynamicLoader(className);
Object argList[] = new Object[1];
argList[0] = properties;
rs = (ReplicaSelector) dl.instantiate(argList);
}
catch(Exception e){
//chain the exception caught into the appropriate Factory Exception
throw new
ReplicaSelectorFactoryException( "Instantiating ReplicaSelector ",
className, e );
}
return rs;
}
}