/** * 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.transfer.implementation; import edu.isi.pegasus.planner.classes.TransferJob; import edu.isi.pegasus.planner.classes.PegasusBag; import edu.isi.pegasus.planner.namespace.Pegasus; import java.io.File; /** * The implementation that is used to create transfer jobs that callout to * the new globus-url-copy client, that support multiple file transfers * * <p> * In order to use the transfer implementation implemented by this class, * <pre> * - the property pegasus.transfer.*.impl must be set to value TPTGUC. * </pre> * * <p> * There should be an entry in the transformation catalog with the fully qualified * name as <code>globus::guc</code> for all the sites where workflow is run, * or on the local site in case of third party transfers. * * Pegasus can automatically construct the path to the globus-url-copy client, if * the environment variable GLOBUS_LOCATION is specified in the site catalog for * the site. * * <p> * The arguments with which the client is invoked can be specified * <pre> * - by specifying the property pegasus.transfer.arguments * - associating the Pegasus profile key transfer.arguments * </pre> * * @author Karan Vahi * @version $Revision$ */ public class TPTGUC extends GUC { /** * The overloaded constructor, that is called by the Factory to load the * class. * * @param bag the bag of Pegasus initialization objects. */ public TPTGUC( PegasusBag bag ){ super( bag ); } /** * Return a boolean indicating whether the transfers to be done always in * a third party transfer mode. A value of false, results in the * direct or peer to peer transfers being done. * <p> * A value of false does not preclude third party transfers. They still can * be done, by setting the property "pegasus.transfer.*.thirdparty.sites". * * @return true always * */ public boolean useThirdPartyTransferAlways(){ return true; } /** * It constructs the arguments to the transfer executable that need to be passed * to the executable referred to in this transfer mode. * * @param job the object containing the transfer node. * @return the argument string */ protected String generateArgumentString( TransferJob job ) { StringBuffer sb = new StringBuffer(); if(job.vdsNS.containsKey( Pegasus.TRANSFER_ARGUMENTS_KEY ) ){ sb.append( job.vdsNS.removeKey(Pegasus.TRANSFER_ARGUMENTS_KEY) ); } else{ //just add the default -p option sb.append(" -p ").append( mNumOfTXStreams ); } //always append -cd option and verbose option sb.append( " -cd -vb" ); //specify the name of the stdin file on command line //since this transfer mode only executes on submit node //we can give full path to the stdin File f = new File( mPOptions.getSubmitDirectory(), job.getStdIn() ); sb.append( " -f " ).append( f.getAbsolutePath() ); return sb.toString(); } /** * Makes sure the stdin is transferred by the Condor File Transfer * Mechanism. In addition, the stdin is set to null, after the file has * been marked for transfer by Condor File Transfer Mechanism. * * @param job the <code>TransferJob</code> that has been created. */ public void postProcess( TransferJob job ){ super.postProcess(job); job.setStdIn( "" ); } }