001: /**
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */package org.griphyn.cPlanner.transfer;
015:
016: import org.griphyn.cPlanner.classes.ADag;
017: import org.griphyn.cPlanner.classes.SubInfo;
018: import org.griphyn.cPlanner.classes.PlannerOptions;
019:
020: import org.griphyn.cPlanner.common.PegasusProperties;
021: import org.griphyn.cPlanner.common.LogManager;
022:
023: import org.griphyn.cPlanner.transfer.implementation.ImplementationFactory;
024: import org.griphyn.cPlanner.transfer.implementation.TransferImplementationFactoryException;
025:
026: import java.util.Collection;
027:
028: import java.io.IOException;
029:
030: import java.lang.reflect.InvocationTargetException;
031:
032: /**
033: * The refiner interface, that determines the functions that need to be
034: * implemented to add various types of transfer nodes to the workflow.
035: * The multiple in the name indicates that the refiner works only with the
036: * implementation that handles multiple file transfer per transfer job.
037: *
038: * @author Karan Vahi
039: * @author Gaurang Mehta
040: *
041: * @version $Revision: 50 $
042: */
043: public abstract class MultipleFTPerXFERJobRefiner extends
044: AbstractRefiner {
045:
046: /**
047: * The overloaded constructor.
048: *
049: * @param dag the workflow to which transfer nodes need to be added.
050: * @param properties the <code>PegasusProperties</code> object containing all
051: * the properties required by Pegasus.
052: * @param options the options passed to the planner.
053: */
054: public MultipleFTPerXFERJobRefiner(ADag dag,
055: PegasusProperties properties, PlannerOptions options) {
056: super (dag, properties, options);
057: }
058:
059: /**
060: * Loads the appropriate implementations that is required by this refinement
061: * strategy for different types of transfer jobs. It calls to the factory
062: * method to load the appropriate Implementor.
063: *
064: * Loads the implementing class corresponding to the mode specified by the user
065: * at runtime in the properties file. The properties object passed should not
066: * be null.
067: *
068: * @param properties the <code>PegasusProperties</code> object containing all
069: * the properties required by Pegasus.
070: * @param options the options with which the planner was invoked.
071: *
072: * @exception TransferImplementationFactoryException that nests any error that
073: * might occur during the instantiation.
074: * @exception ClassCastException in case the incompatible implementation is
075: * loaded
076: */
077: public void loadImplementations(PegasusProperties properties,
078: PlannerOptions options)
079: throws TransferImplementationFactoryException {
080:
081: //load
082: this .mTXStageInImplementation = ImplementationFactory
083: .loadInstance(properties, options,
084: ImplementationFactory.TYPE_STAGE_IN);
085: this .mTXStageInImplementation.setRefiner(this );
086: checkCompatibility(this .mTXStageInImplementation);
087:
088: this .mTXInterImplementation = ImplementationFactory
089: .loadInstance(properties, options,
090: ImplementationFactory.TYPE_STAGE_INTER);
091: this .mTXInterImplementation.setRefiner(this );
092: checkCompatibility(this .mTXInterImplementation);
093:
094: this .mTXStageOutImplementation = ImplementationFactory
095: .loadInstance(properties, options,
096: ImplementationFactory.TYPE_STAGE_OUT);
097: this .mTXStageOutImplementation.setRefiner(this );
098: checkCompatibility(this .mTXStageOutImplementation);
099:
100: //log config messages message
101: super .logConfigMessages();
102: }
103:
104: /**
105: * Checks whether the implementation loaded is compatible with the refiner.
106: * If not throws a ClassCastException.
107: *
108: * @param implementation the implementation whose compatibility needs to
109: * be checked.
110: *
111: * @exception ClassCastException in case the implementation is incompatible.
112: */
113: private void checkCompatibility(Implementation implementation)
114: throws ClassCastException {
115: //check if refiner loaded is of special type
116: boolean condition1 = !this .getClass().getName()
117: .equalsIgnoreCase(
118: "org.griphyn.cPlanner.transfer.refiner.Chain");
119:
120: //check if implementation loaded is of right type
121: if (condition1
122: && !(implementation instanceof MultipleFTPerXFERJob)) {
123: throw new ClassCastException(
124: "Wrong type of transfer implementation loaded "
125: + implementation.getDescription()
126: + " for refiner " + this.getDescription());
127: }
128:
129: }
130: }
|