/**
* 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.generator;
import edu.isi.pegasus.common.logging.LogManager;
import edu.isi.pegasus.planner.catalog.ReplicaCatalog;
import edu.isi.pegasus.planner.catalog.replica.ReplicaCatalogEntry;
import edu.isi.pegasus.planner.catalog.replica.ReplicaFactory;
import edu.isi.pegasus.planner.classes.ADag;
import edu.isi.pegasus.planner.classes.Job;
import edu.isi.pegasus.planner.classes.PegasusBag;
import edu.isi.pegasus.planner.classes.PlannerOptions;
import edu.isi.pegasus.planner.classes.ReplicaLocation;
import edu.isi.pegasus.planner.classes.ReplicaStore;
import edu.isi.pegasus.planner.code.CodeGenerator;
import edu.isi.pegasus.planner.code.CodeGeneratorException;
import edu.isi.pegasus.planner.common.PegasusProperties;
import java.io.File;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Properties;
/**
* A generator that writes out the replica store containing a file based replica
* catalog that has the file locations mentioned in the DAX.
*
* @author Karan Vahi
* @version $Revision$
*/
public class DAXReplicaStore implements CodeGenerator {
/**
* The name of the source key for Replica Catalog Implementer that serves as
* the repository for DAX Replica Store
*/
public static final String DAX_REPLICA_STORE_CATALOG_KEY = "file";
/**
* The name of the Replica Catalog Implementer that serves as the source for
* cache files.
*/
public static final String DAX_REPLICA_STORE_CATALOG_IMPLEMENTER = "SimpleFile";
/**
* Suffix to be applied for cache file generation.
*/
private static final String CACHE_FILE_SUFFIX = ".cache";
/**
* Suffix to be applied for the DAX Replica Store.
*/
private static final String DAX_REPLICA_STORE_SUFFIX = ".replica.store";
/**
* The bag of initialization objects.
*/
protected PegasusBag mBag;
/**
* The directory where all the submit files are to be generated.
*/
protected String mSubmitFileDir;
/**
* The object holding all the properties pertaining to Pegasus.
*/
protected PegasusProperties mProps;
/**
* The object containing the command line options specified to the planner
* at runtime.
*/
protected PlannerOptions mPOptions;
/**
* The handle to the logging object.
*/
protected LogManager mLogger;
/**
* Returns the path to the DAX Replica Store File.
*
* @param options the options for the sub workflow.
* @param label the label for the workflow.
* @param index the index for the workflow.
*
* @return the name of the cache file
*/
public static String getDAXReplicaStoreFile( PlannerOptions options, String label , String index ){
StringBuffer sb = new StringBuffer();
sb.append( options.getSubmitDirectory()).
append( File.separator ).
append( Abstract.getDAGFilename(options, label, index, DAXReplicaStore.DAX_REPLICA_STORE_SUFFIX ) );
return sb.toString();
}
/**
* Initializes the Code Generator implementation.
*
* @param bag
* the bag of initialization objects.
*
* @throws CodeGeneratorException
* in case of any error occurring code generation.
*/
public void initialize(PegasusBag bag) throws CodeGeneratorException {
mBag = bag;
mProps = bag.getPegasusProperties();
mPOptions = bag.getPlannerOptions();
mSubmitFileDir = mPOptions.getSubmitDirectory();
mLogger = bag.getLogger();
}
/**
* Generates the notifications input file. The method initially generates
* work-flow level notification records, followed by job-level notification
* records.
*
* @param dag the concrete work-flow.
*
* @return the Collection of <code>File</code> objects for the files written
* out.
*
* @throws CodeGeneratorException
* in case of any error occurring code generation.
*/
public Collection<File> generateCode(ADag dag)
throws CodeGeneratorException {
//sanity check
if( dag.getReplicaStore().isEmpty() ){
return new LinkedList<File>();
}
ReplicaCatalog rc = null;
Properties replicaStoreProps = mProps.getVDSProperties().matchingSubset(
ReplicaCatalog.c_prefix,
false );
File file = new File ( getDAXReplicaStoreFile( this.mPOptions, dag.getLabel(), dag.getIndex() ) );
//set the appropriate property to designate path to file
replicaStoreProps.setProperty( DAXReplicaStore.DAX_REPLICA_STORE_CATALOG_KEY, file.getAbsolutePath() );
mLogger.log("Writing out the DAX Replica Store to file " + file.getAbsolutePath(),
LogManager.DEBUG_MESSAGE_LEVEL );
try{
rc = ReplicaFactory.loadInstance(
DAXReplicaStore.DAX_REPLICA_STORE_CATALOG_IMPLEMENTER,
replicaStoreProps);
}
catch( Exception e ){
throw new RuntimeException( "Unable to initialize the DAX Replica Store File " + file,
e );
}
//get hold of DAX Replica Store
ReplicaStore store = dag.getReplicaStore();
for( Iterator it = store.replicaLocationIterator(); it.hasNext() ;){
ReplicaLocation rl = (ReplicaLocation)it.next();
String lfn = rl.getLFN();
for( Iterator rceIt = rl.pfnIterator(); rceIt.hasNext(); ){
ReplicaCatalogEntry rce = (ReplicaCatalogEntry) rceIt.next();
rc.insert(lfn, rce);
}
}
rc.close();
Collection<File> result = new LinkedList<File>();
result.add( file );
return result;
}
/**
*
* Not implemented
*
* @param dag the work-flow
* @param job the job for which the code is to be generated.
*
* @throws edu.isi.pegasus.planner.code.CodeGeneratorException
*/
public void generateCode(ADag dag, Job job) throws CodeGeneratorException {
throw new CodeGeneratorException( "Replica Store generator only generates code for the whole workflow" );
}
/**
* Not implemented
*/
public boolean startMonitoring() {
throw new UnsupportedOperationException("Not supported yet.");
}
/**
* Not implemented
*/
public void reset() throws CodeGeneratorException {
throw new UnsupportedOperationException("Not supported yet.");
}
}