提交 cb319de6 编写于 作者: T Tijs Rademakers

Changes for merge of PR #749

上级 b88e5f8a
......@@ -293,10 +293,10 @@ public interface HistoricProcessInstanceQuery extends Query<HistoricProcessInsta
/**
* Localize historic process name and description to specified locale.
*/
public HistoricProcessInstanceQuery locale(String locale);
HistoricProcessInstanceQuery locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
public HistoricProcessInstanceQuery withLocalizationFallback();
HistoricProcessInstanceQuery withLocalizationFallback();
}
......@@ -12,28 +12,24 @@
*/
package org.activiti.engine.impl;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SubProcess;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.DynamicBpmnConstants;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.SuspensionState;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ExecutionQuery;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @author Joram Barrez
* @author Frederik Heremans
......@@ -302,35 +298,28 @@ public class ExecutionQueryImpl extends AbstractVariableQueryImpl<ExecutionQuery
return commandContext.getExecutionEntityManager().findExecutionCountByQueryCriteria(this);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@SuppressWarnings({ "unchecked" })
public List<Execution> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
List<?> executions = commandContext.getExecutionEntityManager().findExecutionsByQueryCriteria(this, page);
for(ExecutionEntity execution : (List<ExecutionEntity>)executions) {
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(execution.getProcessDefinitionId());
String activityId;
if(execution.isScope()) {
if(execution.getId() == execution.getProcessInstanceId()) {
Process process = bpmnModel.getMainProcess();
execution.setName(process.getName());
execution.setDescription(process.getDocumentation());
activityId = process.getId();
}
else {
activityId = execution.getActivityId();
FlowElement element = bpmnModel.getFlowElement(activityId);
if(element instanceof SubProcess) {
SubProcess subprocess = (SubProcess) element;
execution.setName(subprocess.getName());
execution.setDescription(subprocess.getDocumentation());
}
for (ExecutionEntity execution : (List<ExecutionEntity>) executions) {
String activityId = null;
if (execution.getId().equals(execution.getProcessInstanceId())) {
if (execution.getProcessDefinitionId() != null) {
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration()
.getDeploymentManager()
.findDeployedProcessDefinitionById(execution.getProcessDefinitionId());
activityId = processDefinition.getKey();
}
} else {
activityId = execution.getActivityId();
}
if(locale != null && activityId != null) {
localize(execution, activityId);
}
if (activityId != null) {
localize(execution, activityId);
}
}
......@@ -343,7 +332,7 @@ public class ExecutionQueryImpl extends AbstractVariableQueryImpl<ExecutionQuery
executionEntity.setLocalizedDescription(null);
String processDefinitionId = executionEntity.getProcessDefinitionId();
if (processDefinitionId != null) {
if (locale != null && processDefinitionId != null) {
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, activityId, processDefinitionId, withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
......
......@@ -18,8 +18,6 @@ import java.util.Date;
import java.util.List;
import java.util.Set;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.DynamicBpmnConstants;
......@@ -29,7 +27,7 @@ import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
import org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
......@@ -72,11 +70,11 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
protected String name;
protected String nameLike;
protected String nameLikeIgnoreCase;
protected String locale;
protected boolean withLocalizationFallback;
protected List<HistoricProcessInstanceQueryImpl> orQueryObjects = new ArrayList<HistoricProcessInstanceQueryImpl>();
protected HistoricProcessInstanceQueryImpl currentOrQueryObject = null;
protected boolean inOrStatement = false;
protected String locale;
protected boolean withLocalizationFallback;
public HistoricProcessInstanceQueryImpl() {
}
......@@ -456,6 +454,16 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
return variableValueLike(name, value, true);
}
}
public HistoricProcessInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public HistoricProcessInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public HistoricProcessInstanceQuery or() {
if (inOrStatement) {
......@@ -505,16 +513,6 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
public HistoricProcessInstanceQuery orderByTenantId() {
return orderBy(HistoricProcessInstanceQueryProperty.TENANT_ID);
}
public HistoricProcessInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public HistoricProcessInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public String getMssqlOrDB2OrderBy() {
String specialOrderBy = super.getOrderBy();
......@@ -534,48 +532,39 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
public List<HistoricProcessInstance> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
List<HistoricProcessInstance> results;
List<HistoricProcessInstance> results = null;
if (includeProcessVariables) {
results = commandContext.getHistoricProcessInstanceEntityManager().findHistoricProcessInstancesAndVariablesByQueryCriteria(this);
} else {
results = commandContext.getHistoricProcessInstanceEntityManager().findHistoricProcessInstancesByQueryCriteria(this);
}
for(HistoricProcessInstance processInstance : results) {
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processInstance.getProcessDefinitionId());
Process process = bpmnModel.getMainProcess();
HistoricProcessInstanceEntity processInstanceEntity = (HistoricProcessInstanceEntity) processInstance;
if (null == processInstance.getName()) {
processInstanceEntity.setName(process.getName());
}
processInstanceEntity.setDescription(process.getDocumentation());
if (locale != null) {
localize(processInstanceEntity, bpmnModel);
}
for (HistoricProcessInstance processInstance : results) {
localize(processInstance, commandContext);
}
return results;
}
protected void localize(HistoricProcessInstanceEntity processInstance, BpmnModel bpmnModel) {
processInstance.setLocalizedName(null);
processInstance.setLocalizedDescription(null);
protected void localize(HistoricProcessInstance processInstance, CommandContext commandContext) {
HistoricProcessInstanceEntity processInstanceEntity = (HistoricProcessInstanceEntity) processInstance;
processInstanceEntity.setLocalizedName(null);
processInstanceEntity.setLocalizedDescription(null);
String processDefinitionId = processInstance.getProcessDefinitionId();
String processDefinitionKey = bpmnModel.getMainProcess().getId();
if (processDefinitionId != null) {
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, processDefinitionKey, processDefinitionId, withLocalizationFallback);
if (locale != null && processInstance.getProcessDefinitionId() != null) {
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration().getDeploymentManager().findDeployedProcessDefinitionById(processInstanceEntity.getProcessDefinitionId());
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, processDefinition.getKey(),
processInstanceEntity.getProcessDefinitionId(), withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
if (languageNameNode != null && languageNameNode.isNull() == false) {
processInstance.setLocalizedName(languageNameNode.asText());
processInstanceEntity.setLocalizedName(languageNameNode.asText());
}
JsonNode languageDescriptionNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_DESCRIPTION);
if (languageDescriptionNode != null && languageDescriptionNode.isNull() == false) {
processInstance.setLocalizedDescription(languageDescriptionNode.asText());
processInstanceEntity.setLocalizedDescription(languageDescriptionNode.asText());
}
}
}
......
......@@ -18,8 +18,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.DynamicBpmnConstants;
......@@ -28,7 +26,6 @@ import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.SuspensionState;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
......@@ -485,6 +482,16 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
return variableValueLike(name, value, false);
}
}
public ProcessInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public ProcessInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public ProcessInstanceQuery orderByProcessInstanceId() {
this.orderProperty = ProcessInstanceQueryProperty.PROCESS_INSTANCE_ID;
......@@ -505,16 +512,6 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
this.orderProperty = ProcessInstanceQueryProperty.TENANT_ID;
return this;
}
public ProcessInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public ProcessInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public String getMssqlOrDB2OrderBy() {
String specialOrderBy = super.getOrderBy();
......@@ -537,26 +534,15 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
public List<ProcessInstance> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
List<ProcessInstance> processInstances;
List<ProcessInstance> processInstances = null;
if (includeProcessVariables) {
processInstances = commandContext.getExecutionEntityManager().findProcessInstanceAndVariablesByQueryCriteria(this);
} else {
processInstances= commandContext.getExecutionEntityManager().findProcessInstanceByQueryCriteria(this);
processInstances = commandContext.getExecutionEntityManager().findProcessInstanceByQueryCriteria(this);
}
for (ProcessInstance processInstance : processInstances) {
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processInstance.getProcessDefinitionId());
Process process = bpmnModel.getMainProcess();
ExecutionEntity processInstanceExecution = (ExecutionEntity) processInstance;
if (null == processInstance.getName()) {
processInstanceExecution.setName(process.getName());
}
processInstanceExecution.setDescription(process.getDocumentation());
if (locale != null) {
localize(processInstanceExecution);
}
localize(processInstance);
}
return processInstances;
......@@ -571,7 +557,8 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
}
}
protected void localize(ExecutionEntity processInstanceExecution) {
protected void localize(ProcessInstance processInstance) {
ExecutionEntity processInstanceExecution = (ExecutionEntity) processInstance;
processInstanceExecution.setLocalizedName(null);
processInstanceExecution.setLocalizedDescription(null);
......
......@@ -103,9 +103,9 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
protected boolean includeProcessVariables;
protected String userIdForCandidateAndAssignee;
protected boolean bothCandidateAndAssigned;
protected boolean orActive;
protected String locale;
protected boolean withLocalizationFallback;
protected boolean orActive;
protected List<TaskQueryImpl> orQueryObjects = new ArrayList<TaskQueryImpl>();
protected TaskQueryImpl currentOrQueryObject = null;
......
......@@ -12,6 +12,11 @@
*/
package org.activiti.engine.impl.bpmn.deployer;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ExtensionElement;
......@@ -36,12 +41,9 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author Joram Barrez
* @author Tijs Rademakers
......@@ -88,7 +90,7 @@ public class BpmnDeployer implements Deployer {
cachingAndArtifactsManager.updateCachingAndArtifacts(parsedDeployment);
for(ProcessDefinitionEntity processDefinition : parsedDeployment.getAllProcessDefinitions()) {
for (ProcessDefinitionEntity processDefinition : parsedDeployment.getAllProcessDefinitions()) {
BpmnModel bpmnModel = parsedDeployment.getBpmnModelForProcessDefinition(processDefinition);
createLocalizationValues(processDefinition.getId(), bpmnModel.getProcessById(processDefinition.getKey()));
}
......@@ -246,105 +248,154 @@ public class BpmnDeployer implements Deployer {
}
}
public IdGenerator getIdGenerator() {
return idGenerator;
}
public void setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
public ParsedDeploymentBuilderFactory getExParsedDeploymentBuilderFactory() {
return parsedDeploymentBuilderFactory;
}
public void setParsedDeploymentBuilderFactory(ParsedDeploymentBuilderFactory parsedDeploymentBuilderFactory) {
this.parsedDeploymentBuilderFactory = parsedDeploymentBuilderFactory;
}
public BpmnDeploymentHelper getBpmnDeploymentHelper() {
return bpmnDeploymentHelper;
}
public void setBpmnDeploymentHelper(BpmnDeploymentHelper bpmnDeploymentHelper) {
this.bpmnDeploymentHelper = bpmnDeploymentHelper;
}
public CachingAndArtifactsManager getCachingAndArtifcatsManager() {
return cachingAndArtifactsManager;
}
public void setCachingAndArtifactsManager(CachingAndArtifactsManager manager) {
this.cachingAndArtifactsManager = manager;
}
public ProcessDefinitionDiagramHelper getProcessDefinitionDiagramHelper() {
return processDefinitionDiagramHelper;
}
public void setProcessDefinitionDiagramHelper(ProcessDefinitionDiagramHelper processDefinitionDiagramHelper) {
this.processDefinitionDiagramHelper = processDefinitionDiagramHelper;
}
protected void createLocalizationValues(String processDefinitionId, Process process) {
if (process == null) return;
CommandContext commandContext = Context.getCommandContext();
DynamicBpmnService dynamicBpmnService = commandContext.getProcessEngineConfiguration().getDynamicBpmnService();
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processDefinitionId);
boolean localizationValuesChanged = false;
List<ExtensionElement> localizationElements = process.getExtensionElements().get("localization");
if(localizationElements != null) {
for(ExtensionElement localizationElement : localizationElements) {
if(BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
if (localizationElements != null) {
for (ExtensionElement localizationElement : localizationElements) {
if (BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
String locale = localizationElement.getAttributeValue(null, "locale");
String name = localizationElement.getAttributeValue(null, "name");
String documentation = null;
List<ExtensionElement> documentationElements = localizationElement.getChildElements().get("documentation");
if(documentationElements != null) {
for(ExtensionElement documentationElement : documentationElements) {
if (documentationElements != null) {
for (ExtensionElement documentationElement : documentationElements) {
documentation = StringUtils.trimToNull(documentationElement.getElementText());
break;
}
}
String processId = process.getId();
dynamicBpmnService.changeLocalizationName(locale, processId, name, infoNode);
if(documentation != null) {
if (isEqualToCurrentLocalizationValue(locale, processId, "name", name, infoNode) == false) {
dynamicBpmnService.changeLocalizationName(locale, processId, name, infoNode);
localizationValuesChanged = true;
}
if (documentation != null && isEqualToCurrentLocalizationValue(locale, processId, "description", documentation, infoNode) == false) {
dynamicBpmnService.changeLocalizationDescription(locale, processId, documentation, infoNode);
localizationValuesChanged = true;
}
break;
}
}
}
for(FlowElement flowElement : process.getFlowElements()) {
if(flowElement instanceof UserTask || flowElement instanceof SubProcess) {
localizationElements = flowElement.getExtensionElements().get("localization");
if(localizationElements != null) {
for(ExtensionElement localizationElement : localizationElements) {
if(BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
boolean isFlowElementLocalizationChanged = localizeFlowElements(process.getFlowElements(), infoNode);
if (isFlowElementLocalizationChanged) {
localizationValuesChanged = true;
}
if (localizationValuesChanged) {
dynamicBpmnService.saveProcessDefinitionInfo(processDefinitionId, infoNode);
}
}
protected boolean localizeFlowElements(Collection<FlowElement> flowElements, ObjectNode infoNode) {
boolean localizationValuesChanged = false;
if (flowElements == null) return localizationValuesChanged;
CommandContext commandContext = Context.getCommandContext();
DynamicBpmnService dynamicBpmnService = commandContext.getProcessEngineConfiguration().getDynamicBpmnService();
for (FlowElement flowElement : flowElements) {
if (flowElement instanceof UserTask || flowElement instanceof SubProcess) {
List<ExtensionElement> localizationElements = flowElement.getExtensionElements().get("localization");
if (localizationElements != null) {
for (ExtensionElement localizationElement : localizationElements) {
if (BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
String locale = localizationElement.getAttributeValue(null, "locale");
String name = localizationElement.getAttributeValue(null, "name");
String documentation = null;
List<ExtensionElement> documentationElements = localizationElement.getChildElements().get("documentation");
if(documentationElements != null) {
for(ExtensionElement documentationElement : documentationElements) {
if (documentationElements != null) {
for (ExtensionElement documentationElement : documentationElements) {
documentation = StringUtils.trimToNull(documentationElement.getElementText());
break;
}
}
String flowElementId = flowElement.getId();
dynamicBpmnService.changeLocalizationName(locale, flowElementId, name, infoNode);
if(documentation != null) {
if (isEqualToCurrentLocalizationValue(locale, flowElementId, "name", name, infoNode) == false) {
dynamicBpmnService.changeLocalizationName(locale, flowElementId, name, infoNode);
localizationValuesChanged = true;
}
if (documentation != null && isEqualToCurrentLocalizationValue(locale, flowElementId, "description", documentation, infoNode) == false) {
dynamicBpmnService.changeLocalizationDescription(locale, flowElementId, documentation, infoNode);
localizationValuesChanged = true;
}
break;
}
}
}
if (flowElement instanceof SubProcess) {
boolean isSubProcessLocalized = localizeFlowElements(((SubProcess) flowElement).getFlowElements(), infoNode);
if (isSubProcessLocalized) {
localizationValuesChanged = true;
}
}
}
}
if(null != infoNode) {
dynamicBpmnService.saveProcessDefinitionInfo(processDefinitionId, infoNode);
return localizationValuesChanged;
}
protected boolean isEqualToCurrentLocalizationValue(String language, String id, String propertyName, String propertyValue, ObjectNode infoNode) {
boolean isEqual = false;
JsonNode localizationNode = infoNode.path("localization").path(language).path(id).path(propertyName);
if (localizationNode.isMissingNode() == false && localizationNode.isNull() == false && localizationNode.asText().equals(propertyValue)) {
isEqual = true;
}
return isEqual;
}
public IdGenerator getIdGenerator() {
return idGenerator;
}
public void setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
public ParsedDeploymentBuilderFactory getExParsedDeploymentBuilderFactory() {
return parsedDeploymentBuilderFactory;
}
public void setParsedDeploymentBuilderFactory(ParsedDeploymentBuilderFactory parsedDeploymentBuilderFactory) {
this.parsedDeploymentBuilderFactory = parsedDeploymentBuilderFactory;
}
public BpmnDeploymentHelper getBpmnDeploymentHelper() {
return bpmnDeploymentHelper;
}
public void setBpmnDeploymentHelper(BpmnDeploymentHelper bpmnDeploymentHelper) {
this.bpmnDeploymentHelper = bpmnDeploymentHelper;
}
public CachingAndArtifactsManager getCachingAndArtifcatsManager() {
return cachingAndArtifactsManager;
}
public void setCachingAndArtifactsManager(CachingAndArtifactsManager manager) {
this.cachingAndArtifactsManager = manager;
}
public ProcessDefinitionDiagramHelper getProcessDefinitionDiagramHelper() {
return processDefinitionDiagramHelper;
}
public void setProcessDefinitionDiagramHelper(ProcessDefinitionDiagramHelper processDefinitionDiagramHelper) {
this.processDefinitionDiagramHelper = processDefinitionDiagramHelper;
}
}
......@@ -135,17 +135,18 @@ public class Context {
ObjectNode definitionInfoNode = getProcessDefinitionInfoNode(processDefinitionId);
ObjectNode localizationProperties = null;
if (definitionInfoNode != null) {
if(!useFallback) {
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(language, id,
definitionInfoNode);
}
else {
if (useFallback == false) {
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(
language, id, definitionInfoNode);
} else {
HashSet<Locale> candidateLocales = new LinkedHashSet<Locale>();
candidateLocales.addAll(resourceBundleControl.getCandidateLocales(id, Locale.forLanguageTag(language)));
candidateLocales.addAll(resourceBundleControl.getCandidateLocales(id, new Locale(language)));
candidateLocales.addAll(resourceBundleControl.getCandidateLocales(id, Locale.getDefault()));
for (Locale locale : candidateLocales) {
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(locale.toLanguageTag(), id,
definitionInfoNode);
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(
locale.getLanguage(), id, definitionInfoNode);
if (localizationProperties != null) {
break;
}
......
......@@ -244,6 +244,16 @@ public interface ProcessInstanceQuery extends Query<ProcessInstanceQuery, Proces
* Only select process instances with a name like the given value, ignoring upper/lower case.
*/
ProcessInstanceQuery processInstanceNameLikeIgnoreCase(String nameLikeIgnoreCase);
/**
* Localize process name and description to specified locale.
*/
ProcessInstanceQuery locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
ProcessInstanceQuery withLocalizationFallback();
/**
* Include process variables in the process query result
......@@ -280,14 +290,4 @@ public interface ProcessInstanceQuery extends Query<ProcessInstanceQuery, Proces
* Order by tenant id (needs to be followed by {@link #asc()} or {@link #desc()}).
*/
ProcessInstanceQuery orderByTenantId();
/**
* Localize process name and description to specified locale.
*/
public ProcessInstanceQuery locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
public ProcessInstanceQuery withLocalizationFallback();
}
......@@ -497,7 +497,7 @@ public interface TaskInfoQuery<T extends TaskInfoQuery<?, ?>, V extends TaskInfo
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
public T withLocalizationFallback();
T withLocalizationFallback();
/**
* All query clauses called will be added to a single or-statement. This or-statement will be included with the other already existing clauses in the query, joined by an 'and'.
......
......@@ -35,8 +35,8 @@ public class HistoricProcessInstanceQueryTest extends PluggableActivitiTestCase
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
List<HistoricProcessInstance> processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).list();
assertEquals(1, processes.size());
assertEquals("Historic Process Name", processes.get(0).getName());
assertEquals("Historic Process Description", processes.get(0).getDescription());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
ObjectNode infoNode = dynamicBpmnService.changeLocalizationName("en-GB", "historicProcessLocalization", "Historic Process Name 'en-GB'");
dynamicBpmnService.changeLocalizationDescription("en-GB", "historicProcessLocalization", "Historic Process Description 'en-GB'", infoNode);
......@@ -48,8 +48,8 @@ public class HistoricProcessInstanceQueryTest extends PluggableActivitiTestCase
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).list();
assertEquals(1, processes.size());
assertEquals("Historic Process Name", processes.get(0).getName());
assertEquals("Historic Process Description", processes.get(0).getDescription());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-GB").list();
assertEquals(1, processes.size());
......@@ -58,8 +58,8 @@ public class HistoricProcessInstanceQueryTest extends PluggableActivitiTestCase
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).listPage(0,10);
assertEquals(1, processes.size());
assertEquals("Historic Process Name", processes.get(0).getName());
assertEquals("Historic Process Description", processes.get(0).getDescription());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-GB").listPage(0,10);
assertEquals(1, processes.size());
......@@ -67,8 +67,8 @@ public class HistoricProcessInstanceQueryTest extends PluggableActivitiTestCase
assertEquals("Historic Process Description 'en-GB'", processes.get(0).getDescription());
HistoricProcessInstance process = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
assertEquals("Historic Process Name", process.getName());
assertEquals("Historic Process Description", process.getDescription());
assertNull(process.getName());
assertNull(process.getDescription());
process = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-GB").singleResult();
assertEquals("Historic Process Name 'en-GB'", process.getName());
......
......@@ -1308,14 +1308,14 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
assertEquals("Process Name", execution.getName());
assertEquals("Process Description", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()){
assertEquals("SubProcess Name", execution.getName());
assertEquals("SubProcess Description", execution.getDescription());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertNull(execution.getName());
assertNull(execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()){
assertNull(execution.getName());
assertNull(execution.getDescription());
}
}
......@@ -1338,26 +1338,26 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
String subProcessId = null;
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
assertEquals("Process Name", execution.getName());
assertEquals("Process Description", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()){
assertEquals("SubProcess Name", execution.getName());
assertEquals("SubProcess Description", execution.getDescription());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertNull(execution.getName());
assertNull(execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()) {
assertNull(execution.getName());
assertNull(execution.getDescription());
subProcessId = execution.getId();
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("es").list();
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Nombre del proceso", execution.getName());
assertEquals("Descripción del proceso", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()){
} else if (execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("Nombre Subproceso", execution.getName());
assertEquals("Subproceso Descripción", execution.getDescription());
}
......@@ -1365,12 +1365,12 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("en-GB").list();
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Process Name 'en-GB'", execution.getName());
assertEquals("Process Description 'en-GB'", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()){
} else if(execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("SubProcess Name 'en-GB'", execution.getName());
assertEquals("SubProcess Description 'en-GB'", execution.getDescription());
}
......@@ -1378,25 +1378,25 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).listPage(0,10);
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
assertEquals("Process Name", execution.getName());
assertEquals("Process Description", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()){
assertEquals("SubProcess Name", execution.getName());
assertEquals("SubProcess Description", execution.getDescription());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertNull(execution.getName());
assertNull(execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()) {
assertNull(execution.getName());
assertNull(execution.getDescription());
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("es").listPage(0,10);
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Nombre del proceso", execution.getName());
assertEquals("Descripción del proceso", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()){
} else if(execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("Nombre Subproceso", execution.getName());
assertEquals("Subproceso Descripción", execution.getDescription());
}
......@@ -1404,24 +1404,24 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("en-GB").listPage(0,10);
assertEquals(3, executions.size());
for(Execution execution : executions) {
if(execution.getParentId() == null) {
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Process Name 'en-GB'", execution.getName());
assertEquals("Process Description 'en-GB'", execution.getDescription());
}
else if(execution.getParentId() == execution.getProcessInstanceId()) {
} else if(execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("SubProcess Name 'en-GB'", execution.getName());
assertEquals("SubProcess Description 'en-GB'", execution.getDescription());
}
}
Execution execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).singleResult();
assertEquals("Process Name", execution.getName());
assertEquals("Process Description", execution.getDescription());
assertNull(execution.getName());
assertNull(execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(subProcessId).singleResult();
assertEquals("SubProcess Name", execution.getName());
assertEquals("SubProcess Description", execution.getDescription());
assertNull(execution.getName());
assertNull(execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("es").singleResult();
assertEquals("Nombre del proceso", execution.getName());
......@@ -1455,12 +1455,9 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
dynamicBpmnService.changeLocalizationName("en-US", "subProcess", "SubProcess Name 'en-US'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-US", "subProcess", "SubProcess Description 'en-US'", infoNode);
dynamicBpmnService.changeLocalizationName("en-US", "subProcess", "SubProcess Name 'en-US'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-US", "subProcess", "SubProcess Description 'en-US'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("en-GB").withLocalizationFallback().singleResult();
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("en-US").singleResult();
assertEquals("Process Name 'en-US'", execution.getName());
assertEquals("Process Description 'en-US'", execution.getDescription());
......
......@@ -1756,8 +1756,8 @@ public class ProcessInstanceQueryTest extends PluggableActivitiTestCase {
List<ProcessInstance> processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).list();
assertEquals(1, processes.size());
assertEquals("oneTaskProcessName", processes.get(0).getName());
assertEquals("oneTaskProcessDescription", processes.get(0).getDescription());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
dynamicBpmnService.changeLocalizationName("en-GB", "oneTaskProcess", "The One Task Process 'en-GB' localized name", infoNode);
......@@ -1770,8 +1770,8 @@ public class ProcessInstanceQueryTest extends PluggableActivitiTestCase {
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).list();
assertEquals(1, processes.size());
assertEquals("oneTaskProcessName", processes.get(0).getName());
assertEquals("oneTaskProcessDescription", processes.get(0).getDescription());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("es").list();
assertEquals(1, processes.size());
......@@ -1785,8 +1785,8 @@ public class ProcessInstanceQueryTest extends PluggableActivitiTestCase {
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).listPage(0, 10);
assertEquals(1, processes.size());
assertEquals("oneTaskProcessName", processes.get(0).getName());
assertEquals("oneTaskProcessDescription", processes.get(0).getDescription());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("es").listPage(0,10);
assertEquals(1, processes.size());
......@@ -1799,8 +1799,8 @@ public class ProcessInstanceQueryTest extends PluggableActivitiTestCase {
assertEquals("The One Task Process 'en-GB' localized description", processes.get(0).getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertEquals("oneTaskProcessName", processInstance.getName());
assertEquals("oneTaskProcessDescription", processInstance.getDescription());
assertNull(processInstance.getName());
assertNull(processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("es").singleResult();
assertEquals("Nombre del proceso", processInstance.getName());
......@@ -1811,8 +1811,8 @@ public class ProcessInstanceQueryTest extends PluggableActivitiTestCase {
assertEquals("The One Task Process 'en-GB' localized description", processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertEquals("oneTaskProcessName", processInstance.getName());
assertEquals("oneTaskProcessDescription", processInstance.getDescription());
assertNull(processInstance.getName());
assertNull(processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("en").singleResult();
assertEquals("The One Task Process 'en' localized name", processInstance.getName());
......
......@@ -864,7 +864,7 @@ public class RuntimeServiceTest extends PluggableActivitiTestCase {
runtimeService.setProcessInstanceName(processInstance.getId(), null);
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(processInstance);
assertEquals("The One Task Process", processInstance.getName());
assertNull(processInstance.getName());
// Set name for unexisting process instance, should fail
try {
......@@ -876,7 +876,7 @@ public class RuntimeServiceTest extends PluggableActivitiTestCase {
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(processInstance);
assertEquals("The One Task Process", processInstance.getName());
assertNull(processInstance.getName());
// Set name for suspended process instance, should fail
runtimeService.suspendProcessInstanceById(processInstance.getId());
......@@ -889,7 +889,7 @@ public class RuntimeServiceTest extends PluggableActivitiTestCase {
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(processInstance);
assertEquals("The One Task Process", processInstance.getName());
assertNull(processInstance.getName());
}
private void startSignalCatchProcesses() {
......
......@@ -18,7 +18,7 @@
<documentation>SubProcess Description</documentation>
<extensionElements>
<activiti:localization locale="es" name="Nombre Subproceso">
<activiti:documentation>Subproceso Descripción</activiti:documentation>
<activiti:documentation>Subproceso Descripción</activiti:documentation>
</activiti:localization>
</extensionElements>
......
......@@ -24,89 +24,104 @@ import org.activiti.engine.runtime.ProcessInstance;
*/
public class Activiti5ProcessInstanceWrapper implements ProcessInstance {
private org.activiti5.engine.runtime.ProcessInstance activit5ProcessInstance;
private org.activiti5.engine.runtime.ProcessInstance activiti5ProcessInstance;
public Activiti5ProcessInstanceWrapper(org.activiti5.engine.runtime.ProcessInstance activit5ProcessInstance) {
this.activit5ProcessInstance = activit5ProcessInstance;
public Activiti5ProcessInstanceWrapper(org.activiti5.engine.runtime.ProcessInstance activiti5ProcessInstance) {
this.activiti5ProcessInstance = activiti5ProcessInstance;
}
@Override
public String getId() {
return activit5ProcessInstance.getId();
return activiti5ProcessInstance.getId();
}
@Override
public boolean isEnded() {
return activit5ProcessInstance.isEnded();
return activiti5ProcessInstance.isEnded();
}
@Override
public String getActivityId() {
return activit5ProcessInstance.getActivityId();
return activiti5ProcessInstance.getActivityId();
}
@Override
public String getProcessInstanceId() {
return activit5ProcessInstance.getProcessInstanceId();
return activiti5ProcessInstance.getProcessInstanceId();
}
@Override
public String getParentId() {
return activit5ProcessInstance.getParentId();
return activiti5ProcessInstance.getParentId();
}
@Override
public String getProcessDefinitionId() {
return activit5ProcessInstance.getProcessDefinitionId();
return activiti5ProcessInstance.getProcessDefinitionId();
}
@Override
public String getProcessDefinitionName() {
return activit5ProcessInstance.getProcessDefinitionName();
return activiti5ProcessInstance.getProcessDefinitionName();
}
@Override
public String getProcessDefinitionKey() {
return activit5ProcessInstance.getProcessDefinitionKey();
return activiti5ProcessInstance.getProcessDefinitionKey();
}
@Override
public Integer getProcessDefinitionVersion() {
return activit5ProcessInstance.getProcessDefinitionVersion();
return activiti5ProcessInstance.getProcessDefinitionVersion();
}
@Override
public String getDeploymentId() {
return activit5ProcessInstance.getDeploymentId();
return activiti5ProcessInstance.getDeploymentId();
}
@Override
public String getBusinessKey() {
return activit5ProcessInstance.getBusinessKey();
return activiti5ProcessInstance.getBusinessKey();
}
@Override
public boolean isSuspended() {
return activit5ProcessInstance.isSuspended();
return activiti5ProcessInstance.isSuspended();
}
@Override
public Map<String, Object> getProcessVariables() {
return activit5ProcessInstance.getProcessVariables();
return activiti5ProcessInstance.getProcessVariables();
}
@Override
public String getTenantId() {
return activit5ProcessInstance.getTenantId();
return activiti5ProcessInstance.getTenantId();
}
@Override
public String getName() {
return activit5ProcessInstance.getName();
return activiti5ProcessInstance.getName();
}
@Override
public String getDescription() {
return activiti5ProcessInstance.getDescription();
}
@Override
public String getLocalizedName() {
return activiti5ProcessInstance.getLocalizedName();
}
@Override
public String getLocalizedDescription() {
return activiti5ProcessInstance.getLocalizedDescription();
}
public org.activiti5.engine.runtime.ProcessInstance getRawObject() {
return activit5ProcessInstance;
return activiti5ProcessInstance;
}
}
......@@ -77,6 +77,11 @@ public interface HistoricProcessInstance {
*/
String getName();
/**
* The description for the process instance.
*/
String getDescription();
/** Returns the process variables if requested in the process instance query */
Map<String, Object> getProcessVariables();
}
......@@ -248,4 +248,14 @@ public interface HistoricProcessInstanceQuery extends Query<HistoricProcessInsta
* Only select process instances with a name like the given value, ignoring upper/lower case.
*/
HistoricProcessInstanceQuery processInstanceNameLikeIgnoreCase(String nameLikeIgnoreCase);
/**
* Localize historic process name and description to specified locale.
*/
HistoricProcessInstanceQuery locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
HistoricProcessInstanceQuery withLocalizationFallback();
}
......@@ -16,13 +16,20 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.activiti.engine.DynamicBpmnConstants;
import org.activiti5.engine.ActivitiIllegalArgumentException;
import org.activiti5.engine.impl.context.Context;
import org.activiti5.engine.impl.interceptor.CommandContext;
import org.activiti5.engine.impl.interceptor.CommandExecutor;
import org.activiti5.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti5.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti5.engine.impl.persistence.entity.SuspensionState;
import org.activiti5.engine.runtime.Execution;
import org.activiti5.engine.runtime.ExecutionQuery;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Joram Barrez
......@@ -45,6 +52,8 @@ public class ExecutionQueryImpl extends AbstractVariableQueryImpl<ExecutionQuery
protected String tenantId;
protected String tenantIdLike;
protected boolean withoutTenantId;
protected String locale;
protected boolean withLocalizationFallback;
// Not used by end-users, but needed for dynamic ibatis query
protected String superProcessInstanceId;
......@@ -236,6 +245,17 @@ public class ExecutionQueryImpl extends AbstractVariableQueryImpl<ExecutionQuery
public ExecutionQuery processVariableValueNotEqualsIgnoreCase(String name, String value) {
return variableValueNotEqualsIgnoreCase(name, value, false);
}
@Override
public ExecutionQuery locale(String locale) {
this.locale = locale;
return this;
}
public ExecutionQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
//ordering ////////////////////////////////////////////////////
......@@ -273,9 +293,50 @@ public class ExecutionQueryImpl extends AbstractVariableQueryImpl<ExecutionQuery
public List<Execution> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
return (List) commandContext
.getExecutionEntityManager()
.findExecutionsByQueryCriteria(this, page);
List<?> executions = commandContext.getExecutionEntityManager().findExecutionsByQueryCriteria(this, page);
for (ExecutionEntity execution : (List<ExecutionEntity>) executions) {
String activityId = null;
if (execution.getId().equals(execution.getProcessInstanceId())) {
if (execution.getProcessDefinitionId() != null) {
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration()
.getDeploymentManager()
.findDeployedProcessDefinitionById(execution.getProcessDefinitionId());
activityId = processDefinition.getKey();
}
} else {
activityId = execution.getActivityId();
}
if (activityId != null) {
localize(execution, activityId);
}
}
return (List<Execution>) executions;
}
protected void localize(Execution execution, String activityId) {
ExecutionEntity executionEntity = (ExecutionEntity) execution;
executionEntity.setLocalizedName(null);
executionEntity.setLocalizedDescription(null);
String processDefinitionId = executionEntity.getProcessDefinitionId();
if (locale != null && processDefinitionId != null) {
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, activityId, processDefinitionId, withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
if (languageNameNode != null && languageNameNode.isNull() == false) {
executionEntity.setLocalizedName(languageNameNode.asText());
}
JsonNode languageDescriptionNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_DESCRIPTION);
if (languageDescriptionNode != null && languageDescriptionNode.isNull() == false) {
executionEntity.setLocalizedDescription(languageDescriptionNode.asText());
}
}
}
}
//getters ////////////////////////////////////////////////////
......
......@@ -18,12 +18,19 @@ import java.util.Date;
import java.util.List;
import java.util.Set;
import org.activiti.engine.DynamicBpmnConstants;
import org.activiti5.engine.ActivitiException;
import org.activiti5.engine.ActivitiIllegalArgumentException;
import org.activiti5.engine.history.HistoricProcessInstance;
import org.activiti5.engine.history.HistoricProcessInstanceQuery;
import org.activiti5.engine.impl.context.Context;
import org.activiti5.engine.impl.interceptor.CommandContext;
import org.activiti5.engine.impl.interceptor.CommandExecutor;
import org.activiti5.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
import org.activiti5.engine.impl.persistence.entity.ProcessDefinitionEntity;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
......@@ -64,6 +71,8 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
protected String name;
protected String nameLike;
protected String nameLikeIgnoreCase;
protected String locale;
protected boolean withLocalizationFallback;
protected List<HistoricProcessInstanceQueryImpl> orQueryObjects = new ArrayList<HistoricProcessInstanceQueryImpl>();
protected HistoricProcessInstanceQueryImpl currentOrQueryObject = null;
protected boolean inOrStatement = false;
......@@ -447,6 +456,16 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
}
}
public HistoricProcessInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public HistoricProcessInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public HistoricProcessInstanceQuery or() {
if (inOrStatement) {
throw new ActivitiException("the query is already in an or statement");
......@@ -516,14 +535,41 @@ public class HistoricProcessInstanceQueryImpl extends AbstractVariableQueryImpl<
public List<HistoricProcessInstance> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
List<HistoricProcessInstance> results = null;
if (includeProcessVariables) {
return commandContext
.getHistoricProcessInstanceEntityManager()
.findHistoricProcessInstancesAndVariablesByQueryCriteria(this);
results = commandContext.getHistoricProcessInstanceEntityManager().findHistoricProcessInstancesAndVariablesByQueryCriteria(this);
} else {
return commandContext
.getHistoricProcessInstanceEntityManager()
.findHistoricProcessInstancesByQueryCriteria(this);
results = commandContext.getHistoricProcessInstanceEntityManager().findHistoricProcessInstancesByQueryCriteria(this);
}
for (HistoricProcessInstance processInstance : results) {
localize(processInstance, commandContext);
}
return results;
}
protected void localize(HistoricProcessInstance processInstance, CommandContext commandContext) {
HistoricProcessInstanceEntity processInstanceEntity = (HistoricProcessInstanceEntity) processInstance;
processInstanceEntity.setLocalizedName(null);
processInstanceEntity.setLocalizedDescription(null);
if (locale != null && processInstance.getProcessDefinitionId() != null) {
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration().getDeploymentManager().findDeployedProcessDefinitionById(processInstanceEntity.getProcessDefinitionId());
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, processDefinition.getKey(),
processInstanceEntity.getProcessDefinitionId(), withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
if (languageNameNode != null && languageNameNode.isNull() == false) {
processInstanceEntity.setLocalizedName(languageNameNode.asText());
}
JsonNode languageDescriptionNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_DESCRIPTION);
if (languageDescriptionNode != null && languageDescriptionNode.isNull() == false) {
processInstanceEntity.setLocalizedDescription(languageDescriptionNode.asText());
}
}
}
}
......
......@@ -17,6 +17,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.activiti.engine.DynamicBpmnConstants;
import org.activiti5.engine.ActivitiException;
import org.activiti5.engine.ActivitiIllegalArgumentException;
import org.activiti5.engine.history.HistoricTaskInstance;
......@@ -25,8 +26,12 @@ import org.activiti5.engine.identity.Group;
import org.activiti5.engine.impl.context.Context;
import org.activiti5.engine.impl.interceptor.CommandContext;
import org.activiti5.engine.impl.interceptor.CommandExecutor;
import org.activiti5.engine.impl.persistence.entity.HistoricTaskInstanceEntity;
import org.activiti5.engine.impl.variable.VariableTypes;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Tom Baeyens
......@@ -96,6 +101,8 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl<His
protected String tenantId;
protected String tenantIdLike;
protected boolean withoutTenantId;
protected String locale;
protected boolean withLocalizationFallback;
protected boolean includeTaskLocalVariables = false;
protected boolean includeProcessVariables = false;
protected List<HistoricTaskInstanceQueryImpl> orQueryObjects = new ArrayList<HistoricTaskInstanceQueryImpl>();
......@@ -1024,6 +1031,15 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl<His
return this;
}
public HistoricTaskInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public HistoricTaskInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public HistoricTaskInstanceQuery includeTaskLocalVariables() {
this.includeTaskLocalVariables = true;
......@@ -1055,6 +1071,30 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl<His
currentOrQueryObject = null;
return this;
}
protected void localize(HistoricTaskInstance task) {
HistoricTaskInstanceEntity taskEntity = (HistoricTaskInstanceEntity) task;
taskEntity.setLocalizedName(null);
taskEntity.setLocalizedDescription(null);
if (locale != null) {
String processDefinitionId = task.getProcessDefinitionId();
if (processDefinitionId != null) {
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, task.getTaskDefinitionKey(), processDefinitionId, withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
if (languageNameNode != null && languageNameNode.isNull() == false) {
taskEntity.setLocalizedName(languageNameNode.asText());
}
JsonNode languageDescriptionNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_DESCRIPTION);
if (languageDescriptionNode != null && languageDescriptionNode.isNull() == false) {
taskEntity.setLocalizedDescription(languageDescriptionNode.asText());
}
}
}
}
}
// ordering /////////////////////////////////////////////////////////////////
......
......@@ -18,14 +18,20 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.activiti.engine.DynamicBpmnConstants;
import org.activiti5.engine.ActivitiException;
import org.activiti5.engine.ActivitiIllegalArgumentException;
import org.activiti5.engine.impl.context.Context;
import org.activiti5.engine.impl.interceptor.CommandContext;
import org.activiti5.engine.impl.interceptor.CommandExecutor;
import org.activiti5.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti5.engine.impl.persistence.entity.SuspensionState;
import org.activiti5.engine.runtime.ProcessInstance;
import org.activiti5.engine.runtime.ProcessInstanceQuery;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Tom Baeyens
......@@ -58,6 +64,8 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
protected String name;
protected String nameLike;
protected String nameLikeIgnoreCase;
protected String locale;
protected boolean withLocalizationFallback;
protected String tenantId;
protected String tenantIdLike;
......@@ -472,6 +480,16 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
return variableValueLike(name, value, false);
}
}
public ProcessInstanceQuery locale(String locale) {
this.locale = locale;
return this;
}
public ProcessInstanceQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public ProcessInstanceQuery orderByProcessInstanceId() {
this.orderProperty = ProcessInstanceQueryProperty.PROCESS_INSTANCE_ID;
......@@ -516,17 +534,20 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
public List<ProcessInstance> executeList(CommandContext commandContext, Page page) {
checkQueryOk();
ensureVariablesInitialized();
List<ProcessInstance> processInstances = null;
if (includeProcessVariables) {
return commandContext
.getExecutionEntityManager()
.findProcessInstanceAndVariablesByQueryCriteria(this);
processInstances = commandContext.getExecutionEntityManager().findProcessInstanceAndVariablesByQueryCriteria(this);
} else {
return commandContext
.getExecutionEntityManager()
.findProcessInstanceByQueryCriteria(this);
processInstances = commandContext.getExecutionEntityManager().findProcessInstanceByQueryCriteria(this);
}
for (ProcessInstance processInstance : processInstances) {
localize(processInstance);
}
return processInstances;
}
@Override
protected void ensureVariablesInitialized() {
super.ensureVariablesInitialized();
......@@ -535,6 +556,30 @@ public class ProcessInstanceQueryImpl extends AbstractVariableQueryImpl<ProcessI
orQueryObject.ensureVariablesInitialized();
}
}
protected void localize(ProcessInstance processInstance) {
ExecutionEntity processInstanceExecution = (ExecutionEntity) processInstance;
processInstanceExecution.setLocalizedName(null);
processInstanceExecution.setLocalizedDescription(null);
if (locale != null) {
String processDefinitionId = processInstanceExecution.getProcessDefinitionId();
if (processDefinitionId != null) {
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, processInstanceExecution.getProcessDefinitionKey(), processDefinitionId, withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
if (languageNameNode != null && languageNameNode.isNull() == false) {
processInstanceExecution.setLocalizedName(languageNameNode.asText());
}
JsonNode languageDescriptionNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_DESCRIPTION);
if (languageDescriptionNode != null && languageDescriptionNode.isNull() == false) {
processInstanceExecution.setLocalizedDescription(languageDescriptionNode.asText());
}
}
}
}
}
//getters /////////////////////////////////////////////////////////////////
......
......@@ -16,6 +16,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.activiti.engine.DynamicBpmnConstants;
import org.activiti.engine.task.DelegationState;
import org.activiti5.engine.ActivitiException;
import org.activiti5.engine.ActivitiIllegalArgumentException;
......@@ -28,6 +29,9 @@ import org.activiti5.engine.impl.variable.VariableTypes;
import org.activiti5.engine.task.Task;
import org.activiti5.engine.task.TaskQuery;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Joram Barrez
* @author Tom Baeyens
......@@ -99,6 +103,8 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
protected boolean includeProcessVariables = false;
protected String userIdForCandidateAndAssignee;
protected boolean bothCandidateAndAssigned = false;
protected String locale;
protected boolean withLocalizationFallback;
protected boolean orActive;
protected List<TaskQueryImpl> orQueryObjects = new ArrayList<TaskQueryImpl>();
protected TaskQueryImpl currentOrQueryObject = null;
......@@ -1049,6 +1055,16 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
return this;
}
public TaskQuery locale(String locale) {
this.locale = locale;
return this;
}
public TaskQuery withLocalizationFallback() {
withLocalizationFallback = true;
return this;
}
public TaskQuery includeTaskLocalVariables() {
this.includeTaskLocalVariables = true;
return this;
......@@ -1211,15 +1227,20 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
public List<Task> executeList(CommandContext commandContext, Page page) {
ensureVariablesInitialized();
checkQueryOk();
List<Task> tasks = null;
if (includeTaskLocalVariables || includeProcessVariables) {
return commandContext
.getTaskEntityManager()
.findTasksAndVariablesByQueryCriteria(this);
tasks = commandContext.getTaskEntityManager().findTasksAndVariablesByQueryCriteria(this);
} else {
return commandContext
.getTaskEntityManager()
.findTasksByQueryCriteria(this);
tasks = commandContext.getTaskEntityManager().findTasksByQueryCriteria(this);
}
if (tasks != null) {
for (Task task : tasks) {
localize(task);
}
}
return tasks;
}
public long executeCount(CommandContext commandContext) {
......@@ -1230,6 +1251,29 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
.findTaskCountByQueryCriteria(this);
}
protected void localize(Task task) {
task.setLocalizedName(null);
task.setLocalizedDescription(null);
if (locale != null) {
String processDefinitionId = task.getProcessDefinitionId();
if (processDefinitionId != null) {
ObjectNode languageNode = Context.getLocalizationElementProperties(locale, task.getTaskDefinitionKey(), processDefinitionId, withLocalizationFallback);
if (languageNode != null) {
JsonNode languageNameNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_NAME);
if (languageNameNode != null && languageNameNode.isNull() == false) {
task.setLocalizedName(languageNameNode.asText());
}
JsonNode languageDescriptionNode = languageNode.get(DynamicBpmnConstants.LOCALIZATION_DESCRIPTION);
if (languageDescriptionNode != null && languageDescriptionNode.isNull() == false) {
task.setLocalizedDescription(languageDescriptionNode.asText());
}
}
}
}
}
//getters ////////////////////////////////////////////////////////////////
public String getName() {
......
......@@ -14,13 +14,23 @@ package org.activiti5.engine.impl.bpmn.deployer;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ExtensionElement;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SubProcess;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.Expression;
import org.activiti5.engine.ActivitiException;
import org.activiti5.engine.DynamicBpmnService;
import org.activiti5.engine.ProcessEngineConfiguration;
import org.activiti5.engine.delegate.event.ActivitiEventType;
import org.activiti5.engine.delegate.event.impl.ActivitiEventBuilder;
......@@ -56,9 +66,11 @@ import org.activiti5.engine.impl.persistence.entity.TimerEntity;
import org.activiti5.engine.impl.util.IoUtil;
import org.activiti5.engine.runtime.Job;
import org.activiti5.engine.task.IdentityLinkType;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
......@@ -82,7 +94,8 @@ public class BpmnDeployer implements Deployer {
List<ProcessDefinitionEntity> processDefinitions = new ArrayList<ProcessDefinitionEntity>();
Map<String, ResourceEntity> resources = deployment.getResources();
Map<String, BpmnModel> bpmnModelMap = new HashMap<String, BpmnModel>();
final ProcessEngineConfigurationImpl processEngineConfiguration = Context.getProcessEngineConfiguration();
for (String resourceName : resources.keySet()) {
......@@ -134,12 +147,14 @@ public class BpmnDeployer implements Deployer {
if(deployment.isNew()) {
if (processEngineConfiguration.isCreateDiagramOnDeploy() &&
diagramResourceName==null && processDefinition.isGraphicalNotationDefined()) {
try {
byte[] diagramBytes = IoUtil.readInputStream(processEngineConfiguration.
getProcessDiagramGenerator().generateDiagram(bpmnParse.getBpmnModel(), "png", processEngineConfiguration.getActivityFontName(),
processEngineConfiguration.getLabelFontName(), processEngineConfiguration.getClassLoader()), null);
diagramResourceName = getProcessImageResourceName(resourceName, processDefinition.getKey(), "png");
createResource(diagramResourceName, diagramBytes, deployment);
} catch (Throwable t) { // if anything goes wrong, we don't store the image (the process will still be executable).
log.warn("Error while generating process diagram, image will not be stored in repository", t);
}
......@@ -148,6 +163,7 @@ public class BpmnDeployer implements Deployer {
processDefinition.setDiagramResourceName(diagramResourceName);
processDefinitions.add(processDefinition);
bpmnModelMap.put(processDefinition.getKey(), bpmnParse.getBpmnModel());
}
}
}
......@@ -198,7 +214,7 @@ public class BpmnDeployer implements Deployer {
}
processDefinition.setId(processDefinitionId);
if(commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
if (commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
commandContext.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, processDefinition));
}
......@@ -215,7 +231,7 @@ public class BpmnDeployer implements Deployer {
dbSqlSession.insert(processDefinition);
addAuthorizations(processDefinition);
if(commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
if (commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
commandContext.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_INITIALIZED, processDefinition));
}
......@@ -247,6 +263,8 @@ public class BpmnDeployer implements Deployer {
// Add to deployment for further usage
deployment.addDeployedArtifact(processDefinition);
createLocalizationValues(processDefinition.getId(), bpmnModelMap.get(processDefinition.getKey()).getProcessById(processDefinition.getKey()));
}
}
......@@ -441,6 +459,117 @@ public class BpmnDeployer implements Deployer {
}
}
protected void createLocalizationValues(String processDefinitionId, Process process) {
if (process == null) return;
CommandContext commandContext = Context.getCommandContext();
DynamicBpmnService dynamicBpmnService = commandContext.getProcessEngineConfiguration().getDynamicBpmnService();
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processDefinitionId);
boolean localizationValuesChanged = false;
List<ExtensionElement> localizationElements = process.getExtensionElements().get("localization");
if (localizationElements != null) {
for (ExtensionElement localizationElement : localizationElements) {
if (BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
String locale = localizationElement.getAttributeValue(null, "locale");
String name = localizationElement.getAttributeValue(null, "name");
String documentation = null;
List<ExtensionElement> documentationElements = localizationElement.getChildElements().get("documentation");
if (documentationElements != null) {
for (ExtensionElement documentationElement : documentationElements) {
documentation = StringUtils.trimToNull(documentationElement.getElementText());
break;
}
}
String processId = process.getId();
if (isEqualToCurrentLocalizationValue(locale, processId, "name", name, infoNode) == false) {
dynamicBpmnService.changeLocalizationName(locale, processId, name, infoNode);
localizationValuesChanged = true;
}
if (documentation != null && isEqualToCurrentLocalizationValue(locale, processId, "description", documentation, infoNode) == false) {
dynamicBpmnService.changeLocalizationDescription(locale, processId, documentation, infoNode);
localizationValuesChanged = true;
}
break;
}
}
}
boolean isFlowElementLocalizationChanged = localizeFlowElements(process.getFlowElements(), infoNode);
if (isFlowElementLocalizationChanged) {
localizationValuesChanged = true;
}
if (localizationValuesChanged) {
dynamicBpmnService.saveProcessDefinitionInfo(processDefinitionId, infoNode);
}
}
protected boolean localizeFlowElements(Collection<FlowElement> flowElements, ObjectNode infoNode) {
boolean localizationValuesChanged = false;
if (flowElements == null) return localizationValuesChanged;
CommandContext commandContext = Context.getCommandContext();
DynamicBpmnService dynamicBpmnService = commandContext.getProcessEngineConfiguration().getDynamicBpmnService();
for (FlowElement flowElement : flowElements) {
if (flowElement instanceof UserTask || flowElement instanceof SubProcess) {
List<ExtensionElement> localizationElements = flowElement.getExtensionElements().get("localization");
if (localizationElements != null) {
for (ExtensionElement localizationElement : localizationElements) {
if (BpmnXMLConstants.ACTIVITI_EXTENSIONS_PREFIX.equals(localizationElement.getNamespacePrefix())) {
String locale = localizationElement.getAttributeValue(null, "locale");
String name = localizationElement.getAttributeValue(null, "name");
String documentation = null;
List<ExtensionElement> documentationElements = localizationElement.getChildElements().get("documentation");
if (documentationElements != null) {
for (ExtensionElement documentationElement : documentationElements) {
documentation = StringUtils.trimToNull(documentationElement.getElementText());
break;
}
}
String flowElementId = flowElement.getId();
if (isEqualToCurrentLocalizationValue(locale, flowElementId, "name", name, infoNode) == false) {
dynamicBpmnService.changeLocalizationName(locale, flowElementId, name, infoNode);
localizationValuesChanged = true;
}
if (documentation != null && isEqualToCurrentLocalizationValue(locale, flowElementId, "description", documentation, infoNode) == false) {
dynamicBpmnService.changeLocalizationDescription(locale, flowElementId, documentation, infoNode);
localizationValuesChanged = true;
}
break;
}
}
}
if (flowElement instanceof SubProcess) {
boolean isSubProcessLocalized = localizeFlowElements(((SubProcess) flowElement).getFlowElements(), infoNode);
if (isSubProcessLocalized) {
localizationValuesChanged = true;
}
}
}
}
return localizationValuesChanged;
}
protected boolean isEqualToCurrentLocalizationValue(String language, String id, String propertyName, String propertyValue, ObjectNode infoNode) {
boolean isEqual = false;
JsonNode localizationNode = infoNode.path("localization").path(language).path(id).path(propertyName);
if (localizationNode.isMissingNode() == false && localizationNode.isNull() == false && localizationNode.asText().equals(propertyValue)) {
isEqual = true;
}
return isEqual;
}
enum ExprType {
USER, GROUP
}
......
......@@ -14,7 +14,12 @@
package org.activiti5.engine.impl.context;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Stack;
import org.activiti5.engine.impl.cfg.ProcessEngineConfigurationImpl;
......@@ -37,6 +42,7 @@ public class Context {
protected static ThreadLocal<Stack<ExecutionContext>> executionContextStackThreadLocal = new ThreadLocal<Stack<ExecutionContext>>();
protected static ThreadLocal<JobExecutorContext> jobExecutorContextThreadLocal = new ThreadLocal<JobExecutorContext>();
protected static ThreadLocal<Map<String, ObjectNode>> bpmnOverrideContextThreadLocal = new ThreadLocal<Map<String, ObjectNode>>();
protected static ResourceBundle.Control resourceBundleControl = new ResourceBundleControl();
public static CommandContext getCommandContext() {
Stack<CommandContext> stack = getStack(commandContextThreadLocal);
......@@ -117,12 +123,27 @@ public class Context {
return elementProperties;
}
public static ObjectNode getLocalizationElementProperties(String language, String id, String processDefinitionId) {
public static ObjectNode getLocalizationElementProperties(String language, String id, String processDefinitionId, boolean useFallback) {
ObjectNode definitionInfoNode = getProcessDefinitionInfoNode(processDefinitionId);
ObjectNode localizationProperties = null;
if (definitionInfoNode != null) {
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(
language, id, definitionInfoNode);
if (useFallback == false) {
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(
language, id, definitionInfoNode);
} else {
HashSet<Locale> candidateLocales = new LinkedHashSet<Locale>();
candidateLocales.addAll(resourceBundleControl.getCandidateLocales(id, new Locale(language)));
candidateLocales.addAll(resourceBundleControl.getCandidateLocales(id, Locale.getDefault()));
for (Locale locale : candidateLocales) {
localizationProperties = getProcessEngineConfiguration().getDynamicBpmnService().getLocalizationElementProperties(
locale.getLanguage(), id, definitionInfoNode);
if (localizationProperties != null) {
break;
}
}
}
}
return localizationProperties;
}
......@@ -160,4 +181,11 @@ public class Context {
}
bpmnOverrideMap.put(id, infoNode);
}
static class ResourceBundleControl extends ResourceBundle.Control {
@Override
public List<Locale> getCandidateLocales(String baseName, Locale locale) {
return super.getCandidateLocales(baseName, locale);
}
}
}
......@@ -120,6 +120,9 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
/** The tenant identifier (if any) */
protected String tenantId = ProcessEngineConfiguration.NO_TENANT_ID;
protected String name;
protected String description;
protected String localizedName;
protected String localizedDescription;
protected Date lockTime;
......@@ -1617,13 +1620,45 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
@Override
public String getName() {
return this.name;
if (localizedName != null && localizedName.length() > 0) {
return localizedName;
} else {
return name;
}
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
if (localizedDescription != null && localizedDescription.length() > 0) {
return localizedDescription;
} else {
return description;
}
}
public void setDescription(String description) {
this.description = description;
}
public String getLocalizedName() {
return localizedName;
}
public void setLocalizedName(String localizedName) {
this.localizedName = localizedName;
}
public String getLocalizedDescription() {
return localizedDescription;
}
public void setLocalizedDescription(String localizedDescription) {
this.localizedDescription = localizedDescription;
}
public String getTenantId() {
return tenantId;
}
......
......@@ -40,6 +40,9 @@ public class HistoricProcessInstanceEntity extends HistoricScopeInstanceEntity i
protected String superProcessInstanceId;
protected String tenantId = ProcessEngineConfiguration.NO_TENANT_ID;
protected String name;
protected String localizedName;
protected String description;
protected String localizedDescription;
protected List<HistoricVariableInstanceEntity> queryVariables;
public HistoricProcessInstanceEntity() {
......@@ -122,12 +125,44 @@ public class HistoricProcessInstanceEntity extends HistoricScopeInstanceEntity i
}
public String getName() {
if (localizedName != null && localizedName.length() > 0) {
return localizedName;
} else {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getLocalizedName() {
return localizedName;
}
public void setLocalizedName(String localizedName) {
this.localizedName = localizedName;
}
public String getDescription() {
if (localizedDescription != null && localizedDescription.length() > 0) {
return localizedDescription;
} else {
return description;
}
}
public void setDescription(String description) {
this.description = description;
}
public String getLocalizedDescription() {
return localizedDescription;
}
public void setLocalizedDescription(String localizedDescription) {
this.localizedDescription = localizedDescription;
}
public Map<String, Object> getProcessVariables() {
Map<String, Object> variables = new HashMap<String, Object>();
......
......@@ -35,8 +35,10 @@ public class HistoricTaskInstanceEntity extends HistoricScopeInstanceEntity impl
protected String executionId;
protected String name;
protected String localizedName;
protected String parentTaskId;
protected String description;
protected String localizedDescription;
protected String owner;
protected String assignee;
protected String taskDefinitionKey;
......@@ -111,17 +113,35 @@ public class HistoricTaskInstanceEntity extends HistoricScopeInstanceEntity impl
this.executionId = executionId;
}
public String getName() {
return name;
if (localizedName != null && localizedName.length() > 0) {
return localizedName;
} else {
return name;
}
}
public void setName(String name) {
this.name = name;
}
public void setLocalizedName(String name) {
this.localizedName = name;
}
public String getDescription() {
return description;
if (localizedDescription != null && localizedDescription.length() > 0) {
return localizedDescription;
} else {
return description;
}
}
public void setDescription(String description) {
this.description = description;
}
public void setLocalizedDescription(String description) {
this.localizedDescription = description;
}
public String getAssignee() {
return assignee;
}
......
......@@ -69,7 +69,9 @@ public class TaskEntity extends VariableScopeImpl implements Task, DelegateTask,
protected String parentTaskId;
protected String name;
protected String localizedName;
protected String description;
protected String localizedDescription;
protected int priority = DEFAULT_PRIORITY;
protected Date createTime; // The time when the task has been created
protected Date dueDate;
......@@ -802,11 +804,35 @@ public class TaskEntity extends VariableScopeImpl implements Task, DelegateTask,
}
public String getName() {
return name;
if (localizedName != null && localizedName.length() > 0) {
return localizedName;
} else {
return name;
}
}
public String getLocalizedName() {
return localizedName;
}
public void setLocalizedName(String localizedName) {
this.localizedName = localizedName;
}
public String getDescription() {
return description;
if (localizedDescription != null && localizedDescription.length() > 0) {
return localizedDescription;
} else {
return description;
}
}
public String getLocalizedDescription() {
return localizedDescription;
}
public void setLocalizedDescription(String localizedDescription) {
this.localizedDescription = localizedDescription;
}
public Date getDueDate() {
......
......@@ -268,6 +268,16 @@ public interface ExecutionQuery extends Query<ExecutionQuery, Execution>{
*/
ExecutionQuery messageEventSubscriptionName(String messageName);
/**
* Localize execution name and description to specified locale.
*/
ExecutionQuery locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
public ExecutionQuery withLocalizationFallback();
//ordering //////////////////////////////////////////////////////////////
/** Order by id (needs to be followed by {@link #asc()} or {@link #desc()}). */
......
......@@ -77,4 +77,18 @@ public interface ProcessInstance extends Execution {
*/
String getName();
/**
* Returns the description of this process instance.
*/
String getDescription();
/**
* Returns the localized name of this process instance.
*/
String getLocalizedName();
/**
* Returns the localized description of this process instance.
*/
String getLocalizedDescription();
}
......@@ -246,6 +246,16 @@ public interface ProcessInstanceQuery extends Query<ProcessInstanceQuery, Proces
*/
ProcessInstanceQuery processInstanceNameLikeIgnoreCase(String nameLikeIgnoreCase);
/**
* Localize process name and description to specified locale.
*/
ProcessInstanceQuery locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
ProcessInstanceQuery withLocalizationFallback();
/**
* Include process variables in the process query result
*/
......
......@@ -34,8 +34,14 @@ public interface Task extends TaskInfo {
/** Name or title of the task. */
void setName(String name);
/** Sets an optional localized name for the task. */
void setLocalizedName(String name);
/** Change the description of the task */
void setDescription(String description);
void setDescription(String description);
/** Sets an optional localized description for the task. */
void setLocalizedDescription(String description);
/** Sets the indication of how important/urgent this task is */
void setPriority(int priority);
......
......@@ -16,6 +16,7 @@ import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.activiti.engine.task.IdentityLink;
import org.activiti5.engine.ActivitiIllegalArgumentException;
import org.activiti5.engine.history.HistoricTaskInstanceQuery;
import org.activiti5.engine.query.Query;
......@@ -520,6 +521,16 @@ public interface TaskInfoQuery<T extends TaskInfoQuery<?, ?>, V extends TaskInfo
*/
T includeProcessVariables();
/**
* Localize task name and description to specified locale.
*/
T locale(String locale);
/**
* Instruct localization to fallback to more general locales including the default locale of the JVM if the specified locale is not found.
*/
T withLocalizationFallback();
/**
* All query clauses called will be added to a single or-statement. This or-statement will be
* included with the other already existing clauses in the query, joined by an 'and'.
......
/* Licensed under the Apache License, Version 2.0 (the "License");
* 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.activiti5.engine.test.api.history;
import java.util.List;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
import org.activiti5.engine.impl.test.PluggableActivitiTestCase;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class HistoricProcessInstanceQueryTest extends PluggableActivitiTestCase {
@Deployment
public void testLocalization() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("historicProcessLocalization");
String processInstanceId = processInstance.getId();
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
taskService.complete(task.getId());
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
List<HistoricProcessInstance> processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).list();
assertEquals(1, processes.size());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
ObjectNode infoNode = dynamicBpmnService.changeLocalizationName("en-GB", "historicProcessLocalization", "Historic Process Name 'en-GB'");
dynamicBpmnService.changeLocalizationDescription("en-GB", "historicProcessLocalization", "Historic Process Description 'en-GB'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
dynamicBpmnService.changeLocalizationName("en", "historicProcessLocalization", "Historic Process Name 'en'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en", "historicProcessLocalization", "Historic Process Description 'en'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).list();
assertEquals(1, processes.size());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-GB").list();
assertEquals(1, processes.size());
assertEquals("Historic Process Name 'en-GB'", processes.get(0).getName());
assertEquals("Historic Process Description 'en-GB'", processes.get(0).getDescription());
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).listPage(0,10);
assertEquals(1, processes.size());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-GB").listPage(0,10);
assertEquals(1, processes.size());
assertEquals("Historic Process Name 'en-GB'", processes.get(0).getName());
assertEquals("Historic Process Description 'en-GB'", processes.get(0).getDescription());
HistoricProcessInstance process = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
assertNull(process.getName());
assertNull(process.getDescription());
process = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-GB").singleResult();
assertEquals("Historic Process Name 'en-GB'", process.getName());
assertEquals("Historic Process Description 'en-GB'", process.getDescription());
process = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en").singleResult();
assertEquals("Historic Process Name 'en'", process.getName());
assertEquals("Historic Process Description 'en'", process.getDescription());
process = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).locale("en-AU").withLocalizationFallback().singleResult();
assertEquals("Historic Process Name 'en'", process.getName());
assertEquals("Historic Process Description 'en'", process.getDescription());
}
}
}
......@@ -47,6 +47,8 @@ import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti5.engine.impl.test.PluggableActivitiTestCase;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Joram Barrez
......@@ -1342,4 +1344,168 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase {
assertEquals(3, runtimeService.createExecutionQuery().processInstanceId(pi.getId()).processVariableValueNotEqualsIgnoreCase("xIgnoreCase", "chilD").count());
}
@Deployment(resources={"org/activiti5/engine/test/api/runtime/executionLocalization.bpmn20.xml"})
public void testLocalizeExecution() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("executionLocalization");
List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertNull(execution.getName());
assertNull(execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()){
assertNull(execution.getName());
assertNull(execution.getDescription());
}
}
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
dynamicBpmnService.changeLocalizationName("en-GB", "executionLocalization", "Process Name 'en-GB'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-GB", "executionLocalization", "Process Description 'en-GB'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
dynamicBpmnService.changeLocalizationName("en", "executionLocalization", "Process Name 'en'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en", "executionLocalization", "Process Description 'en'", infoNode);
dynamicBpmnService.changeLocalizationName("en-GB", "subTask", "Sub task Name 'en-GB'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-GB", "subTask", "Sub task Description 'en-GB'", infoNode);
dynamicBpmnService.changeLocalizationName("en", "subTask", "Sub task Name 'en'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en", "subTask", "Sub task Description 'en'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
String subProcessId = null;
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertNull(execution.getName());
assertNull(execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()) {
assertNull(execution.getName());
assertNull(execution.getDescription());
subProcessId = execution.getId();
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("es").list();
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Nombre del proceso", execution.getName());
assertEquals("Descripción del proceso", execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("Nombre Subproceso", execution.getName());
assertEquals("Subproceso Descripción", execution.getDescription());
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("en-GB").list();
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Process Name 'en-GB'", execution.getName());
assertEquals("Process Description 'en-GB'", execution.getDescription());
} else if(execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("Sub task Name 'en-GB'", execution.getName());
assertEquals("Sub task Description 'en-GB'", execution.getDescription());
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).listPage(0,10);
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertNull(execution.getName());
assertNull(execution.getDescription());
} else if (execution.getParentId() == execution.getProcessInstanceId()) {
assertNull(execution.getName());
assertNull(execution.getDescription());
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("es").listPage(0,10);
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Nombre del proceso", execution.getName());
assertEquals("Descripción del proceso", execution.getDescription());
} else if(execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("Nombre Subproceso", execution.getName());
assertEquals("Subproceso Descripción", execution.getDescription());
}
}
executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).locale("en-GB").listPage(0,10);
assertEquals(2, executions.size());
for (Execution execution : executions) {
if (execution.getParentId() == null) {
assertEquals("Process Name 'en-GB'", execution.getName());
assertEquals("Process Description 'en-GB'", execution.getDescription());
} else if(execution.getParentId() == execution.getProcessInstanceId()) {
assertEquals("Sub task Name 'en-GB'", execution.getName());
assertEquals("Sub task Description 'en-GB'", execution.getDescription());
}
}
Execution execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).singleResult();
assertNull(execution.getName());
assertNull(execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(subProcessId).singleResult();
assertNull(execution.getName());
assertNull(execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("es").singleResult();
assertEquals("Nombre del proceso", execution.getName());
assertEquals("Descripción del proceso", execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(subProcessId).locale("es").singleResult();
assertEquals("Nombre Subproceso", execution.getName());
assertEquals("Subproceso Descripción", execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("en-GB").singleResult();
assertEquals("Process Name 'en-GB'", execution.getName());
assertEquals("Process Description 'en-GB'", execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(subProcessId).locale("en-GB").singleResult();
assertEquals("Sub task Name 'en-GB'", execution.getName());
assertEquals("Sub task Description 'en-GB'", execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("en-AU").withLocalizationFallback().singleResult();
assertEquals("Process Name 'en'", execution.getName());
assertEquals("Process Description 'en'", execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(subProcessId).locale("en-AU").withLocalizationFallback().singleResult();
assertEquals("Sub task Name 'en'", execution.getName());
assertEquals("Sub task Description 'en'", execution.getDescription());
infoNode = dynamicBpmnService.changeLocalizationName("en-US", "executionLocalization", "Process Name 'en-US'");
dynamicBpmnService.changeLocalizationDescription("en-US", "executionLocalization", "Process Description 'en-US'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
dynamicBpmnService.changeLocalizationName("en-US", "subTask", "Sub task Name 'en-US'", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-US", "subTask", "Sub task Description 'en-US'", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
execution = runtimeService.createExecutionQuery().executionId(processInstance.getId()).locale("en-US").singleResult();
assertEquals("Process Name 'en-US'", execution.getName());
assertEquals("Process Description 'en-US'", execution.getDescription());
execution = runtimeService.createExecutionQuery().executionId(subProcessId).locale("en-US").singleResult();
assertEquals("Sub task Name 'en-US'", execution.getName());
assertEquals("Sub task Description 'en-US'", execution.getDescription());
}
}
......@@ -35,6 +35,8 @@ import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.test.Deployment;
import org.activiti5.engine.impl.test.PluggableActivitiTestCase;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Joram Barrez
* @author Tijs Rademakers
......@@ -1785,4 +1787,76 @@ public class ProcessInstanceQueryTest extends PluggableActivitiTestCase {
public void testNativeQueryPaging() {
assertEquals(5, runtimeService.createNativeProcessInstanceQuery().sql("SELECT * FROM " + managementService.getTableName(ProcessInstance.class)).listPage(0, 5).size());
}
public void testLocalizeProcess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
List<ProcessInstance> processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).list();
assertEquals(1, processes.size());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
dynamicBpmnService.changeLocalizationName("en-GB", "oneTaskProcess", "The One Task Process 'en-GB' localized name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-GB", "oneTaskProcess", "The One Task Process 'en-GB' localized description", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
dynamicBpmnService.changeLocalizationName("en", "oneTaskProcess", "The One Task Process 'en' localized name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en", "oneTaskProcess", "The One Task Process 'en' localized description", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).list();
assertEquals(1, processes.size());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("es").list();
assertEquals(1, processes.size());
assertEquals("Nombre del proceso", processes.get(0).getName());
assertEquals("Descripción del proceso", processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("en-GB").list();
assertEquals(1, processes.size());
assertEquals("The One Task Process 'en-GB' localized name", processes.get(0).getName());
assertEquals("The One Task Process 'en-GB' localized description", processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).listPage(0, 10);
assertEquals(1, processes.size());
assertNull(processes.get(0).getName());
assertNull(processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("es").listPage(0,10);
assertEquals(1, processes.size());
assertEquals("Nombre del proceso", processes.get(0).getName());
assertEquals("Descripción del proceso", processes.get(0).getDescription());
processes = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("en-GB").listPage(0, 10);
assertEquals(1, processes.size());
assertEquals("The One Task Process 'en-GB' localized name", processes.get(0).getName());
assertEquals("The One Task Process 'en-GB' localized description", processes.get(0).getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNull(processInstance.getName());
assertNull(processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("es").singleResult();
assertEquals("Nombre del proceso", processInstance.getName());
assertEquals("Descripción del proceso", processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("en-GB").singleResult();
assertEquals("The One Task Process 'en-GB' localized name", processInstance.getName());
assertEquals("The One Task Process 'en-GB' localized description", processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
assertNull(processInstance.getName());
assertNull(processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("en").singleResult();
assertEquals("The One Task Process 'en' localized name", processInstance.getName());
assertEquals("The One Task Process 'en' localized description", processInstance.getDescription());
processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).locale("en-AU").withLocalizationFallback().singleResult();
assertEquals("The One Task Process 'en' localized name", processInstance.getName());
assertEquals("The One Task Process 'en' localized description", processInstance.getDescription());
}
}
......@@ -34,6 +34,8 @@ import org.activiti.engine.task.TaskQuery;
import org.activiti.engine.test.Deployment;
import org.activiti5.engine.impl.test.PluggableActivitiTestCase;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Joram Barrez
* @author Frederik Heremans
......@@ -2883,7 +2885,85 @@ public class TaskQueryTest extends PluggableActivitiTestCase {
.endOr()
.list()
.size());
}
@Deployment(resources={"org/activiti5/engine/test/api/task/TaskQueryTest.testProcessDefinition.bpmn20.xml"})
public void testLocalizeTasks() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
List<Task> tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).list();
assertEquals(1, tasks.size());
assertEquals("my task", tasks.get(0).getName());
assertEquals("My Task Description", tasks.get(0).getDescription());
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("es").list();
assertEquals(1, tasks.size());
assertEquals("Mi Tarea", tasks.get(0).getName());
assertEquals("Mi Tarea Descripción", tasks.get(0).getDescription());
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
dynamicBpmnService.changeLocalizationName("en-GB", "theTask", "My 'en-GB' localized name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-GB", "theTask", "My 'en-GB' localized description", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
dynamicBpmnService.changeLocalizationName("en", "theTask", "My 'en' localized name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en", "theTask", "My 'en' localized description", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).list();
assertEquals(1, tasks.size());
assertEquals("my task", tasks.get(0).getName());
assertEquals("My Task Description", tasks.get(0).getDescription());
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("es").list();
assertEquals(1, tasks.size());
assertEquals("Mi Tarea", tasks.get(0).getName());
assertEquals("Mi Tarea Descripción", tasks.get(0).getDescription());
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("en-GB").list();
assertEquals(1, tasks.size());
assertEquals("My 'en-GB' localized name", tasks.get(0).getName());
assertEquals("My 'en-GB' localized description", tasks.get(0).getDescription());
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).listPage(0, 10);
assertEquals(1, tasks.size());
assertEquals("my task", tasks.get(0).getName());
assertEquals("My Task Description", tasks.get(0).getDescription());
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("es").listPage(0, 10);
assertEquals(1, tasks.size());
assertEquals("Mi Tarea", tasks.get(0).getName());
assertEquals("Mi Tarea Descripción", tasks.get(0).getDescription());
tasks = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("en-GB").listPage(0, 10);
assertEquals(1, tasks.size());
assertEquals("My 'en-GB' localized name", tasks.get(0).getName());
assertEquals("My 'en-GB' localized description", tasks.get(0).getDescription());
Task task = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult();
assertEquals("my task", task.getName());
assertEquals("My Task Description", task.getDescription());
task = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("es").singleResult();
assertEquals("Mi Tarea", task.getName());
assertEquals("Mi Tarea Descripción", task.getDescription());
task = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("en-GB").singleResult();
assertEquals("My 'en-GB' localized name", task.getName());
assertEquals("My 'en-GB' localized description", task.getDescription());
task = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult();
assertEquals("my task", task.getName());
assertEquals("My Task Description", task.getDescription());
task = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("en").singleResult();
assertEquals("My 'en' localized name", task.getName());
assertEquals("My 'en' localized description", task.getDescription());
task = taskService.createTaskQuery().processDefinitionId(processInstance.getProcessDefinitionId()).locale("en-AU").withLocalizationFallback().singleResult();
assertEquals("My 'en' localized name", task.getName());
assertEquals("My 'en' localized description", task.getDescription());
}
/**
......
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="historicProcessLocalization" name="Historic Process Name">
<documentation>Historic Process Description</documentation>
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theProcessTask" />
<userTask id="theProcessTask" name="my process task" />
<sequenceFlow id="flow2" sourceRef="theProcessTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="org.activiti.enginge.test.api.runtime">
<process id="executionLocalization" name="Process Name">
<documentation>Process Description</documentation>
<extensionElements>
<activiti:localization locale="es" name="Nombre del proceso">
<activiti:documentation>Descripción del proceso</activiti:documentation>
</activiti:localization>
</extensionElements>
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="subProcess" />
<subProcess id="subProcess" name="SubProcess Name">
<documentation>SubProcess Description</documentation>
<startEvent id="subStart" />
<sequenceFlow id="flow3" sourceRef="subStart" targetRef="subTask" />
<userTask id="subTask" name="sub task">
<extensionElements>
<activiti:localization locale="es" name="Nombre Subproceso">
<activiti:documentation>Subproceso Descripción</activiti:documentation>
</activiti:localization>
</extensionElements>
</userTask>
<sequenceFlow id="flow4" sourceRef="subTask" targetRef="subEnd" />
<endEvent id="subEnd" />
</subProcess>
<sequenceFlow id="flow5" sourceRef="subProcess" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
......@@ -5,6 +5,12 @@
targetNamespace="org.activiti.enginge.test.api.runtime">
<process id="oneTaskProcess" name="oneTaskProcessName">
<documentation>oneTaskProcessDescription</documentation>
<extensionElements>
<activiti:localization locale="es" name="Nombre del proceso">
<activiti:documentation>Descripción del proceso</activiti:documentation>
</activiti:localization>
</extensionElements>
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
......
......@@ -8,7 +8,15 @@
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
<userTask id="theTask" name="my task" />
<userTask id="theTask" name="my task">
<documentation>My Task Description</documentation>
<extensionElements>
<activiti:localization locale="es" name="Mi Tarea">
<activiti:documentation>Mi Tarea Descripción</activiti:documentation>
</activiti:localization>
</extensionElements>
</userTask>
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
<endEvent id="theEnd" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册