package org.projectusus.core.filerelations.model; import static java.util.Collections.singleton; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.jgrapht.EdgeFactory; public class RelationGraph<T> extends UnmodifiableDirectedGraph<T, Relation<T>> { private final Relations<T> relations; public RelationGraph( Relations<T> relations ) { this.relations = relations; } public Set<Relation<T>> incomingEdgesOf( T vertex ) { return relations.getDirectRelationsTo( vertex ); } public Set<Relation<T>> outgoingEdgesOf( T vertex ) { return relations.getDirectRelationsFrom( vertex ); } public boolean containsVertex( T vertex ) { return relations.containsKey( vertex ); } public Set<Relation<T>> edgeSet() { return new HashSet<Relation<T>>( relations.getAllDirectRelations() ); } public Set<Relation<T>> getAllEdges( T source, T target ) { Relation<T> relation = getEdge( source, target ); Set<Relation<T>> emptySet = Collections.<Relation<T>> emptySet(); return relation == null ? emptySet : singleton( relation ); } public Relation<T> getEdge( T source, T target ) { Relation<T> searchedForRelation = new Relation<T>( source, target ); for( Relation<T> relation : outgoingEdgesOf( source ) ) { if( searchedForRelation.equals( relation ) ) { return relation; } } return null; } public EdgeFactory<T, Relation<T>> getEdgeFactory() { return new EdgeFactory<T, Relation<T>>() { public Relation<T> createEdge( T source, T target ) { return new Relation<T>( source, target ); } }; } public T getEdgeSource( Relation<T> relation ) { return relation.getSource(); } public T getEdgeTarget( Relation<T> relation ) { return relation.getTarget(); } public Set<T> vertexSet() { return relations.keySet(); } }