提交 155357f5 编写于 作者: J Joram Barrez

Merge branch 'master' of https://github.com/Activiti/Activiti

......@@ -4,7 +4,7 @@
<property file="${user.home}/.activiti/build.properties" />
<property name="activiti.version" value="5.15.1-SNAPSHOT" />
<property name="activiti.version" value="5.16-SNAPSHOT" />
<property name="target.distro.root" value="target/zip/activiti-${activiti.version}" />
<property name="activiti.website" value="../../activiti-website" />
......@@ -63,6 +63,9 @@
<fileset dir="../modules/activiti-bpmn-converter/target">
<include name="activiti-bpmn-converter-*.jar" />
</fileset>
<fileset dir="../modules/activiti-process-validation/target">
<include name="activiti-process-validation-*.jar" />
</fileset>
<fileset dir="../modules/activiti-bpmn-layout/target">
<include name="activiti-bpmn-layout-*.jar" />
</fileset>
......
......@@ -35,6 +35,14 @@
<h1>Activiti Release Notes</h1>
<h3>Release Notes - Activiti - Version 5.15.1</h3>
<h4>Highlights</h4>
<ul>
<li>Bug fix release for a MySQL upgrade issue (more details <a href="http://forums.activiti.org/content/important-activiti-515-and-mysql-56-users">here</a>)</li>
<li>Some small improvements from pull requests</li>
</ul>
<h3>Release Notes - Activiti - Version 5.15</h3>
<h4>Highlights</h4>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<build>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
......
......@@ -61,6 +61,18 @@ public class BusinessProcessBeanTest extends CdiActivitiTestCase {
assertNull(processEngine.getRuntimeService().createProcessInstanceQuery().singleResult());
}
@Test
@Deployment
public void testProcessWithoutWaitState() {
BusinessProcess businessProcess = getBeanInstance(BusinessProcess.class);
// start the process
businessProcess.startProcessByKey("businessProcessBeanTest").getId();
// assert that the process is ended:
assertNull(processEngine.getRuntimeService().createProcessInstanceQuery().singleResult());
}
@Test
@Deployment(resources = "org/activiti/cdi/test/api/BusinessProcessBeanTest.test.bpmn20.xml")
......
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="taskAssigneeExample"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="businessProcessBeanTest">
<startEvent id="startEvent" name="StartEvent" />
<endEvent id="endEvent" name="EndEvent" />
<sequenceFlow targetRef="endEvent" sourceRef="startEvent" />
</process>
</definitions>
\ No newline at end of file
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -55,7 +55,6 @@ public class ProcessInstanceHighlightsResource extends SecuredResource {
responseJSON.put("processDefinitionId", processInstance.getProcessDefinitionId());
List<String> highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId);
System.out.println(highLightedActivities);
List<String> highLightedFlows = getHighLightedFlows(processDefinition, processInstanceId);
for (String activityId : highLightedActivities) {
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<dependencies>
......
......@@ -49,7 +49,7 @@ package org.activiti.engine;
public interface ProcessEngine extends EngineServices {
/** the version of the activiti library */
public static String VERSION = "5.15.1-SNAPSHOT";
public static String VERSION = "5.16-SNAPSHOT";
/** The name as specified in 'process-engine-name' in
* the activiti.cfg.xml configuration file.
......
......@@ -96,7 +96,7 @@ public abstract class ProcessEngineConfiguration implements EngineServices {
public static final String NO_TENANT_ID = "";
protected String processEngineName = ProcessEngines.NAME_DEFAULT;
protected int idBlockSize = 100;
protected int idBlockSize = 2500;
protected String history = HistoryLevel.AUDIT.getKey();
protected boolean jobExecutorActivate;
......
......@@ -26,6 +26,8 @@ import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.SimpleEmail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Joram Barrez
......@@ -36,6 +38,8 @@ public class MailActivityBehavior extends AbstractBpmnActivityBehavior {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(MailActivityBehavior.class);
protected Expression to;
protected Expression from;
protected Expression cc;
......@@ -46,39 +50,47 @@ public class MailActivityBehavior extends AbstractBpmnActivityBehavior {
protected Expression html;
protected Expression htmlVar;
protected Expression charset;
protected Expression ignoreException;
protected Expression exceptionVariableName;
public void execute(ActivityExecution execution) {
String toStr = getStringFromField(to, execution);
String fromStr = getStringFromField(from, execution);
String ccStr = getStringFromField(cc, execution);
String bccStr = getStringFromField(bcc, execution);
String subjectStr = getStringFromField(subject, execution);
String textStr = textVar == null ? getStringFromField(text, execution)
: getStringFromField(getExpression(execution, textVar), execution);
String htmlStr = htmlVar == null ? getStringFromField(html, execution)
: getStringFromField(getExpression(execution, htmlVar), execution);
String charSetStr = getStringFromField(charset, execution);
Email email = createEmail(textStr, htmlStr);
addTo(email, toStr);
setFrom(email, fromStr);
addCc(email, ccStr);
addBcc(email, bccStr);
setSubject(email, subjectStr);
setMailServerProperties(email);
setCharset(email, charSetStr);
boolean doIgnoreException = Boolean.parseBoolean(getStringFromField(ignoreException, execution));
String exceptionVariable = getStringFromField(exceptionVariableName, execution);
Email email = null;
try {
String toStr = getStringFromField(to, execution);
String fromStr = getStringFromField(from, execution);
String ccStr = getStringFromField(cc, execution);
String bccStr = getStringFromField(bcc, execution);
String subjectStr = getStringFromField(subject, execution);
String textStr = textVar == null ? getStringFromField(text, execution)
: getStringFromField(getExpression(execution, textVar), execution);
String htmlStr = htmlVar == null ? getStringFromField(html, execution)
: getStringFromField(getExpression(execution, htmlVar), execution);
String charSetStr = getStringFromField(charset, execution);
email = createEmail(textStr, htmlStr);
addTo(email, toStr);
setFrom(email, fromStr);
addCc(email, ccStr);
addBcc(email, bccStr);
setSubject(email, subjectStr);
setMailServerProperties(email);
setCharset(email, charSetStr);
email.send();
} catch (ActivitiException e) {
handleException(execution, e.getMessage(), e, doIgnoreException, exceptionVariable);
} catch (EmailException e) {
throw new ActivitiException("Could not send e-mail", e);
handleException(execution, "Could not send e-mail in execution " + execution.getId(), e, doIgnoreException, exceptionVariable);
}
leave(execution);
}
protected Email createEmail(String text, String html) {
if (html != null) {
return createHtmlEmail(text, html);
......@@ -222,7 +234,7 @@ public class MailActivityBehavior extends AbstractBpmnActivityBehavior {
}
protected String getStringFromField(Expression expression, DelegateExecution execution) {
if(expression != null) {
if (expression != null) {
Object value = expression.getValue(execution);
if(value != null) {
return value.toString();
......@@ -237,4 +249,18 @@ public class MailActivityBehavior extends AbstractBpmnActivityBehavior {
.createExpression(variable);
}
protected void handleException(ActivityExecution execution, String msg, Exception e, boolean doIgnoreException, String exceptionVariable) {
if (doIgnoreException) {
LOG.info("Ignoring email send error: " + msg, e);
if (exceptionVariable != null && exceptionVariable.length() > 0) {
execution.setVariable(exceptionVariable, msg);
}
} else {
if (e instanceof ActivitiException) {
throw (ActivitiException) e;
} else {
throw new ActivitiException(msg, e);
}
}
}
}
......@@ -197,6 +197,7 @@ import org.activiti.engine.impl.variable.EntityManagerSession;
import org.activiti.engine.impl.variable.EntityManagerSessionFactory;
import org.activiti.engine.impl.variable.IntegerType;
import org.activiti.engine.impl.variable.JPAEntityVariableType;
import org.activiti.engine.impl.variable.LongStringType;
import org.activiti.engine.impl.variable.LongType;
import org.activiti.engine.impl.variable.NullType;
import org.activiti.engine.impl.variable.SerializableType;
......@@ -1129,7 +1130,8 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig
}
}
variableTypes.addType(new NullType());
variableTypes.addType(new StringType());
variableTypes.addType(new StringType(4000));
variableTypes.addType(new LongStringType(4001));
variableTypes.addType(new BooleanType());
variableTypes.addType(new ShortType());
variableTypes.addType(new IntegerType());
......
......@@ -57,13 +57,21 @@ public class ExpressionManager {
public ExpressionManager() {
this(null);
this(null);
}
public ExpressionManager(boolean initFactory) {
this(null, false);
}
public ExpressionManager(Map<Object, Object> beans) {
// Use the ExpressionFactoryImpl in activiti build in version of juel, with parametrised method expressions enabled
expressionFactory = new ExpressionFactoryImpl();
this.beans = beans;
this(beans, true);
}
public ExpressionManager(Map<Object, Object> beans, boolean initFactory) {
// Use the ExpressionFactoryImpl in activiti build in version of juel, with parametrised method expressions enabled
expressionFactory = new ExpressionFactoryImpl();
this.beans = beans;
}
......
......@@ -248,7 +248,12 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
if (log.isDebugEnabled()) {
log.debug("Child execution {} created with parent ", createdExecution, this);
}
if (Context.getProcessEngineConfiguration() != null && Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, createdExecution));
}
return createdExecution;
}
......@@ -262,7 +267,12 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
// Initialize the new execution
subProcessInstance.setProcessDefinition((ProcessDefinitionImpl) processDefinition);
subProcessInstance.setProcessInstance(subProcessInstance);
if (Context.getProcessEngineConfiguration() != null && Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, subProcessInstance));
}
Context.getCommandContext().getHistoryManager()
.recordSubProcessInstanceStart(this, subProcessInstance);
......@@ -278,11 +288,6 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
newExecution.setTenantId(getTenantId());
}
if(Context.getProcessEngineConfiguration() != null && Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, newExecution));
}
Context
.getCommandContext()
.getDbSqlSession()
......
/* 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.activiti.engine.impl.variable;
/**
* @author Martin Grofcik
*/
public class LongStringType extends SerializableType {
private final int minLength;
public LongStringType(int minLength) {this.minLength = minLength;}
public String getTypeName() {
return "longString";
}
public boolean isAbleToStore(Object value) {
if (value==null) {
return false;
}
if (String.class.isAssignableFrom(value.getClass())) {
String stringValue = (String) value;
return stringValue.length() >= minLength;
}
return false;
}
}
......@@ -19,7 +19,9 @@ package org.activiti.engine.impl.variable;
*/
public class StringType implements VariableType {
private static final long serialVersionUID = 1L;
private final int maxLength;
public StringType(int maxLength) {this.maxLength = maxLength;}
public String getTypeName() {
return "string";
......@@ -41,6 +43,10 @@ public class StringType implements VariableType {
if (value==null) {
return true;
}
return String.class.isAssignableFrom(value.getClass());
if (String.class.isAssignableFrom(value.getClass())) {
String stringValue = (String) value;
return stringValue.length() <= maxLength;
}
return false;
}
}
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
);
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
);
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
);
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
);
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -6,10 +6,10 @@ create table ACT_GE_PROPERTY (
);
insert into ACT_GE_PROPERTY
values ('schema.version', '5.15.1-SNAPSHOT', 1);
values ('schema.version', '5.16-SNAPSHOT', 1);
insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.15.1-SNAPSHOT)', 1);
values ('schema.history', 'create(5.16-SNAPSHOT)', 1);
insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1);
......
......@@ -67,6 +67,7 @@
<result property="processInstanceId" column="PROC_INST_ID_" jdbcType="VARCHAR" />
<result property="url" column="URL_" jdbcType="VARCHAR" />
<result property="contentId" column="CONTENT_ID_" jdbcType="VARCHAR" />
<result property="userId" column="USER_ID_" jdbcType="VARCHAR" />
</resultMap>
<!-- ATTACHMENT SELECT -->
......
......@@ -13,12 +13,17 @@
package org.activiti.engine.test.api.event;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.ActivitiEntityEvent;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import java.util.ArrayList;
import java.util.List;
/**
* Test case for all {@link ActivitiEvent}s related to process instances.
*
......@@ -26,7 +31,7 @@ import org.activiti.engine.test.Deployment;
*/
public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
private TestActivitiEntityEventListener listener;
private TestInitializedEntityEventListener listener;
/**
* Test create, update and delete events of process instances.
......@@ -34,9 +39,9 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
@Deployment(resources= {"org/activiti/engine/test/api/runtime/oneTaskProcess.bpmn20.xml"})
public void testProcessInstanceEvents() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
assertNotNull(processInstance);
// Check create-event
assertEquals(1, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiEntityEvent);
......@@ -48,7 +53,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(processInstance.getId(), event.getExecutionId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
listener.clearEventsReceived();
// Check update event when suspended/activated
runtimeService.suspendProcessInstanceById(processInstance.getId());
runtimeService.activateProcessInstanceById(processInstance.getId());
......@@ -108,14 +113,24 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
listener.clearEventsReceived();
}
@Override
/**
* Test process with signals start.
*/
@Deployment(resources = {"org/activiti/engine/test/bpmn/event/signal/SignalEventTest.testSignalWithGlobalScope.bpmn20.xml"})
public void testSignalProcessInstanceStart() throws Exception {
this.runtimeService.startProcessInstanceByKey("processWithSignalCatch");
listener.clearEventsReceived();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processWithSignalThrow");
listener.clearEventsReceived();
}
@Override
protected void initializeServices() {
super.initializeServices();
listener = new TestActivitiEntityEventListener(ProcessInstance.class);
processEngineConfiguration.getEventDispatcher().addEventListener(listener);
this.listener = new TestInitializedEntityEventListener();
processEngineConfiguration.getEventDispatcher().addEventListener(this.listener);
}
@Override
......@@ -127,4 +142,38 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
processEngineConfiguration.getEventDispatcher().removeEventListener(listener);
}
}
private class TestInitializedEntityEventListener implements ActivitiEventListener {
private List<ActivitiEvent> eventsReceived;
public TestInitializedEntityEventListener() {
eventsReceived = new ArrayList<ActivitiEvent>();
}
public List<ActivitiEvent> getEventsReceived() {
return eventsReceived;
}
public void clearEventsReceived() {
eventsReceived.clear();
}
@Override
public void onEvent(ActivitiEvent event) {
if (event instanceof ActivitiEntityEvent && ProcessInstance.class.isAssignableFrom(((ActivitiEntityEvent) event).getEntity().getClass())) {
// check whether entity in the event is initialized before adding to the list.
assertNotNull(((ExecutionEntity) ((ActivitiEntityEvent) event).getEntity()).getId());
eventsReceived.add(event);
}
}
@Override
public boolean isFailOnException() {
return true;
}
}
}
......@@ -49,8 +49,22 @@ public class RuntimeServiceTest extends PluggableActivitiTestCase {
Task task = taskService.createTaskQuery().includeProcessVariables().singleResult();
assertNotNull(task.getProcessVariables());
}
@Deployment(resources = {"org/activiti/engine/test/api/oneTaskProcess.bpmn20.xml"})
public void testStartProcessInstanceWithLongStringVariable() {
Map<String, Object> vars = new HashMap<String, Object>();
StringBuilder longString = new StringBuilder();
for (int i=0; i<4001; i++) {
longString.append("c");
}
vars.put("longString", longString.toString());
runtimeService.startProcessInstanceByKey("oneTaskProcess", vars);
Task task = taskService.createTaskQuery().includeProcessVariables().singleResult();
assertNotNull(task.getProcessVariables());
assertEquals( longString.toString(), task.getProcessVariables().get("longString"));
}
public void testStartProcessInstanceByKeyNullKey() {
try {
runtimeService.startProcessInstanceByKey(null);
......
......@@ -26,6 +26,7 @@ import javax.activation.DataHandler;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.util.CollectionUtil;
import org.activiti.engine.test.Deployment;
import org.subethamail.wiser.WiserMessage;
......@@ -115,6 +116,30 @@ public class EmailSendTaskTest extends EmailTestCase {
assertEmailSend(messages.get(0), true, "Test", "Mr. <b>Kermit</b>", "activiti@localhost", Arrays.asList("kermit@activiti.org"), null);
}
@Deployment
public void testInvalidAddress() throws Exception {
try {
runtimeService.startProcessInstanceByKey("invalidAddress").getId();
fail("An Invalid email address should not execute");
} catch(ActivitiException e) {
// fine
} catch(Exception e) {
fail("Only an ActivitiException is expected here but not: " + e);
}
}
@Deployment
public void testInvalidAddressWithoutException() throws Exception {
String piId = runtimeService.startProcessInstanceByKey("invalidAddressWithoutException").getId();
assertNotNull(historyService.createHistoricVariableInstanceQuery().processInstanceId(piId).variableName("emailError").singleResult());
}
@Deployment
public void testInvalidAddressWithoutExceptionVariableName() throws Exception {
String piId = runtimeService.startProcessInstanceByKey("invalidAddressWithoutException").getId();
assertNull(historyService.createHistoricVariableInstanceQuery().processInstanceId(piId).variableName("emailError").singleResult());
}
// Helper
private void assertEmailSend(WiserMessage emailMessage, boolean htmlMail, String subject, String message,
......
......@@ -26,6 +26,7 @@ import javax.activation.DataHandler;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.util.CollectionUtil;
import org.activiti.engine.test.Deployment;
import org.subethamail.wiser.WiserMessage;
......@@ -128,6 +129,30 @@ public class EmailServiceTaskTest extends EmailTestCase {
assertEmailSend(messages.get(0), true, "Test", "Mr. <b>Kermit</b>", "activiti@localhost", Arrays.asList("kermit@activiti.org"), null);
}
@Deployment
public void testInvalidAddress() throws Exception {
try {
runtimeService.startProcessInstanceByKey("invalidAddress").getId();
fail("An Invalid email address should not execute");
} catch(ActivitiException e) {
// fine
} catch(Exception e) {
fail("Only an ActivitiException is expected here but not: " + e);
}
}
@Deployment
public void testInvalidAddressWithoutException() throws Exception {
String piId = runtimeService.startProcessInstanceByKey("invalidAddressWithoutException").getId();
assertNotNull(historyService.createHistoricVariableInstanceQuery().processInstanceId(piId).variableName("emailError").singleResult());
}
@Deployment
public void testInvalidAddressWithoutExceptionVariableName() throws Exception {
String piId = runtimeService.startProcessInstanceByKey("invalidAddressWithoutException").getId();
assertNull(historyService.createHistoricVariableInstanceQuery().processInstanceId(piId).variableName("emailError").singleResult());
}
// Helper
public static void assertEmailSend(WiserMessage emailMessage, boolean htmlMail, String subject, String message,
......
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="simpleTextOnly" >
<startEvent id="theStart" />
<sequenceFlow sourceRef="theStart" targetRef="sendMail" />
<sendTask id="sendMail" activiti:type="mail">
<extensionElements>
<activiti:field name="to">
<activiti:string>kermit@activiti.org@org</activiti:string>
</activiti:field>
<activiti:field name="subject">
<activiti:string>Hello Kermit!</activiti:string>
</activiti:field>
<activiti:field name="text">
<activiti:string>This a text only e-mail.</activiti:string>
</activiti:field>
</extensionElements>
</sendTask>
<sequenceFlow sourceRef="sendMail" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="invalidAddressWithoutException" >
<startEvent id="theStart" />
<sequenceFlow sourceRef="theStart" targetRef="sendMail" />
<sendTask id="sendMail" activiti:type="mail">
<extensionElements>
<activiti:field name="ignoreException" stringValue="true" />
<activiti:field name="exceptionVariableName" stringValue="emailError" />
<activiti:field name="to">
<activiti:string>kermit@activiti.org@org</activiti:string>
</activiti:field>
<activiti:field name="subject">
<activiti:string>Hello Kermit!</activiti:string>
</activiti:field>
<activiti:field name="text">
<activiti:string>This a text only e-mail.</activiti:string>
</activiti:field>
</extensionElements>
</sendTask>
<sequenceFlow sourceRef="sendMail" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="invalidAddressWithoutException" >
<startEvent id="theStart" />
<sequenceFlow sourceRef="theStart" targetRef="sendMail" />
<sendTask id="sendMail" activiti:type="mail">
<extensionElements>
<activiti:field name="ignoreException" stringValue="true" />
<activiti:field name="to">
<activiti:string>kermit@activiti.org@org</activiti:string>
</activiti:field>
<activiti:field name="subject">
<activiti:string>Hello Kermit!</activiti:string>
</activiti:field>
<activiti:field name="text">
<activiti:string>This a text only e-mail.</activiti:string>
</activiti:field>
</extensionElements>
</sendTask>
<sequenceFlow sourceRef="sendMail" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="simpleTextOnly" >
<startEvent id="theStart" />
<sequenceFlow sourceRef="theStart" targetRef="sendMail" />
<sendTask id="sendMail" activiti:type="mail">
<extensionElements>
<activiti:field name="to">
<activiti:string>kermit@activiti.org@org</activiti:string>
</activiti:field>
<activiti:field name="subject">
<activiti:string>Hello Kermit!</activiti:string>
</activiti:field>
<activiti:field name="text">
<activiti:string>This a text only e-mail.</activiti:string>
</activiti:field>
</extensionElements>
</sendTask>
<sequenceFlow sourceRef="sendMail" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="invalidAddressWithoutException" >
<startEvent id="theStart" />
<sequenceFlow sourceRef="theStart" targetRef="sendMail" />
<sendTask id="sendMail" activiti:type="mail">
<extensionElements>
<activiti:field name="ignoreException" stringValue="true" />
<activiti:field name="exceptionVariableName" stringValue="emailError" />
<activiti:field name="to">
<activiti:string>kermit@activiti.org@org</activiti:string>
</activiti:field>
<activiti:field name="subject">
<activiti:string>Hello Kermit!</activiti:string>
</activiti:field>
<activiti:field name="text">
<activiti:string>This a text only e-mail.</activiti:string>
</activiti:field>
</extensionElements>
</sendTask>
<sequenceFlow sourceRef="sendMail" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="invalidAddressWithoutException" >
<startEvent id="theStart" />
<sequenceFlow sourceRef="theStart" targetRef="sendMail" />
<sendTask id="sendMail" activiti:type="mail">
<extensionElements>
<activiti:field name="ignoreException" stringValue="true" />
<activiti:field name="to">
<activiti:string>kermit@activiti.org@org</activiti:string>
</activiti:field>
<activiti:field name="subject">
<activiti:string>Hello Kermit!</activiti:string>
</activiti:field>
<activiti:field name="text">
<activiti:string>This a text only e-mail.</activiti:string>
</activiti:field>
</extensionElements>
</sendTask>
<sequenceFlow sourceRef="sendMail" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
\ No newline at end of file
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<build>
......
......@@ -79,10 +79,10 @@ public class BlueprintBasicTest {
@Configuration
public Option[] createConfiguration() {
Option[] coreBundles = options(
mavenBundle().groupId("org.activiti").artifactId("activiti-bpmn-model").version("5.15.1-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-bpmn-converter").version("5.15.1-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-process-validation").version("5.15.1-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-engine").version("5.15.1-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-bpmn-model").version("5.16-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-bpmn-converter").version("5.16-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-process-validation").version("5.16-SNAPSHOT"),
mavenBundle().groupId("org.activiti").artifactId("activiti-engine").version("5.16-SNAPSHOT"),
mavenBundle().groupId("org.apache.commons").artifactId("commons-lang3").version("3.1"),
mavenBundle().groupId("org.codehaus.jackson").artifactId("jackson-core-asl").version("1.9.9"),
mavenBundle().groupId("log4j").artifactId("log4j").version("1.2.17"),
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -59,10 +59,10 @@ import org.activiti.rest.service.api.engine.variable.IntegerRestVariableConverte
import org.activiti.rest.service.api.engine.variable.LongRestVariableConverter;
import org.activiti.rest.service.api.engine.variable.QueryVariable;
import org.activiti.rest.service.api.engine.variable.RestVariable;
import org.activiti.rest.service.api.engine.variable.RestVariable.RestVariableScope;
import org.activiti.rest.service.api.engine.variable.RestVariableConverter;
import org.activiti.rest.service.api.engine.variable.ShortRestVariableConverter;
import org.activiti.rest.service.api.engine.variable.StringRestVariableConverter;
import org.activiti.rest.service.api.engine.variable.RestVariable.RestVariableScope;
import org.activiti.rest.service.api.form.FormDataResponse;
import org.activiti.rest.service.api.form.RestEnumFormProperty;
import org.activiti.rest.service.api.form.RestFormProperty;
......@@ -79,10 +79,10 @@ import org.activiti.rest.service.api.identity.UserResponse;
import org.activiti.rest.service.api.management.JobResponse;
import org.activiti.rest.service.api.management.TableResponse;
import org.activiti.rest.service.api.repository.DeploymentResourceResponse;
import org.activiti.rest.service.api.repository.DeploymentResourceResponse.DeploymentResourceType;
import org.activiti.rest.service.api.repository.DeploymentResponse;
import org.activiti.rest.service.api.repository.ModelResponse;
import org.activiti.rest.service.api.repository.ProcessDefinitionResponse;
import org.activiti.rest.service.api.repository.DeploymentResourceResponse.DeploymentResourceType;
import org.activiti.rest.service.api.runtime.process.ExecutionResponse;
import org.activiti.rest.service.api.runtime.process.ProcessInstanceResponse;
import org.activiti.rest.service.api.runtime.task.TaskResponse;
......@@ -430,6 +430,7 @@ public class RestResponseFactory {
result.setId(processInstance.getId());
result.setProcessDefinitionId(processInstance.getProcessDefinitionId());
result.setProcessDefinitionUrl(securedResource.createFullResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processInstance.getProcessDefinitionId()));
result.setEnded(processInstance.isEnded());
result.setSuspended(processInstance.isSuspended());
result.setUrl(securedResource.createFullResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()));
result.setTenantId(processInstance.getTenantId());
......
......@@ -115,7 +115,7 @@ public class ExecutionVariableCollectionResource extends BaseExecutionVariableRe
RestVariable[] restVariables = getConverterService().toObject(representation, RestVariable[].class, this);
if(restVariables == null || restVariables.length == 0) {
throw new ActivitiIllegalArgumentException("Request didn't cantain a list of variables to create.");
throw new ActivitiIllegalArgumentException("Request didn't contain a list of variables to create.");
}
RestVariableScope sharedScope = null;
......
......@@ -87,7 +87,7 @@ public class ProcessInstanceResource extends SecuredResource {
}
ActivitiUtil.getRuntimeService().suspendProcessInstanceById(processInstance.getId());
ProcessInstanceResponse response = getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory()
ProcessInstanceResponse response = getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory()
.createProcessInstanceResponse(this, processInstance);
// No need to re-fetch the instance, just alter the suspended state of the result-object
......
......@@ -26,6 +26,7 @@ public class ProcessInstanceResponse {
protected String url;
protected String businessKey;
protected boolean suspended;
protected boolean ended;
protected String processDefinitionId;
protected String processDefinitionUrl;
protected String activityId;
......@@ -64,6 +65,14 @@ public class ProcessInstanceResponse {
this.suspended = suspended;
}
public boolean isEnded() {
return ended;
}
public void setEnded(boolean ended) {
this.ended = ended;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
......
......@@ -86,7 +86,7 @@ public class TaskVariableCollectionResource extends TaskVariableBaseResource {
RestVariable[] restVariables = getConverterService().toObject(representation, RestVariable[].class, this);
if(restVariables == null || restVariables.length == 0) {
throw new ActivitiIllegalArgumentException("Request didn't cantain a list of variables to create.");
throw new ActivitiIllegalArgumentException("Request didn't contain a list of variables to create.");
}
RestVariableScope sharedScope = null;
......
......@@ -298,6 +298,11 @@ public class ProcessInstanceCollectionResourceTest extends BaseRestTestCase {
client.post(requestNode);
assertEquals(Status.SUCCESS_CREATED, client.getResponse().getStatus());
JsonNode responseNode = objectMapper.readTree(client.getResponseEntity().getStream());
assertEquals("processTask", responseNode.get("activityId").asText());
assertEquals(false, responseNode.get("ended").asBoolean());
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult();
assertNotNull(processInstance);
......
......@@ -257,7 +257,7 @@ public class ProcessInstanceVariablesCollectionResourceTest extends BaseRestTest
fail("Exception expected");
} catch (ResourceException expected) {
assertEquals(Status.CLIENT_ERROR_BAD_REQUEST, expected.getStatus());
assertEquals("Request didn't cantain a list of variables to create.", expected.getStatus().getDescription());
assertEquals("Request didn't contain a list of variables to create.", expected.getStatus().getDescription());
}
// Test passing in object instead of array
......@@ -267,7 +267,7 @@ public class ProcessInstanceVariablesCollectionResourceTest extends BaseRestTest
fail("Exception expected");
} catch (ResourceException expected) {
assertEquals(Status.CLIENT_ERROR_BAD_REQUEST, expected.getStatus());
assertEquals("Request didn't cantain a list of variables to create.", expected.getStatus().getDescription());
assertEquals("Request didn't contain a list of variables to create.", expected.getStatus().getDescription());
}
}
......
......@@ -400,7 +400,7 @@ public class TaskVariablesCollectionResourceTest extends BaseRestTestCase {
fail("Exception expected");
} catch (ResourceException expected) {
assertEquals(Status.CLIENT_ERROR_BAD_REQUEST, expected.getStatus());
assertEquals("Request didn't cantain a list of variables to create.", expected.getStatus().getDescription());
assertEquals("Request didn't contain a list of variables to create.", expected.getStatus().getDescription());
}
// Test passing in object instead of array
......@@ -410,7 +410,7 @@ public class TaskVariablesCollectionResourceTest extends BaseRestTestCase {
fail("Exception expected");
} catch (ResourceException expected) {
assertEquals(Status.CLIENT_ERROR_BAD_REQUEST, expected.getStatus());
assertEquals("Request didn't cantain a list of variables to create.", expected.getStatus().getDescription());
assertEquals("Request didn't contain a list of variables to create.", expected.getStatus().getDescription());
}
} finally {
// Clean adhoc-tasks even if test fails
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<dependencies>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -9,7 +9,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<build>
......
......@@ -11,7 +11,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<properties>
......
......@@ -10,7 +10,7 @@
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<build>
......
......@@ -14,7 +14,7 @@
</parent>
<packaging>pom</packaging>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.framework.version>3.2.7.RELEASE</spring.framework.version>
......
......@@ -4,7 +4,7 @@
<property file="${user.home}/.activiti/build.properties" />
<property file="../distro/src/setup/build.properties" />
<property name="activiti.version" value="5.15.1-SNAPSHOT" />
<property name="activiti.version" value="5.16-SNAPSHOT" />
<property name="activiti.home" value="../distro/target/activiti-${activiti.version}" />
<property name="macos.browser" value="/usr/bin/open" />
<property name="windows.browser" value="C:/Program Files/Mozilla Firefox/firefox.exe" />
......
......@@ -8,7 +8,7 @@
<artifactId>activiti-dbclean</artifactId>
<packaging>pom</packaging>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
<dependencies>
<dependency>
......
......@@ -2,7 +2,7 @@
<project name="activiti.qa.upgrade" default="upgrade">
<property file="${user.home}/.activiti/build.properties" />
<property name="activiti.version" value="5.15.1-SNAPSHOT" />
<property name="activiti.version" value="5.16-SNAPSHOT" />
<property name="database" value="h2" />
<property name="activiti.old.version" value="5.0" />
<property name="downloads.dir" value="${user.home}/.activiti/downloads" />
......
......@@ -6,13 +6,13 @@
<name>Activiti - Upgrade Fetcher</name>
<groupId>org.activiti</groupId>
<artifactId>activiti-upgrade-fetcher</artifactId>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
<parent>
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>5.15.1-SNAPSHOT</version>
<version>5.16-SNAPSHOT</version>
</parent>
<dependencies>
......
......@@ -22,7 +22,7 @@
<book>
<bookinfo><title>Activiti 5.15.1-SNAPSHOT User Guide</title></bookinfo>
<bookinfo><title>Activiti 5.16-SNAPSHOT User Guide</title></bookinfo>
<toc />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册