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