Search in sources :

Example 6 with Constraint

use of org.jbpm.workflow.core.Constraint in project jbpm by kiegroup.

the class MultiConditionalSequenceFlowNodeBuilder method build.

public void build(Process process, ProcessDescr processDescr, ProcessBuildContext context, Node node) {
    Map<ConnectionRef, Constraint> constraints = ((NodeImpl) node).getConstraints();
    // exclude split as it is handled with separate builder and nodes with non conditional sequence flows
    if (node instanceof Split || constraints.size() == 0) {
        return;
    }
    // we need to clone the map, so we can update the original while iterating.
    Map<ConnectionRef, Constraint> map = new HashMap<ConnectionRef, Constraint>(constraints);
    for (Iterator<Map.Entry<ConnectionRef, Constraint>> it = map.entrySet().iterator(); it.hasNext(); ) {
        Map.Entry<ConnectionRef, Constraint> entry = it.next();
        ConnectionRef connection = entry.getKey();
        ConstraintImpl constraint = (ConstraintImpl) entry.getValue();
        Connection outgoingConnection = null;
        for (Connection out : ((NodeImpl) node).getDefaultOutgoingConnections()) {
            if (out.getToType().equals(connection.getToType()) && out.getTo().getId() == connection.getNodeId()) {
                outgoingConnection = out;
            }
        }
        if (outgoingConnection == null) {
            throw new IllegalArgumentException("Could not find outgoing connection");
        }
        if ("rule".equals(constraint.getType())) {
            RuleConstraintEvaluator ruleConstraint = new RuleConstraintEvaluator();
            ruleConstraint.setDialect(constraint.getDialect());
            ruleConstraint.setName(constraint.getName());
            ruleConstraint.setPriority(constraint.getPriority());
            ruleConstraint.setDefault(constraint.isDefault());
            ((NodeImpl) node).setConstraint(outgoingConnection, ruleConstraint);
        } else if ("code".equals(constraint.getType())) {
            ReturnValueConstraintEvaluator returnValueConstraint = new ReturnValueConstraintEvaluator();
            returnValueConstraint.setDialect(constraint.getDialect());
            returnValueConstraint.setName(constraint.getName());
            returnValueConstraint.setPriority(constraint.getPriority());
            returnValueConstraint.setDefault(constraint.isDefault());
            ((NodeImpl) node).setConstraint(outgoingConnection, returnValueConstraint);
            ReturnValueDescr returnValueDescr = new ReturnValueDescr();
            returnValueDescr.setText(constraint.getConstraint());
            returnValueDescr.setResource(processDescr.getResource());
            ProcessDialect dialect = ProcessDialectRegistry.getDialect(constraint.getDialect());
            dialect.getReturnValueEvaluatorBuilder().build(context, returnValueConstraint, returnValueDescr, (NodeImpl) node);
        }
    }
}
Also used : NodeImpl(org.jbpm.workflow.core.impl.NodeImpl) Constraint(org.jbpm.workflow.core.Constraint) HashMap(java.util.HashMap) ReturnValueDescr(org.drools.compiler.compiler.ReturnValueDescr) Connection(org.kie.api.definition.process.Connection) ReturnValueConstraintEvaluator(org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator) ProcessDialect(org.jbpm.process.builder.dialect.ProcessDialect) ConstraintImpl(org.jbpm.workflow.core.impl.ConstraintImpl) RuleConstraintEvaluator(org.jbpm.process.instance.impl.RuleConstraintEvaluator) Split(org.jbpm.workflow.core.node.Split) ConnectionRef(org.jbpm.workflow.core.impl.ConnectionRef) HashMap(java.util.HashMap) Map(java.util.Map)

Example 7 with Constraint

use of org.jbpm.workflow.core.Constraint in project jbpm by kiegroup.

the class SplitNodeBuilder method build.

