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.partitioner;
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 org.griphyn.cPlanner.partitioner.graph.GraphNode;
024:
025: import java.io.IOException;
026:
027: import java.lang.reflect.InvocationTargetException;
028:
029: import java.util.Map;
030:
031: /**
032: * A Factory class to load the right type of partitioner at runtime, as
033: * specified by the Properties. Each invocation, results in a new partitioner
034: * being loaded.
035: *
036: * @author Karan Vahi
037: * @version $Revision: 50 $
038: */
039: public class PartitionerFactory {
040:
041: /**
042: * Package to prefix "just" class names with.
043: */
044: public static final String DEFAULT_PACKAGE_NAME = "org.griphyn.cPlanner.partitioner";
045:
046: /**
047: * The name of the class that does level based partitioning.
048: */
049: public static final String LEVEL_BASED_PARTITIONING_CLASS = "BFS";
050:
051: /**
052: * The name of the class that does label based partitioning.
053: */
054: public static final String LABEL_BASED_PARTITIONING_CLASS = "Label";
055:
056: /**
057: * The name of the class that does horizontal based partitioning.
058: */
059: public static final String HORIZONTAL_PARTITIONING_CLASS = "Horizontal";
060:
061: /**
062: * The name of the class that does level based partitioning.
063: */
064: public static final String DEFAULT_PARTITIONING_CLASS = LEVEL_BASED_PARTITIONING_CLASS;
065:
066: /**
067: * An array of known partitioning classes.
068: */
069: private static final String[] PARTITIONING_CLASSES = {
070: LEVEL_BASED_PARTITIONING_CLASS,
071: LABEL_BASED_PARTITIONING_CLASS,
072: HORIZONTAL_PARTITIONING_CLASS };
073:
074: /**
075: * Loads the implementing class corresponding to the type specified by the user.
076: * The properties object passed should not be null.
077: *
078: * @param properties the <code>PegasusProperties</code> object containing all
079: * the properties required by Pegasus.
080: * @param root the dummy root node of the graph.
081: * @param graph the map containing all the nodes of the graph keyed by
082: * the logical id of the nodes.
083: * @param className the name of the implementing class.
084: *
085: * @return the instance of the class implementing this interface.
086: *
087: * @throws PartitionerFactoryException that nests any error that
088: * might occur during the instantiation
089: *
090: * @see #DEFAULT_PACKAGE_NAME
091: */
092: public static Partitioner loadInstance(
093: PegasusProperties properties, GraphNode root, Map graph,
094: String className) throws PartitionerFactoryException {
095:
096: //sanity check
097: if (properties == null) {
098: throw new NullPointerException("Invalid properties passed");
099: }
100:
101: if (className.indexOf('.') == -1) {
102: //compare with the known classes to ensure classnames
103: //passed are case insensitive
104: for (int i = 0; i < PARTITIONING_CLASSES.length; i++) {
105: if (className.equalsIgnoreCase(PARTITIONING_CLASSES[i])) {
106: className = PARTITIONING_CLASSES[i];
107: break;
108: }
109: }
110: className = DEFAULT_PACKAGE_NAME + "." + className;
111: }
112:
113: //try loading the class dynamically
114: Partitioner partitioner = null;
115:
116: try {
117: DynamicLoader dl = new DynamicLoader(className);
118: Object argList[] = new Object[3];
119: Class classList[] = new Class[3];
120: argList[0] = root;
121: //classList[0] = Class.forName( "org.griphyn.cPlanner.partitioner.GraphNode" );
122: classList[0] = new GraphNode().getClass();//to circumvent root being null
123: argList[1] = graph;
124: classList[1] = Class.forName("java.util.Map");
125: argList[2] = properties;
126: classList[2] = Class
127: .forName("org.griphyn.cPlanner.common.PegasusProperties");
128: partitioner = (Partitioner) dl.instantiate(classList,
129: argList);
130: } catch (Exception e) {
131: throw new PartitionerFactoryException(
132: "Instantiating Partitioner ", className, e);
133: }
134:
135: return partitioner;
136: }
137:
138: }
|