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.sls;
015:
016: import org.griphyn.cPlanner.classes.PlannerOptions;
017: import org.griphyn.cPlanner.classes.PegasusBag;
018:
019: import org.griphyn.cPlanner.transfer.SLS;
020:
021: import org.griphyn.cPlanner.common.PegasusProperties;
022: import org.griphyn.common.util.DynamicLoader;
023:
024: /**
025: * A factory class to load the appropriate type of SLS Implementation to do
026: * the Second Level Staging.
027: *
028: * @author Karan Vahi
029: * @version $Revision: 420 $
030: */
031: public class SLSFactory {
032:
033: /**
034: * The default package where the all the implementing classes are supposed to
035: * reside.
036: */
037: public static final String DEFAULT_PACKAGE_NAME = "org.griphyn.cPlanner.transfer.sls";
038:
039: /**
040: * The name of the class implementing the condor code generator.
041: */
042: public static final String DEFAULT_SLS_IMPL_CLASS = "Transfer";
043:
044: /**
045: * This method loads the appropriate implementing code generator as specified
046: * by the user at runtime. If the megadag mode is specified in the options,
047: * then that is used to load the implementing class, overriding the submit
048: * mode specified in the properties file.
049: *
050: *
051: * @param bag the bag of initialization objects.
052: *
053: * @return the instance of the class implementing this interface.
054: *
055: * @exception CodeGeneratorFactoryException that nests any error that
056: * might occur during the instantiation of the implementation.
057: *
058: * @see #DEFAULT_PACKAGE_NAME
059: * @see org.griphyn.cPlanner.common.PegasusProperties#getDAXCallback()
060: *
061: * @throws SLSFactoryException
062: */
063: public static SLS loadInstance(PegasusBag bag)
064: throws SLSFactoryException {
065:
066: PegasusProperties properties = bag.getPegasusProperties();
067: PlannerOptions options = bag.getPlannerOptions();
068:
069: //sanity check
070: if (properties == null) {
071: throw new SLSFactoryException("Invalid properties passed");
072: }
073: if (options == null) {
074: throw new SLSFactoryException("Invalid Options specified");
075: }
076:
077: String className = properties.getSLSTransferImplementation();
078: if (className == null) {
079: className = DEFAULT_SLS_IMPL_CLASS; //to be picked up from properties eventually
080: }
081:
082: return loadInstance(bag, className);
083:
084: }
085:
086: /**
087: * This method loads the appropriate code generator as specified by the
088: * user at runtime.
089: *
090: *
091: * @param bag the bag of initialization objects.
092: * @param className the name of the implementing class.
093: *
094: * @return the instance of the class implementing this interface.
095: *
096: * @exception CodeGeneratorFactoryException that nests any error that
097: * might occur during the instantiation of the implementation.
098: *
099: * @see #DEFAULT_PACKAGE_NAME
100: *
101: * @throws SLSFactoryException
102: */
103: public static SLS loadInstance(PegasusBag bag, String className)
104: throws SLSFactoryException {
105:
106: PegasusProperties properties = bag.getPegasusProperties();
107: PlannerOptions options = bag.getPlannerOptions();
108:
109: //sanity check
110: if (properties == null) {
111: throw new SLSFactoryException("Invalid properties passed");
112: }
113: if (className == null) {
114: throw new SLSFactoryException("Invalid className specified");
115: }
116:
117: //prepend the package name if classname is actually just a basename
118: className = (className.indexOf('.') == -1) ?
119: //pick up from the default package
120: DEFAULT_PACKAGE_NAME + "." + className
121: :
122: //load directly
123: className;
124:
125: //try loading the class dynamically
126: SLS sls = null;
127: try {
128: DynamicLoader dl = new DynamicLoader(className);
129: sls = (SLS) dl.instantiate(new Object[0]);
130: //initialize the loaded code generator
131: sls.initialize(bag);
132: } catch (Exception e) {
133: throw new SLSFactoryException(
134: "Instantiating SLS Implementor ", className, e);
135: }
136:
137: return sls;
138: }
139:
140: }
|