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:
016: package org.griphyn.cPlanner.parser.dax;
017:
018: import org.griphyn.cPlanner.classes.SubInfo;
019:
020: import org.griphyn.cPlanner.partitioner.graph.Graph;
021: import org.griphyn.cPlanner.partitioner.graph.MapGraph;
022: import org.griphyn.cPlanner.partitioner.graph.GraphNode;
023:
024: import org.griphyn.cPlanner.common.PegasusProperties;
025:
026: import java.util.ArrayList;
027: import java.util.Iterator;
028: import java.util.LinkedList;
029: import java.util.List;
030: import java.util.Map;
031:
032: /**
033: * An exploratory implementation that builds on the DAX2Graph.
034: * There is a graph object created that is returned.
035: *
036: * @author Karan Vahi
037: * @version $Revision: 50 $
038: */
039:
040: public class DAX2NewGraph implements Callback {
041:
042: /**
043: * The Graph instance that stores the abstract workflow as a Graph.
044: */
045: protected Graph mWorkflow;
046:
047: /**
048: * A flag to specify whether the graph has been generated for the partition
049: * or not.
050: */
051: protected boolean mDone;
052:
053: /**
054: * The label of the abstract dax.
055: */
056: protected String mLabel;
057:
058: /**
059: * The handle to the properties object.
060: */
061: protected PegasusProperties mProps;
062:
063: /**
064: * The overloaded constructor.
065: *
066: * @param properties the properties passed to the planner.
067: * @param dax the path to the DAX file.
068: */
069: public DAX2NewGraph(PegasusProperties properties, String dax) {
070: mProps = properties;
071: mWorkflow = new MapGraph();
072: mDone = false;
073: mLabel = null;
074: }
075:
076: /**
077: * Returns the workflow represented in the <code>Graph</code> form.
078: *
079: *
080: * @return <code>Graph</code> containing the abstract workflow referred
081: * in the dax.
082: */
083: public Object getConstructedObject() {
084: if (!mDone)
085: throw new RuntimeException(
086: "Method called before the abstract dag "
087: + " for the partition was fully generated");
088:
089: return mWorkflow;
090: }
091:
092: /**
093: * Callback when the opening tag was parsed. This contains all
094: * attributes and their raw values within a map. It ends up storing
095: * the attributes with the adag element in the internal memory structure.
096: *
097: * @param attributes is a map of attribute key to attribute value
098: */
099: public void cbDocument(Map attributes) {
100: /**@todo Implement this org.griphyn.cPlanner.parser.Callback method*/
101: if (attributes == null
102: || (mLabel = (String) attributes.get("name")) == null) {
103: mLabel = "test";
104: }
105: }
106:
107: /**
108: * This constructs a graph node for the job and ends up storing it in the
109: * internal map.
110: *
111: * @param job the job that was parsed.
112: */
113: public void cbJob(SubInfo job) {
114: //populate the job as a node in the graph
115: GraphNode node = new GraphNode(job.getID(), job);
116: mWorkflow.addNode(node);
117: }
118:
119: /**
120: * This updates the internal graph nodes of child with references to it's
121: * parents referred to by the list of parents passed. It gets the handle
122: * to the parents graph nodes from it's internal map.
123: *
124: * @param child the logical id of the child node.
125: * @param parents list containing the logical id's of the parents of the
126: * child nodes.
127: */
128: public void cbParents(String child, List parents) {
129: mWorkflow.addEdges(child, parents);
130: }
131:
132: /**
133: * Returns the name of the dax.
134: */
135: public String getNameOfDAX() {
136: return mLabel;
137: }
138:
139: /**
140: * Callback to signal that traversal of the DAX is complete. At this point a
141: * dummy root node is added to the graph, that is the parents to all the root
142: * nodes in the existing DAX.
143: */
144: public void cbDone() {
145: //the abstract graph is fully generated
146: mDone = true;
147: }
148:
149: /**
150: * Returns the <code>GraphNode</code> of the corresponding id.
151: *
152: * @param id the id of the node.
153: *
154: * @return <code>GraphNode</code>.
155: */
156: public GraphNode get(String key) {
157: return mWorkflow.getNode(key);
158: }
159:
160: }
|