org.camunda.bpm.engine.impl.dmn.cmd.EvaluateDecisionCmd Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of camunda-engine Show documentation
Show all versions of camunda-engine Show documentation
The Camunda BPMN engine + configurable support for GraalVM and support for CockroachDB.
The newest version!
/*
* Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. Camunda licenses this file to you under the Apache License,
* Version 2.0; you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.camunda.bpm.engine.impl.dmn.cmd;
import static org.camunda.bpm.engine.impl.util.DecisionEvaluationUtil.evaluateDecision;
import static org.camunda.bpm.engine.impl.util.EnsureUtil.ensureOnlyOneNotNull;
import java.util.ArrayList;
import java.util.List;
import org.camunda.bpm.dmn.engine.DmnDecisionResult;
import org.camunda.bpm.engine.ProcessEngineException;
import org.camunda.bpm.engine.history.UserOperationLogEntry;
import org.camunda.bpm.engine.impl.cfg.CommandChecker;
import org.camunda.bpm.engine.impl.dmn.DecisionEvaluationBuilderImpl;
import org.camunda.bpm.engine.impl.interceptor.Command;
import org.camunda.bpm.engine.impl.interceptor.CommandContext;
import org.camunda.bpm.engine.impl.persistence.deploy.cache.DeploymentCache;
import org.camunda.bpm.engine.impl.persistence.entity.PropertyChange;
import org.camunda.bpm.engine.repository.DecisionDefinition;
import org.camunda.bpm.engine.variable.VariableMap;
import org.camunda.bpm.engine.variable.Variables;
/**
* Evaluates the decision with the given key or id.
*
* If the decision definition key given then specify the version and tenant-id.
* If no version is provided then the latest version is taken.
*/
public class EvaluateDecisionCmd implements Command {
protected String decisionDefinitionKey;
protected String decisionDefinitionId;
protected Integer version;
protected VariableMap variables;
protected String decisionDefinitionTenantId;
protected boolean isTenandIdSet;
public EvaluateDecisionCmd(DecisionEvaluationBuilderImpl builder) {
this.decisionDefinitionKey = builder.getDecisionDefinitionKey();
this.decisionDefinitionId = builder.getDecisionDefinitionId();
this.version = builder.getVersion();
this.variables = Variables.fromMap(builder.getVariables());
this.decisionDefinitionTenantId = builder.getDecisionDefinitionTenantId();
this.isTenandIdSet = builder.isTenantIdSet();
}
@Override
public DmnDecisionResult execute(CommandContext commandContext) {
ensureOnlyOneNotNull("either decision definition id or key must be set", decisionDefinitionId, decisionDefinitionKey);
DecisionDefinition decisionDefinition = getDecisionDefinition(commandContext);
for(CommandChecker checker : commandContext.getProcessEngineConfiguration().getCommandCheckers()) {
checker.checkEvaluateDecision(decisionDefinition);
}
writeUserOperationLog(commandContext, decisionDefinition);
return doEvaluateDecision(decisionDefinition, variables);
}
protected void writeUserOperationLog(CommandContext commandContext, DecisionDefinition decisionDefinition) {
List propertyChanges = new ArrayList<>();
propertyChanges.add(new PropertyChange("decisionDefinitionId", null, decisionDefinition.getId()));
propertyChanges.add(new PropertyChange("decisionDefinitionKey", null, decisionDefinition.getKey()));
commandContext.getOperationLogManager().logDecisionDefinitionOperation(UserOperationLogEntry.OPERATION_TYPE_EVALUATE, propertyChanges);
}
protected DmnDecisionResult doEvaluateDecision(DecisionDefinition decisionDefinition, VariableMap variables) {
try {
return evaluateDecision(decisionDefinition, variables);
}
catch (Exception e) {
throw new ProcessEngineException("Exception while evaluating decision with key '"+decisionDefinitionKey+"'", e);
}
}
protected DecisionDefinition getDecisionDefinition(CommandContext commandContext) {
DeploymentCache deploymentCache = commandContext.getProcessEngineConfiguration().getDeploymentCache();
if (decisionDefinitionId != null) {
return findById(deploymentCache);
} else {
return findByKey(deploymentCache);
}
}
protected DecisionDefinition findById(DeploymentCache deploymentCache) {
return deploymentCache.findDeployedDecisionDefinitionById(decisionDefinitionId);
}
protected DecisionDefinition findByKey(DeploymentCache deploymentCache) {
DecisionDefinition decisionDefinition = null;
if (version == null && !isTenandIdSet) {
decisionDefinition = deploymentCache.findDeployedLatestDecisionDefinitionByKey(decisionDefinitionKey);
}
else if (version == null && isTenandIdSet) {
decisionDefinition = deploymentCache.findDeployedLatestDecisionDefinitionByKeyAndTenantId(decisionDefinitionKey, decisionDefinitionTenantId);
}
else if (version != null && !isTenandIdSet) {
decisionDefinition = deploymentCache.findDeployedDecisionDefinitionByKeyAndVersion(decisionDefinitionKey, version);
}
else if (version != null && isTenandIdSet) {
decisionDefinition = deploymentCache.findDeployedDecisionDefinitionByKeyVersionAndTenantId(decisionDefinitionKey, version, decisionDefinitionTenantId);
}
return decisionDefinition;
}
}