package kr.ac.snu.selab.soot.graph;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import kr.ac.snu.selab.soot.util.XMLWriter;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.log4j.Logger;
public class Path<N extends Node> {
private static Logger log = Logger.getLogger(Path.class);
private ArrayList<N> nodeList;
public Path() {
nodeList = new ArrayList<N>();
}
public Path<N> copy() {
Path<N> p = new Path<N>();
p.nodeList.addAll(nodeList);
return p;
}
@Override
public int hashCode() {
HashCodeBuilder builder = new HashCodeBuilder();
for (N node : nodeList) {
builder.append(node.element);
}
return builder.toHashCode();
}
@Override
@SuppressWarnings("unchecked")
public boolean equals(Object anObject) {
if (anObject.getClass() != getClass())
return false;
Path<N> compare = (Path<N>) anObject;
if (compare.length() != length()) {
return false;
}
boolean result = true;
int length = length();
for (int i = 0; i < length; i++) {
if (!compare.getNodeList().get(i).equals(getNodeList().get(i))) {
result = false;
break;
}
}
return result;
}
public void add(N aNode) {
nodeList.add(aNode);
}
public void addTop(N aNode) {
nodeList.add(0, aNode);
}
public boolean contains(N aNode) {
return nodeList.contains(aNode);
}
public N last() {
return nodeList.get(nodeList.size() - 1);
}
public boolean isEmpty() {
return nodeList.isEmpty();
}
public List<N> getNodeList() {
return nodeList;
}
public int length() {
return nodeList.size();
}
public String toXML() {
CharArrayWriter writer = new CharArrayWriter();
XMLWriter w = new XMLWriter(writer);
writeXML(w);
w.close();
return writer.toString();
}
public void writeXML(XMLWriter writer) {
try {
writer.startElement("Path");
for (N aNode : nodeList) {
aNode.writeXML(writer);
}
writer.endElement();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}