/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2016
*/
package com.ibm.streamsx.topology.generator.spl;
import static com.ibm.streamsx.topology.generator.spl.GraphUtilities.findOperatorByKind;
import static com.ibm.streamsx.topology.generator.spl.GraphUtilities.getDownstream;
import static com.ibm.streamsx.topology.internal.gson.GsonUtilities.first;
import static com.ibm.streamsx.topology.internal.gson.GsonUtilities.jstring;
import java.util.Set;
import com.google.gson.JsonObject;
import com.ibm.streamsx.topology.builder.BVirtualMarker;
public class GraphValidation {
void validateGraph(JsonObject graph){
checkValidEndParallel(graph);
}
private void checkValidEndParallel(JsonObject graph){
Set<JsonObject> endParallels = findOperatorByKind(BVirtualMarker.END_PARALLEL, graph);
for (JsonObject endParallel : endParallels) {
// Setting up loop
JsonObject endParallelParent = endParallel;
do {
Set<JsonObject> endParallelParents = GraphUtilities.getUpstream(endParallelParent, graph);
if (endParallelParents.size() != 1) {
throw new IllegalStateException("Cannot union multiple streams before invoking endParallel()");
}
endParallelParent = first(endParallelParents);
} while (jstring(endParallelParent, "kind").startsWith("$"));
Set<JsonObject> endParallelParentChildren = getDownstream(endParallelParent, graph);
if (endParallelParentChildren.size() != 1) {
throw new IllegalStateException("Cannot fanout a stream before invoking endParallel()");
}
}
}
}