/** * 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.cluster.aggregator; import edu.isi.pegasus.planner.cluster.JobAggregator; import edu.isi.pegasus.planner.common.PegasusProperties; import edu.isi.pegasus.planner.classes.ADag; import edu.isi.pegasus.planner.classes.PegasusBag; import edu.isi.pegasus.common.util.DynamicLoader; /** * A factory class to load the appropriate JobAggregator implementations while * clustering jobs. * * @author Karan Vahi * @version $Revision$ */ public class JobAggregatorFactory { /** * Package to prefix "just" class names with. */ public static final String DEFAULT_PACKAGE_NAME = "edu.isi.pegasus.planner.cluster.aggregator"; /** * The name of the class in this package, that corresponds to seqexec. * This is required to load the correct class, even though the user * specifyies a class that matches on ignoring case, but not directly. */ public static final String SEQ_EXEC_CLASS = "SeqExec"; /** * The name of the class in this package, that corresponds to mpiexec. * This is required to load the correct class, even though the user * specifyies a class that matches on ignoring case, but not directly. */ public static final String MPI_EXEC_CLASS = "MPIExec"; /** * Loads the implementing class corresponding to the mode specified by the user * at runtime in the properties file. The properties object passed should not * be null. * * @param dag the workflow that is being clustered. * @param bag the bag of objects that is useful for initialization. * * @return the instance of the class implementing this interface. * * @throws JobAggregatorFactoryException that nests any error that * might occur during the instantiation * * @see #DEFAULT_PACKAGE_NAME */ public static JobAggregator loadInstance( ADag dag, PegasusBag bag ) { PegasusProperties properties = bag.getPegasusProperties(); //sanity check if( properties == null){ throw new RuntimeException("Invalid properties passed"); } return loadInstance( properties.getJobAggregator(), dag, bag ); } /** * Loads the implementing class corresponding to the class passed. * * @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 dag the workflow that is being clustered. * @param bag the bag of objects that is useful for initialization. * * @return the instance of the class implementing this interface. * * @throws JobAggregatorFactoryException that nests any error that * might occur during the instantiation * * @see #DEFAULT_PACKAGE_NAME */ public static JobAggregator loadInstance( String className, ADag dag, PegasusBag bag ) { //sanity check if( bag.getPegasusProperties() == null){ throw new RuntimeException("Invalid properties passed"); } if(className == null){ throw new RuntimeException("Invalid class specified to load"); } JobAggregator ja = null; try{ //ensure that correct class is picked up in case //of mpiexec and seqexec if(className.equalsIgnoreCase(MPI_EXEC_CLASS)){ className = MPI_EXEC_CLASS; } else if(className.equalsIgnoreCase(SEQ_EXEC_CLASS)){ className = SEQ_EXEC_CLASS; } //prepend the package name if required 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[0]; ja = (JobAggregator) dl.instantiate(argList); ja.initialize( dag, bag ); } catch ( Exception e ) { throw new JobAggregatorFactoryException("Instantiating JobAggregator ", className, e); } return ja; } }