/**
* Copyright 2007-2008 University Of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.isi.pegasus.planner.classes;
import java.io.Writer;
import java.io.StringWriter;
import java.io.IOException;
/**
* Captures the parent child relationship between the jobs in the ADAG.
*
* @author Karan Vahi
* @version $Revision$
*/
public class PCRelation extends Data /*implements Comparable*/{
/**
* the parent making up the
* parent child relationship pair
* in a dag
*/
public String parent;
/**
* the child making up the
* parent child relationship pair
* in a dag
*/
public String child;
/**
* this is used for collapsing the dag
* during the reduction algorithm
* on the basis of the results returned
* from the Replica Catalog.
*/
public boolean isDeleted;
/**
* The abstract id for the parent node. required for stampede events.
*/
private String mAbstractParentID;
/**
* The abstract id for the child node. required for stampede events.
*/
private String mAbstractChildID;
/**
* the default constructor
*/
public PCRelation(){
parent = "";
child = "";
mAbstractParentID = "";
mAbstractChildID = "";
isDeleted = false;
}
/**
* the overloaded constructor
*/
public PCRelation(String parentName,String childName,boolean deleted){
this();
parent = parentName;
child = childName;
isDeleted = deleted;
}
/**
* the overloaded constructor
*/
public PCRelation(String parentName,String childName){
this();
parent = parentName;
child = childName;
isDeleted = false;
}
/**
* Returns the parent in the edge.
*
* @return parent
*/
public String getParent(){
return parent;
}
/**
* Returns the child in the edge.
*
* @return child
*/
public String getChild(){
return child;
}
/**
* Sets the abstract parent id associated with the edge.
*
* @param id the abstract id
*/
public void setAbstractParentID( String id){
mAbstractParentID = id;
}
/**
* Sets the abstract child id associated with the edge.
*
* @param id the abstract id
*/
public void setAbstractChildID( String id){
mAbstractChildID = id;
}
/**
* Returns the abstract parent id associated with the edge.
*
* @return parent
*/
public String getAbstractParentID(){
return mAbstractParentID;
}
/**
* Returns the abstract child id associated with the edge.
*
* @return child
*/
public String getAbstractChildID(){
return mAbstractChildID;
}
/**
* returns a new copy of the
* Object
*/
public Object clone(){
PCRelation pc = new PCRelation();
pc.parent = this.parent;
pc.child = this.child;
pc.isDeleted = this.isDeleted;
pc.mAbstractChildID = this.mAbstractChildID;
pc.mAbstractParentID = this.mAbstractParentID;
return pc;
}
/**
* Checks if an object is similar to the one referred to by this class.
* We compare the primary key to determine if it is the same or not.
*
* @return true if the primary key (parent,child) match.
* else false.
*/
public boolean equals(Object o){
PCRelation rel = (PCRelation)o;
return (rel.parent.equals(this.parent) &&
rel.child.equals(this.child))?
true:
false;
}
public int compareTo(Object o){
return (this.equals(o))?0:
1;
}
/**
* Returns the textual description.
*
* @return textual description.
*/
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append( "{" ).append( parent ).append( " [" ).append( this.getAbstractParentID()).
append( "]" ).append( " -> " ).append( child ).append( " [" ).append( this.getAbstractChildID()).
append( "]" ).append( "," ).append( this.isDeleted ).append( "}" );
return sb.toString();
}
/**
* Returns the DOT description of the object. This is used for visualizing
* the workflow.
*
* @return String containing the Partition object in XML.
*
* @exception IOException if something fishy happens to the stream.
*/
public String toDOT() throws IOException{
Writer writer = new StringWriter(32);
toDOT( writer, "" );
return writer.toString();
}
/**
* Returns the DOT description of the object. This is used for visualizing
* the workflow.
*
* @param stream is a stream opened and ready for writing. This can also
* be a StringWriter for efficient output.
* @param indent is a <code>String</code> of spaces used for pretty
* printing. The initial amount of spaces should be an empty
* string. The parameter is used internally for the recursive
* traversal.
*
*
* @exception IOException if something fishy happens to the stream.
*/
public void toDOT( Writer stream, String indent ) throws IOException {
String newLine = System.getProperty( "line.separator", "\r\n" );
//write out the edge
stream.write( indent );
stream.write( "\"" );
stream.write( getParent());
stream.write( "\"" );
stream.write( " -> ");
stream.write( "\"" );
stream.write( getChild() );
stream.write( "\"" );
stream.write( newLine );
stream.flush();
}
/**
* Sets the child of the edge.
*
* @param childNode the child node
*/
public void setChild(String childNode) {
this.child = childNode;
}
/**
* Sets the parent of the edge.
*
* @param parentNode the parent node
*/
public void setParent(String parentNode) {
this.parent = parentNode;
}
}