Skip to content

Traversal Context

Kristina Heckelmann edited this page Nov 10, 2012 · 11 revisions

Traversal Context

A TraversalContext is used wherever only a part of the graph should be considered. It defines which vertices and edges are within the context and which are not. If a TraversalContext is set for a graph, most graph traversing methods return only vertices and edges that are within the context.

The TraversalContext interface contains two methods: public boolean containsVertex(Vertex v); and public boolean containsEdge(Edge e);. The snippet below shows an example for a TraversalContext implementation. The FilterVertexTraversalContext contains all vertices, that have a member of the validVertexClasses list as VertexClass. Edges are in the context, if their alpha and omega vertices are in the context.

class FilterVertexClassesTraversalContext implements TraversalContext{

	List<VertexClass> validVertexClasses;

	public FilterVertexClassesTraversalContext(List<VertexClass> v){
		this.validVertexClasses = v;
	}
			
	@Override
	public boolean containsVertex(Vertex v) {
		return validVertexClasses.contains(v.getAttributedElementClass());
	}

	@Override
	public boolean containsEdge(Edge e) {
		return this.containsVertex(e.getAlpha()) && 
				this.containsVertex(e.getOmega());
	}		
}

We use the example graph from the previous section again. It is displayed below:

graph

The following snippet shows how a TraversalContext is set. It should contain only vertices of type JavaType and JavaMember.

Graph g = ...
Vertex v1 = g.getVertex(1);
Vertex v4 = g.getVertex(4);
GraphClass gc = g.getGraphClass();

ArrayList<VertexClass> vcList = new ArrayList<VertexClass>();
vcList.add(gc.getVertexClass("JavaType"));
vcList.add(gc.getVertexClass("JavaMember"));
TraversalContext tc = new FilterVertexClassesTraversalContext(vcList);

g.setTraversalContext(tc);

This traversal context reduces the graph to the subset displayed in the picture below.

graph subset

After setting the traversal context, the graph traversing methods may return other values than before. The following table shows, how the results differ.

Method call Without Traversal Context set With Traversal Context set
g.getVertex(1) v1: JavaPackage v1: JavaPackage
g.getFirstVertex() v1: JavaPackage v4: JavaType
g.getLastVertex() v9: JavaMember v9: JavaMember
g.getFirstEdge() +e1: ContainsPackage +e3: Declares
g.getLastEdge() +e8: Imports +e6: Declares
v4.getPrevVertex() v3: SourceFile null
g.getVCount() 9 6
g.getECount() 8 4
v4.getFirstIncidence() -e2: ContainsType +e3: Declares
v4.getDegree() 6 4
g.containsVertex(v1)  true false

The vertex, edge and incidence iterators also reduce their results to the vertices and edges contained in the set traversal context.

System.out.println("Vertices in the graph: ");
for(Vertex vertex : g.vertices()){
	System.out.println(vertex);	
}

Console output:

v4: JavaType

v5: JavaType

v6: JavaMember

v7: JavaMember

v8: JavaMember

v9: JavaMember