/* 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.test.bpmn.parse;
import java.util.List;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.impl.pvm.process.TransitionImpl;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.impl.test.TestHelper;
import org.activiti.engine.test.Deployment;
/**
*
* @author Joram Barrez
*/
public class BpmnParseTest extends PluggableActivitiTestCase {
public void testInvalidProcessDefinition() {
try {
String resource = TestHelper.getBpmnProcessDefinitionResource(getClass(), "testInvalidProcessDefinition");
repositoryService.createDeployment().name(resource).addClasspathResource(resource).deploy();
fail();
} catch (ActivitiException e) {
assertTextPresent("cvc-complex-type.3.2.2:", e.getMessage());
assertTextPresent("invalidAttribute", e.getMessage());
assertTextPresent("process", e.getMessage());
}
}
public void testParseWithBpmnNamespacePrefix() {
repositoryService.createDeployment()
.addClasspathResource("org/activiti/engine/test/bpmn/parse/BpmnParseTest.testParseWithBpmnNamespacePrefix.bpmn20.xml")
.deploy();
assertEquals(1, repositoryService.createProcessDefinitionQuery().count());
repositoryService.deleteDeployment(repositoryService.createDeploymentQuery().singleResult().getId(), true);
}
public void testParseWithMultipleDocumentation() {
repositoryService.createDeployment()
.addClasspathResource("org/activiti/engine/test/bpmn/parse/BpmnParseTest.testParseWithMultipleDocumentation.bpmn20.xml")
.deploy();
assertEquals(1, repositoryService.createProcessDefinitionQuery().count());
repositoryService.deleteDeployment(repositoryService.createDeploymentQuery().singleResult().getId(), true);
}
public void testParseCollaborationPlane() {
repositoryService.createDeployment().addClasspathResource("org/activiti/engine/test/bpmn/parse/BpmnParseTest.testParseCollaborationPlane.bpmn").deploy();
assertEquals(1, repositoryService.createProcessDefinitionQuery().count());
repositoryService.deleteDeployment(repositoryService.createDeploymentQuery().singleResult().getId(), true);
}
@Deployment
public void testParseDiagramInterchangeElements() {
// Graphical information is not yet exposed publicly, so we need to do some plumbing
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutorTxRequired();
ProcessDefinitionEntity processDefinitionEntity = commandExecutor.execute(new Command<ProcessDefinitionEntity>() {
public ProcessDefinitionEntity execute(CommandContext commandContext) {
return Context
.getProcessEngineConfiguration()
.getDeploymentCache()
.findDeployedLatestProcessDefinitionByKey("myProcess");
}
});
assertNotNull(processDefinitionEntity);
assertEquals(7, processDefinitionEntity.getActivities().size());
// Check if diagram has been created based on Diagram Interchange when it's not a headless instance
List<String> resourceNames = repositoryService.getDeploymentResourceNames(processDefinitionEntity.getDeploymentId());
assertEquals(2, resourceNames.size());
for (ActivityImpl activity : processDefinitionEntity.getActivities()) {
if (activity.getId().equals("theStart")) {
assertActivityBounds(activity, 70, 255, 30, 30);
} else if (activity.getId().equals("task1")) {
assertActivityBounds(activity, 176, 230, 100, 80);
} else if (activity.getId().equals("gateway1")) {
assertActivityBounds(activity, 340, 250, 40, 40);
} else if (activity.getId().equals("task2")) {
assertActivityBounds(activity, 445, 138, 100, 80);
} else if (activity.getId().equals("gateway2")) {
assertActivityBounds(activity, 620, 250, 40, 40);
} else if (activity.getId().equals("task3")) {
assertActivityBounds(activity, 453, 304, 100, 80);
} else if (activity.getId().equals("theEnd")) {
assertActivityBounds(activity, 713, 256, 28, 28);
}
for (PvmTransition sequenceFlow : activity.getOutgoingTransitions()) {
assertTrue( ((TransitionImpl)sequenceFlow).getWaypoints().size() >= 4);
TransitionImpl transitionImpl = (TransitionImpl) sequenceFlow;
if (transitionImpl.getId().equals("flowStartToTask1")) {
assertSequenceFlowWayPoints(transitionImpl, 100, 270, 176, 270);
} else if (transitionImpl.getId().equals("flowTask1ToGateway1")) {
assertSequenceFlowWayPoints(transitionImpl, 276, 270, 340,270);
} else if (transitionImpl.getId().equals("flowGateway1ToTask2")) {
assertSequenceFlowWayPoints(transitionImpl, 360, 250, 360, 178, 445, 178);
} else if (transitionImpl.getId().equals("flowGateway1ToTask3")) {
assertSequenceFlowWayPoints(transitionImpl, 360, 290, 360, 344, 453, 344);
} else if (transitionImpl.getId().equals("flowTask2ToGateway2")) {
assertSequenceFlowWayPoints(transitionImpl, 545, 178, 640, 178, 640, 250);
} else if (transitionImpl.getId().equals("flowTask3ToGateway2")) {
assertSequenceFlowWayPoints(transitionImpl, 553, 344, 640, 344, 640, 290);
} else if (transitionImpl.getId().equals("flowGateway2ToEnd")) {
assertSequenceFlowWayPoints(transitionImpl, 660, 270, 713, 270);
}
}
}
}
@Deployment
public void testParseNamespaceInConditionExpressionType() {
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutorTxRequired();
ProcessDefinitionEntity processDefinitionEntity = commandExecutor.execute(new Command<ProcessDefinitionEntity>() {
public ProcessDefinitionEntity execute(CommandContext commandContext) {
return Context
.getProcessEngineConfiguration()
.getDeploymentCache()
.findDeployedLatestProcessDefinitionByKey("resolvableNamespacesProcess");
}
});
// Test that the process definition has been deployed
assertNotNull(processDefinitionEntity);
ActivityImpl activity = processDefinitionEntity.findActivity("ExclusiveGateway_1");
assertNotNull(activity);
// Test that the conditions has been resolved
for (PvmTransition transition : activity.getOutgoingTransitions()) {
if (transition.getDestination().getId().equals("Task_2")) {
assertTrue(transition.getProperty("conditionText").equals("#{approved}"));
} else if (transition.getDestination().getId().equals("Task_3")) {
assertTrue(transition.getProperty("conditionText").equals("#{!approved}"));
} else {
fail("Something went wrong");
}
}
}
@Deployment
public void testParseDiagramInterchangeElementsForUnknownModelElements() {
}
public void testParseSwitchedSourceAndTargetRefsForAssociations() {
repositoryService.createDeployment()
.addClasspathResource("org/activiti/engine/test/bpmn/parse/BpmnParseTest.testParseSwitchedSourceAndTargetRefsForAssociations.bpmn20.xml")
.deploy();
assertEquals(1, repositoryService.createProcessDefinitionQuery().count());
repositoryService.deleteDeployment(repositoryService.createDeploymentQuery().singleResult().getId(), true);
}
protected void assertActivityBounds(ActivityImpl activity, int x, int y, int width, int height) {
assertEquals(x, activity.getX());
assertEquals(y, activity.getY());
assertEquals(width, activity.getWidth());
assertEquals(height, activity.getHeight());
}
protected void assertSequenceFlowWayPoints(TransitionImpl sequenceFlow, Integer ... waypoints) {
assertEquals(waypoints.length, sequenceFlow.getWaypoints().size());
for (int i = 0; i < waypoints.length; i++) {
assertEquals(waypoints[i], sequenceFlow.getWaypoints().get(i));
}
}
}