public void build(Process process, ProcessDescr processDescr, ProcessBuildContext context, Node node) {
    Split splitNode = (Split) node;
    if (splitNode.getType() != Split.TYPE_XOR && splitNode.getType() != Split.TYPE_OR) {
        // we only process or/xor
        return;
    }
    // we need to clone the map, so we can update the original while iterating.
    Map<ConnectionRef, Constraint> map = new HashMap<ConnectionRef, Constraint>(splitNode.getConstraints());
    for (Iterator<Map.Entry<ConnectionRef, Constraint>> it = map.entrySet().iterator(); it.hasNext(); ) {
        Map.Entry<ConnectionRef, Constraint> entry = it.next();
        ConnectionRef connection = entry.getKey();
        ConstraintImpl constraint = (ConstraintImpl) entry.getValue();
        Connection outgoingConnection = null;
        for (Connection out : splitNode.getDefaultOutgoingConnections()) {
            if (out.getToType().equals(connection.getToType()) && out.getTo().getId() == connection.getNodeId()) {
                outgoingConnection = out;
            }
        }
        if (outgoingConnection == null) {
            throw new IllegalArgumentException("Could not find outgoing connection");
        }
        if (constraint == null && splitNode.isDefault(outgoingConnection)) {
        // do nothing since conditions are ignored for default sequence flow
        } else if (constraint != null && "rule".equals(constraint.getType())) {
            RuleConstraintEvaluator ruleConstraint = new RuleConstraintEvaluator();
            ruleConstraint.setDialect(constraint.getDialect());
            ruleConstraint.setName(constraint.getName());
            ruleConstraint.setPriority(constraint.getPriority());
            ruleConstraint.setDefault(constraint.isDefault());
            ruleConstraint.setType(constraint.getType());
            ruleConstraint.setConstraint(constraint.getConstraint());
            splitNode.setConstraint(outgoingConnection, ruleConstraint);
        } else if (constraint != null && "code".equals(constraint.getType())) {
            ReturnValueConstraintEvaluator returnValueConstraint = new ReturnValueConstraintEvaluator();
            returnValueConstraint.setDialect(constraint.getDialect());
            returnValueConstraint.setName(constraint.getName());
            returnValueConstraint.setPriority(constraint.getPriority());
            returnValueConstraint.setDefault(constraint.isDefault());
            returnValueConstraint.setType(constraint.getType());
            returnValueConstraint.setConstraint(constraint.getConstraint());
            splitNode.setConstraint(outgoingConnection, returnValueConstraint);
            ReturnValueDescr returnValueDescr = new ReturnValueDescr();
            returnValueDescr.setText(constraint.getConstraint());
            returnValueDescr.setResource(processDescr.getResource());
            ProcessDialect dialect = ProcessDialectRegistry.getDialect(constraint.getDialect());
            dialect.getReturnValueEvaluatorBuilder().build(context, returnValueConstraint, returnValueDescr, (NodeImpl) node);
        }
    }
}
Also used : Constraint(org.jbpm.workflow.core.Constraint) HashMap(java.util.HashMap) ReturnValueDescr(org.drools.compiler.compiler.ReturnValueDescr) Connection(org.kie.api.definition.process.Connection) ReturnValueConstraintEvaluator(org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator) ProcessDialect(org.jbpm.process.builder.dialect.ProcessDialect) ConstraintImpl(org.jbpm.workflow.core.impl.ConstraintImpl) RuleConstraintEvaluator(org.jbpm.process.instance.impl.RuleConstraintEvaluator) Split(org.jbpm.workflow.core.node.Split) ConnectionRef(org.jbpm.workflow.core.impl.ConnectionRef) HashMap(java.util.HashMap) Map(java.util.Map)

Example 8 with Constraint

use of org.jbpm.workflow.core.Constraint in project jbpm by kiegroup.

the class StateNodeInstance method activationCreated.

