Author: clim
Date: Sun Nov 27 04:09:44 2005
New Revision: 349220
URL: http://svn.apache.org/viewcvs?rev=349220&view=rev
Log:
Applied patch for actor functionality support from Geoff Howard. (AGILA-23)
Added:
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/ActorResolverServiceImpl.java
(with props)
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/ActorResolverService.java
(with props)
incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/impl/ActorResolverServiceImplTest.java
(with props)
Modified:
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApplicationTask.java
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApprovalTask.java
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/web/AgilaServlet.java
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/model/Actor.java
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/AbstractTaskService.java
incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/TaskService.java
incubator/agila/trunk/modules/bpm/src/main/resources/LeaveApplication.xml
incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/LeaveApplicationTestCase.java
incubator/agila/trunk/modules/bpm/src/test/resources/LeaveApplication.xml
Modified: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApplicationTask.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApplicationTask.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApplicationTask.java
(original)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApplicationTask.java
Sun Nov 27 04:09:44 2005
@@ -16,9 +16,11 @@
package org.apache.agila.example;
+import org.apache.agila.model.Actor;
import org.apache.agila.model.Connection;
import org.apache.agila.model.node.BaseNodeImpl;
import org.apache.agila.model.NodeContext;
+import org.apache.agila.services.notification.NotificationService;
import org.apache.agila.services.task.Renderer;
import org.apache.agila.services.task.ResponseHandler;
import org.apache.agila.services.task.TaskActivity;
@@ -64,10 +66,12 @@
*/
public boolean doStart(NodeContext ctx) {
+
TaskService ts = ctx.getTaskService();
-
- ts.assignTask(ctx.getNextExecutionToken().getTokenID(), "Enter leave details",
- new UserID(1), new Date());
+ NotificationService ns = ctx.getNotificationService();
+ Actor[] actors = this.getActors();
+ ts.assignTaskToActors(ctx.getNextExecutionToken().getTokenID(), "Enter leave details",
+ actors, new Date());
return false;
}
Modified: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApprovalTask.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApprovalTask.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApprovalTask.java
(original)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/example/LeaveApprovalTask.java
Sun Nov 27 04:09:44 2005
@@ -16,6 +16,7 @@
package org.apache.agila.example;
+import org.apache.agila.model.Actor;
import org.apache.agila.model.Connection;
import org.apache.agila.model.NodeContext;
import org.apache.agila.services.user.UserID;
@@ -35,9 +36,10 @@
TaskService ts = ctx.getTaskService();
NotificationService ns = ctx.getNotificationService();
-
- ts.assignTask(ctx.getNextExecutionToken().getTokenID(), "Leave Approval",
- new UserID(1), new Date());
+ Actor[] actors = this.getActors();
+
+ ts.assignTaskToActors(ctx.getNextExecutionToken().getTokenID(), "Leave Approval",
+ actors, new Date());
return false;
}
Added: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/ActorResolverServiceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/ActorResolverServiceImpl.java?rev=349220&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/ActorResolverServiceImpl.java
(added)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/ActorResolverServiceImpl.java
Sun Nov 27 04:09:44 2005
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * 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.apache.agila.impl;
+
+import org.apache.agila.model.Actor;
+import org.apache.agila.services.ActorResolverService;
+import org.apache.agila.services.user.GroupID;
+import org.apache.agila.services.user.UserID;
+import org.apache.agila.util.BaseID;
+
+/**
+ * @author <a href="mailto:geoff.howard@gmail.com">Geoff Howard</a>
+ * @version $Id$
+ */
+public class ActorResolverServiceImpl implements ActorResolverService {
+
+ public BaseID[] resolve( Actor a ) {
+ /*
+ TODO is an array necessary here? should an actor be allowed to
+ resolve to more than one user or group?
+ */
+
+ // TODO use more sophisticated method to determine resolution rules.
+
+ String name = a.getName();
+ String[] pieces = name.split( ":" );
+
+ if( pieces.length != 2 ) {
+ throw new IllegalArgumentException( "Actor name must be specified as type:value"
);
+ }
+
+ String type = pieces[0];
+ String value = pieces[1];
+
+ if( type.equals( "userid" ) ) {
+ int id = Integer.parseInt( value );
+ return new UserID[] { new UserID( id ) };
+ } else if( type.equals( "groupid" ) ) {
+ int id = Integer.parseInt( value );
+ return new GroupID[] { new GroupID( id ) };
+ } else if( type.equals( "instance" ) ) {
+ // TODO parse special instance values such as initiator, current actor, etc.
+ } else if( type.equals( "variable" ) ) {
+ // TODO parse references to bound variables
+ }
+
+ return null;
+ }
+
+}
Propchange: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/ActorResolverServiceImpl.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/web/AgilaServlet.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/web/AgilaServlet.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/web/AgilaServlet.java
(original)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/impl/web/AgilaServlet.java
Sun Nov 27 04:09:44 2005
@@ -20,6 +20,7 @@
import org.apache.agila.engine.EngineMessage;
import org.apache.agila.engine.InstanceID;
import org.apache.agila.engine.MessageProcessor;
+import org.apache.agila.impl.ActorResolverServiceImpl;
import org.apache.agila.impl.EngineMessageImpl;
import org.apache.agila.impl.QueueServiceImpl;
import org.apache.agila.impl.servlet.ActionServlet;
@@ -32,6 +33,7 @@
import org.apache.agila.impl.memory.TokenServiceImpl;
import org.apache.agila.model.BusinessProcessID;
import org.apache.agila.model.Variable;
+import org.apache.agila.services.ActorResolverService;
import org.apache.agila.services.BusinessProcessInfo;
import org.apache.agila.services.InstanceInfo;
import org.apache.agila.services.notification.NotificationID;
@@ -103,6 +105,7 @@
this.taskService = new TaskServiceImpl();
this.timerService = new TimerServiceImpl();
this.notifyService = new NotificationServiceImpl();
+
this.userService = new UserServiceImpl();
@@ -111,10 +114,11 @@
user.setUserID(new UserID( 1 ));
this.userService.addUser(user);
-
+ ActorResolverService arSvc = new ActorResolverServiceImpl();
taskService.setTokenService(tokenService);
taskService.setInstanceService(eiSvc);
taskService.setBusinessProcessService(graphManager);
+ taskService.setActorResolverService(arSvc);
this.impl = new MessageProcessor();
@@ -596,4 +600,4 @@
public void error(Object msg, Throwable t) {
log(msg.toString(), t);
}
-}
\ No newline at end of file
+}
Modified: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/model/Actor.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/model/Actor.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/model/Actor.java (original)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/model/Actor.java Sun
Nov 27 04:09:44 2005
@@ -17,7 +17,7 @@
package org.apache.agila.model;
/**
- * Represents and actor. Currently, and actor is just a name
+ * Represents an actor. Currently, an actor is just a name
* and the engine will need to find a resolver for the name,
* and use the resolver to get real information
* *
Added: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/ActorResolverService.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/ActorResolverService.java?rev=349220&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/ActorResolverService.java
(added)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/ActorResolverService.java
Sun Nov 27 04:09:44 2005
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * 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.apache.agila.services;
+
+import org.apache.agila.model.Actor;
+import org.apache.agila.util.BaseID;
+
+/**
+ * Interface for handling resolution of named actors in the
+ * engine
+ *
+ * @author <a href="mailto:geoff.howard@gmail.com">Geoff Howard</a>
+ * @version $Id$
+ */
+public interface ActorResolverService {
+
+ /**
+ * Resolves an abstract named Actor.
+ *
+ * @param actor
+ */
+ BaseID[] resolve( Actor actor );
+
+}
Propchange: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/ActorResolverService.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/AbstractTaskService.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/AbstractTaskService.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/AbstractTaskService.java
(original)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/AbstractTaskService.java
Sun Nov 27 04:09:44 2005
@@ -21,9 +21,11 @@
import org.apache.agila.engine.Token;
import org.apache.agila.engine.TokenID;
import org.apache.agila.impl.NodeContextImpl;
+import org.apache.agila.model.Actor;
import org.apache.agila.model.BusinessProcess;
import org.apache.agila.model.BusinessProcessID;
import org.apache.agila.model.Node;
+import org.apache.agila.services.ActorResolverService;
import org.apache.agila.services.BusinessProcessService;
import org.apache.agila.services.InstanceService;
import org.apache.agila.services.notification.NotificationService;
@@ -31,7 +33,10 @@
import org.apache.agila.services.TokenService;
import org.apache.agila.services.user.UserID;
import org.apache.agila.services.user.GroupID;
+import org.apache.agila.util.BaseID;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -45,6 +50,7 @@
private TokenService tokenService;
private InstanceService instanceService;
private BusinessProcessService businessProcessService;
+ private ActorResolverService actorResolverService;
private TimerService timerService;
private NotificationService notificationService;
@@ -61,6 +67,10 @@
this.businessProcessService = bps;
}
+ public void setActorResolverService(ActorResolverService ars) {
+ this.actorResolverService = ars;
+ }
+
public void setTimerService( TimerService timerService ) {
this.timerService = timerService;
}
@@ -99,8 +109,30 @@
return ti.getTaskID();
}
+
+
- /**
+ public TaskID[] assignTaskToActors(TokenID tokenID, String message, Actor[] actors, Date
due) {
+ ArrayList taskIDs = new ArrayList();
+ for (int i = 0; i < actors.length; i++) {
+ Actor actor = actors[i];
+ BaseID[] resolvedIDs = actorResolverService.resolve(actor);
+ for (int j = 0; j < resolvedIDs.length; j++) {
+ BaseID baseID = resolvedIDs[j];
+ if (baseID instanceof GroupID) {
+ TaskID id = assignTaskToTeam(tokenID,message,(GroupID)baseID,due);
+ taskIDs.add(id);
+ } else if (baseID instanceof UserID) {
+ TaskID id = assignTask(tokenID,message,(UserID)baseID,due);
+ taskIDs.add(id);
+ }
+ }
+ }
+
+ return (TaskID[])(taskIDs.toArray(new TaskID[taskIDs.size()]));
+ }
+
+ /**
* returns a list of tasks for a user
*
* @param userID
Modified: incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/TaskService.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/TaskService.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/TaskService.java
(original)
+++ incubator/agila/trunk/modules/bpm/src/main/java/org/apache/agila/services/task/TaskService.java
Sun Nov 27 04:09:44 2005
@@ -18,6 +18,7 @@
import org.apache.agila.engine.InstanceID;
import org.apache.agila.engine.TokenID;
+import org.apache.agila.model.Actor;
import org.apache.agila.services.user.GroupID;
import org.apache.agila.services.user.UserID;
@@ -55,6 +56,20 @@
* @return
*/
TaskID assignTaskToTeam(TokenID tokenID, String message, GroupID groupID, Date due);
+
+ /**
+ * Assigns a new task to a given abstract named Actor. The service uses its
+ * configured ActorResolver to resolve the abstract actor to one or more
+ * users or groups.
+ *
+ * @param tokenID
+ * @param message
+ * @param actor
+ * @param due
+ * @return
+ */
+
+ TaskID[] assignTaskToActors(TokenID tokenID, String message, Actor[] actor, Date due);
/**
* returns a list of tasks for a user
Modified: incubator/agila/trunk/modules/bpm/src/main/resources/LeaveApplication.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/main/resources/LeaveApplication.xml?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/main/resources/LeaveApplication.xml (original)
+++ incubator/agila/trunk/modules/bpm/src/main/resources/LeaveApplication.xml Sun Nov 27 04:09:44
2005
@@ -19,7 +19,7 @@
<property name="bar">123</property>
<actors>
- <actor name="Self"/>
+ <actor name="userid:1"/>
</actors>
<bindings>
<binding name="numdays" type="el" datatype="Number" value="numdays"
input="true" output="true"/>
@@ -30,7 +30,7 @@
<!-- TODO Should have two outgoing transitions for approve/deny -->
<node id="5" type="activity" class="org.apache.agila.example.LeaveApprovalTask"
display_name="Leave Approval">
<actors>
- <actor name="Self"/>
+ <actor name="userid:1"/>
</actors>
<bindings>
<binding name="numdays" type="el" datatype="Number" value="numdays"
input="true" output="false"/>
Modified: incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/LeaveApplicationTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/LeaveApplicationTestCase.java?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/LeaveApplicationTestCase.java
(original)
+++ incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/LeaveApplicationTestCase.java
Sun Nov 27 04:09:44 2005
@@ -24,6 +24,7 @@
import org.apache.agila.engine.InstanceID;
import org.apache.agila.engine.MessageProcessor;
import org.apache.agila.engine.Token;
+import org.apache.agila.impl.ActorResolverServiceImpl;
import org.apache.agila.impl.EngineMessageImpl;
import org.apache.agila.impl.QueueServiceImpl;
import org.apache.agila.impl.StdoutLogService;
@@ -35,6 +36,7 @@
import org.apache.agila.impl.memory.TimerServiceImpl;
import org.apache.agila.impl.memory.NotificationServiceImpl;
import org.apache.agila.model.BusinessProcessID;
+import org.apache.agila.services.ActorResolverService;
import org.apache.agila.services.BusinessProcessInfo;
import org.apache.agila.services.task.HTTPResponseHandler;
import org.apache.agila.services.task.ResponseHandler;
@@ -64,6 +66,7 @@
private BusinessProcessServiceImpl businessProcessService;
private TaskServiceImpl taskService;
private TimerServiceImpl timerService;
+ private ActorResolverServiceImpl actorResolverService;
private MessageProcessor messageProcessor;
private QueueServiceImpl queueService;
private Engine engine;
@@ -251,6 +254,7 @@
instanceService = new InstanceServiceImpl();
businessProcessService = new BusinessProcessServiceImpl();
taskService = new TaskServiceImpl();
+ actorResolverService = new ActorResolverServiceImpl();
timerService = new TimerServiceImpl();
notifyService = new NotificationServiceImpl();
logger = new StdoutLogService();
@@ -265,6 +269,7 @@
taskService.setTokenService(tokenService);
taskService.setInstanceService( instanceService );
taskService.setBusinessProcessService( businessProcessService );
+ taskService.setActorResolverService(actorResolverService);
messageProcessor = new MessageProcessor();
@@ -302,6 +307,7 @@
tokenService = null;
instanceService = null;
businessProcessService = null;
+ actorResolverService = null;
taskService = null;
timerService = null;
messageProcessor = null;
Added: incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/impl/ActorResolverServiceImplTest.java
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/impl/ActorResolverServiceImplTest.java?rev=349220&view=auto
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/impl/ActorResolverServiceImplTest.java
(added)
+++ incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/impl/ActorResolverServiceImplTest.java
Sun Nov 27 04:09:44 2005
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * 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.apache.agila.impl;
+
+import junit.framework.TestCase;
+import org.apache.agila.model.Actor;
+import org.apache.agila.services.ActorResolverService;
+import org.apache.agila.util.BaseID;
+
+/**
+ * @author <a href="mailto:clim@apache.org">Chris Lim</a>
+ * @version $Id$
+ */
+
+public class ActorResolverServiceImplTest extends TestCase {
+
+
+ public void testResolveActor() {
+
+ BaseID[] baseID;
+
+ Actor actor = new Actor( "userid:1" );
+
+ ActorResolverService actorResolverService = new ActorResolverServiceImpl();
+
+ baseID = actorResolverService.resolve( actor );
+
+ assertTrue( baseID.length == 1);
+ assertTrue( baseID[0].getID() == 1);
+
+ }
+
+}
Propchange: incubator/agila/trunk/modules/bpm/src/test/java/org/apache/agila/impl/ActorResolverServiceImplTest.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: incubator/agila/trunk/modules/bpm/src/test/resources/LeaveApplication.xml
URL: http://svn.apache.org/viewcvs/incubator/agila/trunk/modules/bpm/src/test/resources/LeaveApplication.xml?rev=349220&r1=349219&r2=349220&view=diff
==============================================================================
--- incubator/agila/trunk/modules/bpm/src/test/resources/LeaveApplication.xml (original)
+++ incubator/agila/trunk/modules/bpm/src/test/resources/LeaveApplication.xml Sun Nov 27 04:09:44
2005
@@ -38,7 +38,7 @@
<property name="bar">123</property>
<actors>
- <actor name="Self"/>
+ <actor name="userid:1"/>
</actors>
<bindings>
<binding name="numdays" type="el" datatype="Number" value="numdays"
input="true" output="true"/>
@@ -49,7 +49,7 @@
<!-- TODO Should have two outgoing transitions for approve/deny -->
<node id="5" type="activity" class="org.apache.agila.example.LeaveApprovalTask"
display_name="Leave Approval">
<actors>
- <actor name="Self"/>
+ <actor name="userid:1"/>
</actors>
<bindings>
<binding name="numdays" type="el" datatype="Number" value="numdays"
input="true" output="false"/>
|