@Override public List<ElementGraph> getElementGraphs( FlowElement flowElement ) { List<Process> elementProcesses = getElementProcesses( flowElement ); List<ElementGraph> elementGraphs = new ArrayList<>(); for( Process elementProcess : elementProcesses ) elementGraphs.add( elementProcess.getElementGraph() ); return elementGraphs; }
public ProcessEdge( Process sourceProcess, FlowElement flowElement, Process sinkProcess ) { this( sourceProcess.getElementGraph(), flowElement, sinkProcess.getElementGraph() ); this.sourceProcessID = sourceProcess.getID(); this.sinkProcessID = sinkProcess.getID(); }
@Override public List<ElementGraph> getElementGraphs( Scope scope ) { List<Process> elementProcesses = getElementProcesses( scope ); List<ElementGraph> elementGraphs = new ArrayList<>(); for( Process elementProcess : elementProcesses ) elementGraphs.add( elementProcess.getElementGraph() ); return elementGraphs; }
@Override public List<Process> getElementProcesses( FlowElement flowElement ) { List<Process> processes = new ArrayList<>(); for( Process process : vertexSet() ) { if( process.getElementGraph().vertexSet().contains( flowElement ) ) processes.add( process ); } return processes; }
@Override public List<Process> getElementProcesses( Scope scope ) { List<Process> processes = new ArrayList<>(); for( Process process : vertexSet() ) { if( process.getElementGraph().edgeSet().contains( scope ) ) processes.add( process ); } return processes; }
@Override public Set<ElementGraph> getIdentityElementGraphs() { Set<ElementGraph> results = createIdentitySet(); for( Process process : getIdentityProcesses() ) results.add( process.getElementGraph() ); return results; }
@Override public Set<ElementGraph> getElementGraphs() { Set<ElementGraph> results = createIdentitySet(); for( Process process : vertexSet() ) results.add( process.getElementGraph() ); return results; }
/** * Does the given process perform any work? * * @param process * @return */ public static boolean isIdentity( ProcessModel process ) { ElementGraph elementGraph = ElementGraphs.asExtentMaskedSubGraph( process.getElementGraph() ); Set<FlowElement> sourceElements = process.getSourceElements(); Set<FlowElement> sinkElements = process.getSinkElements(); return elementGraph.vertexSet().size() == ( sourceElements.size() + sinkElements.size() ); } }
@Override public String getVertexName( ProcessModel processModel ) { return "ordinal: " + processModel.getOrdinal() + "\\nid: " + processModel.getID() + "\\nhash: " + canonicalHash( processModel.getElementGraph() ); } }
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(); }
@Override public Map<String, Tap> getSinkTapsMap() { Map<String, Tap> result = new HashMap<>(); Set<Tap> sinkTaps = getSinkTaps(); for( Tap sinkTap : sinkTaps ) { for( Process process : graph.vertexSet() ) { if( !process.getSinkTaps().contains( sinkTap ) ) continue; ElementGraph elementGraph = process.getElementGraph(); for( Scope scope : elementGraph.incomingEdgesOf( sinkTap ) ) result.put( scope.getName(), sinkTap ); } } return result; }
/** * Does the given process perform any work? * * @param process * @param excludingType * @return */ public static boolean isIdentity( ProcessModel process, Class<? extends FlowElement> excludingType ) { ElementGraph elementGraph = ElementGraphs.asExtentMaskedSubGraph( process.getElementGraph() ); Set<? extends FlowElement> sourceElements = Util.narrowIdentitySet( excludingType, process.getSourceElements(), false ); Set<? extends FlowElement> sinkElements = Util.narrowIdentitySet( excludingType, process.getSinkElements(), false ); return elementGraph.vertexSet().size() == ( sourceElements.size() + sinkElements.size() ); }
@Override public Map<String, Tap> getSourceTapsMap() { Map<String, Tap> result = new HashMap<>(); Set<Tap> sourceTaps = getSourceTaps(); for( Tap sourceTap : sourceTaps ) { for( Process process : graph.vertexSet() ) { if( !process.getSourceTaps().contains( sourceTap ) ) continue; ElementGraph elementGraph = process.getElementGraph(); for( Scope scope : elementGraph.outgoingEdgesOf( sourceTap ) ) result.put( scope.getName(), sourceTap ); } } return result; }
public EnumMultiMap<FlowElement> getAnnotations() { EnumMultiMap<FlowElement> annotations = new EnumMultiMap<>(); for( Process process : vertexSet() ) { ElementGraph elementGraph = process.getElementGraph(); if( elementGraph instanceof AnnotatedGraph ) annotations.addAll( ( (AnnotatedGraph) elementGraph ).getAnnotations() ); } return annotations; }