/** * 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.code; import edu.isi.pegasus.planner.classes.PlannerOptions; import edu.isi.pegasus.planner.classes.PegasusBag; import edu.isi.pegasus.planner.code.CodeGenerator; import edu.isi.pegasus.planner.common.PegasusProperties; import edu.isi.pegasus.common.util.DynamicLoader; /** * A factory class to load the appropriate type of Code Generator. The * CodeGenerator implementation is used to write out the concrete plan. * * @author Karan Vahi * @version $Revision$ */ public class CodeGeneratorFactory { /** * The default package where the all the implementing classes are supposed to * reside. */ public static final String DEFAULT_PACKAGE_NAME = "edu.isi.pegasus.planner.code.generator"; /** * The name of the class implementing the condor code generator. */ public static final String CONDOR_CODE_GENERATOR_CLASS = "edu.isi.pegasus.planner.code.generator.condor.CondorGenerator"; /** * The name of the class implementing the Stampede Event Generator */ public static final String STAMPEDE_EVENT_GENERATOR_CLASS = "edu.isi.pegasus.planner.code.generator.Stampede"; /** * This method loads the appropriate implementing code generator as specified * by the user at runtime. If the megadag mode is specified in the options, * then that is used to load the implementing class, overriding the submit * mode specified in the properties file. * * * @param bag the bag of initialization objects. * * @return the instance of the class implementing this interface. * * @exception CodeGeneratorFactoryException that nests any error that * might occur during the instantiation of the implementation. * * @see #DEFAULT_PACKAGE_NAME */ public static CodeGenerator loadInstance( PegasusBag bag ) throws CodeGeneratorFactoryException{ PegasusProperties properties = bag.getPegasusProperties(); PlannerOptions options = bag.getPlannerOptions(); //sanity check if(properties == null){ throw new RuntimeException("Invalid properties passed"); } if(options == null){ throw new RuntimeException("Invalid Options specified"); } //resolve the basename of the class on the basis of the megadag mode String mode = (options == null) ? null: options.getMegaDAGMode(); String className = null; if(mode != null){ //try to see if a special writer needs to be loaded className = (mode.equalsIgnoreCase("daglite"))? "DAGLite": null; //we pick from the properties. } if(className == null){ //pick up the basename/classname from the properties. String submitMode = properties.getSubmitMode(); className = ( submitMode.equals( "condor" ) ) ? CONDOR_CODE_GENERATOR_CLASS : submitMode; } return loadInstance( bag, className ); } /** * This method loads the appropriate code generator as specified by the * user at runtime. * * * @param bag the bag of initialization objects. * @param className the name of the implementing class. * * @return the instance of the class implementing this interface. * * @exception CodeGeneratorFactoryException that nests any error that * might occur during the instantiation of the implementation. * * @see #DEFAULT_PACKAGE_NAME */ public static CodeGenerator loadInstance( PegasusBag bag, String className) throws CodeGeneratorFactoryException{ PegasusProperties properties = bag.getPegasusProperties(); PlannerOptions options = bag.getPlannerOptions(); //sanity check if (properties == null) { throw new RuntimeException( "Invalid properties passed" ); } if (className == null) { throw new RuntimeException( "Invalid className specified" ); } //prepend the package name if classname is actually just a basename className = (className.indexOf('.') == -1) ? //pick up from the default package DEFAULT_PACKAGE_NAME + "." + className : //load directly className; //try loading the class dynamically CodeGenerator cGen = null; try { DynamicLoader dl = new DynamicLoader( className ); cGen = (CodeGenerator) dl.instantiate( new Object[0] ); //initialize the loaded code generator cGen.initialize( bag ); } catch (Exception e) { throw new CodeGeneratorFactoryException( "Instantiating Code Generator ", className, e); } return cGen; } }