[jboss-svn-commits] JBL Code SVN: r22769 - in labs/jbossrules/trunk/drools-process/drools-process-task/src: main/java/org/drools/eventmessaging and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Sep 15 02:50:33 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-09-15 02:50:32 -0400 (Mon, 15 Sep 2008)
New Revision: 22769

Added:
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKey.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKeys.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventResponseHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventTriggerTransport.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/Payload.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/EventPayload.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClosedEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventKey.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaClient.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaServer.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaEventTransport.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/eventmessaging/
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingEventResponseHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/waitevents/
Modified:
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskServer.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java
Log:
JBRULES-1745 WS-Human-Task
-Can now do event callbacks.

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKey.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKey.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKey.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+package org.drools.eventmessaging;
+
+public interface EventKey {
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKeys.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKeys.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventKeys.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,42 @@
+package org.drools.eventmessaging;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class EventKeys {
+    private Map<EventKey, List<EventTriggerTransport>> keys;
+    
+    public EventKeys() {
+        keys = new HashMap<EventKey, List<EventTriggerTransport>>();
+    }
+    
+    public void register(EventKey key, EventTriggerTransport target) {
+        List<EventTriggerTransport> list = keys.get( key);
+        if ( list == null ) {
+            list = new ArrayList<EventTriggerTransport>();
+            keys.put( key, list );
+        }
+        list.add( target );
+    }
+    
+    public void unregister(EventKey key, EventTriggerTransport target) {
+        List<EventTriggerTransport> list = keys.get( key);
+        if ( list != null ) {
+            list.remove( target );
+        }
+    }
+    
+    public List<EventTriggerTransport> getTargets(EventKey key) {
+        return keys.get(  key  );
+    }
+    
+    public List<EventTriggerTransport> removeKey(EventKey key) {
+        return keys.remove( key );
+    }    
+    
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventResponseHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventResponseHandler.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,7 @@
+package org.drools.eventmessaging;
+
+import org.drools.task.service.BaseMinaHandler.ResponseHandler;
+
+public interface EventResponseHandler extends ResponseHandler {
+    public void execute(Payload payload);
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventTriggerTransport.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventTriggerTransport.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/EventTriggerTransport.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,8 @@
+package org.drools.eventmessaging;
+
+
+public interface EventTriggerTransport {
+    public void trigger(Payload payload);
+    
+    public boolean isRemove();
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/Payload.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/Payload.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/eventmessaging/Payload.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,5 @@
+package org.drools.eventmessaging;
+
+public interface Payload {
+    public Object get();
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/DefaultTaskEventListener.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,11 @@
+package org.drools.task.event;
+
+public class DefaultTaskEventListener implements TaskEventListener {
+
+    public void taskClaimed(TaskClaimedEvent event) {        
+    }
+
+    public void taskClosed(TaskClosedEvent event) {
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/EventPayload.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/EventPayload.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/EventPayload.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,32 @@
+package org.drools.task.event;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.eventmessaging.Payload;
+
+public class EventPayload implements Payload, Externalizable {
+    private TaskEvent event;
+
+    public EventPayload() {
+        
+    }
+    
+    public EventPayload(TaskEvent event) {
+        this.event = event;
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( event );
+    }    
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        event = ( TaskEvent ) in.readObject();
+    }
+    
+    public Object get() {
+        return event;
+    }       
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/MessagingTaskEventListener.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,56 @@
+package org.drools.task.event;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.eventmessaging.EventKey;
+import org.drools.eventmessaging.EventKeys;
+import org.drools.eventmessaging.EventTriggerTransport;
+import org.drools.eventmessaging.Payload;
+
+public class MessagingTaskEventListener implements TaskEventListener {
+    EventKeys keys;
+    
+    public MessagingTaskEventListener(EventKeys keys) {
+        this.keys = keys;
+    }
+    
+    public void taskClaimed(TaskClaimedEvent event) {        
+        EventKey key = new TaskEventKey(TaskClaimedEvent.class, event.getTaskId() );
+        List<EventTriggerTransport> targets = keys.getTargets( key );
+        if ( targets == null ){
+            return;
+        }
+        Payload payload = new EventPayload( event );
+        for ( Iterator<EventTriggerTransport> it = targets.iterator(); it.hasNext(); ) {
+            EventTriggerTransport target = it.next();
+            target.trigger( payload );
+            if ( target.isRemove() ) {
+                it.remove();
+            }
+        }
+        if ( targets.isEmpty() ) {
+            keys.removeKey( key );
+        }
+    }
+
+    public void taskClosed(TaskClosedEvent event) {
+        EventKey key = new TaskEventKey(TaskClosedEvent.class, event.getTaskId() );
+        List<EventTriggerTransport> targets = keys.getTargets( key );
+        if ( targets == null ){
+            return;
+        }        
+        Payload payload = new EventPayload( event );
+        for ( Iterator<EventTriggerTransport> it = targets.iterator(); it.hasNext(); ) {
+            EventTriggerTransport target = it.next();
+            target.trigger( payload );
+            if ( target.isRemove() ) {
+                it.remove();
+            }
+        }
+        if ( targets.isEmpty() ) {
+            keys.removeKey( key );
+        }   
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClaimedEvent.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,34 @@
+package org.drools.task.event;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+public class TaskClaimedEvent extends TaskEvent implements Externalizable {
+    private long userId;
+    
+    public TaskClaimedEvent() {
+        super();
+    }
+    
+    public TaskClaimedEvent(long taskId, long userId) {
+        super( taskId );
+        this.userId = userId;
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal( out );
+        out.writeLong( userId );
+    }  
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        super.readExternal( in );
+        userId = in.readLong();
+    }
+    
+    public long getUserId() {
+        return userId;
+    }
+        
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClosedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClosedEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskClosedEvent.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,29 @@
+package org.drools.task.event;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+public class TaskClosedEvent extends TaskEvent implements Externalizable {
+    private long userId;
+    
+    public TaskClosedEvent(long taskId, long userId) {
+        super( taskId );
+        this.userId = userId;
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeLong(  userId  );
+    }   
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        userId = in.readLong();
+    }
+
+
+    public long getUserId() {
+        return userId;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEvent.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,35 @@
+package org.drools.task.event;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.EventObject;
+
+public abstract class TaskEvent  extends EventObject implements Externalizable {
+    private static final String dummySource = "";
+    private long taskId;
+    
+    public TaskEvent() {
+        super( dummySource );
+    }
+    
+    public TaskEvent(long taskId) {
+        super( taskId );
+        this.taskId = (Long) taskId;
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeLong( taskId );
+    }  
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        taskId = in.readLong();
+        source = taskId;
+    }
+    
+    public long getTaskId() {
+        return taskId;
+    }
+        
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventKey.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventKey.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventKey.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,69 @@
+package org.drools.task.event;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.eventmessaging.EventKey;
+
+
+public class TaskEventKey implements EventKey, Externalizable {
+    private Class<? extends TaskEvent> event;
+    private long taskId;
+    
+    public TaskEventKey() {
+        
+    }
+        
+    public TaskEventKey(Class<? extends TaskEvent> event, long taskId) {
+        this.event = event;
+        this.taskId = taskId;
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeUTF(  event.getName() );
+        out.writeLong( taskId );
+    }  
+    
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        String className = in.readUTF();
+        try {
+            event = (Class< ? extends TaskEvent>) Thread.currentThread().getContextClassLoader().loadClass( className );
+        } catch( Exception e ) {
+            event = (Class< ? extends TaskEvent>) getClass().getClassLoader().loadClass( className );
+        }
+        
+        taskId = in.readLong();
+    }    
+            
+    public Class< ? extends TaskEvent> getEvent() {
+        return event;
+    }
+
+    public long getTaskId() {
+        return this.taskId;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((event == null) ? 0 : event.hashCode());
+        result = prime * result + (int) (taskId ^ (taskId >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( !(obj instanceof TaskEventKey) ) return false;
+        TaskEventKey other = (TaskEventKey) obj;
+        if ( event == null ) {
+            if ( other.event != null ) return false;
+        } else if ( !event.equals( other.event ) ) return false;
+        if ( taskId != other.taskId ) return false;
+        return true;
+    }     
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventListener.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,29 @@
+package org.drools.task.event;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * 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.
+ */
+
+import java.util.EventListener;
+
+public interface TaskEventListener
+    extends
+    EventListener {
+    
+    void taskClaimed(TaskClaimedEvent event);
+    
+    void taskClosed(TaskClosedEvent event);
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/event/TaskEventSupport.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,104 @@
+package org.drools.task.event;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * 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.
+ */
+
+import java.io.Externalizable;
+import java.io.ObjectOutput;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.Activation;
+import org.drools.spi.AgendaGroup;
+
+
+public class TaskEventSupport
+    implements
+    Externalizable {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 400L;
+    private List<TaskEventListener> listeners = new CopyOnWriteArrayList<TaskEventListener>();
+
+    public TaskEventSupport() {
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        listeners   = (List<TaskEventListener>)in.readObject();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(listeners);
+    }
+
+    public void addEventListener(final TaskEventListener listener) {
+        if ( !this.listeners.contains( listener ) ) {
+            this.listeners.add( listener );
+        }
+    }
+
+    public void removeEventListener(final TaskEventListener listener) {
+        this.listeners.remove( listener );
+    }
+
+    public List<TaskEventListener> getEventListeners() {
+        return Collections.unmodifiableList( this.listeners );
+    }
+
+    public int size() {
+        return this.listeners.size();
+    }
+
+    public boolean isEmpty() {
+        return this.listeners.isEmpty();
+    }
+    
+    public void fireTaskClaimed(final long taskId, final long userId) {
+      if ( this.listeners.isEmpty() ) {
+          return;
+      }
+
+      final TaskClaimedEvent event = new TaskClaimedEvent(taskId, userId);
+      
+      for ( TaskEventListener listener: listeners) {
+          listener.taskClaimed( event );
+      }
+  }    
+
+    public void fireTaskClosed(final long taskId, final long userId) {
+        if ( this.listeners.isEmpty() ) {
+            return;
+        }
+
+        final TaskClosedEvent event = new TaskClosedEvent( taskId, userId );
+        
+        for ( TaskEventListener listener: listeners) {
+            listener.taskClosed( event );
+        }
+    } 
+    
+    
+
+    public void reset() {
+        this.listeners.clear();
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaClient.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaClient.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaClient.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,72 @@
+package org.drools.task.service;
+
+import java.net.SocketAddress;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.mina.core.future.ConnectFuture;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
+import org.apache.mina.transport.socket.SocketConnector;
+
+public class BaseMinaClient {
+    protected IoSession session;
+    
+    protected final BaseMinaHandler handler;
+    protected final String name;   
+    protected AtomicInteger counter;
+    
+    public BaseMinaClient(String name, BaseMinaHandler handler) {
+        if (name == null) {
+            throw new IllegalArgumentException("Name can not be null");
+        }
+        this.name = name;
+        this.handler = handler;
+        counter = new AtomicInteger();
+    }
+    
+    public boolean connect(SocketConnector connector, SocketAddress address) {
+        if (session != null && session.isConnected()) {
+            throw new IllegalStateException(
+                    "Already connected. Disconnect first.");
+        }
+
+        connector.setHandler( this.handler );
+ 
+        try {
+//            SocketConnectorConfig config = new SocketConnectorConfig();
+//            if (useSsl) {
+//                SSLContext sslContext = BogusSSLContextFactory
+//                        .getInstance(false);
+//                SSLFilter sslFilter = new SSLFilter(sslContext);
+//                sslFilter.setUseClientMode(true);
+//                config.getFilterChain().addLast("sslFilter", sslFilter);
+//            }
+            
+            //connector.setHandler( arg0 );
+            
+            connector.getFilterChain().addLast(
+                                               "codec",
+                                               new ProtocolCodecFilter(
+                                                       new ObjectSerializationCodecFactory()));
+
+            ConnectFuture future1 = connector.connect( address );
+            future1.join();
+            if (!future1.isConnected()) {
+                return false;
+            }
+            session = future1.getSession();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+    
+    public void disconnect() {
+        if ( session!= null && session.isConnected() ) {
+            session.close();
+            session.getCloseFuture().join();
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaHandler.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,29 @@
+package org.drools.task.service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IdleStatus;
+import org.apache.mina.core.session.IoSession;
+import org.drools.task.Content;
+import org.drools.task.Task;
+import org.drools.task.query.TaskSummary;
+
+public class BaseMinaHandler extends IoHandlerAdapter
+{       
+    protected Map<Integer, ResponseHandler> responseHandlers;
+    
+    public BaseMinaHandler() {
+        responseHandlers = new HashMap<Integer, ResponseHandler>();
+    }
+    
+    public void addResponseHandler(int id, ResponseHandler responseHandler) {
+        responseHandlers.put( id, responseHandler );
+    }
+    
+    public static interface ResponseHandler {
+        
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaServer.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaServer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/BaseMinaServer.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,71 @@
+package org.drools.task.service;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.apache.mina.core.service.IoAcceptor;
+import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IdleStatus;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
+import org.apache.mina.filter.logging.LoggingFilter;
+import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
+
+public class BaseMinaServer
+    implements
+    Runnable {
+    private final int port;
+
+    IoHandlerAdapter  handler;
+
+    IoAcceptor        acceptor;
+
+    volatile boolean  running;
+
+    public BaseMinaServer(IoHandlerAdapter handler,
+                          int port) {
+        this.handler = handler;
+        this.port = port;
+    }
+
+    public void run() {
+        try {
+            start();
+            while ( running ) {
+                Thread.sleep( 100 );
+            }
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Server Exception with class " + getClass() + " using port " + port,
+                                        e );
+        }
+    }
+
+    public void start() throws IOException {
+        running = true;
+
+        acceptor = new NioSocketAcceptor();
+
+        acceptor.getFilterChain().addLast( "logger",
+                                           new LoggingFilter() );
+        acceptor.getFilterChain().addLast( "codec",
+                                           new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
+
+        acceptor.setHandler( handler );
+        acceptor.getSessionConfig().setReadBufferSize( 2048 );
+        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE,
+                                                 10 );
+        acceptor.bind( new InetSocketAddress( "127.0.0.1", port ) );
+    }
+    
+    public IoAcceptor getIoAcceptor() {
+        return acceptor;
+    }
+
+    public void stop() {
+        acceptor.dispose();
+        running = false;
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java	2008-09-15 05:20:06 UTC (rev 22768)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/CommandName.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -39,18 +39,19 @@
     AddCommentRequest,
     AddCommentResponse,
     DeleteCommentRequest,    
-    DeleteCommentResponse,
+    DeleteCommentResponse,    
     
-
-    
-    QueryTasksOwned,
-    
+    QueryTasksOwned,    
     QueryTasksAssignedAsBusinessAdministrator,
     QueryTasksAssignedAsExcludedOwner,
     QueryTasksAssignedAsPotentialOwner,
     QueryTasksAssignedAsRecipient,
     QueryTasksAssignedAsTaskInitiator,
-    QueryTasksAssignedAsTaskStakeholder,
+    QueryTasksAssignedAsTaskStakeholder,    
+    QueryTaskSummaryResponse,
     
-    QueryTaskSummaryResponse;
+    RegisterForEventRequest,
+    EventTriggerResponse,
+    
+    RegisterClient;
 }

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaEventTransport.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaEventTransport.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaEventTransport.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,35 @@
+package org.drools.task.service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.mina.core.session.IoSession;
+import org.drools.eventmessaging.EventTriggerTransport;
+import org.drools.eventmessaging.Payload;
+
+public class MinaEventTransport implements EventTriggerTransport {
+    private String uuid;
+    private Map<String, IoSession> sessions;
+    private int responseId;
+    private boolean remove;
+    
+    MinaEventTransport(String uuid, int responseId, Map<String, IoSession> sessions, boolean remove) {
+        this.uuid = uuid;
+        this.responseId = responseId;
+        this.sessions = sessions;
+        this.remove = remove;
+    }
+
+    public void trigger(Payload payload) {        
+        IoSession session = sessions.get( uuid );
+        List args = new ArrayList( 1 );
+        args.add( payload );
+        Command cmd = new Command( responseId, CommandName.EventTriggerResponse, args);             
+        session.write( cmd );        
+    }
+    
+    public boolean isRemove() {
+        return this.remove;
+    }
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2008-09-15 05:20:06 UTC (rev 22768)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskClient.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -18,6 +18,8 @@
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.transport.socket.SocketConnector;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.eventmessaging.EventKey;
+import org.drools.eventmessaging.EventResponseHandler;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
 import org.drools.task.Content;
@@ -32,308 +34,352 @@
 import org.drools.task.service.TaskClientHandler.SetDocumentResponseHandler;
 import org.drools.task.service.TaskClientHandler.TaskSummaryResponseHandler;
 
-public class MinaTaskClient
-{
-    private final TaskClientHandler handler;
+public class MinaTaskClient extends BaseMinaClient {
+    
+    public MinaTaskClient(String name,
+                          TaskClientHandler handler) {
+        super( name,
+               handler );
+    }            
 
-    private final String name;
+    public void addTask(Task task,
+                        AddTaskResponseHandler responseHandler) {
+        List args = new ArrayList( 1 );
+        args.add( task );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.AddTaskRequest,
+                                   args );
 
-    private IoSession session;
-    
-    private AtomicInteger counter;
-    
-    public static void main(String[] args) throws Exception {
-        MinaTaskClient client = new MinaTaskClient("test client", new TaskClientHandler() );
-        NioSocketConnector connector = new NioSocketConnector();
-        SocketAddress address =  new InetSocketAddress( "127.0.0.1", 9123 );
-        client.connect( connector, address );
-    }
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
 
-    public MinaTaskClient(String name, TaskClientHandler handler) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name can not be null");
-        }
-        this.name = name;
-        this.handler = handler;
-        counter = new AtomicInteger();
+        session.write( cmd );
     }
 
-    public boolean connect(SocketConnector connector, SocketAddress address) {
-        if (session != null && session.isConnected()) {
-            throw new IllegalStateException(
-                    "Already connected. Disconnect first.");
-        }
+    public void getTask(long taskId,
+                        GetTaskResponseHandler responseHandler) {
+        List args = new ArrayList( 1 );
+        args.add( taskId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.GetTaskRequest,
+                                   args );
 
-        connector.setHandler( this.handler );
- 
-        try {
-//            SocketConnectorConfig config = new SocketConnectorConfig();
-//            if (useSsl) {
-//                SSLContext sslContext = BogusSSLContextFactory
-//                        .getInstance(false);
-//                SSLFilter sslFilter = new SSLFilter(sslContext);
-//                sslFilter.setUseClientMode(true);
-//                config.getFilterChain().addLast("sslFilter", sslFilter);
-//            }
-            
-            //connector.setHandler( arg0 );
-            
-            connector.getFilterChain().addLast(
-                                               "codec",
-                                               new ProtocolCodecFilter(
-                                                       new ObjectSerializationCodecFactory()));
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
 
-            ConnectFuture future1 = connector.connect( address );
-            future1.join();
-            if (!future1.isConnected()) {
-                return false;
-            }
-            session = future1.getSession();
-            //session.write("LOGIN " + name);
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-    
-    public void disconnect() {
-        if ( session!= null && session.isConnected() ) {
-            session.close();
-            session.getCloseFuture().join();
-        }
-    }
-    
-    public void addTask(Task task, AddTaskResponseHandler responseHandler ) {
-        List args = new ArrayList( 1 );
-        args.add( task );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.AddTaskRequest, args);  
-        
-        handler.addResponseHandler( cmd.getId(), responseHandler );   
-        
         session.write( cmd );
+
     }
-    
-    public void getTask(long taskId, GetTaskResponseHandler responseHandler) {
-        List args = new ArrayList( 1 );
-        args.add( taskId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.GetTaskRequest, args);  
-        
-        handler.addResponseHandler( cmd.getId(), responseHandler );   
-        
-        session.write( cmd );        
-        
-    }
-    
-    public void addComment(long taskId, Comment comment, AddCommentResponseHandler responseHandler) {
+
+    public void addComment(long taskId,
+                           Comment comment,
+                           AddCommentResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( taskId );
         args.add( comment );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.AddCommentRequest, args);       
-        
-        handler.addResponseHandler( cmd.getId(), responseHandler );
-        
-        session.write( cmd );         
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.AddCommentRequest,
+                                   args );
+
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
+
+        session.write( cmd );
     }
-    
-    public void deleteComment(long taskId, long commentId) {
+
+    public void deleteComment(long taskId,
+                              long commentId) {
         List args = new ArrayList( 2 );
         args.add( taskId );
         args.add( commentId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.DeleteCommentRequest, args);
-        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.DeleteCommentRequest,
+                                   args );
+
         session.write( cmd );
     }
-    
-    
-    public void addAttachment(long taskId, Attachment attachment, Content content, AddAttachmentResponseHandler responseHandler ) {
+
+    public void addAttachment(long taskId,
+                              Attachment attachment,
+                              Content content,
+                              AddAttachmentResponseHandler responseHandler) {
         List args = new ArrayList( 3 );
         args.add( taskId );
         args.add( attachment );
         args.add( content );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.AddAttachmentRequest, args);   
-        
-        handler.addResponseHandler( cmd.getId(), responseHandler );
-        
-        session.write( cmd );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.AddAttachmentRequest,
+                                   args );
+
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
+
+        session.write( cmd );
     }
-    
-    public void deleteAttachment(long taskId, long attachmentId, long contentId) {
+
+    public void deleteAttachment(long taskId,
+                                 long attachmentId,
+                                 long contentId) {
         List args = new ArrayList( 3 );
         args.add( taskId );
         args.add( attachmentId );
         args.add( contentId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.DeleteAttachmentRequest, args);
-        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.DeleteAttachmentRequest,
+                                   args );
+
         session.write( cmd );
-    }    
-    
+    }
+
     public void setDocumentContent(long taskId,
-                                   Content content, 
-                                   SetDocumentResponseHandler responseHandler ) {    
+                                   Content content,
+                                   SetDocumentResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( taskId );
         args.add( content );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.SetDocumentContentRequest, args);   
-        
-        handler.addResponseHandler( cmd.getId(), responseHandler );
-        
-        session.write( cmd );         
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.SetDocumentContentRequest,
+                                   args );
+
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
+
+        session.write( cmd );
     }
-    
-    public void getContent(long contentId, GetContentResponseHandler responseHandler) {
+
+    public void getContent(long contentId,
+                           GetContentResponseHandler responseHandler) {
         List args = new ArrayList( 1 );
         args.add( contentId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.GetContentRequest, args);  
-        
-        handler.addResponseHandler( cmd.getId(), responseHandler );   
-        
-        session.write( cmd );                
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.GetContentRequest,
+                                   args );
+
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
+
+        session.write( cmd );
     }
-    
-    public void claim(long taskId, long userId) {
+
+    public void claim(long taskId,
+                      long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.ClaimRequest, args);
-        
-        session.write( cmd );          
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.ClaimRequest,
+                                   args );
+
+        session.write( cmd );
     }
-    
-    public void start(long taskId, long userId) {
+
+    public void start(long taskId,
+                      long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.StartRequest, args);
-        
-        session.write( cmd );         
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.StartRequest,
+                                   args );
+
+        session.write( cmd );
     }
-    
-    public void stop(long taskId, long userId) {
+
+    public void stop(long taskId,
+                     long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.StopRequest, args);
-        
-        session.write( cmd );          
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.StopRequest,
+                                   args );
+
+        session.write( cmd );
     }
-    
-    public void release(long taskId, long userId) {
+
+    public void release(long taskId,
+                        long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.ReleaseRequest, args);
-        
-        session.write( cmd ); 
-    }    
-    
-    public void suspend(long taskId, long userId) {
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.ReleaseRequest,
+                                   args );
+
+        session.write( cmd );
+    }
+
+    public void suspend(long taskId,
+                        long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.SuspendRequest, args);
-        
-        session.write( cmd ); 
-    }     
-    
-    public void resume(long taskId, long userId) {
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.SuspendRequest,
+                                   args );
+
+        session.write( cmd );
+    }
+
+    public void resume(long taskId,
+                       long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.ResumeRequest, args);
-        
-        session.write( cmd ); 
-    }     
-    
-    public void skip(long taskId, long userId) {
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.ResumeRequest,
+                                   args );
+
+        session.write( cmd );
+    }
+
+    public void skip(long taskId,
+                     long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.SkipRequest, args);
-        
-        session.write( cmd ); 
-    }    
-    
-    public void complete(long taskId, long userId) {
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.SkipRequest,
+                                   args );
+
+        session.write( cmd );
+    }
+
+    public void complete(long taskId,
+                         long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.CompleteRequest, args);
-        
-        session.write( cmd ); 
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.CompleteRequest,
+                                   args );
+
+        session.write( cmd );
     }
-    
-    public void fail(long taskId, long userId) {
+
+    public void fail(long taskId,
+                     long userId) {
         List args = new ArrayList( 1 );
         args.add( taskId );
-        args.add(  userId );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.FailRequest, args);
-        
-        session.write( cmd ); 
-    }    
-    
+        args.add( userId );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.FailRequest,
+                                   args );
 
-    public void getTasksOwned(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+        session.write( cmd );
+    }
+
+    public void getTasksOwned(long userId,
+                              String language,
+                              TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksOwned, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksOwned,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
     }
-        
-    public void getTasksAssignedAsBusinessAdministrator(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+
+    public void getTasksAssignedAsBusinessAdministrator(long userId,
+                                                        String language,
+                                                        TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksAssignedAsBusinessAdministrator, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksAssignedAsBusinessAdministrator,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
-    }    
-    
-    public void getTasksAssignedAsExcludedOwner(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+    }
+
+    public void getTasksAssignedAsExcludedOwner(long userId,
+                                                String language,
+                                                TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksAssignedAsExcludedOwner, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksAssignedAsExcludedOwner,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
-    }     
-        
-    public void getTasksAssignedAsPotentialOwner(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+    }
+
+    public void getTasksAssignedAsPotentialOwner(long userId,
+                                                 String language,
+                                                 TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksAssignedAsPotentialOwner, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksAssignedAsPotentialOwner,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
-    }      
-    
-    public void getTasksAssignedAsRecipient(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+    }
+
+    public void getTasksAssignedAsRecipient(long userId,
+                                            String language,
+                                            TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksAssignedAsRecipient, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksAssignedAsRecipient,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
-    } 
-    
-    public void getTasksAssignedAsTaskInitiator(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+    }
+
+    public void getTasksAssignedAsTaskInitiator(long userId,
+                                                String language,
+                                                TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksAssignedAsTaskInitiator, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksAssignedAsTaskInitiator,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
-    }    
-           
-    public void getTasksAssignedAsTaskStakeholder(long userId, String language, TaskSummaryResponseHandler responseHandler) {
+    }
+
+    public void getTasksAssignedAsTaskStakeholder(long userId,
+                                                  String language,
+                                                  TaskSummaryResponseHandler responseHandler) {
         List args = new ArrayList( 2 );
         args.add( userId );
         args.add( language );
-        Command cmd = new Command( counter.getAndIncrement(), CommandName.QueryTasksAssignedAsTaskStakeholder, args);
-        handler.addResponseHandler( cmd.getId(), responseHandler );        
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.QueryTasksAssignedAsTaskStakeholder,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );
         session.write( cmd );
-    }     
+    }
 
+    public void registerForEvent(EventKey key,
+                                 boolean remove,
+                                 EventResponseHandler responseHandler) {
+        List args = new ArrayList( 3 );
+        args.add( key );
+        args.add( remove );
+        args.add( this.name );
+        Command cmd = new Command( counter.getAndIncrement(),
+                                   CommandName.RegisterForEventRequest,
+                                   args );
+        handler.addResponseHandler( cmd.getId(),
+                                    responseHandler );        
+        session.write( cmd );
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskServer.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskServer.java	2008-09-15 05:20:06 UTC (rev 22768)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/MinaTaskServer.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -1,72 +1,11 @@
 package org.drools.task.service;
 
-import java.io.IOException;
-import java.net.InetSocketAddress;
 
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-
-import org.apache.mina.core.service.IoAcceptor;
-import org.apache.mina.core.session.IdleStatus;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
-import org.apache.mina.filter.logging.LoggingFilter;
-import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
-
-public class MinaTaskServer
+public class MinaTaskServer extends BaseMinaServer
     implements
     Runnable {
-    private static final int PORT = 9123;
-
-    TaskServerHandler        handler;
-
-    IoAcceptor               acceptor;
-
-    volatile boolean         running;
-
     public MinaTaskServer(TaskService service) {
-        handler = new TaskServerHandler( service );
+        super( new TaskServerHandler( service ),
+               9123 );
     }
-
-    public void run() {
-        try {
-            start();
-            while ( running ) {
-                Thread.sleep( 100 );
-            }
-        } catch ( Exception e ) {
-            throw new RuntimeException( "Task Service Exception: ",
-                                        e );
-        }
-    }
-
-    public void start() throws IOException {
-        running = true;
-
-        acceptor = new NioSocketAcceptor();
-
-        acceptor.getFilterChain().addLast( "logger",
-                                           new LoggingFilter() );
-        acceptor.getFilterChain().addLast( "codec",
-                                           new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
-
-        acceptor.setHandler( handler );
-        acceptor.getSessionConfig().setReadBufferSize( 2048 );
-        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE,
-                                                 10 );
-        acceptor.bind( new InetSocketAddress( PORT ) );
-    }
-
-    public void stop() {
-        acceptor.dispose();
-        running = false;
-    }
-
-    public static void main(String[] args) throws IOException {
-		EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.drools.task");
-        TaskService taskService = new TaskService(emf);
-        MinaTaskServer server = new MinaTaskServer(taskService);
-        Thread thread = new Thread(server);
-        thread.start();
-    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java	2008-09-15 05:20:06 UTC (rev 22768)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskClientHandler.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -7,23 +7,16 @@
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.drools.eventmessaging.EventResponseHandler;
+import org.drools.eventmessaging.Payload;
 import org.drools.task.Content;
 import org.drools.task.Task;
 import org.drools.task.query.TaskSummary;
 
-public class TaskClientHandler extends IoHandlerAdapter
-{    
-    private MinaTaskClient client;        
-    private Map<Integer, ResponseHandler> responseHandlers;
-    
-    public TaskClientHandler() {
-        responseHandlers = new HashMap<Integer, ResponseHandler>();
-    }
-    
-    public void addResponseHandler(int id, ResponseHandler responseHandler) {
-        responseHandlers.put( id, responseHandler );
-    }
-    
+public class TaskClientHandler extends BaseMinaHandler {
+    private MinaTaskClient    client;
+  
+
     public MinaTaskClient getClient() {
         return client;
     }
@@ -33,18 +26,18 @@
     }
 
     @Override
-    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
-    {
+    public void exceptionCaught(IoSession session,
+                                Throwable cause) throws Exception {
         cause.printStackTrace();
     }
-    
+
     @Override
     public void messageReceived(IoSession session,
                                 Object message) throws Exception {
         Command cmd = (Command) message;
         switch ( cmd.getName() ) {
             case GetTaskResponse : {
-                Task task = ( Task ) cmd.getArguments().get( 0 );
+                Task task = (Task) cmd.getArguments().get( 0 );
                 GetTaskResponseHandler responseHandler = (GetTaskResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( task );
@@ -52,7 +45,7 @@
                 break;
             }
             case AddTaskResponse : {
-                long taskId = ( Long ) cmd.getArguments().get( 0 );
+                long taskId = (Long) cmd.getArguments().get( 0 );
                 AddTaskResponseHandler responseHandler = (AddTaskResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( taskId );
@@ -60,96 +53,101 @@
                 break;
             }
             case AddCommentResponse : {
-                long commentId = ( Long ) cmd.getArguments().get( 0 );
+                long commentId = (Long) cmd.getArguments().get( 0 );
                 AddCommentResponseHandler responseHandler = (AddCommentResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( commentId );
                 }
-                break;                
+                break;
             }
             case AddAttachmentResponse : {
-                long attachmentId = ( Long ) cmd.getArguments().get( 0 );
-                long contentId = ( Long ) cmd.getArguments().get( 1 );
+                long attachmentId = (Long) cmd.getArguments().get( 0 );
+                long contentId = (Long) cmd.getArguments().get( 1 );
                 AddAttachmentResponseHandler responseHandler = (AddAttachmentResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
-                    responseHandler.execute( attachmentId, contentId );
+                    responseHandler.execute( attachmentId,
+                                             contentId );
                 }
-                break;                
-            }         
+                break;
+            }
             case GetContentResponse : {
-                Content content = ( Content ) cmd.getArguments().get( 0 );
+                Content content = (Content) cmd.getArguments().get( 0 );
                 GetContentResponseHandler responseHandler = (GetContentResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( content );
                 }
                 break;
-            }    
+            }
             case SetDocumentContentResponse : {
-                long contentId = ( Long ) cmd.getArguments().get( 0 );
+                long contentId = (Long) cmd.getArguments().get( 0 );
                 SetDocumentResponseHandler responseHandler = (SetDocumentResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( contentId );
                 }
-                break;                    
+                break;
             }
             case QueryTaskSummaryResponse : {
-                List<TaskSummary> results = ( List<TaskSummary> ) cmd.getArguments().get( 0 );
-                TaskSummaryResponseHandler responseHandler = ( TaskSummaryResponseHandler ) responseHandlers.remove( cmd.getId() );
+                List<TaskSummary> results = (List<TaskSummary>) cmd.getArguments().get( 0 );
+                TaskSummaryResponseHandler responseHandler = (TaskSummaryResponseHandler) responseHandlers.remove( cmd.getId() );
                 if ( responseHandler != null ) {
                     responseHandler.execute( results );
                 }
                 break;
             }
+            case EventTriggerResponse : {
+                Payload payload = (Payload) cmd.getArguments().get( 0 );
+                EventResponseHandler responseHandler = (EventResponseHandler) responseHandlers.remove( cmd.getId() );
+                if ( responseHandler != null ) {
+                    responseHandler.execute( payload );
+                }
+                break;                 
+            }
+            default : {
+                
+            }            
         }
     }
 
-    @Override
-    public void messageSent(IoSession session, Object message)
-    {
-        String str = message.toString();
-        if( str.trim().equalsIgnoreCase("quit") ) {
-            session.close();
-            return;
-        }
-
-    }
-
-    @Override
-    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
-    {
-        System.out.println( "IDLE " + session.getIdleCount( status ));
-    }
-    
-    
-    public static interface ResponseHandler {
-        
-    }
-    
-    public static interface GetTaskResponseHandler extends ResponseHandler {
+    public static interface GetTaskResponseHandler
+        extends
+        ResponseHandler {
         public void execute(Task task);
     }
-    
-    public static interface AddTaskResponseHandler extends ResponseHandler {
+
+    public static interface AddTaskResponseHandler
+        extends
+        ResponseHandler {
         public void execute(long taskId);
     }
-    
-    public static interface AddCommentResponseHandler extends ResponseHandler {
+
+    public static interface AddCommentResponseHandler
+        extends
+        ResponseHandler {
         public void execute(long commentId);
-    }    
-    
-    public static interface AddAttachmentResponseHandler extends ResponseHandler {
-        public void execute(long attachmentId, long contentId);
-    }        
-    
-    public static interface SetDocumentResponseHandler extends ResponseHandler {
+    }
+
+    public static interface AddAttachmentResponseHandler
+        extends
+        ResponseHandler {
+        public void execute(long attachmentId,
+                            long contentId);
+    }
+
+    public static interface SetDocumentResponseHandler
+        extends
+        ResponseHandler {
         public void execute(long contentId);
-    }      
-    
-    public static interface GetContentResponseHandler extends ResponseHandler {
+    }
+
+    public static interface GetContentResponseHandler
+        extends
+        ResponseHandler {
         public void execute(Content content);
-    }    
-    
-    public static interface TaskSummaryResponseHandler extends ResponseHandler {
+    }
+
+    public static interface TaskSummaryResponseHandler
+        extends
+        ResponseHandler {
         public void execute(List<TaskSummary> results);
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2008-09-15 05:20:06 UTC (rev 22768)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskServerHandler.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -1,13 +1,17 @@
 package org.drools.task.service;
 
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
+import org.drools.eventmessaging.EventKey;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
 import org.drools.task.Content;
@@ -17,9 +21,11 @@
 
 public class TaskServerHandler extends IoHandlerAdapter {
     private TaskService service;
+    private Map<String, IoSession> clients;
 
     public TaskServerHandler(TaskService service) {
         this.service = service;
+        this.clients = new HashMap<String, IoSession>();
     }
 
     @Override
@@ -250,6 +256,20 @@
                 session.write( resultsCmnd );
                 break;
             }
+            case RegisterForEventRequest : {
+                EventKey key = ( EventKey ) cmd.getArguments().get( 0 );
+                boolean remove = ( Boolean ) cmd.getArguments().get( 1 );
+                String uuid = ( String ) cmd.getArguments().get(  2 );
+                clients.put( uuid, session );
+                MinaEventTransport transport = new MinaEventTransport(uuid, cmd.getId(), clients, remove );
+                service.getEventKeys().register( key, transport );
+                break;
+            }
+            case RegisterClient : {
+                String uuid = ( String ) cmd.getArguments().get( 0 );
+                clients.put( uuid, session );
+                break;
+            }
             default : {
                 // unknown command
             }

Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java	2008-09-15 05:20:06 UTC (rev 22768)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/task/service/TaskService.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -16,6 +16,8 @@
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Query;
 
+import org.drools.event.WorkingMemoryEventListener;
+import org.drools.eventmessaging.EventKeys;
 import org.drools.task.AccessType;
 import org.drools.task.Attachment;
 import org.drools.task.Content;
@@ -29,9 +31,14 @@
 import org.drools.task.TaskData;
 import org.drools.task.User;
 import org.drools.task.UserInfo;
+import org.drools.task.event.MessagingTaskEventListener;
+import org.drools.task.event.TaskEventListener;
+import org.drools.task.event.TaskEventSupport;
 import org.drools.task.query.DeadlineSummary;
 import org.drools.task.query.TaskSummary;
 
+import sun.misc.resources.Messages_zh_TW;
+
 public class TaskService {
     EntityManagerFactory             emf;
 
@@ -51,13 +58,20 @@
     ScheduledThreadPoolExecutor      scheduler;
 
     private EscalatedDeadlineHandler escalatedDeadlineHandler;
-    
-    private UserInfo userInfo;
 
+    private UserInfo                 userInfo;
+
+    private TaskEventSupport         eventSupport;
+    private EventKeys                eventKeys;
+
     public TaskService(EntityManagerFactory emf) {
         this.emf = emf;
         em = emf.createEntityManager();
 
+        eventSupport = new TaskEventSupport();
+        eventKeys = new EventKeys();
+        eventSupport.addEventListener( new MessagingTaskEventListener( eventKeys ) );
+
         try {
             Reader reader = new InputStreamReader( getClass().getResourceAsStream( "TasksOwned.txt" ) );
             tasksOwned = em.createQuery( toString( reader ) );
@@ -90,7 +104,7 @@
             unescalatedDeadlines = em.createQuery( toString( reader ) );
             long now = System.currentTimeMillis();
             for ( Object object : unescalatedDeadlines.getResultList() ) {
-                DeadlineSummary summary = (DeadlineSummary) object;                
+                DeadlineSummary summary = (DeadlineSummary) object;
                 scheduler.schedule( new ScheduledTaskDeadline( summary.getTaskId(),
                                                                summary.getDeadlineId(),
                                                                this ),
@@ -101,8 +115,24 @@
             throw new RuntimeException( "Unable to inialize TaskService, could not load and schedule oustanding deadlines",
                                         e );
         }
-    }    
-    
+    }
+
+    public EventKeys getEventKeys() {
+        return eventKeys;
+    }
+
+    public void addEventListener(final TaskEventListener listener) {
+        this.eventSupport.addEventListener( listener );
+    }
+
+    public void removeEventListener(final TaskEventListener listener) {
+        this.eventSupport.removeEventListener( listener );
+    }
+
+    public List<TaskEventListener> getWorkingMemoryEventListeners() {
+        return this.eventSupport.getEventListeners();
+    }
+
     public UserInfo getUserinfo() {
         return userInfo;
     }
@@ -146,7 +176,7 @@
             if ( potentialOwners.size() == 1 ) {
                 // if there is a single potential owner, assign and set status to Reserved
                 taskData.setActualOwner( (User) potentialOwners.get( 0 ) );
-                taskData.setStatus( Status.Reserved );                
+                taskData.setStatus( Status.Reserved );
             } else if ( potentialOwners.size() > 1 ) {
                 // multiple potential owners, so set to Ready so one can claim.
                 taskData.setStatus( Status.Ready );
@@ -203,61 +233,75 @@
                 }
             }
         }
-        
+
         if ( task.getTaskData().getStatus() == Status.Reserved ) {
             // Task was reserved so owner should get icals
-            SendIcal.getInstance().sendIcalForTask( task, userInfo );
+            SendIcal.getInstance().sendIcalForTask( task,
+                                                    userInfo );
+
+            // trigger event support
+            eventSupport.fireTaskClaimed( task.getId(),
+                                          task.getTaskData().getActualOwner().getId() );
         }
-    }    
+    }
 
     public void claim(long taskId,
                       long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
 
         //task must be in status Ready
         if ( taskData.getStatus() == Status.Ready ) {
             // check permissions
             PeopleAssignments people = task.getPeopleAssignments();
-            if ( isAllowed( user, new List[] { people.getPotentialOwners(), people.getBusinessAdministrators() } ) ) {
+            if ( isAllowed( user,
+                            new List[]{people.getPotentialOwners(), people.getBusinessAdministrators()} ) ) {
                 em.getTransaction().begin();
                 // only potential owners and business admin can claim a task
                 taskData.setStatus( Status.Reserved );
                 taskData.setActualOwner( user );
                 em.getTransaction().commit();
-                
+
                 // Task was reserved so owner should get icals
-                SendIcal.getInstance().sendIcalForTask( task, userInfo );
+                SendIcal.getInstance().sendIcalForTask( task,
+                                                        userInfo );
+
+                // trigger event support
+                eventSupport.fireTaskClaimed( task.getId(),
+                                              task.getTaskData().getActualOwner().getId() );
             } else {
                 // @TODO Error
             }
         } else {
             // @TODO Error
         }
-    }    
+    }
 
     public void start(long taskId,
                       long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         // Status must be Read or Reserved
         if ( taskData.getStatus() == Status.Ready ) {
             // if Ready must be potentialOwner
             PeopleAssignments people = task.getPeopleAssignments();
-            if ( isAllowed( user, new List[] { people.getPotentialOwners() } ) ) {
+            if ( isAllowed( user,
+                            new List[]{people.getPotentialOwners()} ) ) {
                 em.getTransaction().begin();
                 taskData.setActualOwner( user );
                 taskData.setStatus( Status.InProgress );
-                em.getTransaction().commit();              
+                em.getTransaction().commit();
             } else {
                 // @TODO Error
             }
@@ -272,69 +316,78 @@
             }
         } else {
             // @TODO Error
-            return;            
-        }        
+            return;
+        }
     }
-    
+
     public void stop(long taskId,
-                      long userId) {
+                     long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
-        PeopleAssignments people = task.getPeopleAssignments();        
-        if ( taskData.getStatus() == Status.InProgress && ( taskData.getActualOwner().getId() == user.getId() || isAllowed( user, new List[] { people.getBusinessAdministrators() } ) ) ) {
+
+        PeopleAssignments people = task.getPeopleAssignments();
+        if ( taskData.getStatus() == Status.InProgress && (taskData.getActualOwner().getId() == user.getId() || isAllowed( user,
+                                                                                                                           new List[]{people.getBusinessAdministrators()} )) ) {
             // Status must be InProgress and actual owner, switch to Reserved
             em.getTransaction().begin();
             taskData.setStatus( Status.Reserved );
             em.getTransaction().commit();
         } else {
             // @TODO Error
-            return;            
-        }  
-    }   
+            return;
+        }
+    }
 
-    public void release(long taskId, long userId) {
+    public void release(long taskId,
+                        long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         // task must be reserved or in progress and owned by user
-        PeopleAssignments people = task.getPeopleAssignments();        
-        if ( (taskData.getStatus() == Status.Reserved || taskData.getStatus() == Status.InProgress) && ( taskData.getActualOwner().getId() == user.getId() || isAllowed( user, new List[] { people.getBusinessAdministrators() } ) ) ) {
+        PeopleAssignments people = task.getPeopleAssignments();
+        if ( (taskData.getStatus() == Status.Reserved || taskData.getStatus() == Status.InProgress) && (taskData.getActualOwner().getId() == user.getId() || isAllowed( user,
+                                                                                                                                                                        new List[]{people.getBusinessAdministrators()} )) ) {
             em.getTransaction().begin();
             taskData.setStatus( Status.Ready );
             taskData.setActualOwner( null );
             em.getTransaction().commit();
         } else {
             //@TODO Error
-        } 
+        }
     }
 
-    public void suspend(long taskId, long userId) {
+    public void suspend(long taskId,
+                        long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         List[] allowed;
         PeopleAssignments people = task.getPeopleAssignments();
         if ( taskData.getStatus() == Status.Ready ) {
             // If it's ready then potential owners can suspect too
-            allowed = new List[] { people.getPotentialOwners(), people.getBusinessAdministrators() };
+            allowed = new List[]{people.getPotentialOwners(), people.getBusinessAdministrators()};
         } else {
-            allowed = new List[] { people.getBusinessAdministrators() };
+            allowed = new List[]{people.getBusinessAdministrators()};
         }
-        
-        if ( (taskData.getStatus() == Status.Ready || taskData.getStatus() == Status.Reserved || taskData.getStatus() == Status.InProgress) && ( ( taskData.getActualOwner() != null && taskData.getActualOwner().getId() == user.getId() ) || isAllowed( user, allowed ) ) ) {
+
+        if ( (taskData.getStatus() == Status.Ready || taskData.getStatus() == Status.Reserved || taskData.getStatus() == Status.InProgress)
+             && ((taskData.getActualOwner() != null && taskData.getActualOwner().getId() == user.getId()) || isAllowed( user,
+                                                                                                                        allowed )) ) {
             em.getTransaction().begin();
             taskData.setStatus( Status.Suspended );
             em.getTransaction().commit();
@@ -342,67 +395,75 @@
             //@TODO Error            
         }
     }
-    
-    public void resume(long taskId, long userId) {
+
+    public void resume(long taskId,
+                       long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         List[] allowed;
         PeopleAssignments people = task.getPeopleAssignments();
         if ( taskData.getPreviousStatus() == Status.Ready ) {
             // If it's ready then potential owners can suspect too
-            allowed = new List[] { people.getPotentialOwners(), people.getBusinessAdministrators() };
+            allowed = new List[]{people.getPotentialOwners(), people.getBusinessAdministrators()};
         } else {
-            allowed = new List[] { people.getBusinessAdministrators() };
+            allowed = new List[]{people.getBusinessAdministrators()};
         }
-        
-        if ( (taskData.getStatus() == Status.Suspended) && ( ( taskData.getActualOwner() != null && taskData.getActualOwner().getId() == user.getId() ) || isAllowed( user, allowed ) ) ) {
+
+        if ( (taskData.getStatus() == Status.Suspended) && ((taskData.getActualOwner() != null && taskData.getActualOwner().getId() == user.getId()) || isAllowed( user,
+                                                                                                                                                                   allowed )) ) {
             em.getTransaction().begin();
             taskData.setStatus( taskData.getPreviousStatus() );
             em.getTransaction().commit();
         } else {
             //@TODO Error            
         }
-    }    
-    
-    public void skip(long taskId, long userId) {
+    }
+
+    public void skip(long taskId,
+                     long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         List[] allowed;
         PeopleAssignments people = task.getPeopleAssignments();
         if ( taskData.getStatus() == Status.Ready ) {
             // If it's ready then potential owners can skip too
-            allowed = new List[] { people.getPotentialOwners(), people.getBusinessAdministrators() };
+            allowed = new List[]{people.getPotentialOwners(), people.getBusinessAdministrators()};
         } else {
-            allowed = new List[] { people.getBusinessAdministrators() };
+            allowed = new List[]{people.getBusinessAdministrators()};
         }
-        
-        if ( task.getTaskData().isSkipable() && (taskData.getStatus() != Status.Completed && taskData.getStatus() != Status.Failed ) && ( ( taskData.getActualOwner() != null && taskData.getActualOwner().getId() == user.getId() ) || isAllowed( user, allowed ) ) ) {
+
+        if ( task.getTaskData().isSkipable() && (taskData.getStatus() != Status.Completed && taskData.getStatus() != Status.Failed) && ((taskData.getActualOwner() != null && taskData.getActualOwner().getId() == user.getId()) || isAllowed( user,
+                                                                                                                                                                                                                                               allowed )) ) {
             em.getTransaction().begin();
             taskData.setStatus( Status.Obselete );
             em.getTransaction().commit();
         } else {
             //@TODO Error            
         }
-    }    
-    
-    public void complete(long taskId, long userId) {
+    }
+
+    public void complete(long taskId,
+                         long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         if ( taskData.getStatus() == Status.InProgress && taskData.getActualOwner().getId() == user.getId() ) {
             // Status must be InProgress and actual owner, switch to Reserved
             em.getTransaction().begin();
@@ -410,18 +471,20 @@
             em.getTransaction().commit();
         } else {
             // @TODO Error
-            return;            
-        }  
-    }     
-    
-    public void fail(long taskId, long userId) {
+            return;
+        }
+    }
+
+    public void fail(long taskId,
+                     long userId) {
         Task task = em.find( Task.class,
                              taskId );
-        
-        User user = em.find( User.class, userId );
-        
+
+        User user = em.find( User.class,
+                             userId );
+
         TaskData taskData = task.getTaskData();
-        
+
         if ( taskData.getStatus() == Status.InProgress && taskData.getActualOwner().getId() == user.getId() ) {
             // Status must be InProgress and actual owner, switch to Reserved
             em.getTransaction().begin();
@@ -429,8 +492,8 @@
             em.getTransaction().commit();
         } else {
             // @TODO Error
-            return;            
-        }  
+            return;
+        }
     }
 
     public void addComment(long taskId,
@@ -479,7 +542,7 @@
         list.add( attachment );
         em.getTransaction().commit();
     }
-    
+
     public void setDocumentContent(long taskId,
                                    Content content) {
         Task task = em.find( Task.class,
@@ -492,15 +555,15 @@
         em.getTransaction().begin();
 
         em.persist( content );
-        
+
         task.getTaskData().setDocumentContentId( content.getId() );
-        
+
         em.getTransaction().commit();
     }
 
     public Content getContent(long contentId) {
         Content content = em.find( Content.class,
-                                             contentId );
+                                   contentId );
         return content;
     }
 
@@ -648,17 +711,20 @@
                                                            this );
         localEm.close();
     }
-    
-    public boolean isAllowed(User user,  List<OrganizationalEntity>[] people) {
+
+    public boolean isAllowed(User user,
+                             List<OrganizationalEntity>[] people) {
         for ( List<OrganizationalEntity> list : people ) {
-            if ( isAllowed( user, list) ) {
+            if ( isAllowed( user,
+                            list ) ) {
                 return true;
             }
         }
         return false;
     }
-    
-    public boolean isAllowed(User user, List<OrganizationalEntity> entities) {
+
+    public boolean isAllowed(User user,
+                             List<OrganizationalEntity> entities) {
         // for now just do a contains, I'll figure out group membership later.
         for ( OrganizationalEntity entity : entities ) {
             if ( entity.getId() == user.getId() ) {

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingEventResponseHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingEventResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/BlockingEventResponseHandler.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,34 @@
+/**
+ * 
+ */
+package org.drools.task.service;
+
+import org.drools.eventmessaging.EventResponseHandler;
+import org.drools.eventmessaging.Payload;
+
+public class BlockingEventResponseHandler implements EventResponseHandler {
+    private volatile Payload payload;
+    private volatile boolean wait;
+
+    public synchronized void execute(Payload payload) {
+        this.payload = payload;
+        wait = true;
+        notifyAll();                
+    }
+    
+    public synchronized Payload getPayload() {
+        if ( !wait ) {                  
+            try {
+                wait( 300000 );
+            } catch ( InterruptedException e ) {
+                // swallow as this is just a notification
+            }
+        }
+        
+        if ( !wait ) {
+            throw new RuntimeException("Timeout : unable to retrieve event payload" );
+        }
+        
+        return payload;
+    }       
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/MockEventMessagingTest.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,67 @@
+package org.drools.task.service;
+
+import java.io.StringReader;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.eventmessaging.EventKey;
+import org.drools.eventmessaging.EventTriggerTransport;
+import org.drools.eventmessaging.Payload;
+import org.drools.task.BaseTest;
+import org.drools.task.Status;
+import org.drools.task.Task;
+import org.drools.task.event.EventPayload;
+import org.drools.task.event.TaskClaimedEvent;
+import org.drools.task.event.TaskClosedEvent;
+import org.drools.task.event.TaskEventKey;
+import org.drools.task.service.MinaTaskClient;
+import org.drools.task.service.MinaTaskServer;
+import org.drools.task.service.TaskClientHandler;
+
+public class MockEventMessagingTest extends BaseTest {    
+    public void testMockTransport() throws Exception {      
+        Map  vars = new HashedMap();     
+        vars.put( "users", users );
+        vars.put( "groups", groups );        
+        vars.put( "now", new Date() );                
+
+        // One potential owner, should go straight to state Reserved
+        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), ";
+        str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [users['bobba' ], users['darth'] ], }),";                        
+        str += "names = [ new I18NText( 'en-UK', 'This is my task name')] })";
+            
+        Task task = ( Task )  eval( new StringReader( str ), vars );
+        taskService.addTask( task );
+        
+        long taskId = task.getId();      
+        
+        EventKey key = new TaskEventKey(TaskClaimedEvent.class, taskId );        
+        MockEventTriggerTransport transport = new MockEventTriggerTransport();   
+        taskService.getEventKeys().register( key, transport );        
+        taskService.claim( taskId, users.get( "darth" ).getId() );        
+        
+        assertEquals( 1, transport.list.size() );
+        assertEquals( taskId, ((TaskClaimedEvent) ((Payload) transport.list.get(0)).get()).getTaskId() );
+        assertEquals( users.get( "darth" ).getId(), (Long) ((TaskClaimedEvent) ((Payload) transport.list.get(0)).get()).getUserId() );
+        
+    }
+    
+    public static class MockEventTriggerTransport implements EventTriggerTransport {
+        List<Payload> list = new ArrayList<Payload>();
+        
+        public void trigger(Payload payload) {
+            list.add( payload );
+        }
+
+        public boolean isRemove() {
+            return true;
+        }                
+    }
+  
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/test/java/org/drools/task/service/TaskServiceEventMessagingTest.java	2008-09-15 06:50:32 UTC (rev 22769)
@@ -0,0 +1,86 @@
+package org.drools.task.service;
+
+import java.io.StringReader;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.eventmessaging.EventKey;
+import org.drools.eventmessaging.EventResponseHandler;
+import org.drools.eventmessaging.EventTriggerTransport;
+import org.drools.eventmessaging.Payload;
+import org.drools.task.BaseTest;
+import org.drools.task.Status;
+import org.drools.task.Task;
+import org.drools.task.event.TaskClaimedEvent;
+import org.drools.task.event.TaskEventKey;
+import org.drools.task.service.MockEventMessagingTest.MockEventTriggerTransport;
+
+public class TaskServiceEventMessagingTest extends BaseTest {
+    MinaTaskServer server;
+    MinaTaskClient client;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        server = new MinaTaskServer( taskService );
+        Thread thread = new Thread( server );
+        thread.start();
+        Thread.sleep( 500 );
+        
+        client = new MinaTaskClient( "client 1",
+                                     new TaskClientHandler() );
+        NioSocketConnector connector = new NioSocketConnector();
+        SocketAddress address = new InetSocketAddress( "127.0.0.1",
+                                                       9123 );
+        client.connect( connector,
+                        address );
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        client.disconnect();
+        server.stop();
+    }    
+    
+    public void testClaimEvent() throws Exception {      
+        Map  vars = new HashedMap();     
+        vars.put( "users", users );
+        vars.put( "groups", groups );        
+        vars.put( "now", new Date() );                
+
+        // One potential owner, should go straight to state Reserved
+        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { } ), ";
+        str += "peopleAssignments = (with ( new PeopleAssignments() ) { potentialOwners = [users['bobba' ], users['darth'] ], }),";                        
+        str += "names = [ new I18NText( 'en-UK', 'This is my task name')] })";
+            
+        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
+        Task task = ( Task )  eval( new StringReader( str ), vars );
+        client.addTask( task, addTaskResponseHandler );
+        
+        long taskId = addTaskResponseHandler.getTaskId();
+        
+        // A Task with multiple potential owners moves to "Ready" state until someone claims it.
+        BlockingGetTaskResponseHandler getTaskResponseHandler = new BlockingGetTaskResponseHandler(); 
+        client.getTask( taskId, getTaskResponseHandler );
+        Task task1 = getTaskResponseHandler.getTask();
+        assertEquals( Status.Ready , task1.getTaskData().getStatus() );         
+        
+        EventKey key = new TaskEventKey(TaskClaimedEvent.class, taskId );           
+        BlockingEventResponseHandler handler = new BlockingEventResponseHandler(); 
+        client.registerForEvent( key, true, handler );
+        
+        taskService.claim( taskId, users.get( "darth" ).getId() );  
+        
+
+        Payload payload = handler.getPayload();
+        TaskClaimedEvent event = ( TaskClaimedEvent ) payload.get();
+        assertNotNull( event );        
+    }
+  
+}




More information about the jboss-svn-commits mailing list