/*******************************************************************************
* Copyright (c) 2014 EURA NOVA.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v2.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* Aldemar Reynaga - initial API and implementation
* Salim Jouili - initial API and implementation
******************************************************************************/
package com.steffi.traversal;
import java.util.Iterator;
import java.util.LinkedList;
import com.steffi.model.EdgeType;
import com.steffi.model.SteffiEdge;
import com.steffi.model.SteffiVertex;
/**
* @author Aldemar Reynaga
* Implementation of the Path interface using the ReducedVertexPath class
*/
public class PathImpl implements Path{
private LinkedList<Object> path;
public PathImpl(ReducedVertexPath vertexPath) {
path = new LinkedList<Object>();
ReducedVertexPath curVertexPath = vertexPath;
do {
path.addFirst(curVertexPath.getVertex());
path.addFirst(curVertexPath.getParentEdge());
curVertexPath = curVertexPath.getParentVertexPath();
} while (curVertexPath != null);
}
@Override
public Iterable<SteffiVertex> getVertexes() {
return new Iterable<SteffiVertex>() {
@Override
public Iterator<SteffiVertex> iterator() {
LinkedList<SteffiVertex> vertexes = new LinkedList<SteffiVertex>();
for (int i=0; i<path.size(); i+=2)
vertexes.add((SteffiVertex) path.get(i));
return vertexes.iterator();
}
};
}
@Override
public Iterable<SteffiEdge> getEdges() {
return new Iterable<SteffiEdge>() {
@Override
public Iterator<SteffiEdge> iterator() {
LinkedList<SteffiEdge> edges = new LinkedList<SteffiEdge>();
for (int i=1; i<path.size(); i+=2)
edges.add((SteffiEdge) path.get(i));
return edges.iterator();
}
};
}
@Override
public Iterable<Object> getPath() {
return new Iterable<Object>() {
@Override
public Iterator<Object> iterator() {
return path.iterator();
}
};
}
@Override
public String toString() {
String string = "";
for (Object item : path) {
if (item instanceof SteffiVertex)
string += "[" + ((SteffiVertex) item).getId() + "]";
else if (item instanceof SteffiEdge) {
String edgeName = (((SteffiEdge) item).getName()==null)?"":((SteffiEdge) item).getName();
if (((SteffiEdge) item).getEdgeType().equals(EdgeType.IN))
string += "<" + edgeName + "-";
else if (((SteffiEdge) item).getEdgeType().equals(EdgeType.OUT))
string += "-" + edgeName + ">";
else
string += "-" + edgeName+ "-";
}
}
return string;
}
}