public Vector<AbstractNode> nodesWithSameName() { Vector<AbstractNode> returned = new Vector<AbstractNode>(); Vector<AbstractNode> allNodes = getProcess().getAllAbstractNodes(); for (Enumeration<AbstractNode> e = allNodes.elements(); e.hasMoreElements(); ) { AbstractNode node = e.nextElement(); if ((node != this) && (node.getFullyQualifiedName().equalsIgnoreCase(getFullyQualifiedName()))) { returned.add(node); } } return returned; }
@Override public ValidationIssue<NodeWithDefaultFlowMustHaveConditionOneOtherEdge, AbstractNode> applyValidation(final AbstractNode node) { int defaultCount = 0; int conditionalCount = 0; int totalCount = 0; for (FlexoPostCondition p : node.getOutgoingPostConditions()) { if (p instanceof TokenEdge) { totalCount++; if (p.getIsDefaultFlow()) { defaultCount++; } else if (p.getIsConditional()) { conditionalCount++; } } } if (defaultCount > 0 && totalCount != defaultCount + conditionalCount) { if (node instanceof OperatorNode && ((OperatorNode) node).isExclusiveGateway()) { return null; // There is a rule on the post conditions to prevent this already! } else { ValidationWarning<NodeWithDefaultFlowMustHaveConditionOneOtherEdge, AbstractNode> warning = new ValidationWarning< NodeWithDefaultFlowMustHaveConditionOneOtherEdge, AbstractNode>( this, node, "node_($object.name)_has_one_default_outgoing_flow_and_so_other_edges_must_be_conditionnal"); return warning; } } return null; }
public RenameThisNode(AbstractNode node) { super( "rename_this_node", "newName", "enter_a_non_ambigous_name", node.findNextNonAmbigousName()); }
@Override public ValidationIssue<NodeShouldHaveNonAmbigousName, AbstractNode> applyValidation( final AbstractNode node) { Vector<? extends Validable> nodesWithSameName = node.nodesWithSameName(); if (nodesWithSameName.size() > 0) { ValidationWarning<NodeShouldHaveNonAmbigousName, AbstractNode> warning = new ValidationWarning<NodeShouldHaveNonAmbigousName, AbstractNode>( this, node, "node_($object.name)_has_ambigous_name"); warning.addToRelatedValidableObjects(nodesWithSameName); warning.addToFixProposals(new RenameThisNode(node)); return warning; } if (node.getProcess() != null && node.getProcess().getName().equalsIgnoreCase(node.getName())) { ValidationWarning<NodeShouldHaveNonAmbigousName, AbstractNode> warning = new ValidationWarning<NodeShouldHaveNonAmbigousName, AbstractNode>( this, node, "node_($object.name)_has_ambigous_name"); warning.addToRelatedValidableObjects(node.getProcess()); warning.addToFixProposals(new RenameThisNode(node)); return warning; } return null; }
@Override public ValidationIssue<NodeCannotHaveMoreThanOneDefaultOutgoingTokenEdge, AbstractNode> applyValidation(final AbstractNode node) { boolean hasAlreadyOne = false; for (FlexoPostCondition p : node.getOutgoingPostConditions()) { if (p instanceof TokenEdge && p.getIsDefaultFlow()) { if (hasAlreadyOne) { ValidationWarning<NodeCannotHaveMoreThanOneDefaultOutgoingTokenEdge, AbstractNode> warning = new ValidationWarning< NodeCannotHaveMoreThanOneDefaultOutgoingTokenEdge, AbstractNode>( this, node, "node_($object.name)_has_more_than_one_default_outgoing_edge"); return warning; } else { hasAlreadyOne = true; } } } return null; }
@Override public ValidationIssue< NodeWithConditionalEdgeOrDefaultEdgeMustHaveMoreThanOneEdge, AbstractNode> applyValidation(final AbstractNode node) { int defaultCount = 0; int conditionalCount = 0; int regular = 0; Vector<FlexoPostCondition<?, ?>> listOfAllPostToConsider = new Vector<FlexoPostCondition<?, ?>>(); listOfAllPostToConsider.addAll(node.getOutgoingPostConditions()); if ((node instanceof ActivityNode || node instanceof OperationNode)) { FlexoNode startNode = (FlexoNode) node; if (startNode.isEndNode()) { // try to find other brother end node with outgoing post for (PetriGraphNode brotherNode : startNode.getParentPetriGraph().getNodes()) { if (brotherNode instanceof FlexoNode) { if (((FlexoNode) brotherNode).isEndNode() && brotherNode != startNode) { return null; } } } if (startNode.getParentPetriGraph().getContainer() instanceof SubProcessNode) { SubProcessNode sub = (SubProcessNode) startNode.getParentPetriGraph().getContainer(); if (sub.getPortMapRegistery().getAllOutPortmaps().size() > 0) { return null; } } } } else if (node instanceof FlexoPortMap && ((FlexoPortMap) node).isOutputPort()) { SubProcessNode sub = ((FlexoPortMap) node).getSubProcessNode(); if (sub.getPortMapRegistery().getAllOutPortmaps().size() > 0) { return null; } if (sub.getOperationPetriGraph() != null && sub.getOperationPetriGraph().getAllEndNodes().size() > 0) { return null; } } for (FlexoPostCondition p : listOfAllPostToConsider) { if (p.getIsDefaultFlow()) { defaultCount++; } else if (p.getIsConditional()) { conditionalCount++; } else { regular++; } } if (defaultCount > 0 && (regular + conditionalCount) == 0) { if (node instanceof OperatorNode && ((OperatorNode) node).isExclusiveGateway()) { return null; // There is a rule on the post conditions to prevent this already! } else { ValidationWarning< NodeWithConditionalEdgeOrDefaultEdgeMustHaveMoreThanOneEdge, AbstractNode> warning = new ValidationWarning< NodeWithConditionalEdgeOrDefaultEdgeMustHaveMoreThanOneEdge, AbstractNode>( this, node, "node_($object.name)_has_one_default_outgoing_edge_should_have_at_least_another_outgoing_edge"); return warning; } } if (conditionalCount == 1 && regular == 0 && defaultCount == 0 && !listOfAllPostToConsider.firstElement().mustBeConditional()) { if (node instanceof OperatorNode && ((OperatorNode) node).isExclusiveGateway()) { return null; // There is a rule on the post conditions to prevent this already! } else { ValidationWarning< NodeWithConditionalEdgeOrDefaultEdgeMustHaveMoreThanOneEdge, AbstractNode> warning = new ValidationWarning< NodeWithConditionalEdgeOrDefaultEdgeMustHaveMoreThanOneEdge, AbstractNode>( this, node, "node_($object.name)_has_one_conditional_outgoing_edge_should_have_at_least_another_outgoing_edge"); return warning; } } return null; }