public void activationCreated(MatchCreatedEvent event) {
    Connection selected = null;
    for (Connection connection : getNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
        Constraint constraint = getStateNode().getConstraint(connection);
        if (constraint != null) {
            String constraintName = getActivationEventType() + "-" + connection.getTo().getId() + "-" + connection.getToType();
            if (constraintName.equals(event.getMatch().getRule().getName()) && checkProcessInstance((Activation) event.getMatch())) {
                selected = connection;
            }
        }
    }
    if (selected != null) {
        removeEventListeners();
        ((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
        triggerConnection(selected);
    }
}
Also used : NodeInstanceContainer(org.jbpm.workflow.instance.NodeInstanceContainer) Constraint(org.jbpm.workflow.core.Constraint) Connection(org.kie.api.definition.process.Connection) Activation(org.drools.core.spi.Activation)

Example 9 with Constraint

use of org.jbpm.workflow.core.Constraint in project jbpm by kiegroup.

the class StateNodeInstance method internalTrigger.

public void internalTrigger(NodeInstance from, String type) {
    super.internalTrigger(from, type);
    // if node instance was cancelled, abort
    if (getNodeInstanceContainer().getNodeInstance(getId()) == null) {
        return;
    }
    // TODO: composite states trigger
    StateNode stateNode = getStateNode();
    Connection selected = null;
    int priority = Integer.MAX_VALUE;
    for (Connection connection : stateNode.getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
        Constraint constraint = stateNode.getConstraint(connection);
        if (constraint != null && constraint.getPriority() < priority) {
            String rule = "RuleFlowStateNode-" + getProcessInstance().getProcessId() + "-" + getStateNode().getUniqueId() + "-" + connection.getTo().getId() + "-" + connection.getToType();
            boolean isActive = ((InternalAgenda) getProcessInstance().getKnowledgeRuntime().getAgenda()).isRuleActiveInRuleFlowGroup("DROOLS_SYSTEM", rule, getProcessInstance().getId());
            if (isActive) {
                selected = connection;
                priority = constraint.getPriority();
            }
        }
    }
    if (selected != null) {
        ((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
        triggerConnection(selected);
    } else {
        addTriggerListener();
        addActivationListener();
    }
}
Also used : InternalAgenda(org.drools.core.common.InternalAgenda) NodeInstanceContainer(org.jbpm.workflow.instance.NodeInstanceContainer) Constraint(org.jbpm.workflow.core.Constraint) StateNode(org.jbpm.workflow.core.node.StateNode) Connection(org.kie.api.definition.process.Connection) Constraint(org.jbpm.workflow.core.Constraint)

Example 10 with Constraint

use of org.jbpm.workflow.core.Constraint in project jbpm by kiegroup.

the class StateNodeInstance method signalEvent.

public void signalEvent(String type, Object event) {
    if ("signal".equals(type)) {
        if (event instanceof String) {
            for (Connection connection : getStateNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
                boolean selected = false;
                Constraint constraint = getStateNode().getConstraint(connection);
                if (constraint == null) {
                    if (((String) event).equals(connection.getTo().getName())) {
                        selected = true;
                    }
                } else if (((String) event).equals(constraint.getName())) {
                    selected = true;
                }
                if (selected) {
                    triggerEvent(ExtendedNodeImpl.EVENT_NODE_EXIT);
                    removeEventListeners();
                    ((org.jbpm.workflow.instance.NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
                    triggerConnection(connection);
                    return;
                }
            }
        }
    } else if (getActivationEventType().equals(type)) {
        if (event instanceof MatchCreatedEvent) {
            activationCreated((MatchCreatedEvent) event);
        }
    } else {
        super.signalEvent(type, event);
    }
}
Also used : NodeInstanceContainer(org.jbpm.workflow.instance.NodeInstanceContainer) Constraint(org.jbpm.workflow.core.Constraint) Connection(org.kie.api.definition.process.Connection) MatchCreatedEvent(org.kie.api.event.rule.MatchCreatedEvent)

Aggregations

Constraint (org.jbpm.workflow.core.Constraint)16 ConnectionRef (org.jbpm.workflow.core.impl.ConnectionRef)8 Split (org.jbpm.workflow.core.node.Split)8 ConstraintImpl (org.jbpm.workflow.core.impl.ConstraintImpl)6 StateNode (org.jbpm.workflow.core.node.StateNode)6 Connection (org.kie.api.definition.process.Connection)6 Map (java.util.Map)5 EventNode (org.jbpm.workflow.core.node.EventNode)4 StartNode (org.jbpm.workflow.core.node.StartNode)4 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3 EventTypeFilter (org.jbpm.process.core.event.EventTypeFilter)3 ConnectionImpl (org.jbpm.workflow.core.impl.ConnectionImpl)3 ActionNode (org.jbpm.workflow.core.node.ActionNode)3 CompositeContextNode (org.jbpm.workflow.core.node.CompositeContextNode)3 EndNode (org.jbpm.workflow.core.node.EndNode)3 FaultNode (org.jbpm.workflow.core.node.FaultNode)3 NodeInstanceContainer (org.jbpm.workflow.instance.NodeInstanceContainer)3 List (java.util.List)2 ReturnValueDescr (org.drools.compiler.compiler.ReturnValueDescr)2