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: */
015: package org.griphyn.cPlanner.transfer.refiner;
016:
017: import org.griphyn.cPlanner.classes.ADag;
018: import org.griphyn.cPlanner.classes.PlannerOptions;
019:
020: import org.griphyn.cPlanner.common.PegasusProperties;
021:
022: import org.griphyn.cPlanner.transfer.Implementation;
023: import org.griphyn.cPlanner.transfer.Refiner;
024:
025: import org.griphyn.common.util.DynamicLoader;
026:
027: import java.io.IOException;
028:
029: import java.lang.reflect.InvocationTargetException;
030:
031: /**
032: * The factory class that loads an appropriate Transfer Refiner class,
033: * as specified by the properties.
034: *
035: * @author Karan Vahi
036: * @version $Revision: 50 $
037: */
038: public class RefinerFactory {
039:
040: /**
041: * The default package where the implementations reside, which this factory
042: * loads.
043: */
044: public static final String DEFAULT_PACKAGE_NAME = "org.griphyn.cPlanner.transfer.refiner";
045:
046: /**
047: * Loads the implementing class corresponding to the value specified in the
048: * properties. If the package name is not specified with the class, then
049: * class is assumed to be in the DEFAULT_PACKAGE. The properties object passed
050: * should not be null.
051: * <p>
052: * In addition it ends up loading the appropriate Transfer Implementation
053: * that is required by the refiner.
054: *
055: * @param properties the <code>PegasusProperties</code> object containing all
056: * the properties required by Pegasus.
057: * @param dag the workflow that is being refined.
058: * @param options the options with which the planner was invoked.
059: *
060: * @return the instance of the class implementing this interface.
061: *
062: * @exception TransferRefinerException that nests any error that
063: * might occur during the instantiation.
064: *
065: * @see #DEFAULT_PACKAGE_NAME
066: */
067: public static Refiner loadInstance(PegasusProperties properties,
068: ADag dag, PlannerOptions options)
069: throws TransferRefinerFactoryException {
070:
071: return loadInstance(properties.getTransferRefiner(),
072: properties, dag, options);
073: }
074:
075: /**
076: * Loads the implementing class corresponding to the class. If the package
077: * name is not specified with the class, then class is assumed to be
078: * in the DEFAULT_PACKAGE. The properties object passed should not be null.
079: * In addition it ends up loading the appropriate Transfer Implementation
080: * that is required by the refiner.
081: *
082: * @param className the name of the class that implements the mode.It can or
083: * cannot be with the package name.
084: * @param properties the <code>PegasusProperties</code> object containing all
085: * the properties required by Pegasus.
086: * @param dag the workflow that is being refined.
087: * @param options the options with which the planner was invoked.
088: *
089: * @return the instance of the class implementing this interface.
090: *
091: * @exception TransferRefinerFactoryException that nests any error that
092: * might occur during the instantiation.
093: *
094: * @see #DEFAULT_PACKAGE_NAME
095: */
096: public static Refiner loadInstance(String className,
097: PegasusProperties properties, ADag dag,
098: PlannerOptions options)
099: throws TransferRefinerFactoryException {
100:
101: Refiner refiner = null;
102: try {
103: //sanity check
104: if (properties == null) {
105: throw new RuntimeException("Invalid properties passed");
106: }
107: if (dag == null) {
108: throw new RuntimeException("Invalid workflow passed");
109: }
110:
111: //prepend the package name
112: className = (className.indexOf('.') == -1) ?
113: //pick up from the default package
114: DEFAULT_PACKAGE_NAME + "." + className
115: :
116: //load directly
117: className;
118:
119: //try loading the class dynamically
120: DynamicLoader dl = new DynamicLoader(className);
121: Object argList[] = new Object[3];
122: argList[0] = dag;
123: argList[1] = properties;
124: argList[2] = options;
125: refiner = (Refiner) dl.instantiate(argList);
126:
127: //we got the refiner try to load the appropriate
128: //transfer implementation also
129: refiner.loadImplementations(properties, options);
130: } catch (Exception e) {
131: throw new TransferRefinerFactoryException(
132: "Instantiating Transfer Refiner", className, e);
133: }
134:
135: return refiner;
136: }
137:
138: }
|