in jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/validation/RuleFlowProcessValidator.java [766:834]
private void checkAllNodesConnectedToStart(final NodeContainer container,
boolean isDynamic,
final List<ProcessValidationError> errors,
RuleFlowProcess process) {
final Map<org.kie.api.definition.process.Node, Boolean> processNodes = new HashMap<>();
final org.kie.api.definition.process.Node[] nodes;
if (container instanceof CompositeNode) {
nodes = ((CompositeNode) container).internalGetNodes();
} else {
nodes = container.getNodes();
}
List<org.kie.api.definition.process.Node> eventNodes = new ArrayList<>();
List<CompositeNode> compositeNodes = new ArrayList<>();
for (int i = 0; i < nodes.length; i++) {
final org.kie.api.definition.process.Node node = nodes[i];
processNodes.put(node,
Boolean.FALSE);
if (node instanceof EventNode) {
eventNodes.add(node);
}
if (node instanceof CompositeNode) {
compositeNodes.add((CompositeNode) node);
}
}
if (isDynamic) {
for (org.kie.api.definition.process.Node node : nodes) {
if (node.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
processNode(node,
processNodes);
}
}
} else {
final List<org.kie.api.definition.process.Node> start = RuleFlowProcess.getStartNodes(nodes);
if (start != null) {
for (org.kie.api.definition.process.Node s : start) {
processNode(s,
processNodes);
}
}
if (container instanceof CompositeNode) {
for (CompositeNode.NodeAndType nodeAndTypes : ((CompositeNode) container).getLinkedIncomingNodes().values()) {
if (nodeAndTypes.getNode() != null) {
processNode(nodeAndTypes.getNode(), processNodes);
} else {
logger.error("Composite Node " + nodeAndTypes + " is null");
}
}
}
}
for (org.kie.api.definition.process.Node eventNode : eventNodes) {
processNode(eventNode, processNodes);
}
for (CompositeNode compositeNode : compositeNodes) {
checkAllNodesConnectedToStart(
compositeNode,
compositeNode instanceof DynamicNode,
errors,
process);
}
for (final Iterator<org.kie.api.definition.process.Node> it = processNodes.keySet().iterator(); it.hasNext();) {
final org.kie.api.definition.process.Node node = it.next();
if (Boolean.FALSE.equals(processNodes.get(node)) && !(node instanceof StartNode) && !(node instanceof EventSubProcessNode)) {
addErrorMessage(process,
node,
errors,
"Has no connection to the start node.");
}
}
}