protected Set<FlowElement> getSpanElements( ProcessGraph<? extends ProcessModel> processGraph ) { Set<FlowElement> spanElements = new HashSet<>(); spanElements.add( Extent.head ); spanElements.add( Extent.tail ); spanElements.addAll( processGraph.getAllSourceElements() ); spanElements.addAll( processGraph.getAllSinkElements() ); // forces tap to be within a node spanElements.removeAll( processGraph.getSourceTaps() ); spanElements.removeAll( processGraph.getSinkTaps() ); return spanElements; }
protected Set<FlowElement> getIdentityElements( ProcessGraph<? extends ProcessModel> processGraph ) { Set<FlowElement> candidates = new HashSet<>(); // force identity nodes to be visualized for( ElementGraph elementGraph : processGraph.getIdentityElementGraphs() ) { if( !Util.contains( Tap.class, elementGraph.vertexSet() ) ) candidates.addAll( elementGraph.vertexSet() ); } candidates.remove( Extent.head ); candidates.remove( Extent.tail ); // many elements span, but are included into multiple nodes // the first to include the element owns it, making other node representations mis-representative // for now, lets force shared elements to span, but this hides the identity nodes outright Set<FlowElement> identityElements = new HashSet<>(); for( FlowElement identityElement : candidates ) { if( processGraph.getElementProcesses( identityElement ).size() == 1 ) identityElements.add( identityElement ); } return identityElements; }
public void writeGraph( Writer writer, ElementGraph parentGraph, ProcessGraph<? extends ProcessModel> processGraph ) { PrintWriter out = new PrintWriter( writer ); out.println( "digraph G {" ); Set<FlowElement> spanElements = getSpanElements( processGraph ); Set<FlowElement> identityElements = getIdentityElements( processGraph ); Set<FlowElement> duplicatedElements = processGraph.getDuplicatedElements( parentGraph ); writeVertexSet( null, parentGraph, parentGraph, out, spanElements, true, duplicatedElements, identityElements ); writeEdgeSet( processGraph, parentGraph, parentGraph, out, spanElements, true, identityElements ); Iterator<? extends ProcessModel> topologicalIterator = processGraph.getOrdinalTopologicalIterator(); while( topologicalIterator.hasNext() ) { ProcessModel processModel = topologicalIterator.next(); out.println(); out.print( "subgraph cluster_" ); out.print( clusterIDProvider.getVertexName( processModel ) ); out.println( " {" ); out.print( INDENT ); out.print( "label = \"" ); out.print( clusterLabelProvider.getVertexName( processModel ) ); out.println( "\";" ); out.println(); writeVertexSet( processModel, parentGraph, processModel.getElementGraph(), out, spanElements, false, duplicatedElements, identityElements ); writeEdgeSet( processGraph, parentGraph, processModel.getElementGraph(), out, spanElements, false, identityElements ); out.println( "}" ); } out.println( "}" ); out.flush(); }
targetGraphs = processGraph.getElementGraphs( edgeTarget ); sourceGraphs = processGraph.getElementGraphs( edgeSource ); targetGraphs = Arrays.asList( parentGraph );