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.parser.pdax;
016:
017: import org.griphyn.cPlanner.classes.PlannerOptions;
018:
019: import org.griphyn.cPlanner.common.PegasusProperties;
020:
021: import org.griphyn.common.util.DynamicLoader;
022:
023: import java.io.IOException;
024:
025: import java.lang.reflect.InvocationTargetException;
026:
027: /**
028: * A factory class to load the appropriate DAX callback implementations that need
029: * to be passed to the DAX Parser.
030: *
031: * @author Karan Vahi
032: * @version $Revision: 217 $
033: */
034: public class PDAXCallbackFactory {
035:
036: /**
037: * Package to prefix "just" class names with.
038: */
039: public static final String DEFAULT_PACKAGE_NAME = "org.griphyn.cPlanner.parser.pdax";
040:
041: /**
042: * Loads the implementing class corresponding to the type specified by the user.
043: * The properties object passed should not be null. The callback that is
044: * loaded, is the one referred to in the properties by the user.
045: *
046: * @param directory the base level directory in which the output files are
047: * to be generated.
048: * @param properties the <code>PegasusProperties</code> object containing all
049: * the properties required by Pegasus.
050: *
051: * @return the instance of the class implementing this interface.
052: *
053: * @exception PDAXCallbackFactoryException that nests any error that
054: * might occur during the instantiation
055: *
056: * @see #DEFAULT_PACKAGE_NAME
057: * @see org.griphyn.cPlanner.common.PegasusProperties#getDAXCallback()
058: */
059: public static Callback loadInstance(PegasusProperties properties,
060: PlannerOptions options, String directory)
061: throws PDAXCallbackFactoryException {
062:
063: String mode = options.getMegaDAGMode();
064: if (mode == null || mode.equalsIgnoreCase("dag")) {
065: //load the default one
066: mode = "PDAX2MDAG";
067: } else if (mode.equalsIgnoreCase("noop")) {
068: mode = "PDAX2NOOP";
069: } else if (mode.equalsIgnoreCase("daglite")) {
070: mode = "PDAX2DAGLite";
071: }
072: //load the class stored in the mode
073: return loadInstance(properties, options, directory, mode);
074: }
075:
076: /**
077: * Loads the implementing class corresponding to the type specified by the user.
078: * The properties object passed should not be null. The callback that is
079: * loaded, is the one referred to by the className parameter passed.
080: *
081: * @param properties the <code>PegasusProperties</code> object containing all
082: * the properties required by Pegasus.
083: * dag|noop|daglite.
084: * @param options the <code>PlannerOptions</code> object containing the
085: * options passed to gencdag.
086: * @param directory the directory where the pdax file and parititioned daxes
087: * reside.
088: * @param className the name of the implementing class.
089: *
090: * @return the instance of the class implementing this interface.
091: *
092: * @exception PDAXCallbackFactoryException that nests any error that
093: * might occur during the instantiation
094: *
095: * @see #DEFAULT_PACKAGE_NAME
096: */
097: public static Callback loadInstance(PegasusProperties properties,
098: PlannerOptions options, String directory, String className)
099: throws PDAXCallbackFactoryException {
100:
101: Callback callback = null;
102:
103: try {
104:
105: //sanity check
106: if (properties == null) {
107: throw new RuntimeException("Invalid properties passed");
108: }
109: if (className == null) {
110: return loadInstance(properties, options, directory);
111: }
112:
113: //prepend the package name
114: className = (className.indexOf('.') == -1) ?
115: //pick up from the default package
116: DEFAULT_PACKAGE_NAME + "." + className
117: :
118: //load directly
119: className;
120:
121: //try loading the class dynamically
122: DynamicLoader dl = new DynamicLoader(className);
123: Object argList[] = new Object[3];
124: argList[0] = directory;
125: argList[1] = properties;
126: argList[2] = options;
127: callback = (Callback) dl.instantiate(argList);
128: } catch (Exception e) {
129: throw new PDAXCallbackFactoryException(
130: "Instantiating PDAXCallback ", className, e);
131: }
132:
133: return callback;
134: }
135:
136: }
|