/** * 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.refiner; import edu.isi.pegasus.planner.classes.ADag; import edu.isi.pegasus.planner.classes.PegasusBag; import edu.isi.pegasus.planner.refiner.createdir.Implementation; import edu.isi.pegasus.planner.refiner.createdir.Strategy; import edu.isi.pegasus.planner.common.PegasusProperties; import edu.isi.pegasus.common.util.DynamicLoader; import edu.isi.pegasus.common.util.FactoryException; /** * This common interface that identifies the basic functions that need to be * implemented to introduce random directories in which the jobs are executed on * the remote execution pools. The implementing classes are invoked when the user * gives the --randomdir option. The implementing classes determine where in the * graph the nodes creating the random directories are placed and their * dependencies with the rest of the nodes in the graph. * * @author Karan Vahi * @author Gaurang Mehta * * @version $Revision$ */ public class CreateDirectory extends Engine { /** * The name of the package in which all the implementing classes are. */ public static final String PACKAGE_NAME = "edu.isi.pegasus.planner.refiner.createdir"; /** * It is a reference to the Concrete Dag so far. */ protected ADag mCurrentDag; /** * Loads the implementing class corresponding to the mode specified by the * user at runtime. * * @param bag bag of initialization objects * * * @return instance of a CreateDirecctory implementation * * @throws FactoryException that nests any error that * might occur during the instantiation of the implementation. */ public static Strategy loadCreateDirectoryStraegyInstance( PegasusBag bag ) throws FactoryException { PegasusProperties props = bag.getPegasusProperties(); if( props == null ){ throw new FactoryException( "Properties instance is null " ); } String className = props.getCreateDirClass(); //prepend the package name className = PACKAGE_NAME + "." + className; //try loading the class dynamically Strategy cd = null; DynamicLoader dl = new DynamicLoader(className); try { Object argList[] = new Object[ 0 ]; cd = ( Strategy ) dl.instantiate( argList ); cd.initialize( bag, CreateDirectory.loadCreateDirectoryImplementationInstance( bag ) ); } catch (Exception e) { throw new FactoryException( "Instantiating Create Directory Strategy", className, e ); } return cd; } /** * Loads the implementing class corresponding to the mode specified by the * user at runtime. * * @param bag bag of initialization objects * * * @return instance of a CreateDirecctory implementation * * @throws FactoryException that nests any error that * might occur during the instantiation of the implementation. */ public static Implementation loadCreateDirectoryImplementationInstance( PegasusBag bag ) throws FactoryException { PegasusProperties props = bag.getPegasusProperties(); if( props == null ){ throw new FactoryException( "Properties instance is null " ); } String className = props.getCreateDirImplementation(); //for now //className = "DefaultImplementation"; //prepend the package name className = PACKAGE_NAME + "." + className; //try loading the class dynamically Implementation impl = null; DynamicLoader dl = new DynamicLoader(className); try { Object argList[] = new Object[ 0 ]; impl = ( Implementation ) dl.instantiate( argList ); impl.initialize( bag ); } catch (Exception e) { throw new FactoryException( "Instantiating Create Directory", className, e ); } return impl; } /** * A pratically nothing constructor ! * * * @param bag bag of initialization objects */ protected CreateDirectory( PegasusBag bag ) { super( bag ); } /** * It modifies the concrete dag passed in the constructor and adds the create * random directory nodes to it at the root level. These directory nodes have * a common child that acts as a concatenating job and ensures that Condor * does not start staging in the data before the directories have been added. * The root nodes in the unmodified dag are now chidren of this concatenating * dummy job. * * @param dag the workflow to which nodes have to be added * * @return workflow with nodes added. */ public ADag addCreateDirectoryNodes( ADag dag ){ Strategy s = CreateDirectory.loadCreateDirectoryStraegyInstance( mBag ); return s.addCreateDirectoryNodes( dag ); } }