/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.identity.assignment;
import java.util.Iterator;
import java.util.Set;
import org.jbpm.context.def.ContextDefinition;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.context.log.VariableLog;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.identity.Group;
import org.jbpm.identity.IdentityDbTestCase;
import org.jbpm.identity.Membership;
import org.jbpm.identity.User;
import org.jbpm.logging.exe.LoggingInstance;
import org.jbpm.logging.log.ProcessLog;
import org.jbpm.taskmgmt.def.Swimlane;
import org.jbpm.taskmgmt.def.TaskMgmtDefinition;
import org.jbpm.taskmgmt.exe.PooledActor;
import org.jbpm.taskmgmt.exe.SwimlaneInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class ExpressionAssignmentHandlerTest extends IdentityDbTestCase {
ExpressionAssignmentHandler expressionAssignmentHandler;
TaskInstance assignable = new TaskInstance();
ProcessInstance processInstance;
ExecutionContext executionContext;
Membership membershipJohn, membershipBill;
Group hellsangels;
User john, bill;
public void setUp() throws Exception {
super.setUp();
expressionAssignmentHandler = new ExpressionAssignmentHandler();
setUpProcessInstance();
setUpUserData();
jbpmContext.setActorId("bill");
}
protected void tearDown() throws Exception {
identitySession.deleteEntity(hellsangels);
identitySession.deleteEntity(john);
identitySession.deleteEntity(bill);
super.tearDown();
}
private void setUpUserData() {
john = new User("john");
bill = new User("bill");
hellsangels = new Group("hellsangels", "hierarchy");
membershipJohn = Membership.create(john, "leaderofthegang", hellsangels);
membershipBill = Membership.create(bill, hellsangels);
identitySession.saveEntity(john);
identitySession.saveEntity(bill);
identitySession.saveEntity(hellsangels);
}
private void setUpProcessInstance() {
TaskMgmtDefinition taskMgmtDefinition = new TaskMgmtDefinition();
taskMgmtDefinition.addSwimlane(new Swimlane("boss"));
ProcessDefinition processDefinition = new ProcessDefinition("exp");
processDefinition.addDefinition(taskMgmtDefinition);
processDefinition.addDefinition(new ContextDefinition());
deployProcessDefinition(processDefinition);
processInstance = jbpmContext.newProcessInstanceForUpdate("exp");
executionContext = new ExecutionContext(processInstance.getRootToken());
}
public void testFirstTermPrevious() {
expressionAssignmentHandler.expression = "previous";
expressionAssignmentHandler.assign(assignable, executionContext);
assertEquals("bill", assignable.getActorId());
}
public void testFirstTermSwimlane() {
SwimlaneInstance swimlaneInstance = processInstance.getTaskMgmtInstance()
.createSwimlaneInstance("boss");
swimlaneInstance.setActorId("john");
expressionAssignmentHandler.expression = "swimlane(boss)";
expressionAssignmentHandler.assign(assignable, executionContext);
assertEquals("john", assignable.getActorId());
}
public void testFirstTermSwimlaneUnexisting() {
expressionAssignmentHandler.expression = "swimlane(sillywoman)";
try {
expressionAssignmentHandler.assign(assignable, executionContext);
fail("expected exception");
}
catch (ExpressionAssignmentException e) {
// OK
}
}
public void testFirstTermVariableString() {
processInstance.getContextInstance().setVariable("actoridstringvariable", "john");
expressionAssignmentHandler.expression = "variable(actoridstringvariable)";
expressionAssignmentHandler.assign(assignable, executionContext);
assertEquals("john", assignable.getActorId());
}
public void testFirstTermVariableUser() {
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("uservariable", john);
expressionAssignmentHandler.expression = "variable(uservariable)";
expressionAssignmentHandler.assign(assignable, executionContext);
assertEquals("john", assignable.getActorId());
contextInstance.deleteVariable("uservariable");
deleteLogs(processInstance.getLoggingInstance(), VariableLog.class);
}
public void testFirstTermVariableGroup() {
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("groupvariable", hellsangels);
expressionAssignmentHandler.expression = "variable(groupvariable)";
expressionAssignmentHandler.assign(assignable, executionContext);
Set pooledActors = assignable.getPooledActors();
PooledActor pooledActor = (PooledActor) pooledActors.iterator().next();
assertEquals("hellsangels", pooledActor.getActorId());
contextInstance.deleteVariable("groupvariable");
deleteLogs(processInstance.getLoggingInstance(), VariableLog.class);
}
private static void deleteLogs(LoggingInstance loggingInstance, Class logClass) {
for (Iterator i = loggingInstance.getLogs().iterator(); i.hasNext();) {
ProcessLog processLog = (ProcessLog) i.next();
if (logClass.isInstance(processLog)) i.remove();
}
}
public void testFirstTermVariableUnexisting() {
expressionAssignmentHandler.expression = "variable(unexistingvariablename)";
try {
expressionAssignmentHandler.assign(assignable, executionContext);
fail("expected exception");
}
catch (ExpressionAssignmentException e) {
// OK
}
}
public void testFirstTermUser() {
expressionAssignmentHandler.expression = "user(john)";
expressionAssignmentHandler.assign(assignable, executionContext);
assertEquals("john", assignable.getActorId());
}
public void testFirstTermUserUnexisting() {
expressionAssignmentHandler.expression = "user(idontexist)";
try {
expressionAssignmentHandler.assign(assignable, executionContext);
fail("expected exception");
}
catch (ExpressionAssignmentException e) {
// OK
}
}
public void testFirstTermGroup() {
expressionAssignmentHandler.expression = "group(hellsangels)";
expressionAssignmentHandler.assign(assignable, executionContext);
Set pooledActors = assignable.getPooledActors();
PooledActor pooledActor = (PooledActor) pooledActors.iterator().next();
assertEquals("hellsangels", pooledActor.getActorId());
}
public void testFirstTermGroupUnexisting() {
expressionAssignmentHandler.expression = "group(wedontexist)";
try {
expressionAssignmentHandler.assign(assignable, executionContext);
fail("expected exception");
}
catch (ExpressionAssignmentException e) {
// OK
}
}
public void testWrongFirstTerm() {
expressionAssignmentHandler.expression = "wrong-first-term";
try {
expressionAssignmentHandler.assign(assignable, executionContext);
fail("expected exception");
}
catch (ExpressionAssignmentException e) {
// OK
}
}
public void testNextTermGroup() {
expressionAssignmentHandler.expression = "user(john) --> group(hierarchy)";
expressionAssignmentHandler.assign(assignable, executionContext);
Set pooledActors = assignable.getPooledActors();
PooledActor pooledActor = (PooledActor) pooledActors.iterator().next();
assertEquals("hellsangels", pooledActor.getActorId());
}
public void testNextTermMember() {
expressionAssignmentHandler.expression = "group(hellsangels) --> member(leaderofthegang)";
expressionAssignmentHandler.assign(assignable, executionContext);
assertEquals("john", assignable.getActorId());
}
public void testWrongNextTerm() {
expressionAssignmentHandler.expression = "user(john) --> wrong-second-term";
try {
expressionAssignmentHandler.assign(assignable, executionContext);
fail("expected exception");
}
catch (ExpressionAssignmentException e) {
// OK
}
}
}