[jboss-svn-commits] JBL Code SVN: r31991 - in labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src: main/java/org/drools/services/command and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Mar 8 07:57:10 EST 2010


Author: salaboy21
Date: 2010-03-08 07:57:08 -0500 (Mon, 08 Mar 2010)
New Revision: 31991

Added:
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/ExecutionNode.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/GetWorkItemManagerCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/LookupCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterRemoteWorkItemHandlerCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerClientConnectCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerServerContext.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/StartProcessRemoteCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/BlockingGenericIoWriter.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/ClientGenericMessageReceiver.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/CollectionClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericConnector.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericIoWriter.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandlerImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/Message.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/MessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/NodeData.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBaseProviderLocalClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBuilderProviderLocalClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseProviderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderProviderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/ProcessInstanceRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/StatefulKnowledgeSessionRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/WorkItemManagerRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/ClientGenericMessageReceiverImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaAcceptor.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaConnector.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoWriter.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBaseResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBlockingResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/BlockingMessageResponseHandler.java
Removed:
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/Node.java
Modified:
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/GridConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/LocalNodeConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/NodeConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/RemoteNodeConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/NodeServiceLocatorBaseTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/RemoteNodeServiceTest.java
Log:
JBRULES-2446: Drools Services API
	- drools-services package refactor

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/ExecutionNode.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/Node.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/ExecutionNode.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/ExecutionNode.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,56 @@
+/*
+ *  Copyright 2010 salaboy.
+ * 
+ *  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.
+ *  under the License.
+ */
+
+package org.drools.services;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ *
+ * @author salaboy
+ */
+public class ExecutionNode {
+
+ private final Map<Class<?>, Object> services
+    = new ConcurrentHashMap<Class<?>, Object>();
+
+
+  public <T> T get(Class<T> interfaceClass) {
+    synchronized (interfaceClass) {
+      Object service = services.get(interfaceClass);
+      if (service == null) {
+        try {
+          Class<?> implementingClass = Class.forName(interfaceClass.getCanonicalName()+"Impl");
+
+          service = implementingClass.newInstance();
+          services.put(interfaceClass, service);
+        }
+        catch (Exception e) {
+          throw new RuntimeException(e);
+        }
+      }
+      return interfaceClass.cast(service);
+    }
+  }
+  public <T> void set(Class<T> interfaceClass, T provider) {
+    synchronized (interfaceClass) {
+      services.put(interfaceClass, provider);
+    }
+  }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/GridConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/GridConnection.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/GridConnection.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -24,7 +24,7 @@
  * @author salaboy
  */
 public class GridConnection {
-    private List<Node> nodes;
+    private List<ExecutionNode> nodes;
     private String url;
 
     public GridConnection() {
@@ -34,15 +34,15 @@
         this.url = url;
     }
 
-    public List<Node> connect(){
+    public List<ExecutionNode> connect(){
         return this.nodes;
     }
 
-    public List<Node> getNodes() {
+    public List<ExecutionNode> getNodes() {
         return nodes;
     }
 
-    public void setNodes(List<Node> nodes) {
+    public void setNodes(List<ExecutionNode> nodes) {
         this.nodes = nodes;
     }
 

Modified: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/LocalNodeConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/LocalNodeConnection.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/LocalNodeConnection.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -18,8 +18,8 @@
 package org.drools.services;
 import org.drools.KnowledgeBaseFactoryService;
 import org.drools.builder.KnowledgeBuilderFactoryService;
-import org.drools.vsm.local.KnowledgeBaseProviderLocalClient;
-import org.drools.vsm.local.KnowledgeBuilderProviderLocalClient;
+import org.drools.services.local.KnowledgeBaseProviderLocalClient;
+import org.drools.services.local.KnowledgeBuilderProviderLocalClient;
 /**
  *
  * @author salaboy
@@ -32,8 +32,8 @@
     }
 
 
-    public Node connect() {
-        Node node = new Node();
+    public ExecutionNode connect() {
+        ExecutionNode node = new ExecutionNode();
         node.set(KnowledgeBuilderFactoryService.class, new KnowledgeBuilderProviderLocalClient() );
         node.set(KnowledgeBaseFactoryService.class, new KnowledgeBaseProviderLocalClient() );
 

Deleted: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/Node.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/Node.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/Node.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -1,56 +0,0 @@
-/*
- *  Copyright 2010 salaboy.
- * 
- *  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.
- *  under the License.
- */
-
-package org.drools.services;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- *
- * @author salaboy
- */
-public class Node {
-
- private final Map<Class<?>, Object> services
-    = new ConcurrentHashMap<Class<?>, Object>();
-
-
-  public <T> T get(Class<T> interfaceClass) {
-    synchronized (interfaceClass) {
-      Object service = services.get(interfaceClass);
-      if (service == null) {
-        try {
-          Class<?> implementingClass = Class.forName(interfaceClass.getCanonicalName()+"Impl");
-
-          service = implementingClass.newInstance();
-          services.put(interfaceClass, service);
-        }
-        catch (Exception e) {
-          throw new RuntimeException(e);
-        }
-      }
-      return interfaceClass.cast(service);
-    }
-  }
-  public <T> void set(Class<T> interfaceClass, T provider) {
-    synchronized (interfaceClass) {
-      services.put(interfaceClass, provider);
-    }
-  }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/NodeConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/NodeConnection.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/NodeConnection.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -22,7 +22,7 @@
  * @author salaboy
  */
 public interface NodeConnection {
-    public Node connect();
+    public ExecutionNode connect();
     public void disconnect();
     
 }

Modified: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/RemoteNodeConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/RemoteNodeConnection.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/RemoteNodeConnection.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -21,9 +21,9 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import org.drools.KnowledgeBaseFactoryService;
 import org.drools.builder.KnowledgeBuilderFactoryService;
-import org.drools.vsm.GenericConnector;
-import org.drools.vsm.remote.KnowledgeBaseProviderRemoteClient;
-import org.drools.vsm.remote.KnowledgeBuilderProviderRemoteClient;
+import org.drools.services.generic.GenericConnector;
+import org.drools.services.remote.KnowledgeBaseProviderRemoteClient;
+import org.drools.services.remote.KnowledgeBuilderProviderRemoteClient;
 
 /**
  *
@@ -50,11 +50,11 @@
         this.counter = new AtomicInteger();
     }
 
-    public Node connect() {
+    public ExecutionNode connect() {
 
         if(client.connect()){
 
-            Node node = new Node();
+            ExecutionNode node = new ExecutionNode();
             node.set(KnowledgeBuilderFactoryService.class, new KnowledgeBuilderProviderRemoteClient(this) );
             node.set(KnowledgeBaseFactoryService.class, new KnowledgeBaseProviderRemoteClient(this) );
             return node;

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/GetWorkItemManagerCommand.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/command/vsm/GetWorkItemManagerCommand.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/GetWorkItemManagerCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/GetWorkItemManagerCommand.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,29 @@
+package org.drools.services.command;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.services.remote.WorkItemManagerRemoteClient;
+
+/**
+ * 
+ * @author Lucas Amador
+ *
+ */
+public class GetWorkItemManagerCommand implements GenericCommand<WorkItemManager> {
+	
+	private static final long serialVersionUID = 1L;
+
+	public WorkItemManager execute(Context context) {
+        WorkItemManager workItemManager = ((KnowledgeCommandContext) context).getWorkItemManager();
+        ((ExecutionResultImpl)((KnowledgeCommandContext) context ).getExecutionResults()).getResults().put("workItemManager", getRemoteClient(workItemManager) );
+        return workItemManager;
+	}
+	
+	private WorkItemManager getRemoteClient(WorkItemManager workItemManager) {
+        return new WorkItemManagerRemoteClient();
+    }
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/LookupCommand.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/command/vsm/LookupCommand.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/LookupCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/LookupCommand.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,39 @@
+package org.drools.services.command;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.services.generic.NodeData;
+
+public class LookupCommand
+    implements
+    GenericCommand<String> {
+
+    private String identifier;
+
+    private String outIdentifier;
+
+    public LookupCommand(String identfier) {
+        this.identifier = identfier;
+    }
+
+    public LookupCommand(String identfier,
+                         String outIdentifier) {
+        this.identifier = identfier;
+        this.outIdentifier = outIdentifier;
+    }
+
+    public String execute(Context context) {
+        NodeData data = (NodeData) context.get( NodeData.NODE_DATA );
+
+        String instanceId = (String) data.getRoot().get( identifier );
+
+        if ( this.outIdentifier != null ) {
+            ((ExecutionResultImpl) ((KnowledgeCommandContext) context).getExecutionResults()).getResults().put( this.outIdentifier,
+                                                                                                                instanceId );
+        }
+        return instanceId;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterCommand.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/command/vsm/RegisterCommand.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterCommand.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,32 @@
+package org.drools.services.command;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.services.generic.NodeData;
+
+public class RegisterCommand
+    implements
+    GenericCommand<Void> {
+
+    private String identifier;
+    private String instanceId;
+    private int    type;
+
+    public RegisterCommand(String identifier,
+                           String instanceId,
+                           int type) {
+        this.identifier = identifier;
+        this.instanceId = instanceId;
+        this.type = type;
+    }
+
+    public Void execute(Context context) {
+        NodeData data = (NodeData) context.get( NodeData.NODE_DATA );
+
+        data.getRoot().set( identifier,
+                            type + ":" + instanceId );
+
+        return null;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterRemoteWorkItemHandlerCommand.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/command/vsm/RegisterRemoteWorkItemHandlerCommand.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterRemoteWorkItemHandlerCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/RegisterRemoteWorkItemHandlerCommand.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,75 @@
+package org.drools.services.command;
+
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.KnowledgeRuntime;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.WorkItemHandler;
+
+public class RegisterRemoteWorkItemHandlerCommand implements GenericCommand<Object> {
+	
+	private String handler;
+	private String workItemName;
+
+        public RegisterRemoteWorkItemHandlerCommand() {
+        }
+
+        public RegisterRemoteWorkItemHandlerCommand(String workItemName, String handler) {
+            this.handler = handler;
+            this.workItemName = workItemName;
+        }
+        
+	public String getHandler() {
+		return handler;
+	}
+
+	public void setHandler(String handler) {
+		this.handler = handler;
+	}
+
+	public String getWorkItemName() {
+		return workItemName;
+	}
+
+	public void setWorkItemName(String workItemName) {
+		this.workItemName = workItemName;
+	}
+
+    public Object execute(Context context) {
+        StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession(); 
+        WorkItemHandler workItemHandler = null;
+        try {
+             Class t = Class.forName(handler);
+             Constructor c = t.getConstructor(KnowledgeRuntime.class);
+             workItemHandler =  (WorkItemHandler) c.newInstance(ksession);
+        } catch (InstantiationException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (IllegalAccessException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (IllegalArgumentException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (InvocationTargetException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (NoSuchMethodException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (SecurityException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (ClassNotFoundException ex) {
+            Logger.getLogger(RegisterRemoteWorkItemHandlerCommand.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        ksession.getWorkItemManager().registerWorkItemHandler(workItemName, workItemHandler);
+		return null;
+	}
+
+	public String toString() {
+		return "session.getWorkItemManager().registerWorkItemHandler("
+			+ workItemName + ", " + handler +  ");";
+	}
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerClientConnectCommand.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/command/ServiceManagerClientConnectCommand.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerClientConnectCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerClientConnectCommand.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,34 @@
+package org.drools.services.command;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.services.generic.NodeData;
+
+public class ServiceManagerClientConnectCommand
+    implements
+    GenericCommand<Integer> {
+    
+    private String outIdentifier;
+
+    
+
+    public ServiceManagerClientConnectCommand(String outIdentifier) {
+        this.outIdentifier = outIdentifier;
+    }
+
+
+
+    public Integer execute(Context context) {
+        NodeData data = (NodeData) context.get( NodeData.NODE_DATA );
+        
+        Integer sessionId = data.getSessionIdCounter().getAndIncrement();
+        if ( this.outIdentifier != null ) {
+            ((ExecutionResultImpl)((KnowledgeCommandContext) context).getExecutionResults()).getResults().put( this.outIdentifier, sessionId );
+        } 
+        
+        return sessionId;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerServerContext.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/command/vsm/ServiceManagerServerContext.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerServerContext.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/ServiceManagerServerContext.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,40 @@
+package org.drools.services.command;
+
+import org.drools.command.Context;
+import org.drools.command.ContextManager;
+import org.drools.services.generic.NodeData;
+
+public class ServiceManagerServerContext
+    implements
+    Context {
+    private Context            context;
+    private NodeData data;
+
+    public ServiceManagerServerContext(Context context,
+                                       NodeData data) {
+        this.data = data;
+    }
+
+    public NodeData getServiceManagerData() {
+        return this.data;
+    }
+
+    public ContextManager getContextManager() {
+        return context.getContextManager();
+    }
+
+    public String getName() {
+        return context.getName();
+    }
+
+    public Object get(String identifier) {
+        return context.get( identifier );
+    }
+
+    public void set(String identifier,
+                    Object value) {
+        context.set( identifier,
+                     value );
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/StartProcessRemoteCommand.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/command/vsm/StartProcessRemoteCommand.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/StartProcessRemoteCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/command/StartProcessRemoteCommand.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,108 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  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.
+ *  under the License.
+ */
+
+package org.drools.services.command;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.services.remote.ProcessInstanceRemoteClient;
+
+/**
+ *
+ * @author salaboy
+ */
+public class StartProcessRemoteCommand implements GenericCommand<ExecutionResults>{
+    private String processId;
+    private Map<String, Object> parameters = new HashMap<String, Object>();
+    private List<Object> data = null;
+
+    public StartProcessRemoteCommand() {
+    }
+
+
+    public StartProcessRemoteCommand(String processId) {
+        this.processId = processId;
+    }
+
+    public List<Object> getData() {
+        return data;
+    }
+
+    public void setData(List<Object> data) {
+        this.data = data;
+    }
+
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    public void setParameters(Map<String, Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public String getProcessId() {
+        return processId;
+    }
+
+    public void setProcessId(String processId) {
+        this.processId = processId;
+    }
+
+
+    public ExecutionResults execute(Context context) {
+        StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
+
+		if (data != null) {
+			for (Object o: data) {
+				ksession.insert(o);
+			}
+		}
+		ProcessInstance processInstance = (ProcessInstance) ksession.startProcess(processId, parameters);
+
+                ((ExecutionResultImpl)((KnowledgeCommandContext) context ).getExecutionResults()).getResults().put( processId, getRemoteClient(processInstance) );
+
+		return ((ExecutionResultImpl)((KnowledgeCommandContext) context ).getExecutionResults());
+	}
+
+	public String toString() {
+		String result = "session.startProcess(" + processId + ", [";
+		if (parameters != null) {
+			int i = 0;
+			for (Map.Entry<String, Object> entry: parameters.entrySet()) {
+				if (i++ > 0) {
+					result += ", ";
+				}
+				result += entry.getKey() + "=" + entry.getValue();
+			}
+		}
+		result += "]);";
+		return result;
+	}
+
+    private ProcessInstance getRemoteClient(ProcessInstance processInstance) {
+        return new ProcessInstanceRemoteClient(processInstance.getId(), processInstance.getProcessId(),
+                 processInstance.getProcessName(), processInstance.getState());
+    }
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/BlockingGenericIoWriter.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/BlockingGenericIoWriter.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/BlockingGenericIoWriter.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/BlockingGenericIoWriter.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package org.drools.services.generic;
+
+
+public class BlockingGenericIoWriter implements GenericIoWriter {
+    
+    private Message msg;
+
+    public void write(Message message) {
+        this.msg = message;
+    }
+    
+    public Message getMessage() {
+        return this.msg;
+    }
+
+    public void write(Message msg,
+                      MessageResponseHandler responseHandler) {
+        if ( responseHandler == null ) {
+            this.msg = msg;
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+    
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/ClientGenericMessageReceiver.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/ClientGenericMessageReceiver.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/ClientGenericMessageReceiver.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/ClientGenericMessageReceiver.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,13 @@
+package org.drools.services.generic;
+
+import org.drools.services.remote.mina.MinaIoWriter;
+
+public interface ClientGenericMessageReceiver {
+
+    public abstract void addResponseHandler(int id,
+                                            MessageResponseHandler responseHandler);
+
+    public abstract void messageReceived(GenericIoWriter writer,
+                                         Message msg) throws Exception;
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/CollectionClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/CollectionClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/CollectionClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/CollectionClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,84 @@
+package org.drools.services.generic;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+public class CollectionClient<T>
+    implements
+    Collection {
+    private String parentInstanceId;
+
+    public CollectionClient(String parentInstanceId) {
+        this.parentInstanceId = parentInstanceId;
+    }
+
+    public String getParentInstanceId() {
+        return this.parentInstanceId;
+    }
+
+    public boolean add(Object e) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean addAll(Collection c) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public void clear() {
+        // TODO Auto-generated method stub
+
+    }
+
+    public boolean contains(Object o) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean containsAll(Collection c) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean isEmpty() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public Iterator iterator() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public boolean remove(Object o) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean removeAll(Collection c) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean retainAll(Collection c) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public int size() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public Object[] toArray() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Object[] toArray(Object[] a) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericConnector.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/GenericConnector.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericConnector.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericConnector.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,13 @@
+package org.drools.services.generic;
+
+public interface GenericConnector extends GenericIoWriter {
+
+    boolean connect();
+
+    void disconnect();
+
+    Message write(Message msg);
+    
+    //void write(Message msg);
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericIoWriter.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/GenericIoWriter.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericIoWriter.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericIoWriter.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,6 @@
+package org.drools.services.generic;
+
+public interface GenericIoWriter {
+    void write(Message msg,
+               MessageResponseHandler responseHandler);
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandler.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/GenericMessageHandler.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandler.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,8 @@
+package org.drools.services.generic;
+
+public interface GenericMessageHandler {
+
+    public abstract void messageReceived(GenericIoWriter session,
+                                         Message msg) throws Exception;
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandlerImpl.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/GenericMessageHandlerImpl.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandlerImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/GenericMessageHandlerImpl.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,67 @@
+package org.drools.services.generic;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.SystemEventListener;
+import org.drools.command.FinishedCommand;
+import org.drools.command.impl.ContextImpl;
+import org.drools.command.impl.GenericCommand;
+import org.drools.runtime.impl.ExecutionResultImpl;
+
+public class GenericMessageHandlerImpl implements GenericMessageHandler {
+    private SystemEventListener systemEventListener;
+
+    private NodeData  data;
+
+    public GenericMessageHandlerImpl(NodeData data,
+                                 SystemEventListener systemEventListener) {
+        this.systemEventListener = systemEventListener;
+        this.data = data;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.GenericMessageHandler#messageReceived(org.drools.vsm.GenericIoWriter, org.drools.vsm.Message)
+     */
+    public void messageReceived(GenericIoWriter session,
+                                Message msg) throws Exception {
+        systemEventListener.debug( "Message receieved : " + msg );
+
+
+        // we always need to process a List, for genericity, but don't force a List on the payload
+        List<GenericCommand> commands;
+        if ( msg.getPayload() instanceof List ) {
+            commands = (List<GenericCommand>) msg.getPayload();
+        } else {
+            commands = new ArrayList<GenericCommand>();
+            commands.add( (GenericCommand) msg.getPayload() );
+        }
+
+        // Setup the evaluation context 
+        ContextImpl localSessionContext = new ContextImpl( "session_" + msg.getSessionId(),
+                                                           this.data.getContextManager(),
+                                                           this.data.getTemp() );        
+        ExecutionResultImpl localKresults = new ExecutionResultImpl();
+        localSessionContext.set( "kresults_" + msg.getSessionId(),
+                                 localKresults );
+        
+        for ( GenericCommand cmd : commands ) {
+            // evaluate the commands
+            cmd.execute( localSessionContext );
+        }
+
+        if ( !msg.isAsync() && localKresults.getIdentifiers().isEmpty() ) {
+            // if it's not an async invocation and their are no results, just send a simple notification message
+            session.write( new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        new FinishedCommand() ), null );
+        } else {
+            // return the payload
+            session.write( new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        localKresults ), null );
+        }
+    }
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/Message.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/Message.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/Message.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/Message.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,52 @@
+package org.drools.services.generic;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class Message
+    implements
+    Serializable {
+    private int     sessionId;
+    private int     responseId;
+    private boolean async;
+    private Object  payload;
+
+    public Message(int sessionId,
+                   int responseId,
+                   boolean async,
+                   Object payload) {
+        this.sessionId = sessionId;
+        this.async = async;
+        this.responseId = responseId;
+        this.payload = payload;
+    }
+
+    public Message(int sessionId,
+                   Map<String, Integer> contextVars,
+                   Object payload) {
+        this.sessionId = sessionId;
+        this.responseId = -1;
+        this.payload = payload;
+    }
+
+    public int getSessionId() {
+        return sessionId;
+    }
+
+    public int getResponseId() {
+        return responseId;
+    }
+
+    public boolean isAsync() {
+        return async;
+    }
+
+    public Object getPayload() {
+        return payload;
+    }
+
+    public String toString() {
+        return "sessionId=" + this.sessionId + " responseId=" + responseId + " async=" + this.async + " payload=" + this.payload;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/MessageResponseHandler.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/MessageResponseHandler.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/MessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/MessageResponseHandler.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,7 @@
+package org.drools.services.generic;
+
+public interface MessageResponseHandler {
+    public void setError(RuntimeException error);
+
+    public void receive(Message message);
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/NodeData.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/ServiceManagerData.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/NodeData.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/generic/NodeData.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,67 @@
+package org.drools.services.generic;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.drools.command.Context;
+import org.drools.command.ContextManager;
+import org.drools.command.impl.ContextImpl;
+import org.drools.vsm.ContextManagerImpl;
+
+public class NodeData {
+    private ContextManager contextManager;
+
+    private Context        root;
+    private Context        temp;
+
+    public static String   ROOT                 = "ROOT";
+    public static String   TEMP                 = "__TEMP__";
+    public static String   NODE_DATA = "__NodeData__";
+
+    private AtomicInteger  sessionIdCounter     = new AtomicInteger();
+
+    public NodeData() {
+        // Setup ROOT context, this will hold all long lived intances and instanceIds
+        this.contextManager = new ContextManagerImpl();
+
+        this.root = new ContextImpl( ROOT,
+                                     this.contextManager );
+        ((ContextManagerImpl) this.contextManager).addContext( this.root );
+        this.root.set( NODE_DATA,
+                       this );
+        // Setup TEMP context, this will hold all short lived instanceId and instances
+        // TODO: TEMP context should have a time/utilisation eviction queue added 
+        this.temp = new ContextImpl( TEMP,
+                                     this.contextManager,
+                                     this.root );
+        ((ContextManagerImpl) this.contextManager).addContext( this.temp );
+    }
+
+    public AtomicInteger getSessionIdCounter() {
+        return sessionIdCounter;
+    }
+
+    public ContextManager getContextManager() {
+        return contextManager;
+    }
+
+    public void setContextManager(ContextManager contextManager) {
+        this.contextManager = contextManager;
+    }
+
+    public Context getRoot() {
+        return root;
+    }
+
+    public void setRoot(Context root) {
+        this.root = root;
+    }
+
+    public Context getTemp() {
+        return temp;
+    }
+
+    public void setTemp(Context temp) {
+        this.temp = temp;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBaseProviderLocalClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/local/KnowledgeBaseProviderLocalClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBaseProviderLocalClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBaseProviderLocalClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,59 @@
+package org.drools.services.local;
+
+import java.util.Properties;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+
+public class KnowledgeBaseProviderLocalClient
+    implements
+    KnowledgeBaseFactoryService {
+
+    public Environment newEnvironment() {
+        return KnowledgeBaseFactory.newEnvironment();
+    }
+
+    public KnowledgeBase newKnowledgeBase() {
+        return newKnowledgeBase( ( KnowledgeBaseConfiguration ) null );
+    }
+
+    public KnowledgeBase newKnowledgeBase(KnowledgeBaseConfiguration conf) {
+        return KnowledgeBaseFactory.newKnowledgeBase( conf );
+    }
+
+    public KnowledgeBaseConfiguration newKnowledgeBaseConfiguration() {
+        return KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+    }
+
+    public KnowledgeBaseConfiguration newKnowledgeBaseConfiguration(Properties properties,
+                                                                    ClassLoader classLoader) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeSessionConfiguration newKnowledgeSessionConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeSessionConfiguration newKnowledgeSessionConfiguration(Properties properties) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBase newKnowledgeBase(String kbaseId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBase newKnowledgeBase(String kbaseId,
+                                          KnowledgeBaseConfiguration conf) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBuilderProviderLocalClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/local/KnowledgeBuilderProviderLocalClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBuilderProviderLocalClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/local/KnowledgeBuilderProviderLocalClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,51 @@
+/**
+ * 
+ */
+package org.drools.services.local;
+
+import java.util.Properties;
+
+import org.drools.KnowledgeBase;
+import org.drools.builder.DecisionTableConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+
+public class KnowledgeBuilderProviderLocalClient
+    implements
+    KnowledgeBuilderFactoryService {
+
+    public DecisionTableConfiguration newDecisionTableConfiguration() {
+        return KnowledgeBuilderFactory.newDecisionTableConfiguration();
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder() {
+        return KnowledgeBuilderFactory.newKnowledgeBuilder();
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder(KnowledgeBuilderConfiguration conf) {
+        return KnowledgeBuilderFactory.newKnowledgeBuilder( conf );
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder(KnowledgeBase kbase) {
+        return KnowledgeBuilderFactory.newKnowledgeBuilder( kbase );
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder(KnowledgeBase kbase,
+                                                KnowledgeBuilderConfiguration conf) {
+        return KnowledgeBuilderFactory.newKnowledgeBuilder( kbase,
+                                                            conf );
+    }
+
+    public KnowledgeBuilderConfiguration newKnowledgeBuilderConfiguration() {
+        return KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
+    }
+
+    public KnowledgeBuilderConfiguration newKnowledgeBuilderConfiguration(Properties properties,
+                                                                          ClassLoader classLoader) {
+        return KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( properties,
+                                                                         classLoader );
+    }
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseProviderRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/KnowledgeBaseProviderRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseProviderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseProviderRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,95 @@
+package org.drools.services.remote;
+
+import java.util.Properties;
+import java.util.UUID;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.command.FinishedCommand;
+import org.drools.command.NewKnowledgeBaseCommand;
+import org.drools.command.SetVariableCommand;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.services.RemoteNodeConnection;
+import org.drools.services.generic.Message;
+
+public class KnowledgeBaseProviderRemoteClient
+    implements
+    KnowledgeBaseFactoryService {
+    private RemoteNodeConnection nodeConnection;
+
+    public KnowledgeBaseProviderRemoteClient(RemoteNodeConnection nodeConnection) {
+        this.nodeConnection = nodeConnection;
+    }
+
+    public Environment newEnvironment() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBase newKnowledgeBase() {
+        return newKnowledgeBase( ( KnowledgeBaseConfiguration ) null );
+    }
+
+    public KnowledgeBase newKnowledgeBase(KnowledgeBaseConfiguration conf) {
+        //return new NewKnowledgeBaseCommand(null);
+
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new NewKnowledgeBaseCommand( null ) ) );
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( !(object instanceof FinishedCommand) ) {
+                throw new RuntimeException( "Response was not correctly ended" );
+            }
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+
+        return new KnowledgeBaseRemoteClient( localId,
+                                              nodeConnection );
+
+    }
+
+    public KnowledgeBaseConfiguration newKnowledgeBaseConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBaseConfiguration newKnowledgeBaseConfiguration(Properties properties,
+                                                                    ClassLoader classLoader) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeSessionConfiguration newKnowledgeSessionConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeSessionConfiguration newKnowledgeSessionConfiguration(Properties properties) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBase newKnowledgeBase(String kbaseId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBase newKnowledgeBase(String kbaseId,
+                                          KnowledgeBaseConfiguration conf) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/KnowledgeBaseRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBaseRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,174 @@
+package org.drools.services.remote;
+
+import java.util.Collection;
+import java.util.UUID;
+
+import org.drools.KnowledgeBase;
+import org.drools.command.FinishedCommand;
+import org.drools.command.KnowledgeBaseAddKnowledgePackagesCommand;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.command.NewStatefulKnowledgeSessionCommand;
+import org.drools.command.SetVariableCommand;
+import org.drools.definition.KnowledgePackage;
+import org.drools.definition.process.Process;
+import org.drools.definition.rule.Rule;
+import org.drools.definition.type.FactType;
+import org.drools.event.knowledgebase.KnowledgeBaseEventListener;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.services.RemoteNodeConnection;
+import org.drools.services.generic.CollectionClient;
+import org.drools.services.generic.Message;
+
+public class KnowledgeBaseRemoteClient
+    implements
+    KnowledgeBase {
+
+    private RemoteNodeConnection nodeConnection;
+    private String                     instanceId;
+
+    public KnowledgeBaseRemoteClient(String instanceId,
+                                     RemoteNodeConnection nodeConnection) {
+        this.instanceId = instanceId;
+        this.nodeConnection = nodeConnection;
+    }
+
+    public void addKnowledgePackages(Collection<KnowledgePackage> kpackages) {
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        String kuilderInstanceId = ((CollectionClient<KnowledgePackage>) kpackages).getParentInstanceId();
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBaseAddKnowledgePackagesCommand(),
+                                                                                  kuilderInstanceId,
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  kresultsId ) );
+        
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( !(object instanceof FinishedCommand) ) {
+                throw new RuntimeException( "Response was not correctly ended" );
+            }
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+    }
+
+    public FactType getFactType(String packageName,
+                                String typeName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgePackage getKnowledgePackage(String packageName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Collection<KnowledgePackage> getKnowledgePackages() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Process getProcess(String processId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Rule getRule(String packageName,
+                        String ruleName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public StatefulKnowledgeSession newStatefulKnowledgeSession() {
+        return newStatefulKnowledgeSession( null,
+                                            null );
+    }
+
+    public StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeSessionConfiguration conf,
+                                                                Environment environment) {
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new KnowledgeContextResolveFromContextCommand( new NewStatefulKnowledgeSessionCommand( null ),
+                                                                                                          null,
+                                                                                                          instanceId,
+                                                                                                          null,
+                                                                                                          kresultsId ) ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+            
+            if ( !(object instanceof FinishedCommand) ) {
+                throw new RuntimeException( "Response was not correctly ended" );
+            }
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+
+        return new StatefulKnowledgeSessionRemoteClient( localId,
+                                                         nodeConnection );
+    }
+
+    public StatelessKnowledgeSession newStatelessKnowledgeSession(KnowledgeSessionConfiguration conf) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public StatelessKnowledgeSession newStatelessKnowledgeSession() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void removeKnowledgePackage(String packageName) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void removeProcess(String processId) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void removeRule(String packageName,
+                           String ruleName) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void addEventListener(KnowledgeBaseEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public Collection<KnowledgeBaseEventListener> getKnowledgeBaseEventListeners() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void removeEventListener(KnowledgeBaseEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+	public void removeFunction(String packageName, String ruleName) {
+		// TODO Auto-generated method stub
+	}
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderProviderRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/KnowledgeBuilderProviderRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderProviderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderProviderRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,87 @@
+/**
+ * 
+ */
+package org.drools.services.remote;
+
+import java.util.Properties;
+import java.util.UUID;
+
+import org.drools.KnowledgeBase;
+import org.drools.builder.DecisionTableConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.command.FinishedCommand;
+import org.drools.command.SetVariableCommand;
+import org.drools.command.builder.NewKnowledgeBuilderCommand;
+import org.drools.services.RemoteNodeConnection;
+import org.drools.services.generic.Message;
+
+public class KnowledgeBuilderProviderRemoteClient
+    implements
+    KnowledgeBuilderFactoryService {
+    private RemoteNodeConnection nodeConnection;
+
+    public KnowledgeBuilderProviderRemoteClient(RemoteNodeConnection nodeConnection) {
+        this.nodeConnection =  nodeConnection;
+    }
+
+    public DecisionTableConfiguration newDecisionTableConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder() {
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new NewKnowledgeBuilderCommand( null ) ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( !(object instanceof FinishedCommand) ) {
+                throw new RuntimeException( "Response was not correctly ended" );
+            }
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+
+        return new KnowledgeBuilderRemoteClient( localId,
+                                                 nodeConnection );
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder(KnowledgeBuilderConfiguration conf) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder(KnowledgeBase kbase) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder(KnowledgeBase kbase,
+                                                KnowledgeBuilderConfiguration conf) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBuilderConfiguration newKnowledgeBuilderConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBuilderConfiguration newKnowledgeBuilderConfiguration(Properties properties,
+                                                                          ClassLoader classLoader) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/KnowledgeBuilderRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/KnowledgeBuilderRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,138 @@
+package org.drools.services.remote;
+
+import java.util.Collection;
+
+import org.drools.KnowledgeBase;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderErrors;
+import org.drools.builder.ResourceConfiguration;
+import org.drools.builder.ResourceType;
+import org.drools.command.FinishedCommand;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.command.builder.KnowledgeBuilderAddCommand;
+import org.drools.command.builder.KnowledgeBuilderGetErrorsCommand;
+import org.drools.command.builder.KnowledgeBuilderHasErrorsCommand;
+import org.drools.definition.KnowledgePackage;
+import org.drools.io.Resource;
+import org.drools.runtime.ExecutionResults;
+import org.drools.services.RemoteNodeConnection;
+import org.drools.services.generic.CollectionClient;
+import org.drools.services.generic.Message;
+
+public class KnowledgeBuilderRemoteClient
+    implements
+    KnowledgeBuilder {
+    private RemoteNodeConnection nodeConnection;
+    private String                     instanceId;
+
+    public KnowledgeBuilderRemoteClient(String instanceId,
+                                        RemoteNodeConnection nodeConnection) {
+        this.instanceId = instanceId;
+        this.nodeConnection = nodeConnection;
+    }
+
+    public void add(Resource resource,
+                    ResourceType resourceType) {
+        add( resource,
+             resourceType,
+             null );
+    }
+
+    public void add(Resource resource,
+                    ResourceType resourceType,
+                    ResourceConfiguration configuration) {
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderAddCommand( resource,
+                                                                                                                  resourceType,
+                                                                                                                  configuration ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  null ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( !(object instanceof FinishedCommand) ) {
+                throw new RuntimeException( "Response was not correctly ended" );
+            }
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+
+    }
+
+    public KnowledgeBuilderErrors getErrors() {
+        String commandId = "kbuilder.getErrors_" + nodeConnection.getNextId();
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderGetErrorsCommand( commandId ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( object == null ) {
+                throw new RuntimeException( "Response was not correctly received" );
+            }
+
+            return (KnowledgeBuilderErrors) ((ExecutionResults) object).getValue( commandId );            
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+        
+    }
+
+    public Collection<KnowledgePackage> getKnowledgePackages() {
+        return new CollectionClient<KnowledgePackage>( this.instanceId );
+    }
+
+    public boolean hasErrors() {
+        String commandId = "kbuilder.hasErrors_" + nodeConnection.getNextId();
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.getNextId(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderHasErrorsCommand( commandId ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( object == null ) {
+                throw new RuntimeException( "Response was not correctly received" );
+            }
+
+            return (Boolean) ((ExecutionResults) object).getValue( commandId );
+
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+        
+        
+        
+    }
+
+	public KnowledgeBase newKnowledgeBase() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/ProcessInstanceRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/ProcessInstanceRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/ProcessInstanceRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/ProcessInstanceRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,70 @@
+/*
+ *  Copyright 2009 salaboy.
+ * 
+ *  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.
+ *  under the License.
+ */
+
+package org.drools.services.remote;
+
+import java.io.Serializable;
+import org.drools.runtime.process.ProcessInstance;
+
+/**
+ *
+ * @author salaboy
+ */
+public class ProcessInstanceRemoteClient implements ProcessInstance, Serializable {
+
+    private String processId;
+    private long id;
+    private String processName;
+    private int state;
+    private String[] eventTypes;
+    public ProcessInstanceRemoteClient() {
+    }
+
+    public ProcessInstanceRemoteClient(long id, String processId, String processName, int state) {
+        this.processId = processId;
+        this.id = id;
+        this.processName = processName;
+        this.state = state;
+    }
+
+
+
+    public String getProcessId() {
+        return processId;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void signalEvent(String type, Object event) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public String[] getEventTypes() {
+        return eventTypes;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/StatefulKnowledgeSessionRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/StatefulKnowledgeSessionRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/StatefulKnowledgeSessionRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/StatefulKnowledgeSessionRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,419 @@
+package org.drools.services.remote;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.drools.KnowledgeBase;
+import org.drools.command.Command;
+import org.drools.command.ExecuteCommand;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.command.runtime.rule.FireAllRulesCommand;
+import org.drools.services.command.GetWorkItemManagerCommand;
+import org.drools.services.command.RegisterRemoteWorkItemHandlerCommand;
+import org.drools.services.command.StartProcessRemoteCommand;
+import org.drools.event.process.ProcessEventListener;
+import org.drools.event.rule.AgendaEventListener;
+import org.drools.event.rule.WorkingMemoryEventListener;
+import org.drools.runtime.Calendars;
+import org.drools.runtime.Environment;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.ExitPoint;
+import org.drools.runtime.Globals;
+import org.drools.runtime.ObjectFilter;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.runtime.rule.Agenda;
+import org.drools.runtime.rule.AgendaFilter;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResults;
+import org.drools.runtime.rule.WorkingMemoryEntryPoint;
+import org.drools.services.RemoteNodeConnection;
+import org.drools.time.SessionClock;
+import org.drools.services.generic.Message;
+
+public class StatefulKnowledgeSessionRemoteClient
+    implements
+    StatefulKnowledgeSession {
+
+    private RemoteNodeConnection nodeConnection;
+    private String                     instanceId;
+
+    public StatefulKnowledgeSessionRemoteClient(String instanceId,
+                                                RemoteNodeConnection nodeConnection) {
+        this.instanceId = instanceId;
+        this.nodeConnection = nodeConnection;
+    }
+
+    public String getInstanceId() {
+        return this.instanceId;
+    }
+
+    public void dispose() {
+        // TODO Auto-generated method stub
+
+    }
+
+    public int getId() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public int fireAllRules() {
+        String commandId = "ksession.fireAllRules" + nodeConnection.getNextId();
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new FireAllRulesCommand( commandId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+
+            if ( object == null ) {
+                throw new RuntimeException( "Response was not correctly received" );
+            }
+
+            return (Integer) ((ExecutionResults) object).getValue( commandId );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+    }
+
+    public int fireAllRules(int max) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public int fireAllRules(AgendaFilter agendaFilter) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public void fireUntilHalt() {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void fireUntilHalt(AgendaFilter agendaFilter) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public ExecutionResults execute(Command command) {
+        String commandId = "ksession.execute" + nodeConnection.getNextId();
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new ExecuteCommand( commandId,
+                                                                                                      command ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();if ( object == null ) {
+                throw new RuntimeException( "Response was not correctly received" );
+            }
+
+            return (ExecutionResults) ((ExecutionResults) object).getValue( commandId );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+    }
+
+    public Environment getEnvironment() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Object getGlobal(String identifier) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Globals getGlobals() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBase getKnowledgeBase() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends SessionClock> T getSessionClock() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void registerExitPoint(String name,
+                                  ExitPoint exitPoint) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void setGlobal(String identifier,
+                          Object object) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void unregisterExitPoint(String name) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public Agenda getAgenda() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public QueryResults getQueryResults(String query) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public QueryResults getQueryResults(String query,
+                                        Object[] arguments) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public WorkingMemoryEntryPoint getWorkingMemoryEntryPoint(String name) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Collection< ? extends WorkingMemoryEntryPoint> getWorkingMemoryEntryPoints() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void halt() {
+        // TODO Auto-generated method stub
+
+    }
+
+    public FactHandle getFactHandle(Object object) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends FactHandle> Collection<T> getFactHandles() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends FactHandle> Collection<T> getFactHandles(ObjectFilter filter) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Object getObject(FactHandle factHandle) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Collection<Object> getObjects() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Collection<Object> getObjects(ObjectFilter filter) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public FactHandle insert(Object object) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void retract(FactHandle handle) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void update(FactHandle handle,
+                       Object object) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void abortProcessInstance(long id) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public ProcessInstance getProcessInstance(long id) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Collection<ProcessInstance> getProcessInstances() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public WorkItemManager getWorkItemManager() {
+    	 String kresultsId = "kresults_" + nodeConnection.getSessionId();
+         Message msg = new Message( nodeConnection.getSessionId(),
+                                    nodeConnection.counter.incrementAndGet(),
+                                    true,
+                                    new KnowledgeContextResolveFromContextCommand( new GetWorkItemManagerCommand(),
+                                                                                   null,
+                                                                                   null,
+                                                                                   instanceId,
+                                                                                   kresultsId ) );
+         try {
+             Object payload = nodeConnection.client.write( msg ).getPayload();
+             WorkItemManager workItemManager = (WorkItemManager) ((ExecutionResults) payload).getValue( "workItemManager" );
+             ((WorkItemManagerRemoteClient)workItemManager).setNodeConnection(nodeConnection);
+             ((WorkItemManagerRemoteClient)workItemManager).setInstanceId(instanceId);
+             return workItemManager;
+         } catch ( Exception e ) {
+             throw new RuntimeException( "Unable to execute message", e );
+         }
+    }
+    
+    public void registerWorkItemHandler(String name, String workItemHandler){
+        
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new RegisterRemoteWorkItemHandlerCommand(name, workItemHandler ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            nodeConnection.client.write( msg );
+            
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+
+
+    }
+
+    public void signalEvent(String type,
+                            Object event) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public ProcessInstance startProcess(String processId) {
+        String commandId = "ksession.execute" + nodeConnection.getNextId();
+        String kresultsId = "kresults_" + nodeConnection.getSessionId();
+
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new StartProcessRemoteCommand( processId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = nodeConnection.client.write( msg ).getPayload();
+            if ( object == null ) {
+                throw new RuntimeException( "Response was not correctly received" );
+            }
+
+            return (ProcessInstance) ((ExecutionResults) object).getValue( processId );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+        
+    }
+
+    public ProcessInstance startProcess(String processId,
+                                        Map<String, Object> parameters) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void addEventListener(WorkingMemoryEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void addEventListener(AgendaEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public Collection<AgendaEventListener> getAgendaEventListeners() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Collection<WorkingMemoryEventListener> getWorkingMemoryEventListeners() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void removeEventListener(WorkingMemoryEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void removeEventListener(AgendaEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void addEventListener(ProcessEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public Collection<ProcessEventListener> getProcessEventListeners() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void removeEventListener(ProcessEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public String getEntryPointId() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public long getFactCount() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public void signalEvent(String type,
+                            Object event,
+                            long processInstanceId) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public Calendars getCalendars() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/WorkItemManagerRemoteClient.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/remote/WorkItemManagerRemoteClient.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/WorkItemManagerRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/WorkItemManagerRemoteClient.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,58 @@
+package org.drools.services.remote;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.services.RemoteNodeConnection;
+import org.drools.services.generic.Message;
+
+/**
+ *
+ * @author Lucas Amador
+ * @author salaboy
+ */
+public class WorkItemManagerRemoteClient implements WorkItemManager, Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	private RemoteNodeConnection nodeConnection;
+	private String instanceId;
+
+	public void abortWorkItem(long id) {
+		throw new UnsupportedOperationException("Not supported yet.");
+	}
+
+	public void completeWorkItem(long id, Map<String, Object> results) {
+		String kresultsId = "kresults_" + nodeConnection.getSessionId();
+        Message msg = new Message( nodeConnection.getSessionId(),
+                                   nodeConnection.counter.incrementAndGet(),
+                                   true,
+                                   new KnowledgeContextResolveFromContextCommand( new CompleteWorkItemCommand(id, results),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+        try {
+            nodeConnection.client.write( msg );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message", e );
+        }
+	}
+
+	public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+		throw new UnsupportedOperationException("Not supported yet.");
+	}
+
+	public void setNodeConnection(RemoteNodeConnection nodeConnection) {
+		this.nodeConnection = nodeConnection;
+	}
+
+	public void setInstanceId(String instanceId) {
+		this.instanceId = instanceId;
+	}
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/ClientGenericMessageReceiverImpl.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/mina/ClientGenericMessageReceiverImpl.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/ClientGenericMessageReceiverImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/ClientGenericMessageReceiverImpl.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,72 @@
+/**
+ * 
+ */
+package org.drools.services.remote.mina;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.drools.SystemEventListener;
+import org.drools.task.service.Command;
+
+
+
+import org.drools.services.generic.ClientGenericMessageReceiver;
+import org.drools.services.generic.GenericIoWriter;
+import org.drools.services.generic.GenericMessageHandler;
+import org.drools.services.generic.Message;
+import org.drools.services.generic.MessageResponseHandler;
+
+public class ClientGenericMessageReceiverImpl
+    implements
+    ClientGenericMessageReceiver {
+    protected Map<Integer, MessageResponseHandler> responseHandlers;
+
+    private GenericMessageHandler                  handler;
+
+    private final SystemEventListener              systemEventListener;
+
+    public ClientGenericMessageReceiverImpl(GenericMessageHandler handler,
+                                            SystemEventListener systemEventListener) {
+        this.handler = handler;
+        this.responseHandlers = new ConcurrentHashMap<Integer, MessageResponseHandler>();;
+        this.systemEventListener = systemEventListener;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.mina.ClientGenericMessageReceiver#addResponseHandler(int, org.drools.vsm.MessageResponseHandler)
+     */
+    public void addResponseHandler(int id,
+                                   MessageResponseHandler responseHandler) {
+        this.responseHandlers.put( id,
+                                   responseHandler );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.mina.ClientGenericMessageReceiver#messageReceived(org.drools.vsm.mina.MinaIoWriter, org.drools.vsm.Message)
+     */
+    public void messageReceived(GenericIoWriter writer,
+                                Message msg) throws Exception {
+
+        systemEventListener.debug( "Message receieved : " + msg );
+
+        MessageResponseHandler responseHandler = (MessageResponseHandler) responseHandlers.remove( msg.getResponseId() );
+
+        if ( responseHandler != null ) {
+            Object payload = msg.getPayload();
+            if (payload instanceof Command && ((Command)msg.getPayload()).getArguments().size() > 0 &&
+            	((Command)msg.getPayload()).getArguments().get(0) instanceof RuntimeException)
+            	payload = ((Command)msg.getPayload()).getArguments().get(0);
+            if (( payload != null && payload instanceof RuntimeException )) {
+                responseHandler.setError( (RuntimeException) payload );
+            } else {
+                responseHandler.receive( msg );
+            }
+        } else if ( handler != null ) {
+            this.handler.messageReceived( writer,
+                                          msg );
+        } else {
+            throw new RuntimeException( "Unable to process Message" );
+        }
+    }
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaAcceptor.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/mina/MinaAcceptor.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaAcceptor.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaAcceptor.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,45 @@
+package org.drools.services.remote.mina;
+
+import java.io.IOException;
+import java.net.SocketAddress;
+
+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.SocketAcceptor;
+import org.drools.vsm.AcceptorService;
+
+public class MinaAcceptor
+    implements
+    AcceptorService {
+    protected SocketAcceptor acceptor;
+    protected SocketAddress  address;
+
+    public MinaAcceptor(SocketAcceptor acceptor,
+                        SocketAddress address) {
+        this.acceptor = acceptor;
+        this.address = address;
+    }
+
+    public synchronized void start() throws IOException {
+        acceptor.getFilterChain().addLast( "logger",
+                                           new LoggingFilter() );
+        acceptor.getFilterChain().addLast( "codec",
+                                           new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
+        acceptor.getSessionConfig().setReadBufferSize( 2048 );
+        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE,
+                                                 10 );
+        acceptor.bind( address );
+    }
+
+    public synchronized void stop() {
+        acceptor.dispose();
+    }
+
+    public synchronized IoAcceptor getIoAcceptor() {
+        return acceptor;
+    }
+
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaConnector.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/mina/MinaConnector.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaConnector.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaConnector.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,112 @@
+package org.drools.services.remote.mina;
+
+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;
+import org.drools.SystemEventListener;
+import org.drools.services.generic.GenericConnector;
+import org.drools.services.generic.GenericIoWriter;
+import org.drools.services.generic.Message;
+import org.drools.services.generic.MessageResponseHandler;
+import org.drools.services.responsehandlers.BlockingMessageResponseHandler;
+
+public class MinaConnector
+    implements
+    GenericConnector,
+    GenericIoWriter {
+    protected IoSession           session;
+
+    protected final String        name;
+    protected AtomicInteger       counter;
+    protected SocketConnector     connector;
+    protected SocketAddress       address;
+    protected SystemEventListener eventListener;
+
+    public MinaConnector(String name,
+                         SocketConnector connector,
+                         SocketAddress address,
+                         SystemEventListener eventListener) {
+        if ( name == null ) {
+            throw new IllegalArgumentException( "Name can not be null" );
+        }
+        this.name = name;
+        this.counter = new AtomicInteger();
+        this.address = address;
+        this.connector = connector;
+        this.eventListener = eventListener;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.mina.Messenger#connect()
+     */
+    public boolean connect() {
+        if ( session != null && session.isConnected() ) {
+            throw new IllegalStateException( "Already connected. Disconnect first." );
+        }
+
+        try {
+            this.connector.getFilterChain().addLast( "codec",
+                                                     new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
+
+            ConnectFuture future1 = this.connector.connect( this.address );
+            future1.await( 2000 );
+            if ( !future1.isConnected() ) {
+                eventListener.info( "unable to connect : " + address + " : " + future1.getException() );
+                return false;
+            }
+            eventListener.info( "connected : " + address );
+            this.session = future1.getSession();
+            return true;
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.mina.Messenger#disconnect()
+     */
+    public void disconnect() {
+        if ( session != null && session.isConnected() ) {
+            session.close();
+            session.getCloseFuture().join();
+        }
+    }
+
+    private void addResponseHandler(int id,
+                                    MessageResponseHandler responseHandler) {
+        ((MinaIoHandler) this.connector.getHandler()).addResponseHandler( id,
+                                                                          responseHandler );
+    }
+
+    public void write(Message msg,
+                      MessageResponseHandler responseHandler) {
+        if ( responseHandler != null ) {
+            addResponseHandler( msg.getResponseId(),
+                                responseHandler );
+        }
+        this.session.write( msg );
+    }
+
+    public Message write(Message msg) {
+        BlockingMessageResponseHandler responseHandler = new BlockingMessageResponseHandler();
+
+        if ( responseHandler != null ) {
+            addResponseHandler( msg.getResponseId(),
+                                responseHandler );
+        }
+        this.session.write( msg );
+
+        Message returnMessage = responseHandler.getMessage();
+        if ( responseHandler.getError() != null ) {
+            throw responseHandler.getError();
+        }
+
+        return returnMessage;
+    }
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoHandler.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/mina/MinaIoHandler.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoHandler.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,60 @@
+package org.drools.services.remote.mina;
+
+
+import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IdleStatus;
+import org.apache.mina.core.session.IoSession;
+import org.drools.SystemEventListener;
+import org.drools.services.generic.ClientGenericMessageReceiver;
+import org.drools.services.generic.GenericMessageHandler;
+import org.drools.services.generic.Message;
+import org.drools.services.generic.MessageResponseHandler;
+
+public class MinaIoHandler extends IoHandlerAdapter {
+    /**
+     * Listener used for logging
+     */
+    private final SystemEventListener systemEventListener;
+
+    private ClientGenericMessageReceiver clientMessageReceiver;
+
+    public MinaIoHandler(SystemEventListener systemEventListener) {
+        this( systemEventListener,
+              null );
+
+    }
+
+    public MinaIoHandler(SystemEventListener systemEventListener,
+                         GenericMessageHandler handler) {
+        this.systemEventListener = systemEventListener;
+        this.clientMessageReceiver = new ClientGenericMessageReceiverImpl( handler,
+                                                                           systemEventListener );
+
+    }
+
+    public void addResponseHandler(int id,
+                                   MessageResponseHandler responseHandler) {
+        this.clientMessageReceiver.addResponseHandler( id,
+                                                       responseHandler );
+    }
+
+    public void exceptionCaught(IoSession session,
+                                Throwable cause) throws Exception {
+        systemEventListener.exception( "Uncaught exception on Server",
+                                       cause );
+    }
+
+    public void messageReceived(IoSession session,
+                                Object object) throws Exception {
+        Message msg = (Message) object;
+        clientMessageReceiver.messageReceived( new MinaIoWriter( session ),
+                                               msg );
+    }
+
+    @Override
+    public void sessionIdle(IoSession session,
+                            IdleStatus status) throws Exception {
+        this.systemEventListener.debug( "Server IDLE " + session.getIdleCount( status ) );
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoWriter.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/mina/MinaIoWriter.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoWriter.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/remote/mina/MinaIoWriter.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,23 @@
+package org.drools.services.remote.mina;
+
+import org.apache.mina.core.session.IoSession;
+import org.drools.services.generic.GenericIoWriter;
+import org.drools.services.generic.Message;
+import org.drools.services.generic.MessageResponseHandler;
+
+public class MinaIoWriter
+    implements
+    GenericIoWriter {
+    
+    private IoSession session;
+
+    public MinaIoWriter(IoSession session) {
+        this.session = session;
+    }
+
+    public void write(Message message,
+                      MessageResponseHandler responseHandler) {
+        this.session.write( message );
+    }
+
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBaseResponseHandler.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/responsehandlers/AbstractBaseResponseHandler.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBaseResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBaseResponseHandler.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,69 @@
+package org.drools.services.responsehandlers;
+
+import java.lang.reflect.Constructor;
+
+import org.drools.services.generic.MessageResponseHandler;
+
+/**
+ * Abstract base class for client ResponseHandlers. Provides synchonized access to <field>done</field> which represents
+ * if the response is completed. Also has an <field>error</field> which will be set when there is a problem with
+ * a response. Users of this class should check to see if the response completed successfully, via
+ * the <method>isDone</method> and the <method>hasError</method>.
+ * <p/>
+ * Please note that the <field>error</field> is actually the Exception that occured on the server while
+ * processing the request.
+ *
+ * @author <a href="mailto:stampy88 at yahoo.com">dave sinclair</a>
+ */
+public abstract class AbstractBaseResponseHandler
+    implements
+    MessageResponseHandler {
+    private volatile boolean done;
+    private RuntimeException error;
+
+    public synchronized boolean hasError() {
+        return error != null;
+    }
+
+    public synchronized RuntimeException getError() {
+        return error;
+    }
+
+    public synchronized void setError(RuntimeException error) {
+        this.error = error;
+        notifyAll();
+    }
+
+    public synchronized boolean isDone() {
+        return done;
+    }
+
+    protected synchronized void setDone(boolean done) {
+        this.done = done;
+        notifyAll();
+    }
+
+    /**
+     * This method will take the specified serverSideException, and create a new one for the client based
+     * on the serverSideException. This is done so a proper stack trace can be made for the client, as opposed
+     * to seeing the server side stack.
+     *
+     * @param serverSideException exception used to create client side exception
+     * @return client side exception
+     */
+    protected static RuntimeException createSideException(RuntimeException serverSideException) {
+        RuntimeException clientSideException;
+
+        try {
+            Constructor< ? extends RuntimeException> constructor = serverSideException.getClass().getConstructor( String.class );
+
+            clientSideException = constructor.newInstance( "Server-side Exception: " + serverSideException.getMessage() );
+        } catch ( Exception e ) {
+            // this should never happen - if it does, it is a programming error
+            throw new RuntimeException( "Could not create client side exception",
+                                        e );
+        }
+
+        return clientSideException;
+    }
+}

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBlockingResponseHandler.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/responsehandlers/AbstractBlockingResponseHandler.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBlockingResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/AbstractBlockingResponseHandler.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,37 @@
+/**
+ *
+ */
+package org.drools.services.responsehandlers;
+
+public abstract class AbstractBlockingResponseHandler extends AbstractBaseResponseHandler {
+
+    /**
+     * This method will wait the specified amount of time in milliseconds for the response to
+     * be completed. Completed is determined via the <field>done</field>. Returns true if the
+     * reponse was completed in time, false otherwise. If an error occurs, this method will throw
+     * a subclass of <code>RuntimeException</code> specific to the error.
+     *
+     * @param time max time to wait
+     * @return true if response is available, false otherwise
+     *
+     * @see org.drools.task.service.PermissionDeniedException
+     * @see org.drools.task.service.CannotAddTaskException
+     * @see javax.persistence.PersistenceException
+     */
+    public synchronized boolean waitTillDone(long time) {
+
+        if ( !isDone() ) {
+            try {
+                wait( time );
+            } catch ( InterruptedException e ) {
+                // swallow and return state of done
+            }
+        }
+
+        if ( hasError() ) {
+            throw createSideException( getError() );
+        }
+
+        return isDone();
+    }
+}
\ No newline at end of file

Copied: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/BlockingMessageResponseHandler.java (from rev 31965, labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/vsm/responsehandlers/BlockingMessageResponseHandler.java)
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/BlockingMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/main/java/org/drools/services/responsehandlers/BlockingMessageResponseHandler.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package org.drools.services.responsehandlers;
+
+import org.drools.services.generic.Message;
+import org.drools.services.generic.MessageResponseHandler;
+
+public class BlockingMessageResponseHandler extends AbstractBlockingResponseHandler
+    implements
+    MessageResponseHandler {
+    private static final int ATTACHMENT_ID_WAIT_TIME = 100000;
+    private static final int CONTENT_ID_WAIT_TIME    = 50000;
+
+    private volatile Message message;
+
+    public synchronized void receive(Message message) {
+        this.message = message;
+        setDone( true );
+    }
+
+    public Message getMessage() {
+        boolean done = waitTillDone( CONTENT_ID_WAIT_TIME );
+
+        if ( !done ) {
+            throw new RuntimeException( "Timeout : unable to retrieve Object Id" );
+        }
+
+        return this.message;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/NodeServiceLocatorBaseTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/NodeServiceLocatorBaseTest.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/NodeServiceLocatorBaseTest.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -19,7 +19,7 @@
 
 
 import org.drools.KnowledgeBase;
-import org.drools.services.Node;
+import org.drools.services.ExecutionNode;
 import org.drools.KnowledgeBaseFactoryService;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderFactoryService;
@@ -35,7 +35,7 @@
 
 public class NodeServiceLocatorBaseTest {
 
-    protected Node node;
+    protected ExecutionNode node;
 
     public NodeServiceLocatorBaseTest() {
         
@@ -82,9 +82,6 @@
         Assert.assertEquals( 2, fired );
 
 
-        
-
-
     }
   
 

Modified: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/RemoteNodeServiceTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/RemoteNodeServiceTest.java	2010-03-08 12:46:33 UTC (rev 31990)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-services/src/test/java/org/drools/service/RemoteNodeServiceTest.java	2010-03-08 12:57:08 UTC (rev 31991)
@@ -18,17 +18,17 @@
 package org.drools.service;
 
 import org.drools.services.NodeConnection;
-import org.drools.vsm.mina.MinaConnector;
-import org.drools.vsm.GenericConnector;
+import org.drools.services.remote.mina.MinaConnector;
+import org.drools.services.generic.GenericConnector;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import java.io.IOException;
-import org.drools.vsm.mina.MinaAcceptor;
-import org.drools.vsm.GenericMessageHandlerImpl;
-import org.drools.vsm.mina.MinaIoHandler;
+import org.drools.services.remote.mina.MinaAcceptor;
+import org.drools.services.generic.GenericMessageHandlerImpl;
+import org.drools.services.remote.mina.MinaIoHandler;
 import org.drools.SystemEventListenerFactory;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.SocketAcceptor;
-import org.drools.vsm.ServiceManagerData;
+import org.drools.services.generic.NodeData;
 import java.net.SocketAddress;
 import java.net.InetSocketAddress;
 import org.drools.services.RemoteNodeConnection;
@@ -52,7 +52,7 @@
         SocketAddress address = new InetSocketAddress( "127.0.0.1",
                                                        9123 );
 
-        ServiceManagerData serverData = new ServiceManagerData();
+        NodeData serverData = new NodeData();
         // setup Server
         SocketAcceptor acceptor = new NioSocketAcceptor();
         acceptor.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener(),



More information about the jboss-svn-commits mailing list