[jboss-svn-commits] JBL Code SVN: r32401 - in labs/jbossrules/branches/salaboy_ServiceAPIs: drools-grid and 71 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Apr 4 12:25:35 EDT 2010


Author: salaboy21
Date: 2010-04-04 12:25:30 -0400 (Sun, 04 Apr 2010)
New Revision: 32401

Added:
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/pom.xml
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/DirectoryNodeService.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNode.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNodeService.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeConnector.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeSelectionStrategy.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/RemoteConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/Command.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/CommandName.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeClientConnectCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeContext.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/GetWorkItemManagerCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/LookupCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterRemoteWorkItemHandlerCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/StartProcessRemoteCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/BlockingGenericIoWriter.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/ClientGenericMessageReceiver.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/CollectionClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericIoWriter.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandlerImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericNodeConnector.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/Message.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageSession.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/NodeData.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryLookupProviderLocalClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryNodeLocalImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBaseProviderLocalClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBuilderProviderLocalClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/LocalConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/DirectoryLookupProviderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseProviderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderProviderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/ProcessInstanceRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/ClientGenericMessageReceiverImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaAcceptor.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoWriter.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaNodeConnector.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBaseResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBlockingResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/BlockingMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/DirectoryServiceSelectionStrategy.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/ReturnAlwaysTheFirstSelectionStrategy.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/StaticIncrementalSelectionStrategy.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/command/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/generic/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/local/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/remote/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/remote/mina/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/responsehandlers/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/services/strategies/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/resources/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/ExecutionNodeBaseTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/LocalExecutionNodeTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/RemoteExecutionNodeTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/service/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/pom.xml
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/DirectoryLookupProviderGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GenericMessageGridHandlerImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GridConnection.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseProviderGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderProviderGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/StatefulKnowledgeSessionGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/WorkItemManagerGridClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/command/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/command/NewStatefulKnowledgeSessionGridCommand.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/DirectoryNodeServiceImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/ExecutionNodeServiceImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/rio/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/rio/InternalRioNodeConnector.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/util/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/util/IDEntry.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/grid/command/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/grid/impl/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/grid/rio/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/grid/strategies/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/services/grid/util/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/resources/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/manager-config.groovy
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/start-monitor.groovy
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/test-config.groovy
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ExecutionNodeBaseTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ITGridExecutionTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/services/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/org/drools/executionNodeService.groovy
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/pom.xml
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/GenericEventTransport.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskFactoryService.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskService.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceProviderRemoteClient.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskClientMessageHandlerImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskServerMessageHandlerImpl.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/eventmessaging/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/eventmessaging/EventMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddAttachmentMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddCommentMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddTaskMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteAttachmentMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteCommentMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingEventMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetContentMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetTaskMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingSetContentMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskOperationMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskSummaryMessageResponseHandler.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/services/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/services/task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/services/task/eventmessaging/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/services/task/responseHandlers/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/resources/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/BaseTaskServiceTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandlerTest.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/services/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/services/task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/task/MockUserInfo.java
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/drools.email.conf
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/orm.xml
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/persistence.xml
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadGroups.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadUsers.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/QueryData_UnescalatedDeadlines.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithNotification.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithReassignment.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryData_TasksOwned.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_PeopleAssignmentQuerries.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInEnglish.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInGerman.mvel
   labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/pom.xml
Log:
JBRULES-2446: Drools Services API\n -drools-grid initial commit adding drools-grid-core, drools-grid-task and drools-grid-rio

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/pom.xml
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/pom.xml	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/pom.xml	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>drools</artifactId>
+        <groupId>org.drools</groupId>
+        <version>5.1.0.SNAPSHOT</version>
+    </parent>
+    <artifactId>drools-grid-core</artifactId>
+    <version>5.1.0.SNAPSHOT</version>
+    <name>Drools :: Grid :: Core</name>
+    
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.6</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Drools Runtime -->
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-api</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-core</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-compiler</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+        </dependency>
+
+        <!-- Apache Mina for default Service Remote Implementation -->
+        <dependency>
+            <groupId>org.apache.mina</groupId>
+            <artifactId>mina-core</artifactId>
+            <version>2.0.0-M6</version>
+        </dependency>
+
+        <!-- logging -->
+        
+        
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.5.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>1.5.10</version>
+        </dependency>
+
+    </dependencies>
+    
+</project>

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/DirectoryNodeService.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/DirectoryNodeService.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/DirectoryNodeService.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,24 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.drools.grid;
+
+import java.rmi.RemoteException;
+import org.drools.KnowledgeBase;
+import org.drools.grid.generic.GenericNodeConnector;
+
+
+/**
+ *
+ * @author salaboy
+ */
+
+public interface DirectoryNodeService {
+    public void register(String executorId, String sessionServiceId) throws RemoteException;
+    public GenericNodeConnector lookup(String executorId) throws RemoteException;
+    public void registerKBase(String kbaseId, String sessionServiceId) throws RemoteException;
+    public KnowledgeBase lookupKBase(String kbaseId) throws RemoteException;
+    public void addService(GenericNodeConnector service);
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNode.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNode.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNode.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -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.grid;
+
+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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNodeService.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNodeService.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/ExecutionNodeService.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,22 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.drools.grid;
+
+import java.rmi.RemoteException;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+
+
+/**
+ *
+ * @author salaboy
+ */
+public interface ExecutionNodeService extends GenericNodeConnector{
+    public String  getId() throws RemoteException;
+    public Message write(Message msg) throws RemoteException;
+    double getLoad() throws RemoteException;
+    void setLoad(double load) throws RemoteException;
+    
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeConnector.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeConnector.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeConnector.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,28 @@
+/*
+ *  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.grid;
+
+/**
+ *
+ * @author salaboy
+ */
+public interface NodeConnector {
+    public ExecutionNode connect();
+    public void disconnect();
+    
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeSelectionStrategy.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeSelectionStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/NodeSelectionStrategy.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,32 @@
+/*
+ *  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.grid;
+
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+
+/**
+ *
+ * @author salaboy
+ */
+public interface NodeSelectionStrategy {
+
+    public GenericNodeConnector getBestNode();
+    public void setConnection(GenericConnection connection);
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/RemoteConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/RemoteConnection.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/RemoteConnection.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,124 @@
+/*
+ *  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.grid;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.remote.DirectoryLookupProviderRemoteClient;
+import org.drools.grid.remote.KnowledgeBaseProviderRemoteClient;
+import org.drools.grid.remote.KnowledgeBuilderProviderRemoteClient;
+import org.drools.grid.strategies.DirectoryServiceSelectionStrategy;
+
+import org.drools.grid.strategies.StaticIncrementalSelectionStrategy;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
+/**
+ *
+ * @author salaboy
+ */
+public class RemoteConnection implements GenericConnection {
+    //Cached Services
+    private List<GenericNodeConnector> nodeConnectors;
+    //Cached Directories
+    private List<DirectoryNodeService> directories;
+
+    public RemoteConnection() {
+        this.nodeConnectors = new ArrayList<GenericNodeConnector>();
+        this.directories = new ArrayList<DirectoryNodeService>();
+    }
+
+    public void addNodeConnector(GenericNodeConnector service) {
+        //register the service to all the DirectoryServices
+        for(DirectoryNodeService directory : directories){
+            directory.addService(service);
+        }
+        this.nodeConnectors.add(service);
+
+    }
+    public void addDirectoryNode(DirectoryNodeService directory) {
+        this.directories.add(directory);
+    }
+
+    // In real scenarios this method will be in charge of populating
+    // all the ExecutionNodeService and DirectoryServices
+    public void connect() {
+        throw new NotImplementedException();
+    }
+
+
+    public ExecutionNode getExecutionNode(NodeSelectionStrategy strategy) {
+        ExecutionNode node = null;
+        GenericNodeConnector currentNode = null;
+        try {
+
+            //if the strategy is null use the default one
+            if (strategy == null) {
+                currentNode = getBestNode(new StaticIncrementalSelectionStrategy(this));
+            } else {
+                strategy.setConnection(this);
+                currentNode = getBestNode(strategy);
+            }
+            if (currentNode.connect()) {
+                node = new ExecutionNode();
+                node.set(KnowledgeBuilderFactoryService.class, new KnowledgeBuilderProviderRemoteClient(currentNode));
+                node.set(KnowledgeBaseFactoryService.class, new KnowledgeBaseProviderRemoteClient(currentNode));
+                node.set(DirectoryLookupFactoryService.class, new DirectoryLookupProviderRemoteClient(currentNode, this));
+
+            }
+            
+        } catch (RemoteException ex) {
+            Logger.getLogger(RemoteConnection.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return node;
+    }
+    public GenericNodeConnector getBestNode(NodeSelectionStrategy nodeSelectionStrategy) {
+        return nodeSelectionStrategy.getBestNode();
+    }
+
+    public List<DirectoryNodeService> getDirectories() {
+        return directories;
+    }
+
+    public void setDirectories(List<DirectoryNodeService> directories) {
+        this.directories = directories;
+    }
+
+    public List<GenericNodeConnector> getNodeConnectors() {
+        return nodeConnectors;
+    }
+
+    public void setServices(List<GenericNodeConnector> services) {
+        this.nodeConnectors = services;
+    }
+
+    public DirectoryNodeService getDirectoryNode(DirectoryServiceSelectionStrategy directorySelectionStrategy) {
+        return directories.get(0);
+    }
+
+   
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/Command.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/Command.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/Command.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,48 @@
+package org.drools.grid.command;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class Command implements Serializable {
+    
+    private int id;
+    
+    private CommandName name;    
+    
+    private List<Object> arguments;
+    
+    public Command(int id, CommandName name, List<Object> arguments) {
+        super();
+        this.id = id;
+        this.arguments = arguments;
+        this.name = name;
+    }
+    
+    
+    
+    public int getId() {
+        return id;
+    }
+
+
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+
+
+    public CommandName getName() {
+        return name;
+    }
+    public void setName(CommandName name) {
+        this.name = name;
+    }
+    public List<Object> getArguments() {
+        return arguments;
+    }
+    public void setArguments(List<Object> arguments) {
+        this.arguments = arguments;
+    }
+            
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/CommandName.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/CommandName.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/CommandName.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,79 @@
+package org.drools.grid.command;
+
+
+public enum CommandName {   
+    OperationRequest,
+    OperationResponse,
+    
+    ClaimRequest,
+    ClaimResponse,
+    
+    StartRequest,
+    StartResponse,
+    
+    StopRequest,
+    StopResponse,
+    
+    ReleaseRequest,
+    ReleaseResponse,  
+    
+    SuspendRequest,
+    SuspendResponse, 
+    
+    ResumeRequest,
+    ResumeResponse, 
+    
+    SkipRequest,
+    SkipResponse,  
+    
+    DelegateRequest,
+    DelegateResponse,
+    
+    ForwardRequest,
+    ForwardResponse,
+    
+    CompleteRequest,
+    CompleteResponse,   
+    
+    FailRequest,
+    FailResponse,
+    
+    GetTaskRequest,
+    GetTaskResponse,
+    
+    AddTaskRequest,
+    AddTaskResponse,
+    
+    AddAttachmentRequest,
+    AddAttachmentResponse,    
+    DeleteAttachmentRequest,
+    DeleteAttachmentResponse,
+        
+    SetDocumentContentRequest,
+    SetDocumentContentResponse,
+    GetContentRequest,
+    GetContentResponse,
+    
+    AddCommentRequest,
+    AddCommentResponse,    
+    DeleteCommentRequest,    
+    DeleteCommentResponse,    
+    
+    QueryTasksOwned,    
+    QueryTasksAssignedAsBusinessAdministrator,
+    QueryTasksAssignedAsExcludedOwner,
+    QueryTasksAssignedAsPotentialOwner,
+    QueryTasksAssignedAsPotentialOwnerWithGroup,
+    QueryTasksAssignedAsPotentialOwnerByGroup,
+    QuerySubTasksAssignedAsPotentialOwner,
+    QueryGetSubTasksByParentTaskId,
+    QueryTasksAssignedAsRecipient,
+    QueryTasksAssignedAsTaskInitiator,
+    QueryTasksAssignedAsTaskStakeholder,    
+    QueryTaskSummaryResponse,
+    
+    RegisterForEventRequest,
+    EventTriggerResponse,
+    
+    RegisterClient
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeClientConnectCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeClientConnectCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeClientConnectCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,34 @@
+package org.drools.grid.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.grid.generic.NodeData;
+
+public class ExecutionNodeClientConnectCommand
+    implements
+    GenericCommand<Integer> {
+    
+    private String outIdentifier;
+
+    
+
+    public ExecutionNodeClientConnectCommand(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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeContext.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeContext.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/ExecutionNodeContext.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,40 @@
+package org.drools.grid.command;
+
+import org.drools.command.Context;
+import org.drools.command.ContextManager;
+import org.drools.grid.generic.NodeData;
+
+public class ExecutionNodeContext
+    implements
+    Context {
+    private Context            context;
+    private NodeData data;
+
+    public ExecutionNodeContext(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 );
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/GetWorkItemManagerCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/GetWorkItemManagerCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/GetWorkItemManagerCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,29 @@
+package org.drools.grid.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.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/LookupCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/LookupCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/LookupCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,39 @@
+package org.drools.grid.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.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,32 @@
+package org.drools.grid.command;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterRemoteWorkItemHandlerCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterRemoteWorkItemHandlerCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/RegisterRemoteWorkItemHandlerCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,75 @@
+package org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/StartProcessRemoteCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/StartProcessRemoteCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/command/StartProcessRemoteCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -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.grid.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.grid.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());
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/BlockingGenericIoWriter.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/BlockingGenericIoWriter.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/BlockingGenericIoWriter.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/ClientGenericMessageReceiver.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/ClientGenericMessageReceiver.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/ClientGenericMessageReceiver.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,13 @@
+package org.drools.grid.generic;
+
+import org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/CollectionClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/CollectionClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/CollectionClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,84 @@
+package org.drools.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericConnection.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericConnection.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,41 @@
+/*
+ *  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.grid.generic;
+
+import java.util.List;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.NodeSelectionStrategy;
+import org.drools.grid.strategies.DirectoryServiceSelectionStrategy;
+
+/**
+ *
+ * @author salaboy
+ */
+public interface GenericConnection { 
+    public void addNodeConnector(GenericNodeConnector nodeConnector);
+    public void addDirectoryNode(DirectoryNodeService directory);
+    public List<GenericNodeConnector> getNodeConnectors();
+    public List<DirectoryNodeService> getDirectories();
+    public ExecutionNode getExecutionNode(NodeSelectionStrategy strategy);
+    public DirectoryNodeService getDirectoryNode(DirectoryServiceSelectionStrategy directorySelectionStrategy);
+
+    
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericIoWriter.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericIoWriter.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericIoWriter.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,6 @@
+package org.drools.grid.generic;
+
+public interface GenericIoWriter {
+    void write(Message msg,
+               MessageResponseHandler responseHandler);
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,8 @@
+package org.drools.grid.generic;
+
+public interface GenericMessageHandler {
+
+    public abstract void messageReceived(GenericIoWriter session,
+                                         Message msg) throws Exception;
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandlerImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandlerImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericMessageHandlerImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,67 @@
+package org.drools.grid.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 );
+        }
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericNodeConnector.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericNodeConnector.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/GenericNodeConnector.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,16 @@
+package org.drools.grid.generic;
+
+import java.rmi.RemoteException;
+
+public interface GenericNodeConnector extends GenericIoWriter {
+
+    boolean connect() throws RemoteException;;
+
+    void disconnect() throws RemoteException;;
+
+    Message write(Message msg) throws RemoteException;;
+
+    String getId() throws RemoteException;;
+
+   // void setSession(Object object) throws RemoteException;;
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/Message.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/Message.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/Message.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,52 @@
+package org.drools.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,7 @@
+package org.drools.grid.generic;
+
+public interface MessageResponseHandler {
+    public void setError(RuntimeException error);
+
+    public void receive(Message message);
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageSession.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageSession.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/MessageSession.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,57 @@
+/*
+ *  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.grid.generic;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ *
+ * @author salaboy
+ */
+public class MessageSession {
+
+    public AtomicInteger    counter;
+    private int sessionId = -1;
+
+    public MessageSession() {
+        counter = new AtomicInteger();
+    }
+
+
+
+    public AtomicInteger getCounter() {
+        return counter;
+    }
+
+    public void setCounter(AtomicInteger counter) {
+        this.counter = counter;
+    }
+
+    public int getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(int sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public int getNextId() {
+        return this.counter.incrementAndGet();
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/NodeData.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/NodeData.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/generic/NodeData.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,67 @@
+package org.drools.grid.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.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryLookupProviderLocalClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryLookupProviderLocalClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryLookupProviderLocalClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,52 @@
+/*
+ *  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.grid.local;
+
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.runtime.CommandExecutor;
+import org.drools.grid.DirectoryNodeService;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryLookupProviderLocalClient implements DirectoryLookupFactoryService {
+
+    
+    private Map<String, CommandExecutor> services = new HashMap<String, CommandExecutor>();
+
+    public DirectoryLookupProviderLocalClient() {
+        
+    }
+
+
+    public void register(String key, CommandExecutor executor) {
+            services.put(key, executor);
+    }
+
+    public CommandExecutor lookup(String key) {
+            return  services.get(key);
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryNodeLocalImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryNodeLocalImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/DirectoryNodeLocalImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,68 @@
+/*
+ *  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.grid.local;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.drools.KnowledgeBase;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.generic.GenericNodeConnector;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryNodeLocalImpl implements DirectoryNodeService {
+    private Map<String, String> directoryMap = new HashMap<String, String>();
+    private List<GenericNodeConnector> services = new ArrayList<GenericNodeConnector>();
+
+    public void register(String executorId, String sessionServiceId) throws RemoteException {
+        System.out.println("Registering: "+  executorId + " -- "+sessionServiceId);
+        directoryMap.put(executorId, sessionServiceId);
+    }
+
+    public GenericNodeConnector lookup(String executorId) throws RemoteException {
+        GenericNodeConnector sessionService = null;
+        String sessionServiceId = (String)directoryMap.get(executorId);
+        System.out.println("Registry = "+ directoryMap.toString());
+        System.out.println("Nodes Services = "+services);
+        for(GenericNodeConnector ss : services){
+            System.out.println("Session Service id = "+ss.getId() + "needs to match with ="+sessionServiceId);
+            if(ss.getId().equals(sessionServiceId)){
+                sessionService = ss;
+            }
+        }
+
+        return sessionService;
+    }
+
+    public void registerKBase(String kbaseId, String sessionServiceId) throws RemoteException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public KnowledgeBase lookupKBase(String kbaseId) throws RemoteException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    public void addService(GenericNodeConnector service){
+        services.add(service);
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBaseProviderLocalClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBaseProviderLocalClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBaseProviderLocalClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,59 @@
+package org.drools.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBuilderProviderLocalClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBuilderProviderLocalClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/KnowledgeBuilderProviderLocalClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,51 @@
+/**
+ * 
+ */
+package org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/LocalConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/LocalConnection.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/local/LocalConnection.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,82 @@
+/*
+ *  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.grid.local;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.NodeSelectionStrategy;
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.strategies.DirectoryServiceSelectionStrategy;
+
+/**
+ *
+ * @author salaboy
+ */
+public class LocalConnection implements GenericConnection {
+
+     //Cached NodeConnectors
+    private List<GenericNodeConnector> nodeConnectors;
+
+
+    public LocalConnection() {
+        this.nodeConnectors = new ArrayList<GenericNodeConnector>();
+
+    }
+
+
+    public void addNodeConnector(GenericNodeConnector nodeConnector) {
+        this.nodeConnectors.add(nodeConnector);
+    }
+
+    public void addDirectoryNode(DirectoryNodeService directory) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<GenericNodeConnector> getNodeConnectors() {
+        return this.nodeConnectors;
+    }
+
+    public List<DirectoryNodeService> getDirectories() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public GenericNodeConnector getBestNode(NodeSelectionStrategy nodeSelectionStrategy) {
+        //Analyze if we will need more than one node connector for local usage in the same JVM
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public DirectoryNodeService getDirectoryNode(DirectoryServiceSelectionStrategy directorySelectionStrategy) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public ExecutionNode getExecutionNode(NodeSelectionStrategy strategy) {
+
+        ExecutionNode node = new ExecutionNode();
+        node.set(KnowledgeBuilderFactoryService.class, new KnowledgeBuilderProviderLocalClient() );
+        node.set(KnowledgeBaseFactoryService.class, new KnowledgeBaseProviderLocalClient() );
+        node.set(DirectoryLookupFactoryService.class, new DirectoryLookupProviderLocalClient());
+        return node;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/DirectoryLookupProviderRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/DirectoryLookupProviderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/DirectoryLookupProviderRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,135 @@
+/*
+ *  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.grid.remote;
+
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.command.FinishedCommand;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.runtime.CommandExecutor;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.grid.command.LookupCommand;
+import org.drools.grid.command.RegisterCommand;
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryLookupProviderRemoteClient implements DirectoryLookupFactoryService {
+
+    //The current node connector
+
+    private GenericNodeConnector client;
+   
+   
+    private GenericConnection connection;
+
+
+    private MessageSession messageSession;
+
+    public DirectoryLookupProviderRemoteClient(GenericNodeConnector client, GenericConnection connection) {
+        this.client = client;
+        this.messageSession = new MessageSession();
+        this.connection = connection;
+    }
+
+    public void register(String identifier,
+            CommandExecutor executor)  {
+        try {
+            String commandId = "client.lookup" + messageSession.getNextId();
+            String kresultsId = "kresults_" + messageSession.getSessionId();
+            int type;
+            if (executor instanceof StatefulKnowledgeSession) {
+                type = 0;
+            } else {
+                throw new IllegalArgumentException("Type is not supported for registration");
+            }
+            Message msg = new Message(messageSession.getSessionId(), messageSession.getCounter().incrementAndGet(), false, new KnowledgeContextResolveFromContextCommand(new RegisterCommand(identifier, ((StatefulKnowledgeSessionRemoteClient) executor).getInstanceId(), type), null, null, null, null));
+
+
+            System.out.println("Registering " + identifier + " - - " + client.getId());
+            connection.getDirectoryNode(null).register(identifier, client.getId());
+            try {
+                Object object = 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);
+            }
+        } catch (RemoteException ex) {
+            Logger.getLogger(DirectoryLookupProviderRemoteClient.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+    }
+
+    public CommandExecutor lookup(String identifier) {
+
+        try {
+            String commandId = "client.lookup" + messageSession.getNextId();
+            String kresultsId = "kresults_" + messageSession.getSessionId();
+            Message msg = new Message(messageSession.getSessionId(), messageSession.getCounter().incrementAndGet(), false, new KnowledgeContextResolveFromContextCommand(new LookupCommand(identifier, commandId), null, null, null, kresultsId));
+            System.out.println("Looking up the session with identifier = " + identifier);
+            client = connection.getDirectoryNode(null).lookup(identifier);
+            try {
+                Object object = client.write(msg).getPayload();
+                if (object == null) {
+                    throw new RuntimeException("Response was not correctly received");
+                }
+                String value = (String) ((ExecutionResults) object).getValue(commandId);
+                String type = String.valueOf(value.charAt(0));
+                String instanceId = value.substring(2);
+                CommandExecutor executor = null;
+                switch (Integer.parseInt(type)) {
+                    case 0:
+                        {
+                            executor = new StatefulKnowledgeSessionRemoteClient(instanceId, client, messageSession);
+                            break;
+                        }
+                    default:
+                        {
+                        }
+                }
+                return executor;
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to execute message", e);
+            }
+        } catch (RemoteException ex) {
+            Logger.getLogger(DirectoryLookupProviderRemoteClient.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return null;
+    }
+   
+
+   
+   
+   
+
+
+   
+    
+    
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseProviderRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseProviderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseProviderRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,98 @@
+package org.drools.grid.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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+public class KnowledgeBaseProviderRemoteClient
+    implements
+    KnowledgeBaseFactoryService {
+    
+    private GenericNodeConnector client;
+    private MessageSession          messageSession;
+    public KnowledgeBaseProviderRemoteClient(GenericNodeConnector client) {
+         this.client = client;
+         this.messageSession = new MessageSession();
+    }
+
+    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( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new NewKnowledgeBaseCommand( null ) ) );
+        try {
+            Object object = 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,
+                                              client, messageSession );
+
+    }
+
+    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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBaseRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,178 @@
+package org.drools.grid.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.grid.generic.CollectionClient;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+public class KnowledgeBaseRemoteClient
+    implements
+    KnowledgeBase {
+
+
+    private GenericNodeConnector       client;
+    private MessageSession              messageSession;
+    private String                     instanceId;
+
+    public KnowledgeBaseRemoteClient(String instanceId,
+                                     GenericNodeConnector client, MessageSession messageSession) {
+        this.instanceId = instanceId;
+        this.client = client;
+        this.messageSession = messageSession;
+    }
+
+    public void addKnowledgePackages(Collection<KnowledgePackage> kpackages) {
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        String kuilderInstanceId = ((CollectionClient<KnowledgePackage>) kpackages).getParentInstanceId();
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBaseAddKnowledgePackagesCommand(),
+                                                                                  kuilderInstanceId,
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  kresultsId ) );
+        
+        try {
+            Object object = 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_" + messageSession.getSessionId();
+
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new KnowledgeContextResolveFromContextCommand( new NewStatefulKnowledgeSessionCommand( null ),
+                                                                                                          null,
+                                                                                                          instanceId,
+                                                                                                          null,
+                                                                                                          kresultsId ) ) );
+
+        try {
+            Object object = 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,
+                                                         client, messageSession );
+    }
+
+    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
+	}
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderProviderRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderProviderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderProviderRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,92 @@
+/**
+ * 
+ */
+package org.drools.grid.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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+public class KnowledgeBuilderProviderRemoteClient
+    implements
+    KnowledgeBuilderFactoryService {
+    
+    private GenericNodeConnector client;
+    private MessageSession messageSession;
+    public KnowledgeBuilderProviderRemoteClient(GenericNodeConnector client) {
+        //this.nodeConnection =  nodeConnection;
+        this.messageSession = new MessageSession();
+        this.client = client;
+
+    }
+
+    public DecisionTableConfiguration newDecisionTableConfiguration() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder() {
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new NewKnowledgeBuilderCommand( null ) ) );
+
+        try {
+            Object object = 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,
+                                                 client, messageSession );
+    }
+
+    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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/KnowledgeBuilderRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,142 @@
+package org.drools.grid.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.grid.generic.CollectionClient;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+public class KnowledgeBuilderRemoteClient
+    implements
+    KnowledgeBuilder {
+    
+    private String                     instanceId;
+    private final GenericNodeConnector client;
+    private final MessageSession messageSession;
+
+    public KnowledgeBuilderRemoteClient(String instanceId,
+                                        GenericNodeConnector client, MessageSession messageSession) {
+        this.instanceId = instanceId;
+        this.client = client;
+        this.messageSession = messageSession;
+    }
+
+    public void add(Resource resource,
+                    ResourceType resourceType) {
+        add( resource,
+             resourceType,
+             null );
+    }
+
+    public void add(Resource resource,
+                    ResourceType resourceType,
+                    ResourceConfiguration configuration) {
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderAddCommand( resource,
+                                                                                                                  resourceType,
+                                                                                                                  configuration ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  null ) );
+
+        try {
+            Object object = 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_" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderGetErrorsCommand( commandId ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = 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_" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.getNextId(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderHasErrorsCommand( commandId ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = 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;
+	}
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/ProcessInstanceRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/ProcessInstanceRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/ProcessInstanceRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -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.grid.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,425 @@
+package org.drools.grid.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.grid.command.GetWorkItemManagerCommand;
+import org.drools.grid.command.RegisterRemoteWorkItemHandlerCommand;
+import org.drools.grid.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.grid.generic.GenericNodeConnector;
+import org.drools.time.SessionClock;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+public class StatefulKnowledgeSessionRemoteClient
+    implements
+    StatefulKnowledgeSession {
+
+
+    private GenericNodeConnector     client;
+    private MessageSession              messageSession;
+    private String                      instanceId;
+
+    public StatefulKnowledgeSessionRemoteClient(String instanceId,
+                                                GenericNodeConnector client, MessageSession messageSession) {
+        this.instanceId = instanceId;
+        this.client = client;
+        this.messageSession = messageSession;
+        
+    }
+
+    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" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new FireAllRulesCommand( commandId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+        try {
+            Object object = 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" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new ExecuteCommand( commandId,
+                                                                                                      command ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = 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_" + messageSession.getSessionId();
+         Message msg = new Message( messageSession.getSessionId(),
+                                    messageSession.counter.incrementAndGet(),
+                                    true,
+                                    new KnowledgeContextResolveFromContextCommand( new GetWorkItemManagerCommand(),
+                                                                                   null,
+                                                                                   null,
+                                                                                   instanceId,
+                                                                                   kresultsId ) );
+         try {
+             Object payload = client.write( msg ).getPayload();
+             WorkItemManager workItemManager = (WorkItemManager) ((ExecutionResults) payload).getValue( "workItemManager" );
+             ((WorkItemManagerRemoteClient)workItemManager).setClient(client);
+             ((WorkItemManagerRemoteClient)workItemManager).setMessageSession(messageSession);
+             ((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_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new RegisterRemoteWorkItemHandlerCommand(name, workItemHandler ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            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" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new StartProcessRemoteCommand( processId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = 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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,66 @@
+package org.drools.grid.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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+/**
+ *
+ * @author Lucas Amador
+ * @author salaboy
+ */
+public class WorkItemManagerRemoteClient implements WorkItemManager, Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	private GenericNodeConnector     client;
+        private MessageSession              messageSession;
+	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_" + messageSession.getSessionId();
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   true,
+                                   new KnowledgeContextResolveFromContextCommand( new CompleteWorkItemCommand(id, results),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+        try {
+            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 setClient(GenericNodeConnector client) {
+            this.client = client;
+        }
+
+        public void setMessageSession(MessageSession messageSession) {
+            this.messageSession = messageSession;
+        }
+
+	
+
+	public void setInstanceId(String instanceId) {
+		this.instanceId = instanceId;
+	}
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/ClientGenericMessageReceiverImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/ClientGenericMessageReceiverImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/ClientGenericMessageReceiverImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,73 @@
+/**
+ * 
+ */
+package org.drools.grid.remote.mina;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.drools.SystemEventListener;
+import org.drools.grid.command.Command;
+
+
+
+
+import org.drools.grid.generic.ClientGenericMessageReceiver;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.GenericMessageHandler;
+import org.drools.grid.generic.Message;
+import org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaAcceptor.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaAcceptor.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaAcceptor.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,45 @@
+package org.drools.grid.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.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,60 @@
+package org.drools.grid.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.grid.generic.ClientGenericMessageReceiver;
+import org.drools.grid.generic.GenericMessageHandler;
+import org.drools.grid.generic.Message;
+import org.drools.grid.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 ) );
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoWriter.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoWriter.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaIoWriter.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,23 @@
+package org.drools.grid.remote.mina;
+
+import org.apache.mina.core.session.IoSession;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.Message;
+import org.drools.grid.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 );
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaNodeConnector.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaNodeConnector.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/remote/mina/MinaNodeConnector.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,122 @@
+package org.drools.grid.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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageResponseHandler;
+import org.drools.grid.responsehandlers.BlockingMessageResponseHandler;
+
+public class MinaNodeConnector
+    implements
+    GenericNodeConnector,
+    GenericIoWriter {
+
+
+    protected IoSession           session;
+
+    protected final String        name;
+    protected AtomicInteger       counter;
+    protected SocketConnector     connector;
+    protected SocketAddress       address;
+    protected SystemEventListener eventListener;
+
+    public MinaNodeConnector(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;
+    }
+
+    public String getId() {
+        return String.valueOf(session.getId());
+    }
+
+    public void setSession(Object object) {
+        this.session = (IoSession) object;
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBaseResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBaseResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBaseResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,69 @@
+package org.drools.grid.responsehandlers;
+
+import java.lang.reflect.Constructor;
+
+import org.drools.grid.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;
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBlockingResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBlockingResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/AbstractBlockingResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,37 @@
+/**
+ *
+ */
+package org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/BlockingMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/BlockingMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/responsehandlers/BlockingMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package org.drools.grid.responsehandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.grid.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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/DirectoryServiceSelectionStrategy.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/DirectoryServiceSelectionStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/DirectoryServiceSelectionStrategy.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,26 @@
+/*
+ *  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.grid.strategies;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryServiceSelectionStrategy {
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/ReturnAlwaysTheFirstSelectionStrategy.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/ReturnAlwaysTheFirstSelectionStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/ReturnAlwaysTheFirstSelectionStrategy.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,43 @@
+/*
+ *  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.grid.strategies;
+
+import org.drools.grid.NodeSelectionStrategy;
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+
+/**
+ *
+ * @author salaboy
+ */
+public class ReturnAlwaysTheFirstSelectionStrategy implements NodeSelectionStrategy{
+
+    private GenericConnection connection;
+    public ReturnAlwaysTheFirstSelectionStrategy(GenericConnection connection) {
+        this.connection = connection;
+    }
+    public GenericNodeConnector getBestNode() {
+        return this.connection.getNodeConnectors().get(0);
+    }
+
+    public void setConnection(GenericConnection connection) {
+        this.connection = connection;
+    }
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/StaticIncrementalSelectionStrategy.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/StaticIncrementalSelectionStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/main/java/org/drools/grid/strategies/StaticIncrementalSelectionStrategy.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,51 @@
+/*
+ *  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.grid.strategies;
+
+
+import org.drools.grid.NodeSelectionStrategy;
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+
+
+/**
+ *
+ * @author salaboy
+ */
+public class StaticIncrementalSelectionStrategy implements NodeSelectionStrategy{
+    public static int counter = 0;
+    private GenericConnection connection;
+    public StaticIncrementalSelectionStrategy(GenericConnection connection) {
+        this.connection = connection;
+    }
+
+
+    @Override
+    public GenericNodeConnector getBestNode() {
+        System.out.println("!!!!!GET BEST NODE = "+counter);
+        GenericNodeConnector service = connection.getNodeConnectors().get(counter);
+        StaticIncrementalSelectionStrategy.counter = counter +1;
+        return service;
+    }
+
+    public void setConnection(GenericConnection connection) {
+        this.connection = connection;
+    }
+    
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/ExecutionNodeBaseTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/ExecutionNodeBaseTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/ExecutionNodeBaseTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,222 @@
+/*
+ *  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.grid;
+
+
+import org.drools.KnowledgeBase;
+import org.drools.grid.ExecutionNode;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.command.runtime.rule.FireAllRulesCommand;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.grid.generic.GenericConnection;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+/**
+ *
+ * @author salaboy
+ */
+
+public abstract class ExecutionNodeBaseTest {
+
+    protected ExecutionNode node;
+    protected GenericConnection connection;
+
+    @Before
+    protected abstract void configureNode() throws Exception;
+
+    public ExecutionNodeBaseTest() {
+        
+    }
+
+
+    @Test
+    public void fireAllRules(){
+
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+         
+        KnowledgeBuilder kbuilder =
+                node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase =
+                node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        Assert.assertNotNull(ksession);
+
+        int fired = ksession.fireAllRules();
+        Assert.assertEquals( 2, fired );
+
+
+    }
+    @Test
+    public void testExecute() throws Exception {
+        
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ExecutionResults results = ksession.execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2,
+                      (int) (Integer) results.getValue( "fired" ) );
+    }
+    @Test
+    public void testNamedService() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        node.get(DirectoryLookupFactoryService.class).register( "ksession1",
+                              ksession );
+
+        ExecutionResults results = node.get(DirectoryLookupFactoryService.class).lookup( "ksession1" ).execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2,
+                      (int) (Integer) results.getValue( "fired" ) );
+    }
+    @Test
+    public void testVsmPipeline() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        node.get(DirectoryLookupFactoryService.class).register( "ksession1",
+                              ksession );
+
+        ExecutionResults results = node.get(DirectoryLookupFactoryService.class).lookup( "ksession1" ).execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2, (int ) ( Integer) results.getValue( "fired" ) );
+    }
+  
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/LocalExecutionNodeTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/LocalExecutionNodeTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/LocalExecutionNodeTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,43 @@
+/*
+ *  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.grid;
+
+import org.drools.grid.local.LocalConnection;
+import org.junit.Before;
+
+/**
+ *
+ * @author salaboy
+ */
+public class LocalExecutionNodeTest extends ExecutionNodeBaseTest{
+
+    public LocalExecutionNodeTest() {
+    }
+
+   
+
+    @Before
+    public void configureNode() {
+        connection = new LocalConnection();
+        node = connection.getExecutionNode(null);
+    }
+
+   
+
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/RemoteExecutionNodeTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/RemoteExecutionNodeTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-core/src/test/java/org/drools/grid/RemoteExecutionNodeTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,99 @@
+/*
+ *  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.grid;
+
+import java.rmi.RemoteException;
+import java.util.Iterator;
+import org.drools.grid.remote.mina.MinaNodeConnector;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import java.io.IOException;
+import org.drools.grid.remote.mina.MinaAcceptor;
+import org.drools.grid.generic.GenericMessageHandlerImpl;
+import org.drools.grid.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.grid.generic.NodeData;
+import java.net.SocketAddress;
+import java.net.InetSocketAddress;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.RemoteConnection;
+import org.drools.grid.local.DirectoryNodeLocalImpl;
+import org.drools.grid.strategies.StaticIncrementalSelectionStrategy;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ *
+ * @author salaboy
+ */
+public class RemoteExecutionNodeTest extends ExecutionNodeBaseTest{
+    private MinaAcceptor server;
+    
+    public RemoteExecutionNodeTest() {
+    }
+
+   
+
+    @Before
+    public void configureNode() throws IOException {
+        connection = new RemoteConnection();
+
+        StaticIncrementalSelectionStrategy.counter = 0;
+        SocketAddress address = new InetSocketAddress( "127.0.0.1",
+                                                       9123 );
+
+        NodeData nodeData = new NodeData();
+        // setup Server
+        SocketAcceptor acceptor = new NioSocketAcceptor();
+        acceptor.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener(),
+                                                new GenericMessageHandlerImpl( nodeData,
+                                                                               SystemEventListenerFactory.getSystemEventListener() ) ) );
+        this.server = new MinaAcceptor( acceptor,
+                                        address );
+        this.server.start();
+
+        connection.addDirectoryNode(new DirectoryNodeLocalImpl());
+
+        // setup Client
+        NioSocketConnector clientConnector = new NioSocketConnector();
+        clientConnector.setHandler( new MinaIoHandler( SystemEventListenerFactory.getSystemEventListener() ) );
+        GenericNodeConnector minaClient = new MinaNodeConnector( "client 1",
+                                                         clientConnector,
+                                                         address,
+                                                         SystemEventListenerFactory.getSystemEventListener() );
+        connection.addNodeConnector(minaClient);
+        node = connection.getExecutionNode(null); 
+        
+    }
+
+    @After
+    public void tearDown() throws RemoteException {
+        
+        for(Iterator<GenericNodeConnector> iterator = connection.getNodeConnectors().iterator(); iterator.hasNext();){
+            iterator.next().disconnect();
+        }
+       
+        this.server.stop();
+
+    }
+
+    
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/pom.xml
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/pom.xml	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/pom.xml	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>drools</artifactId>
+    <groupId>org.drools</groupId>
+    <version>5.1.0.SNAPSHOT</version>
+  </parent>
+  
+  <artifactId>drools-grid-rio</artifactId>
+  <name>Drools :: Grid :: RIO</name>
+  
+  <packaging>oar</packaging>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.6</version>
+      <scope>test</scope>
+    </dependency>
+
+     <!-- Drools Runtime -->
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-api</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+            
+        </dependency>
+
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-core</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+            
+        </dependency>
+
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-compiler</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+
+        </dependency>
+
+       <!-- Drools Grid Core -->
+       <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-grid-core</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+        </dependency>
+
+        <!-- RIO Runtime -->
+         <dependency>
+            <groupId>org.rioproject</groupId>
+            <artifactId>rio</artifactId>
+            <version>4.0</version>
+        </dependency>
+
+        <!-- RIO Test framework -->
+        <dependency>
+            <groupId>org.rioproject</groupId>
+            <artifactId>rio-test</artifactId>
+            <version>4.0</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- RIO Gnostic -->
+        <dependency>
+            <groupId>org.rioproject</groupId>
+            <artifactId>gnostic</artifactId>
+            <version>4.0</version>
+            
+        </dependency>
+
+  </dependencies>
+  <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-rio-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <opstring>src/test/resources/org/drools/executionNodeService.groovy</opstring>
+                    <createJar>
+                        <classifier>dl</classifier>
+                        <ins>
+                            <in>org.drools.grid</in>
+                            <in>org.rioproject.gnostic</in>
+                        </ins>
+                        <topclasses>
+                            <topclass>org.drools.grid.ExecutionNodeService</topclass>
+                            <topclass>org.drools.grid.DirectoryNodeService</topclass>
+                            <topclass>org.drools.grid.distributed.util.IDEntry</topclass>
+                            <topclass>org.drools.impl.SystemEventListenerServiceImpl</topclass>
+                            <topclass>org.rioproject.gnostic.Gnostic</topclass>
+                        </topclasses>
+                    </createJar>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>**/*IT*.java</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>failsafe-maven-plugin</artifactId>
+                <version>2.4.3-alpha-1</version>
+                <configuration>
+                    <forkMode>always</forkMode>
+                    <argLine>-DRIO_TEST_ATTACH</argLine>
+                    <systemProperties>
+
+                        <property>
+                            <name>opstring</name>
+                            <value>src/test/resources/org/drools/executionNodeService.groovy</value>
+                        </property>
+                        <property>
+                            <name>org.rioproject.test.config</name>
+                            <value>src/test/conf/test-config.groovy</value>
+                        </property>
+                      
+                        <property>
+                            <name>org.rioproject.test.manager.config</name>
+                            <value>src/test/conf/manager-config.groovy</value>
+                        </property>
+                    </systemProperties>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <repositories>
+        <repository>
+            <id>rio</id>
+            <url>http://www.rio-project.org/maven2</url>
+        </repository>
+       
+      
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>rio</id>
+            <url>http://www.rio-project.org/maven2</url>
+        </pluginRepository>
+
+        <pluginRepository>
+
+            <id>elastic-grid</id>
+            <url>http://maven.elastic-grid.com</url>
+
+        </pluginRepository>
+    </pluginRepositories>
+</project>

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/DirectoryLookupProviderGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/DirectoryLookupProviderGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/DirectoryLookupProviderGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,148 @@
+/*
+ *  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.grid.distributed;
+
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.ExecutionNodeService;
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.command.FinishedCommand;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.runtime.CommandExecutor;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.grid.command.LookupCommand;
+import org.drools.grid.command.RegisterCommand;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryLookupProviderGridClient implements DirectoryLookupFactoryService {
+
+    private GridConnection gridClient;
+    private GenericNodeConnector currentService;
+    private MessageSession messageSession;
+
+  
+
+    public DirectoryLookupProviderGridClient(GenericNodeConnector currentService, GridConnection gridClient) {
+        this.currentService = currentService;
+        this.gridClient = gridClient;
+        this.messageSession = new MessageSession();
+    }
+
+    public void register(String identifier,
+                         CommandExecutor executor) {
+        try {
+            String commandId = "client.lookup" + messageSession.getNextId();
+            String kresultsId = "kresults_" + messageSession.getSessionId();
+            int type;
+
+
+            if ( executor instanceof StatefulKnowledgeSession ) {
+                type = 0;
+            } else {
+                throw new IllegalArgumentException("Type is not supported for registration");
+            }
+            Message msg = new Message(messageSession.getSessionId(), messageSession.getCounter().incrementAndGet(), false, new KnowledgeContextResolveFromContextCommand(new RegisterCommand(identifier, ((StatefulKnowledgeSessionGridClient) executor).getInstanceId(), type), null, null, null, null));
+            System.out.println("Registering " + identifier + " - - " + currentService.getId());
+            try {
+               // DirectoryNodeService directory = (DirectoryNodeService) gridClient.getDirectories().iterator().next();
+                for(DirectoryNodeService directory : gridClient.getDirectories() ){
+
+                        directory.register(identifier, currentService.getId());
+                    
+                }
+            } catch (RemoteException ex) {
+                Logger.getLogger(DirectoryLookupProviderGridClient.class.getName()).log(Level.SEVERE, null, ex);
+            }
+            try {
+                Object object = currentService.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);
+            }
+        } catch ( RemoteException ex ) {
+            Logger.getLogger(DirectoryLookupProviderGridClient.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    public CommandExecutor lookup(String identifier) {
+        String commandId = "client.lookup" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.getCounter().incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new LookupCommand( identifier,
+                                                                                                     commandId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+        System.out.println("Looking up the session with identifier = "+identifier);
+            try {
+            //First I need to get the correct client ExecutionNodeService with the identifier
+            //Look in all the DirectoryNodes
+            //DirectoryNodeService directory = (DirectoryNodeService) gridClient.getDirectories().iterator().next();
+            
+             for(DirectoryNodeService directory : gridClient.getDirectories() )  {
+                currentService = directory.lookup(identifier);
+             }
+            
+        } catch (RemoteException ex) {
+            Logger.getLogger(DirectoryLookupProviderGridClient.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        try {
+            Object object = currentService.write( msg ).getPayload();
+
+            if ( object == null ) {
+                throw new RuntimeException( "Response was not correctly received" );
+            }
+            String value = (String) ((ExecutionResults) object).getValue( commandId );
+            String type = String.valueOf( value.charAt( 0 ) );
+            String instanceId = value.substring( 2 );
+
+            CommandExecutor executor = null;
+            switch ( Integer.parseInt( type ) ) {
+                case 0 : {
+                    executor = new StatefulKnowledgeSessionGridClient( instanceId, currentService, messageSession );
+                    break;
+                }
+                default : {
+
+                }
+
+            }
+
+            return executor;
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GenericMessageGridHandlerImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GenericMessageGridHandlerImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GenericMessageGridHandlerImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,144 @@
+package org.drools.grid.distributed;
+
+import org.drools.grid.DirectoryNodeService;
+import java.io.IOException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.core.lookup.ServiceTemplate;
+import net.jini.discovery.LookupDiscoveryManager;
+import net.jini.lease.LeaseRenewalManager;
+import net.jini.lookup.ServiceDiscoveryManager;
+
+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;
+import org.drools.grid.generic.NodeData;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.GenericMessageHandler;
+import org.drools.grid.generic.Message;
+
+
+public class GenericMessageGridHandlerImpl implements GenericMessageHandler {
+    private SystemEventListener systemEventListener;
+
+    private NodeData  data;
+    private DirectoryNodeService registry;
+
+    public GenericMessageGridHandlerImpl(NodeData data,
+                                 SystemEventListener systemEventListener) {
+        this.systemEventListener = systemEventListener;
+        this.data = data;
+        
+        Class[] classes = new Class[]{org.drools.grid.DirectoryNodeService.class};
+        ServiceTemplate tmpl = new ServiceTemplate(null, classes,null);
+
+        LookupDiscoveryManager lookupDiscovery = null;
+        try {
+            lookupDiscovery = new LookupDiscoveryManager(LookupDiscoveryManager.ALL_GROUPS, null, null);
+        } catch (IOException ex) {
+            Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        System.out.println("Discovering Manager service ...");
+
+        ServiceDiscoveryManager serviceDiscovery =  null;
+        try {
+            serviceDiscovery = new ServiceDiscoveryManager(lookupDiscovery, new LeaseRenewalManager());
+        } catch (IOException ex) {
+            Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        /* Wait no more then 10 seconds to discover the service */
+        ServiceItem item = null;
+        try {
+            try {
+                item = serviceDiscovery.lookup(tmpl, null, 1000);
+            } catch (RemoteException ex) {
+                Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        } catch (InterruptedException ex) {
+            Logger.getLogger(GenericMessageGridHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        serviceDiscovery.terminate();
+
+        if(item != null) {
+            System.out.println("Discovered Registry service");
+            if(item.service instanceof DirectoryNodeService){
+                registry = (DirectoryNodeService)item.service;
+
+            }
+
+
+        } else {
+            System.out.println("Registry service not discovered, make sure the"+
+                               "service is deployed");
+        }
+
+    }
+
+  
+
+    
+
+    
+    /* (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 );
+        //@TODO: replace with Environment ?? this needs to change..
+        localSessionContext.set("registry", registry);
+        
+        for ( GenericCommand cmd : commands ) {
+            // evaluate the commands
+            cmd.execute( localSessionContext );
+        }
+
+        if(localSessionContext.get("kbase") != null){
+            session.write( new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        localSessionContext.get("kbase") ), null );
+        
+        } else 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 );
+        }
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GridConnection.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GridConnection.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/GridConnection.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,122 @@
+/*
+ *  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.grid.distributed;
+
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.builder.DirectoryLookupFactoryService;
+import java.util.ArrayList;
+import java.util.List;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.NodeSelectionStrategy;
+import org.drools.grid.generic.GenericConnection;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.strategies.DirectoryServiceSelectionStrategy;
+import org.drools.grid.strategies.StaticIncrementalSelectionStrategy;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
+/**
+ *
+ * @author salaboy
+ */
+public class GridConnection implements GenericConnection {
+
+    //Cached Services
+    private List<GenericNodeConnector> nodeConnectors;
+    //Cached Directories
+    private List<DirectoryNodeService> directories;
+
+    public GridConnection() {
+        this.nodeConnectors = new ArrayList<GenericNodeConnector>();
+        this.directories = new ArrayList<DirectoryNodeService>();
+    }
+
+    public void addNodeConnector(GenericNodeConnector service) {
+
+        this.nodeConnectors.add(service);
+
+    }
+
+    public void addDirectoryNode(DirectoryNodeService directory) {
+        this.directories.add(directory);
+    }
+
+    // In real scenarios this method will be in charge of populating
+    // all the ExecutionNodeService and DirectoryServices
+    public void connect() {
+        throw new NotImplementedException();
+    }
+
+    
+    @Override
+    public ExecutionNode getExecutionNode(NodeSelectionStrategy strategy) {
+        ExecutionNode node = null;
+        GenericNodeConnector currentNode = null;
+        try {
+           
+            //if the strategy is null use the default one
+            if (strategy == null) {
+                currentNode = getBestNode(new StaticIncrementalSelectionStrategy(this));
+            } else {
+                strategy.setConnection(this);
+                currentNode = getBestNode(strategy);
+            }
+            if (currentNode.connect()) {
+                node = new ExecutionNode();
+                node.set(KnowledgeBuilderFactoryService.class, new KnowledgeBuilderProviderGridClient(currentNode, this));
+                node.set(KnowledgeBaseFactoryService.class, new KnowledgeBaseProviderGridClient(currentNode, this));
+                node.set(DirectoryLookupFactoryService.class, new DirectoryLookupProviderGridClient(currentNode, this));
+            }
+            
+        } catch (RemoteException ex) {
+            Logger.getLogger(GridConnection.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return node;
+    }
+
+    
+
+    
+    public GenericNodeConnector getBestNode(NodeSelectionStrategy nodeSelectionStrategy) {
+        return nodeSelectionStrategy.getBestNode();
+    }
+
+    public List<DirectoryNodeService> getDirectories() {
+        return directories;
+    }
+
+    public void setDirectories(List<DirectoryNodeService> directories) {
+        this.directories = directories;
+    }
+
+    public List<GenericNodeConnector> getNodeConnectors() {
+        return nodeConnectors;
+    }
+
+    public void setServices(List<GenericNodeConnector> services) {
+        this.nodeConnectors = services;
+    }
+
+    @Override
+    public DirectoryNodeService getDirectoryNode(DirectoryServiceSelectionStrategy directorySelectionStrategy) {
+        return directories.get(0);
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,199 @@
+package org.drools.grid.distributed;
+
+import org.drools.grid.DirectoryNodeService;
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+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.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.grid.generic.CollectionClient;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+import org.drools.grid.distributed.command.NewStatefulKnowledgeSessionGridCommand;
+import org.drools.grid.distributed.rio.InternalRioNodeConnector;
+
+
+public class KnowledgeBaseGridClient
+    implements
+    KnowledgeBase {
+
+
+    private GenericNodeConnector     client;
+    private MessageSession              messageSession;
+    private String                      instanceId;
+    private GridConnection gridClient;
+    
+    public KnowledgeBaseGridClient(String instanceId,
+                                     GenericNodeConnector client, MessageSession messageSession, GridConnection gridClient) {
+        this.instanceId = instanceId;
+
+        this.client = client;
+        this.messageSession = messageSession;
+        this.gridClient = gridClient; 
+    }
+
+    public void addKnowledgePackages(Collection<KnowledgePackage> kpackages) {
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        String kuilderInstanceId = ((CollectionClient<KnowledgePackage>) kpackages).getParentInstanceId();
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBaseAddKnowledgePackagesCommand(),
+                                                                                  kuilderInstanceId,
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  kresultsId ) );
+        try {
+            //I should register the kbase ID??
+            DirectoryNodeService directory = gridClient.getDirectories().iterator().next();
+            if(directory != null){
+                directory.registerKBase(instanceId, client.getId());
+            }
+            //nodeConnection.getRegistryService().registerKBase(, );
+        } catch (RemoteException ex) {
+            Logger.getLogger(KnowledgeBaseGridClient.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        try {
+            Object object = 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_" + messageSession.getSessionId();
+
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new KnowledgeContextResolveFromContextCommand( new NewStatefulKnowledgeSessionGridCommand( null, instanceId ),
+                                                                                                          null,
+                                                                                                          instanceId,
+                                                                                                          null,
+                                                                                                          kresultsId ) ) );
+
+        try {
+            Object object = 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 StatefulKnowledgeSessionGridClient( localId,
+                                                         client, messageSession );
+    }
+
+    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
+	}
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseProviderGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseProviderGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBaseProviderGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,122 @@
+package org.drools.grid.distributed;
+
+
+import org.drools.grid.ExecutionNodeService;
+import java.util.Properties;
+import java.util.UUID;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.SystemEventListenerFactory;
+
+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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+import org.drools.grid.distributed.rio.InternalRioNodeConnector;
+
+
+public class KnowledgeBaseProviderGridClient
+    implements
+    KnowledgeBaseFactoryService {
+    
+    private GridConnection gridClient;
+    private String localId = "";   
+    private GenericNodeConnector client;
+    private MessageSession messageSession;
+    
+    public KnowledgeBaseProviderGridClient(GenericNodeConnector currentService, GridConnection gridClient) {
+        
+        this.gridClient = gridClient;
+        this.messageSession = new MessageSession();
+        this.client = new InternalRioNodeConnector("client 1", SystemEventListenerFactory.getSystemEventListener(), (ExecutionNodeService) currentService);
+
+    }
+
+   
+    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);
+        if(localId == null || localId.equals("")){
+            localId = UUID.randomUUID().toString();
+        }
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new NewKnowledgeBaseCommand( null ) ) );
+        try {
+            Object object = 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 KnowledgeBaseGridClient( localId,
+                                              client, messageSession, gridClient);
+
+    }
+
+    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;
+    }
+
+    public String getLocalId() {
+        return localId;
+    }
+
+    public void setLocalId(String localId) {
+        this.localId = localId;
+    }
+
+   
+    
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,147 @@
+package org.drools.grid.distributed;
+
+import org.drools.KnowledgeBase;
+
+import java.util.Collection;
+
+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.grid.generic.CollectionClient;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+
+public class KnowledgeBuilderGridClient
+    implements
+    KnowledgeBuilder {
+    //private GridExecutionNodeConnection nodeConnection;
+    private String                      instanceId;
+    private GenericNodeConnector     client;
+    private MessageSession              messageSession;
+    
+    public KnowledgeBuilderGridClient(String instanceId,
+                                        GenericNodeConnector client, MessageSession messageSession) {
+        this.instanceId = instanceId;
+        //this.nodeConnection = nodeConnection;
+        this.client = client;
+        this.messageSession = messageSession;
+
+        
+    }
+
+    public void add(Resource resource,
+                    ResourceType resourceType) {
+        add( resource,
+             resourceType,
+             null );
+    }
+
+    public void add(Resource resource,
+                    ResourceType resourceType,
+                    ResourceConfiguration configuration) {
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderAddCommand( resource,
+                                                                                                                  resourceType,
+                                                                                                                  configuration ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  null ) );
+
+        try {
+            Object object = 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_" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderGetErrorsCommand( commandId ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = 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_" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.getNextId(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new KnowledgeBuilderHasErrorsCommand( commandId ),
+                                                                                  instanceId,
+                                                                                  null,
+                                                                                  null,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = 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 );
+        }
+        
+        
+        
+    }
+
+    @Override
+    public KnowledgeBase newKnowledgeBase() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderProviderGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderProviderGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/KnowledgeBuilderProviderGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,100 @@
+/**
+ * 
+ */
+package org.drools.grid.distributed;
+
+
+import org.drools.grid.ExecutionNodeService;
+import java.util.Properties;
+import java.util.UUID;
+
+import org.drools.KnowledgeBase;
+import org.drools.SystemEventListenerFactory;
+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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+import org.drools.grid.distributed.rio.InternalRioNodeConnector;
+
+
+public class KnowledgeBuilderProviderGridClient
+    implements
+    KnowledgeBuilderFactoryService {
+    
+    private MessageSession messageSession;
+    private GenericNodeConnector client;
+
+
+
+    public KnowledgeBuilderProviderGridClient(GenericNodeConnector currentService, GridConnection gridClient) {
+            this.messageSession = new MessageSession();
+            client = new InternalRioNodeConnector("client 1", SystemEventListenerFactory.getSystemEventListener(), (ExecutionNodeService) currentService);
+        
+    }
+
+    public DecisionTableConfiguration newDecisionTableConfiguration() {
+        // TODO Auto-generated method stub
+        return null; 
+    }
+
+    public KnowledgeBuilder newKnowledgeBuilder() {
+        String localId = UUID.randomUUID().toString();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new SetVariableCommand( "__TEMP__",
+                                                           localId,
+                                                           new NewKnowledgeBuilderCommand( null ) ) );
+
+        try {
+            Object object = 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 KnowledgeBuilderGridClient( localId,
+                                                 client, messageSession );
+    }
+
+    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

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/StatefulKnowledgeSessionGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/StatefulKnowledgeSessionGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/StatefulKnowledgeSessionGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,433 @@
+package org.drools.grid.distributed;
+
+
+import org.drools.grid.ExecutionNodeService;
+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.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.grid.command.GetWorkItemManagerCommand;
+import org.drools.grid.command.RegisterRemoteWorkItemHandlerCommand;
+import org.drools.grid.command.StartProcessRemoteCommand;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+import org.drools.time.SessionClock;
+
+
+public class StatefulKnowledgeSessionGridClient
+    implements
+    StatefulKnowledgeSession {
+
+    private GenericNodeConnector     nodeConnection;
+    private String                      instanceId;
+    private MessageSession              messageSession;
+    
+
+    
+
+    
+
+    public StatefulKnowledgeSessionGridClient(String instanceId, GenericNodeConnector currentService, MessageSession messageSession) {
+        this.instanceId = instanceId;
+        this.nodeConnection = currentService;
+        this.messageSession = messageSession;
+    }
+
+
+
+
+    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" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                  messageSession.getCounter().incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new FireAllRulesCommand( commandId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+        try {
+            Object object = nodeConnection.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" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new ExecuteCommand( commandId,
+                                                                                                      command ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = nodeConnection.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_" + messageSession.getSessionId();
+         Message msg = new Message( messageSession.getSessionId(),
+                                    messageSession.counter.incrementAndGet(),
+                                    true,
+                                    new KnowledgeContextResolveFromContextCommand( new GetWorkItemManagerCommand(),
+                                                                                   null,
+                                                                                   null,
+                                                                                   instanceId,
+                                                                                   kresultsId ) );
+         try {
+             Object payload = nodeConnection.write( msg ).getPayload();
+             WorkItemManager workItemManager = (WorkItemManager) ((ExecutionResults) payload).getValue( "workItemManager" );
+             ((WorkItemManagerGridClient)workItemManager).setClient(nodeConnection);
+             ((WorkItemManagerGridClient)workItemManager).setMessageSession(messageSession);
+             ((WorkItemManagerGridClient)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_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new RegisterRemoteWorkItemHandlerCommand(name, workItemHandler ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            nodeConnection.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" + messageSession.getNextId();
+        String kresultsId = "kresults_" + messageSession.getSessionId();
+
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   false,
+                                   new KnowledgeContextResolveFromContextCommand( new StartProcessRemoteCommand( processId ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+
+        try {
+            Object object = nodeConnection.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;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/WorkItemManagerGridClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/WorkItemManagerGridClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/WorkItemManagerGridClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,69 @@
+package org.drools.grid.distributed;
+
+
+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.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageSession;
+
+
+/**
+ *
+ * @author Lucas Amador
+ * @author salaboy: salaboy at gmail.com
+ */
+public class WorkItemManagerGridClient implements WorkItemManager, Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	//private GridExecutionNodeConnection nodeConnection;
+        private GenericNodeConnector client;
+        private MessageSession messageSession;
+	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_" + messageSession.getSessionId();
+        Message msg = new Message( messageSession.getSessionId(),
+                                   messageSession.counter.incrementAndGet(),
+                                   true,
+                                   new KnowledgeContextResolveFromContextCommand( new CompleteWorkItemCommand(id, results),
+                                                                                  null,
+                                                                                  null,
+                                                                                  instanceId,
+                                                                                  kresultsId ) );
+        try {
+            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 setClient(GenericNodeConnector client) {
+            this.client = client;
+        }
+
+        public void setMessageSession(MessageSession messageSession) {
+            this.messageSession = messageSession;
+        }
+
+	
+
+	public void setInstanceId(String instanceId) {
+		this.instanceId = instanceId;
+	}
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/command/NewStatefulKnowledgeSessionGridCommand.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/command/NewStatefulKnowledgeSessionGridCommand.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/command/NewStatefulKnowledgeSessionGridCommand.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,61 @@
+package org.drools.grid.distributed.command;
+
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.drools.KnowledgeBase;
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.grid.DirectoryNodeService;
+
+
+public class NewStatefulKnowledgeSessionGridCommand
+    implements
+    GenericCommand<StatefulKnowledgeSession> {
+
+    private KnowledgeSessionConfiguration ksessionConf;
+    private String kbaseId;
+    
+    public NewStatefulKnowledgeSessionGridCommand(KnowledgeSessionConfiguration ksessionConf) {
+        this.ksessionConf = ksessionConf;
+    }
+
+    public NewStatefulKnowledgeSessionGridCommand(KnowledgeSessionConfiguration ksessionConf, String kbaseId) {
+        this.ksessionConf = ksessionConf;
+        this.kbaseId = kbaseId;
+    }
+    
+
+    public StatefulKnowledgeSession execute(Context context) {
+
+        KnowledgeBase kbase = ((KnowledgeCommandContext) context).getKnowledgeBase();
+        DirectoryNodeService registry = (DirectoryNodeService)context.get("registry");
+        System.out.println("Inside Grid Command!!!!!!!!");
+        System.out.println("Registry = "+registry);
+        System.out.println("KbaseId = "+kbaseId);
+        StatefulKnowledgeSession ksession;
+
+        if( kbase == null){
+            try {
+                //@TODO: need to find the best way to injec the service in the command or the command executor.
+                //lookup in the registry service.
+                kbase = registry.lookupKBase(kbaseId);
+            } catch (RemoteException ex) {
+                Logger.getLogger(NewStatefulKnowledgeSessionGridCommand.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+        if ( this.ksessionConf == null ) {
+            System.out.println("Kbase inside the newStatefull Session = "+kbase);
+            ksession = kbase.newStatefulKnowledgeSession();
+            
+        } else {
+            ksession = kbase.newStatefulKnowledgeSession( this.ksessionConf, null );
+        }
+
+        return ksession;
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/DirectoryNodeServiceImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/DirectoryNodeServiceImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/DirectoryNodeServiceImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,107 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.drools.grid.distributed.impl;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.drools.KnowledgeBase;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.command.runtime.GetKnowledgeBaseCommand;
+import org.drools.grid.generic.Message;
+import org.drools.grid.ExecutionNodeService;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.generic.GenericNodeConnector;
+
+
+/**
+ *
+ * @author salaboy
+ */
+public class DirectoryNodeServiceImpl implements DirectoryNodeService{
+
+    
+
+    private Map<String, String> directoryMap = new HashMap<String, String>();
+
+    private Map<String, String> kbaseDirectoryMap = new HashMap<String, String>();
+
+    private Iterable<ExecutionNodeService> nodeServices;
+
+    public DirectoryNodeServiceImpl() {
+        nodeServices = new ArrayList<ExecutionNodeService>();
+    }
+
+    
+    
+    @Override
+    public void register(String sessionId, String sessionServiceId) throws RemoteException {
+        System.out.println("Registering: "+  sessionId + " -- "+sessionServiceId);
+        directoryMap.put(sessionId, sessionServiceId);
+    }
+
+    @Override
+    public GenericNodeConnector lookup(String sessionId) throws RemoteException {
+        ExecutionNodeService sessionService = null;
+        String sessionServiceId = (String)directoryMap.get(sessionId);
+        System.out.println("Registry = "+ directoryMap.toString());
+        System.out.println("Nodes Services = "+nodeServices);
+        for(ExecutionNodeService ss : nodeServices){
+            System.out.println("Session Service id = "+ss.getId() + "needs to match with ="+sessionServiceId);
+            if(ss.getId().equals(sessionServiceId)){
+                sessionService = ss;
+            }
+        }     
+
+        return sessionService;
+    }
+
+
+    public void setNodeServices(Iterable<ExecutionNodeService> nodeServices) {
+        this.nodeServices = nodeServices;
+    }
+
+    @Override
+    public void registerKBase(String kbaseId, String nodeServiceId) throws RemoteException {
+        System.out.println("Registering KnowledgeBase = "+kbaseId +" -in NS=" +nodeServiceId);
+        kbaseDirectoryMap.put(kbaseId, nodeServiceId);
+    }
+
+    @Override
+    public KnowledgeBase lookupKBase(String kbaseId) throws RemoteException{
+        ExecutionNodeService nodeService = null;
+        String nodeServiceId = (String)kbaseDirectoryMap.get(kbaseId);
+        System.out.println("Kbase Registry = "+ kbaseDirectoryMap.toString());
+        System.out.println("Session Services = "+nodeService);
+        for(ExecutionNodeService ns : nodeServices){
+            System.out.println("Node Service id = "+ns.getId() + "needs to match with ="+nodeServiceId);
+            if(ns.getId().equals(nodeServiceId)){
+                nodeService = ns;
+            }
+        }
+        System.out.println("Node Service = "+nodeService);
+        
+        try {
+            Message msg = nodeService.write(new Message(999,1000,false, new KnowledgeContextResolveFromContextCommand( new GetKnowledgeBaseCommand(), null, kbaseId, null, null)));
+            System.out.println("MSG returned by nodeService = "+msg);
+            if (msg.getPayload() instanceof KnowledgeBase) {
+                System.out.println("Kbase in the payload: "+(KnowledgeBase)msg.getPayload());
+                return (KnowledgeBase)msg.getPayload();
+            }
+            return null;
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to execute message",
+                                        e );
+        }
+    }
+
+    @Override
+    public void addService(GenericNodeConnector service) {
+        ((List)nodeServices).add(service);
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/ExecutionNodeServiceImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/ExecutionNodeServiceImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/impl/ExecutionNodeServiceImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,128 @@
+/*
+ *  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.grid.distributed.impl;
+
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.drools.SystemEventListener;
+import org.drools.SystemEventListenerFactory;
+import org.drools.grid.generic.BlockingGenericIoWriter;
+import org.drools.grid.generic.GenericMessageHandler;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageResponseHandler;
+import org.drools.grid.generic.NodeData;
+import org.drools.grid.distributed.GenericMessageGridHandlerImpl;
+import org.drools.grid.ExecutionNodeService;
+import org.drools.grid.distributed.util.IDEntry;
+
+import org.rioproject.core.jsb.ServiceBeanContext;
+import org.rioproject.watch.GaugeWatch;
+
+/**
+ *
+ * @author salaboy
+ */
+public class ExecutionNodeServiceImpl implements ExecutionNodeService {
+
+    private GenericMessageHandler handler;
+    private String id;
+    private GaugeWatch loadWatch;
+    private Long instanceID;
+
+    public ExecutionNodeServiceImpl() {
+        this.id = UUID.randomUUID().toString();
+        handler = new GenericMessageGridHandlerImpl(new NodeData(), SystemEventListenerFactory.getSystemEventListener());
+    }
+
+    public ExecutionNodeServiceImpl(NodeData data,
+            SystemEventListener systemEventListener) {
+        handler = new GenericMessageGridHandlerImpl(data, systemEventListener); 
+    }
+
+    public Message write(Message msg) throws RemoteException {
+        BlockingGenericIoWriter blockingWriter = new BlockingGenericIoWriter();
+        try {
+            handler.messageReceived(blockingWriter, msg);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RemoteException(e.getMessage());
+        }
+
+        return blockingWriter.getMessage();
+    }
+
+    public GenericMessageHandler getGenericMessageHandler() {
+        return this.handler;
+    }
+
+    public void write(Message msg,
+            MessageResponseHandler responseHandler) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setServiceBeanContext(ServiceBeanContext context) {
+        context.addAttribute(new IDEntry(this.id));
+        loadWatch = new GaugeWatch("load");
+        context.getWatchRegistry().register(loadWatch);
+        instanceID = context.getServiceBeanConfig().getInstanceID();
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public boolean connect() throws RemoteException {
+        //this is always connected if the lookup was successful
+        return true;
+    }
+
+    @Override
+    public void disconnect() throws RemoteException {
+        //we don't need to desconnect the grid
+    }
+
+    @Override
+    public double getLoad() throws RemoteException {
+        return loadWatch.getLastCalculableValue();
+    }
+
+    @Override
+    public void setLoad(double load) throws RemoteException {
+        double last = loadWatch.getLastCalculableValue();
+        loadWatch.addValue(load);
+        boolean verified = loadWatch.getLastCalculableValue() == load;
+        if (!verified)
+            System.err.println(System.currentTimeMillis() + " "+
+                "---> ["+instanceID+"] was [" + loadWatch.getLastCalculableValue() +
+                "], SET FAILED [" + load + "] " +
+                "breached=" +
+                loadWatch.getThresholdManager().getThresholdCrossed());
+        else
+            System.err.println(System.currentTimeMillis() + " "+
+                "---> ["+instanceID+"] Load now [" + load + "] " +
+                "breached=" +
+                loadWatch.getThresholdManager().getThresholdCrossed());
+    }
+
+  
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/rio/InternalRioNodeConnector.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/rio/InternalRioNodeConnector.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/rio/InternalRioNodeConnector.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,119 @@
+package org.drools.grid.distributed.rio;
+
+
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.net.SocketAddress;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.drools.SystemEventListener;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageResponseHandler;
+import org.drools.grid.ExecutionNodeService;
+import org.drools.grid.generic.GenericNodeConnector;
+
+
+public class InternalRioNodeConnector
+     implements GenericNodeConnector{
+
+    protected final String                 name;
+    protected AtomicInteger                counter;
+    protected ExecutionNodeService         nodeService;
+    protected SocketAddress                address;
+    protected SystemEventListener          eventListener;
+  
+    public InternalRioNodeConnector(String name,
+                        SystemEventListener eventListener
+                       ) {
+        if ( name == null ) {
+            throw new IllegalArgumentException( "Name can not be null" );
+        }
+        this.name = name;
+        this.counter = new AtomicInteger();
+        this.eventListener = eventListener;
+   
+    }
+
+    public InternalRioNodeConnector(String name,
+                        SystemEventListener eventListener,
+                        ExecutionNodeService nodeService
+                        ) {
+        if ( name == null ) {
+            throw new IllegalArgumentException( "Name can not be null" );
+        }
+        this.name = name;
+        this.counter = new AtomicInteger();
+        this.eventListener = eventListener;
+        this.nodeService = nodeService;
+       
+       
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.mina.Messenger#connect()
+     */
+    public boolean connect() {
+        
+        return true;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.vsm.mina.Messenger#disconnect()
+     */
+    public void disconnect() {
+        //I don't need to be disconected
+    }
+
+    public Message write(Message msg) {
+        if ( nodeService != null ) {
+            try {
+
+                Message returnMessage = this.nodeService.write( msg );
+                return returnMessage;
+              
+            } catch ( RemoteException ex ) {
+                Logger.getLogger( InternalRioNodeConnector.class.getName() ).log( Level.SEVERE,
+                                                                      null,
+                                                                      ex );
+            } catch ( Exception ex ) {
+                Logger.getLogger( InternalRioNodeConnector.class.getName() ).log( Level.SEVERE,
+                                                                      null,
+                                                                      ex );
+            }
+        }
+        throw new IllegalStateException( "sessionService should not be null" );
+    }
+    
+    public void write(Message msg,
+                      MessageResponseHandler responseHandler) {
+        throw new UnsupportedOperationException();
+    }
+
+ 
+    public String getId() {
+        try {
+            return nodeService.getId();
+        } catch (RemoteException ex) {
+            Logger.getLogger(InternalRioNodeConnector.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return null;
+    }
+
+
+
+    
+
+    
+    public void setNodeService(Object object) {
+        this.nodeService = (ExecutionNodeService) object;
+        try {
+            System.out.println("Setting Node Service = " + nodeService.getId());
+        } catch (RemoteException ex) {
+            Logger.getLogger(InternalRioNodeConnector.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/util/IDEntry.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/util/IDEntry.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/main/java/org/drools/grid/distributed/util/IDEntry.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,22 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.drools.grid.distributed.util;
+
+/**
+ *
+ * @author salaboy
+ */
+public class IDEntry extends net.jini.entry.AbstractEntry{
+    public String id;
+
+   public IDEntry() {
+       super();
+   }
+
+   public IDEntry(String id) {
+       this. id = id;
+   }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/manager-config.groovy
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/manager-config.groovy	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/manager-config.groovy	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,53 @@
+/*
+ * Copyright to the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.rioproject.config.Constants
+
+/*
+* Configuration properties for the Gnostic
+*/
+manager {
+    execClassPath =
+        '${RIO_HOME}${/}lib${/}boot.jar${:}${RIO_HOME}${/}lib/${/}start.jar${:}${JAVA_HOME}${/}lib${/}tools.jar${:}${RIO_HOME}${/}lib${/}groovy-all.jar'
+
+    inheritOptions = true
+
+    jvmOptions = '''
+        -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts
+        -Djava.security.policy=${RIO_HOME}${/}policy${/}policy.all
+        -DRIO_HOME=${RIO_HOME} -Dorg.rioproject.groups=${org.rioproject.groups}'''
+
+    mainClass = 'com.sun.jini.start.ServiceStarter'
+
+    /* The ${service} token will be replaced by the name of the starter file.
+     * For start-reggie the service name will be reggie, for start-monitor the
+     * service name will be monitor, etc ... */
+    String logExt = System.getProperty(Constants.GROUPS_PROPERTY_NAME,
+                                       System.getProperty('user.name'))
+    String logDir = '/tmp/logs/rio/'
+    String opSys = System.getProperty('os.name')
+    if(opSys.startsWith("Windows"))
+        logDir = '${java.io.tmpdir}/logs/rio/'
+    log = logDir + logExt + '/${service}.log'
+
+    /*
+    * Remove any previously created service log files
+    */
+    cleanLogs = true
+
+    monitorStarter = '${user.dir}${/}src${/}test${/}conf${/}start-monitor.groovy'
+    cybernodeStarter = '${RIO_HOME}/config/start-cybernode.groovy'
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/start-monitor.groovy
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/start-monitor.groovy	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/start-monitor.groovy	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,38 @@
+/*
+ * This configuration is used by the com.sun.jini.start utility to start a
+ * ProvisionMonitor, including an embedded Webster
+ */
+
+import org.rioproject.config.Component
+
+import org.rioproject.boot.ServiceDescriptorUtil;
+import com.sun.jini.start.ServiceDescriptor;
+
+ at Component('com.sun.jini.start')
+class StartMonitorConfig {
+
+    ServiceDescriptor[] getServiceDescriptors() {
+        String m2Home = "${System.getProperty("user.home")}/.m2"
+        String rioHome = System.getProperty('RIO_HOME')
+        String cwd = System.getProperty('user.dir')
+        println "\n********\n$cwd\n********"
+        
+        def websterRoots = [rioHome+'/lib-dl', ';',
+                            rioHome+'/lib',     ';',
+                            m2Home+'/repository', ';',
+                            cwd+'/target/']
+
+        String policyFile = rioHome+'/policy/policy.all'
+        String monitorConfig = rioHome+'/config/monitor.groovy'
+        String reggieConfig = rioHome+'/config/reggie.groovy'
+
+        def serviceDescriptors = [
+            ServiceDescriptorUtil.getWebster(policyFile, '0', (String[])websterRoots),
+            ServiceDescriptorUtil.getLookup(policyFile, reggieConfig),
+            ServiceDescriptorUtil.getMonitor(policyFile, monitorConfig)
+        ]
+
+        return (ServiceDescriptor[])serviceDescriptors
+    }
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/test-config.groovy
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/test-config.groovy	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/conf/test-config.groovy	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,13 @@
+/*
+ * Configuration file for integration test cases
+ */
+ITGridExecutionTest {
+    groups = "ITGridExecutionTest"
+    numCybernodes = 1
+    numMonitors = 1
+    //numLookups = 1
+    opstring = 'src/test/resources/org/drools/executionNodeService.groovy'
+    autoDeploy = true
+    //harvest = true
+}
+

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ExecutionNodeBaseTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ExecutionNodeBaseTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ExecutionNodeBaseTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,342 @@
+/*
+ *  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.grid.distributed;
+
+
+import org.drools.grid.ExecutionNodeService;
+import org.drools.grid.ExecutionNode;
+import java.rmi.RemoteException;
+import java.util.List;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.command.runtime.rule.FireAllRulesCommand;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.distributed.GridConnection;
+import org.drools.grid.strategies.StaticIncrementalSelectionStrategy;
+import org.junit.Assert;
+import org.junit.Test;
+/**
+ *
+ * @author salaboy
+ */
+
+public abstract class ExecutionNodeBaseTest {
+
+    protected ExecutionNode node;
+    protected GridConnection connection = new GridConnection();
+    public ExecutionNodeBaseTest() {
+        
+    }
+
+
+    @Test
+    public void fireAllRules(){
+        StaticIncrementalSelectionStrategy.counter = 0;
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        Assert.assertNotNull(node);
+         
+        KnowledgeBuilder kbuilder = 
+                node.get(KnowledgeBuilderFactoryService.class)
+                 .newKnowledgeBuilder();
+        Assert.assertNotNull(kbuilder);
+
+        kbuilder.add( ResourceFactory
+                       .newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = 
+                node.get(KnowledgeBaseFactoryService.class)
+                 .newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+        
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession =
+                            kbase.newStatefulKnowledgeSession();
+        Assert.assertNotNull(ksession);
+
+        int fired = ksession.fireAllRules();
+        Assert.assertEquals( 2, fired );
+
+
+    }
+
+     @Test
+    public void testExecute() throws Exception {
+         StaticIncrementalSelectionStrategy.counter = 0;
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        Assert.assertNotNull(node);
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        Assert.assertNotNull(kbuilder);
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ExecutionResults results = ksession.execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2,
+                      (int) (Integer) results.getValue( "fired" ) );
+    }
+
+    @Test
+    public void testVsmPipeline() throws Exception {
+        StaticIncrementalSelectionStrategy.counter = 0;
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello3!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello4!!!\" ); \n";
+        str += "end \n";
+
+        Assert.assertNotNull(node);
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        Assert.assertNotNull(kbuilder);
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        node.get(DirectoryLookupFactoryService.class).register( "ksession1", ksession );
+
+        ExecutionResults results = node.get(DirectoryLookupFactoryService.class).lookup( "ksession1" ).execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2, (int ) ( Integer) results.getValue( "fired" ) );
+    }
+
+    @Test
+    public void testNamedService() throws Exception {
+        StaticIncrementalSelectionStrategy.counter = 1;
+        System.out.println("Running ===============> testNamedService");
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n"; 
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        Assert.assertNotNull(kbuilder);
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        System.out.println("registering a session!!!!!!!");
+        node.get(DirectoryLookupFactoryService.class).register( "ksession1",
+                              ksession );
+        System.out.println("Lookup ksession1!!!!!!!!!!!!!");
+        ExecutionResults results = node.get(DirectoryLookupFactoryService.class).lookup( "ksession1" ).execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2,
+                     (int) (Integer) results.getValue( "fired" ) );
+        System.out.println("TEst ENDED =========>");
+    }
+   @Test
+    public void twoSessionsIntoDifferentSessionServices() throws RemoteException{
+        StaticIncrementalSelectionStrategy.counter = 0;
+        String str = "";
+        str += "package org.drools \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello1!!!\" ); \n";
+        str += "end \n";
+        str += "rule rule2 \n";
+        str += "    dialect \"java\" \n";
+        str += "when \n";
+        str += "then \n";
+        str += "    System.out.println( \"hello2!!!\" ); \n";
+        str += "end \n";
+
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        Assert.assertNotNull(kbuilder);
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder.getErrors() );
+        }
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase);
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession1 = kbase.newStatefulKnowledgeSession();
+        System.out.println("registering ksession1!");
+        node.get(DirectoryLookupFactoryService.class).register( "ksession1", ksession1 );
+
+        System.out.println("Let's go for the Second ksession");
+        //Switching to another node
+        node = connection.getExecutionNode(null);
+
+        KnowledgeBuilder kbuilder2 = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        Assert.assertNotNull(kbuilder2);
+
+        kbuilder2.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder2.hasErrors() ) {
+            System.out.println( "Errors: " + kbuilder2.getErrors() );
+        }
+
+
+        KnowledgeBase kbase2 = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        Assert.assertNotNull(kbase2);
+
+
+        kbase2.addKnowledgePackages( kbuilder2.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession2 = kbase2.newStatefulKnowledgeSession();
+        System.out.println("registering ksession2!");
+        node.get(DirectoryLookupFactoryService.class).register( "ksession2", ksession2 );
+
+        System.out.println("Lookuping up ksession1 !");
+        ExecutionResults results1 = node.get(DirectoryLookupFactoryService.class).lookup( "ksession1" ).execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2,
+                     (int) (Integer) results1.getValue( "fired" ) );
+
+        System.out.println("Lookuping up ksession2 !");
+        ExecutionResults results2 = node.get(DirectoryLookupFactoryService.class).lookup( "ksession2" ).execute( new FireAllRulesCommand( "fired" ) );
+
+        Assert.assertEquals( 2,
+                     (int) (Integer) results2.getValue( "fired" ) );
+
+    }
+
+   @Test
+   public void scalingUp(){
+       for(int i=1; i<20; i++) {
+       List<GenericNodeConnector> services = connection.getNodeConnectors();
+         for(GenericNodeConnector serviceConnector : services) {
+             if(serviceConnector instanceof ExecutionNodeService){
+                    Throwable thrown = null;
+                    try {
+                        double d = ((ExecutionNodeService)serviceConnector).getLoad();
+                        if(d<80)
+                            ((ExecutionNodeService)serviceConnector).setLoad(d+10);
+                        else
+                            ((ExecutionNodeService)serviceConnector).setLoad(d);
+                        Thread.sleep(5000);
+                    } catch (Exception e) {
+                        thrown = e;
+                    }
+                    Assert.assertNull(thrown);
+                }
+         }
+       }
+
+   }
+
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ITGridExecutionTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ITGridExecutionTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/java/org/drools/grid/distributed/ITGridExecutionTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,68 @@
+package org.drools.grid.distributed;
+
+import org.drools.grid.ExecutionNodeService;
+import org.drools.grid.DirectoryNodeService;
+import org.drools.grid.AcceptorService;
+import java.util.Iterator;
+import junit.framework.Assert;
+
+import net.jini.core.lookup.ServiceItem;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.junit.After;
+
+
+
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.rioproject.gnostic.Gnostic;
+import org.rioproject.test.RioTestRunner;
+import org.rioproject.test.SetTestManager;
+import org.rioproject.test.TestManager;
+
+ at RunWith(RioTestRunner.class)
+public class ITGridExecutionTest extends ExecutionNodeBaseTest {
+
+    AcceptorService server;
+    @SetTestManager
+    static TestManager testManager;
+
+    @Before
+    public void setUp() throws Exception {
+        
+        Assert.assertNotNull(testManager);
+        //setup all the services using the Rio Test Framework
+        //In real scenarios all this code will happen inside the connection.connect() method
+        ExecutionNodeService nodeService = (ExecutionNodeService) testManager.waitForService(ExecutionNodeService.class);
+        ServiceItem[] nodeServiceItems = testManager.getServiceItems(ExecutionNodeService.class);
+        System.out.println("Node Service Items =" + nodeServiceItems.length);
+        DirectoryNodeService directoryService = (DirectoryNodeService) testManager.waitForService(DirectoryNodeService.class);
+        Assert.assertNotNull(directoryService);
+        Gnostic service = (Gnostic)testManager.waitForService(Gnostic.class);
+
+        connection.addDirectoryNode(directoryService);
+
+        for (int i = 0; i < nodeServiceItems.length; i++) {
+            if (nodeServiceItems[i].service instanceof ExecutionNodeService) {
+                connection.addNodeConnector((ExecutionNodeService) nodeServiceItems[i].service);
+            }
+        }
+
+        //Get an execution node using the default/round robin strategy
+        node = connection.getExecutionNode(null);
+        System.out.println("Node = "+ node);
+
+
+    }
+    @After
+    public void tearDown() throws Exception {
+        Iterator<GenericNodeConnector> iterator = connection.getNodeConnectors().iterator();
+        while(iterator.hasNext()){
+            iterator.next().disconnect();
+        }
+        Iterator<DirectoryNodeService> iterator1 = connection.getDirectories().iterator();
+        while(iterator.hasNext()){
+            iterator.next().disconnect();
+        }
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/org/drools/executionNodeService.groovy
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/org/drools/executionNodeService.groovy	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-rio/src/test/resources/org/drools/executionNodeService.groovy	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,76 @@
+import org.rioproject.config.Constants
+import java.util.logging.Level
+
+import org.rioproject.resources.servicecore.Service
+
+deployment(name:'executionNodeService',  debug: 'true') {
+
+    logging {
+        logger 'org.rioproject.resolver', Level.FINE
+    }
+    /* Configuration for the discovery group that the service should join.
+     * This first checks if the org.rioproject.groups property is set, if not
+     * the user name is used */
+    groups System.getProperty(Constants.GROUPS_PROPERTY_NAME,
+                              System.getProperty('user.name'))
+
+    /* Declares the artifacts required for deployment. Note the 'dl'
+     * classifier used for the 'download' jar */
+    artifact id:'service', 'org.drools:drools-grid-rio:5.1.0.SNAPSHOT'
+    artifact id:'service-dl', 'org.drools:drools-grid-rio:dl:5.1.0.SNAPSHOT'
+
+    /*
+     * Declare the service to be deployed. The number of instances deployed
+     * defaults to 1. If you require > 1 instances change as needed
+     */
+    service(name: 'ExecutionNodeService') {
+        interfaces {
+            classes 'org.drools.grid.ExecutionNodeService'
+            artifact ref:'service-dl'
+        }
+        implementation(class:'org.drools.grid.distributed.impl.ExecutionNodeServiceImpl') {
+            artifact ref:'service'
+        }
+        sla(id:'load', low:10, high: 30) {
+            rule resource: 'ScalingRuleHandler', max:5
+        }
+        maintain 2
+    }
+    service(name: 'DirectoryNodeService') {
+        interfaces {
+            classes 'org.drools.grid.DirectoryNodeService'
+            artifact ref:'service-dl'
+        }
+        implementation(class:'org.drools.grid.distributed.impl.DirectoryNodeServiceImpl') {
+            artifact ref:'service'
+        }
+         
+        association (name:'ExecutionNodeService', type:'uses', property:'nodeServices')
+         
+        maintain 1
+    }
+
+    service(name: 'Gnostic') {
+        interfaces {
+            classes 'org.rioproject.gnostic.Gnostic'
+            artifact ref: 'service-dl'
+        }
+        implementation(class: 'org.rioproject.gnostic.GnosticImpl') {
+            artifact ref: 'service'
+        }
+
+        parameters {
+            parameter name: "create-core-associations", value: "yes"
+        }
+
+        associations {
+            ['ExecutionNodeService'].each {
+                association name: "$it",
+                            type: 'uses', property: 'service',
+                            serviceType: Service.name
+            }
+        }
+        maintain 1
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/pom.xml
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/pom.xml	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/pom.xml	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>drools</artifactId>
+        <groupId>org.drools</groupId>
+        <version>5.1.0.SNAPSHOT</version>
+    </parent>
+    
+    <artifactId>drools-grid-task</artifactId>
+    <version>5.1.0.SNAPSHOT</version>
+    
+    <name>Drools :: Grid :: Task</name>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.6</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Drools Runtime -->
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-compiler</artifactId>
+        </dependency>
+
+        <!-- Apache Mina for default Service Remote Implementation -->
+        <dependency>
+            <groupId>org.apache.mina</groupId>
+            <artifactId>mina-core</artifactId>
+            <version>2.0.0-M6</version>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-process-task</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-grid-core</artifactId>
+            <version>5.1.0.SNAPSHOT</version>
+            
+        </dependency>
+
+
+         <!-- DB H2 -->
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>1.2.128</version>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.0.2</version>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,382 @@
+package org.drools.grid.task;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.SystemEventListenerFactory;
+import org.drools.eventmessaging.EventKey;
+import org.drools.eventmessaging.Payload;
+import org.drools.runtime.KnowledgeRuntime;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.grid.remote.mina.MinaNodeConnector;
+import org.drools.grid.remote.mina.MinaIoHandler;
+import org.drools.task.AccessType;
+import org.drools.task.Content;
+import org.drools.task.Group;
+import org.drools.task.I18NText;
+import org.drools.task.OrganizationalEntity;
+import org.drools.task.PeopleAssignments;
+import org.drools.task.SubTasksStrategy;
+import org.drools.task.SubTasksStrategyFactory;
+import org.drools.task.Task;
+import org.drools.task.TaskData;
+import org.drools.task.User;
+import org.drools.task.event.TaskCompletedEvent;
+import org.drools.task.event.TaskEvent;
+import org.drools.task.event.TaskEventKey;
+import org.drools.task.event.TaskFailedEvent;
+import org.drools.task.event.TaskSkippedEvent;
+import org.drools.task.service.Command;
+import org.drools.task.service.ContentData;
+import org.drools.task.service.responsehandlers.AbstractBaseResponseHandler;
+
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddTaskMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetContentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetTaskMessageResponseHandler;
+import org.drools.grid.task.eventmessaging.EventMessageResponseHandler;
+
+/**
+ * @author salaboy
+ * @author Lucas Amador
+ *
+ */
+
+public class CommandBasedServicesWSHumanTaskHandler implements WorkItemHandler {
+
+    private String ipAddress = "127.0.0.1";
+    private int port = 9124;
+    private SocketAddress address;
+    private GenericNodeConnector connector;
+    private HumanTaskServiceImpl client;
+    private KnowledgeRuntime session;
+    private Map<Long, Long> idMapping = new HashMap<Long, Long>();
+    private Map<Long, WorkItemManager> managers = new HashMap<Long, WorkItemManager>();
+
+    public CommandBasedServicesWSHumanTaskHandler(KnowledgeRuntime session) {
+        this.session = session;
+        this.address = new InetSocketAddress(ipAddress, port);
+    }
+
+    public void connect() throws RemoteException {
+        if (connector == null) {
+            NioSocketConnector htclientConnector = new NioSocketConnector();
+            htclientConnector.setHandler(new MinaIoHandler(SystemEventListenerFactory.getSystemEventListener()));
+            connector = new MinaNodeConnector("client ht",
+                    htclientConnector,
+                    this.address,
+                    SystemEventListenerFactory.getSystemEventListener());
+            boolean connected = connector.connect();
+            if (!connected) {
+                throw new IllegalArgumentException("Could not connect task client");
+            }
+            int id = ((StatefulKnowledgeSession) session).getId();
+            client = new HumanTaskServiceImpl(connector, id);
+        }
+    }
+
+    public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+        try {
+            connect();
+        } catch (RemoteException ex) {
+            Logger.getLogger(CommandBasedServicesWSHumanTaskHandler.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        Task task = new Task();
+        String taskName = (String) workItem.getParameter("TaskName");
+        if (taskName != null) {
+            List<I18NText> names = new ArrayList<I18NText>();
+            names.add(new I18NText("en-UK", taskName));
+            task.setNames(names);
+        }
+        String comment = (String) workItem.getParameter("Comment");
+        if (comment != null) {
+            List<I18NText> descriptions = new ArrayList<I18NText>();
+            descriptions.add(new I18NText("en-UK", comment));
+            task.setDescriptions(descriptions);
+            List<I18NText> subjects = new ArrayList<I18NText>();
+            subjects.add(new I18NText("en-UK", comment));
+            task.setSubjects(subjects);
+        }
+        String priorityString = (String) workItem.getParameter("Priority");
+        int priority = 0;
+        if (priorityString != null) {
+            try {
+                priority = new Integer(priorityString);
+            } catch (NumberFormatException e) {
+                // do nothing
+            }
+        }
+        task.setPriority(priority);
+
+        TaskData taskData = new TaskData();
+        taskData.setWorkItemId(workItem.getId());
+        taskData.setSkipable(!"false".equals(workItem.getParameter("Skippable")));
+        //Sub Task Data
+        Long parentId = (Long) workItem.getParameter("ParentId");
+        if (parentId != null) {
+            taskData.setParentId(parentId);
+        }
+
+        String subTaskStrategiesCommaSeparated = (String) workItem.getParameter("SubTaskStrategies");
+        if (subTaskStrategiesCommaSeparated != null && !subTaskStrategiesCommaSeparated.equals("")) {
+            String[] subTaskStrategies = subTaskStrategiesCommaSeparated.split(",");
+            List<SubTasksStrategy> strategies = new ArrayList<SubTasksStrategy>();
+            for (String subTaskStrategyString : subTaskStrategies) {
+                SubTasksStrategy subTaskStrategy = SubTasksStrategyFactory.newStrategy(subTaskStrategyString);
+                strategies.add(subTaskStrategy);
+            }
+            task.setSubTaskStrategies(strategies);
+        }
+
+        PeopleAssignments assignments = new PeopleAssignments();
+        List<OrganizationalEntity> potentialOwners = new ArrayList<OrganizationalEntity>();
+
+        String actorId = (String) workItem.getParameter("ActorId");
+        if (actorId != null) {
+
+            String[] actorIds = actorId.split(",");
+            for (String id : actorIds) {
+                User user = new User();
+                user.setId(id.trim());
+                potentialOwners.add(user);
+            }
+            //Set the first user as creator ID??? hmmm might be wrong
+            if (potentialOwners.size() > 0) {
+                taskData.setCreatedBy((User) potentialOwners.get(0));
+            }
+        }
+        String groupId = (String) workItem.getParameter("GroupId");
+        if (groupId != null) {
+
+            String[] groupIds = groupId.split(",");
+            for (String id : groupIds) {
+
+                potentialOwners.add(new Group(id));
+            }
+
+        }
+
+        assignments.setPotentialOwners(potentialOwners);
+        List<OrganizationalEntity> businessAdministrators = new ArrayList<OrganizationalEntity>();
+        businessAdministrators.add(new User("Administrator"));
+        assignments.setBusinessAdministrators(businessAdministrators);
+        task.setPeopleAssignments(assignments);
+
+        task.setTaskData(taskData);
+
+        ContentData content = null;
+        Object contentObject = workItem.getParameter("Content");
+        if (contentObject != null) {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            ObjectOutputStream out;
+            try {
+                out = new ObjectOutputStream(bos);
+                out.writeObject(contentObject);
+                out.close();
+                content = new ContentData();
+                content.setContent(bos.toByteArray());
+                content.setAccessType(AccessType.Inline);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        TaskWorkItemAddTaskMessageResponseHandler taskResponseHandler =
+                new TaskWorkItemAddTaskMessageResponseHandler(workItem.getId(), this.managers, idMapping, manager);
+        client.addTask(task, content, taskResponseHandler);
+    }
+
+    public void dispose() throws RemoteException {
+        if (connector != null) {
+            connector.disconnect();
+        }
+    }
+
+    public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+        Long taskId = idMapping.get(workItem.getId());
+        if (taskId != null) {
+            synchronized (idMapping) {
+                idMapping.remove(taskId);
+            }
+            synchronized (managers) {
+                managers.remove(taskId);
+            }
+            client.skip(taskId, "Administrator", null);
+        }
+    }
+
+    public class TaskWorkItemAddTaskMessageResponseHandler extends AbstractBaseResponseHandler implements AddTaskMessageResponseHandler {
+
+        private Map<Long, WorkItemManager> managers;
+        private Map<Long, Long> idMapping;
+        private WorkItemManager manager;
+        private long workItemId;
+
+        public TaskWorkItemAddTaskMessageResponseHandler(long workItemId,
+                Map<Long, WorkItemManager> managers, Map<Long, Long> idMapping,
+                WorkItemManager manager) {
+            this.workItemId = workItemId;
+            this.managers = managers;
+            this.idMapping = idMapping;
+            this.manager = manager;
+        }
+
+        public void execute(long taskId) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
+        public void receive(Message message) {
+            Command command = (Command) message.getPayload();
+            Long taskId = (Long) command.getArguments().get(0);
+
+            synchronized (managers) {
+                managers.put(taskId, this.manager);
+            }
+            synchronized (idMapping) {
+                idMapping.put(workItemId, taskId);
+            }
+            System.out.println("Created task " + taskId + " for work item " + workItemId);
+
+            EventKey key = new TaskEventKey(TaskCompletedEvent.class, taskId);
+            TaskCompletedMessageHandler eventResponseHandler = new TaskCompletedMessageHandler(workItemId, taskId, managers);
+            client.registerForEvent(key, true, eventResponseHandler);
+            key = new TaskEventKey(TaskFailedEvent.class, taskId);
+            client.registerForEvent(key, true, eventResponseHandler);
+            key = new TaskEventKey(TaskSkippedEvent.class, taskId);
+            client.registerForEvent(key, true, eventResponseHandler);
+        }
+    }
+
+    private class TaskCompletedMessageHandler extends AbstractBaseResponseHandler implements EventMessageResponseHandler {
+
+        private long workItemId;
+        private long taskId;
+        private final Map<Long, WorkItemManager> managers;
+
+        public TaskCompletedMessageHandler(long workItemId, long taskId, Map<Long, WorkItemManager> managers) {
+            this.workItemId = workItemId;
+            this.taskId = taskId;
+            this.managers = managers;
+        }
+
+        public void receive(Message message) {
+            Command cmd = (Command) message.getPayload();
+            Payload payload = (Payload) cmd.getArguments().get(0);
+            TaskEvent event = (TaskEvent) payload.get();
+            if (event.getTaskId() != taskId) {
+                // defensive check that should never happen, just here for testing
+                setError(new IllegalStateException("Expected task id and arrived task id do not march"));
+                return;
+            }
+            if (event instanceof TaskCompletedEvent) {
+                synchronized (this.managers) {
+                    WorkItemManager manager = this.managers.get(taskId);
+                    if (manager != null) {
+                        GetCompletedTaskMessageResponseHandler getTaskResponseHandler = new GetCompletedTaskMessageResponseHandler(manager);
+                        client.getTask(taskId, getTaskResponseHandler);
+                    }
+                }
+            } else {
+                synchronized (this.managers) {
+                    WorkItemManager manager = this.managers.get(taskId);
+                    if (manager != null) {
+                        manager.abortWorkItem(workItemId);
+                    }
+                }
+            }
+        }
+
+        public void execute(Payload payload) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+    }
+
+    private class GetCompletedTaskMessageResponseHandler extends AbstractBaseResponseHandler implements GetTaskMessageResponseHandler {
+
+        private WorkItemManager manager;
+
+        public GetCompletedTaskMessageResponseHandler(WorkItemManager manager) {
+            this.manager = manager;
+        }
+
+        public void receive(Message message) {
+            Command cmd = (Command) message.getPayload();
+            Task task = (Task) cmd.getArguments().get(0);
+            long workItemId = task.getTaskData().getWorkItemId();
+            String userId = task.getTaskData().getActualOwner().getId();
+            Map<String, Object> results = new HashMap<String, Object>();
+            results.put("ActorId", userId);
+            long contentId = task.getTaskData().getOutputContentId();
+            if (contentId != -1) {
+                GetResultContentMessageResponseHandler getContentResponseHandler =
+                        new GetResultContentMessageResponseHandler(manager, task, results);
+                client.getContent(contentId, getContentResponseHandler);
+            } else {
+                manager.completeWorkItem(workItemId, results);
+            }
+        }
+
+        public void execute(Task task) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+    }
+
+    private class GetResultContentMessageResponseHandler extends AbstractBaseResponseHandler implements GetContentMessageResponseHandler {
+
+        private Task task;
+        private final WorkItemManager manager;
+        private Map<String, Object> results;
+
+        public GetResultContentMessageResponseHandler(WorkItemManager manager, Task task, Map<String, Object> results) {
+            this.manager = manager;
+            this.task = task;
+            this.results = results;
+        }
+
+        public void receive(Message message) {
+            Command cmd = (Command) message.getPayload();
+            Content content = (Content) cmd.getArguments().get(0);
+            ByteArrayInputStream bis = new ByteArrayInputStream(content.getContent());
+            ObjectInputStream in;
+            try {
+                in = new ObjectInputStream(bis);
+                Object result = in.readObject();
+                in.close();
+                results.put("Result", result);
+                if (result instanceof Map) {
+                    Map<?, ?> map = (Map) result;
+                    for (Map.Entry<?, ?> entry : map.entrySet()) {
+                        if (entry.getKey() instanceof String) {
+                            results.put((String) entry.getKey(), entry.getValue());
+                        }
+                    }
+                }
+                manager.completeWorkItem(task.getTaskData().getWorkItemId(), results);
+            } catch (IOException e) {
+                e.printStackTrace();
+            } catch (ClassNotFoundException e) {
+                e.printStackTrace();
+            }
+        }
+
+        public void execute(Content content) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/GenericEventTransport.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/GenericEventTransport.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/GenericEventTransport.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,42 @@
+package org.drools.grid.task;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+import org.drools.eventmessaging.EventTriggerTransport;
+import org.drools.eventmessaging.Payload;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.Message;
+import org.drools.task.service.Command;
+import org.drools.task.service.CommandName;
+
+public class GenericEventTransport implements EventTriggerTransport {
+    private String uuid;
+    private Map<String, GenericIoWriter> sessions;
+    private int responseId;
+    private boolean remove;
+    
+    GenericEventTransport(String uuid, int responseId, Map<String, GenericIoWriter> sessions, boolean remove) {
+        this.uuid = uuid;
+        this.responseId = responseId;
+        this.sessions = sessions;
+        this.remove = remove;
+    }
+
+    public void trigger(Payload payload) {        
+        GenericIoWriter session = sessions.get( uuid );
+        List args = new ArrayList( 1 );
+        args.add( payload );
+        Command resultsCmnd = new Command( responseId, CommandName.EventTriggerResponse, args);
+        session.write(new Message(Integer.parseInt(uuid),
+                                        responseId,
+                                        false,
+                                        resultsCmnd ), null);
+    }
+    
+    public boolean isRemove() {
+        return this.remove;
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskFactoryService.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskFactoryService.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskFactoryService.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,14 @@
+package org.drools.grid.task;
+
+import org.drools.Service;
+import org.drools.grid.generic.GenericNodeConnector;
+
+
+
+
+public interface HumanTaskFactoryService extends Service {
+    public HumanTaskService newHumanTaskService();
+    
+	 
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskService.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskService.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskService.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,59 @@
+package org.drools.grid.task;
+
+import java.util.List;
+
+import org.drools.eventmessaging.EventKey;
+
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddAttachmentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddCommentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddTaskMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.DeleteAttachmentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.DeleteCommentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetContentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetTaskMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.SetDocumentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.TaskOperationMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.TaskSummaryMessageResponseHandler;
+import org.drools.grid.task.eventmessaging.EventMessageResponseHandler;
+import org.drools.task.Attachment;
+import org.drools.task.Comment;
+import org.drools.task.Content;
+import org.drools.task.Task;
+import org.drools.task.service.ContentData;
+import org.drools.task.service.FaultData;
+ 
+
+public interface HumanTaskService {
+    public void addTask(Task task, ContentData content, AddTaskMessageResponseHandler responseHandler);
+    public Task getTask(long taskId, GetTaskMessageResponseHandler responseHandler);
+    public void addComment(long taskId, Comment comment, AddCommentMessageResponseHandler responseHandler);
+    public void deleteComment(long taskId, long commentId, DeleteCommentMessageResponseHandler responseHandler);
+    public void addAttachment(long taskId, Attachment attachment, Content content, AddAttachmentMessageResponseHandler responseHandler);
+    public void deleteAttachment(long taskId, long attachmentId, long contentId, DeleteAttachmentMessageResponseHandler responseHandler );
+    public void setDocumentContent(long taskId, Content content, SetDocumentMessageResponseHandler responseHandler);
+    public void getContent(long contentId, GetContentMessageResponseHandler responseHandler);
+    public void claim(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void start(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void stop(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void release(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void suspend(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void resume(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void skip(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler);
+    public void delegate(long taskId, String userId, String targetUserId, TaskOperationMessageResponseHandler responseHandler);
+    public void forward(long taskId, String userId, String targetEntityId, TaskOperationMessageResponseHandler responseHandler) ;
+    public void complete(long taskId, String userId, ContentData outputData, TaskOperationMessageResponseHandler responseHandler) ;
+    public void fail(long taskId, String userId, FaultData faultData, TaskOperationMessageResponseHandler responseHandler);
+    public void getTasksOwned(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsBusinessAdministrator(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsExcludedOwner(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsPotentialOwner(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsPotentialOwner(String userId, List<String> groupIds, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getSubTasksAssignedAsPotentialOwner(long parentId, String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getSubTasksByParent(long parentId, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsRecipient(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsTaskInitiator(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void getTasksAssignedAsTaskStakeholder(String userId, String language, TaskSummaryMessageResponseHandler responseHandler);
+    public void registerForEvent(EventKey key, boolean remove, EventMessageResponseHandler responseHandler);
+    public boolean connect();
+    public void disconnect();
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,424 @@
+package org.drools.grid.task;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.drools.eventmessaging.EventKey;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.Message;
+import org.drools.task.Attachment;
+import org.drools.task.Comment;
+import org.drools.task.Content;
+import org.drools.task.Task;
+import org.drools.task.service.Command;
+import org.drools.task.service.CommandName;
+import org.drools.task.service.ContentData;
+import org.drools.task.service.FaultData;
+import org.drools.task.service.Operation;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddAttachmentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddCommentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddTaskMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.DeleteAttachmentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.DeleteCommentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetContentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetTaskMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.SetDocumentMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.TaskOperationMessageResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.TaskSummaryMessageResponseHandler;
+import org.drools.grid.task.eventmessaging.EventMessageResponseHandler;
+
+/**
+ * @author salaboy
+ * @author Lucas Amador
+ *
+ */
+public class HumanTaskServiceImpl implements HumanTaskService {
+
+    private final GenericNodeConnector client;
+    private final AtomicInteger counter;
+    private int sessionId;
+    private String clientName;
+
+    public HumanTaskServiceImpl(GenericNodeConnector client, int sessionId) {
+        this.client = client;
+        this.counter = new AtomicInteger();
+        this.clientName = String.valueOf(sessionId);
+        this.sessionId = sessionId;
+
+    }
+
+    @Override
+    public boolean connect() {
+        try {
+            return this.client.connect();
+        } catch (RemoteException ex) {
+            Logger.getLogger(HumanTaskServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
+            return false;
+        }
+
+    }
+
+    public void disconnect() {
+        try {
+            this.client.disconnect();
+        } catch (RemoteException ex) {
+            Logger.getLogger(HumanTaskServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    public void addTask(Task task, ContentData content, AddTaskMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(task);
+        args.add(content);
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.AddTaskRequest, args);
+
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public Task getTask(long taskId, GetTaskMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(1);
+        args.add(taskId);
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.GetTaskRequest, args);
+
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+        client.write(msg, responseHandler);
+        return null;
+    }
+
+    public void addComment(long taskId, Comment comment, AddCommentMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(taskId);
+        args.add(comment);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.AddCommentRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void deleteComment(long taskId, long commentId, DeleteCommentMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(taskId);
+        args.add(commentId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.DeleteCommentRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void addAttachment(long taskId, Attachment attachment, Content content, AddAttachmentMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(taskId);
+        args.add(attachment);
+        args.add(content);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.AddAttachmentRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void deleteAttachment(long taskId, long attachmentId, long contentId, DeleteAttachmentMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(taskId);
+        args.add(attachmentId);
+        args.add(contentId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.DeleteAttachmentRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void setDocumentContent(long taskId, Content content, SetDocumentMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(taskId);
+        args.add(content);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.SetDocumentContentRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getContent(long contentId, GetContentMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(1);
+        args.add(contentId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.GetContentRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void claim(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Claim);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void start(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Start);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void stop(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Stop);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void release(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Release);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void suspend(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Suspend);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void resume(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Resume);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void skip(long taskId, String userId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(Operation.Skip);
+        args.add(taskId);
+        args.add(userId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void delegate(long taskId, String userId, String targetUserId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(4);
+        args.add(Operation.Delegate);
+        args.add(taskId);
+        args.add(userId);
+        args.add(targetUserId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void forward(long taskId, String userId, String targetEntityId, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(4);
+        args.add(Operation.Forward);
+        args.add(taskId);
+        args.add(userId);
+        args.add(targetEntityId);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void complete(long taskId, String userId, ContentData outputData, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(5);
+        args.add(Operation.Complete);
+        args.add(taskId);
+        args.add(userId);
+        args.add(null);
+        args.add(outputData);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void fail(long taskId, String userId, FaultData faultData, TaskOperationMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(5);
+        args.add(Operation.Fail);
+        args.add(taskId);
+        args.add(userId);
+        args.add(null);
+        args.add(faultData);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.OperationRequest, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksOwned(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksOwned, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsBusinessAdministrator(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsBusinessAdministrator, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsExcludedOwner(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsExcludedOwner, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsPotentialOwner(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsPotentialOwner, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsPotentialOwner(String userId, List<String> groupIds, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(groupIds);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsPotentialOwnerWithGroup, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getSubTasksAssignedAsPotentialOwner(long parentId, String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(parentId);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QuerySubTasksAssignedAsPotentialOwner, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getSubTasksByParent(long parentId, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(parentId);
+        //@TODO: un hard code this
+        args.add("en-UK");
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryGetSubTasksByParentTaskId, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsRecipient(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsRecipient, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsTaskInitiator(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsTaskInitiator, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void getTasksAssignedAsTaskStakeholder(String userId, String language, TaskSummaryMessageResponseHandler responseHandler) {
+        List<Object> args = new ArrayList<Object>(2);
+        args.add(userId);
+        args.add(language);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.QueryTasksAssignedAsTaskStakeholder, args);
+        Message msg = new Message(sessionId, counter.incrementAndGet(), false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+
+    public void registerForEvent(EventKey key, boolean remove, EventMessageResponseHandler responseHandler) { //@TODO: look for the event stuff
+        List<Object> args = new ArrayList<Object>(3);
+        args.add(key);
+        args.add(remove);
+        args.add(clientName);
+
+        Command cmd = new Command(counter.getAndIncrement(), CommandName.RegisterForEventRequest, args);
+        int responseId = counter.incrementAndGet();
+        Message msg = new Message(sessionId, responseId, false, cmd);
+
+        client.write(msg, responseHandler);
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceProviderRemoteClient.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceProviderRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/HumanTaskServiceProviderRemoteClient.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,66 @@
+/*
+ *  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.grid.task;
+
+import org.drools.grid.generic.GenericNodeConnector;
+
+/**
+ *
+ * @author salaboy
+ */
+public class HumanTaskServiceProviderRemoteClient implements HumanTaskFactoryService {
+
+    private GenericNodeConnector connector;
+    private int id;
+
+    public HumanTaskServiceProviderRemoteClient() {
+    }
+
+    public HumanTaskServiceProviderRemoteClient(GenericNodeConnector connector, int id) {
+        this.connector = connector;
+        this.id = id;
+    }
+
+    public GenericNodeConnector getConnector() {
+        return connector;
+    }
+
+    public void setConnector(GenericNodeConnector connector) {
+        this.connector = connector;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+
+    @Override
+    public HumanTaskService newHumanTaskService() {
+
+        
+            return new HumanTaskServiceImpl(this.connector, this.id);
+      
+    }
+
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskClientMessageHandlerImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskClientMessageHandlerImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskClientMessageHandlerImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,249 @@
+package org.drools.grid.task;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.drools.SystemEventListener;
+import org.drools.eventmessaging.Payload;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.GenericMessageHandler;
+import org.drools.grid.generic.Message;
+import org.drools.grid.generic.MessageResponseHandler;
+import org.drools.task.Content;
+import org.drools.task.Task;
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.Command;
+
+import org.drools.grid.task.eventmessaging.EventMessageResponseHandler;
+import org.drools.grid.task.responseHandlers.BlockingTaskSummaryMessageResponseHandler;
+
+public class TaskClientMessageHandlerImpl implements GenericMessageHandler {
+
+    /**
+     * Listener used for logging
+     */
+    private SystemEventListener systemEventListener;
+    protected Map<Integer, MessageResponseHandler> responseHandlers;
+
+    public TaskClientMessageHandlerImpl(SystemEventListener systemEventListener) {
+        this.systemEventListener = systemEventListener;
+        this.responseHandlers = new ConcurrentHashMap<Integer, MessageResponseHandler>();;
+    }
+
+    
+    public void exceptionCaught(GenericIoWriter session,
+                                Throwable cause) throws Exception {
+        systemEventListener.exception("Uncaught exception on client", cause);
+    }
+
+    public void messageReceived(GenericIoWriter session, Message msg) throws Exception {
+        Command cmd = (Command) msg.getPayload();
+        systemEventListener.debug("Message receieved redirected to the client 1111111111: " + cmd.getName());
+        systemEventListener.debug("Arguments : " + Arrays.toString(cmd.getArguments().toArray()));
+
+        switch (cmd.getName()) {
+            case OperationResponse: {
+                TaskOperationMessageResponseHandler responseHandler = (TaskOperationMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        responseHandler.setIsDone(true);
+                        System.out.println("IS DONDEEEE");
+                    }
+                }
+                break;
+            }
+            case GetTaskResponse: {
+                GetTaskMessageResponseHandler responseHandler = (GetTaskMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {                    
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        Task task = (Task) cmd.getArguments().get(0);
+                        responseHandler.execute(task);
+                    }
+                }
+                break;
+            }
+            case AddTaskResponse: {
+                AddTaskMessageResponseHandler responseHandler = (AddTaskMessageResponseHandler) responseHandlers.remove(msg.getResponseId());
+                System.out.println("response id searched: " + msg.getResponseId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        long taskId = (Long) cmd.getArguments().get(0);
+                        responseHandler.execute(taskId);
+                    }
+                }
+                break;
+            }
+            case AddCommentResponse: {
+                AddCommentMessageResponseHandler responseHandler = (AddCommentMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        long commentId = (Long) cmd.getArguments().get(0);
+                        responseHandler.execute(commentId);
+                    }
+                }
+                break;
+            }
+            case DeleteCommentResponse: {
+                DeleteCommentMessageResponseHandler responseHandler = (DeleteCommentMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        responseHandler.setIsDone(true);
+                    }
+                }
+                break;
+            }
+            case AddAttachmentResponse: {
+                AddAttachmentMessageResponseHandler responseHandler = (AddAttachmentMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        long attachmentId = (Long) cmd.getArguments().get(0);
+                        long contentId = (Long) cmd.getArguments().get(1);
+                        responseHandler.execute(attachmentId,
+                                contentId);
+                    }
+                }
+                break;
+            }
+            case DeleteAttachmentResponse: {
+                DeleteAttachmentMessageResponseHandler responseHandler = (DeleteAttachmentMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        responseHandler.setIsDone(true);
+                    }
+                }
+                break;
+            }
+            case GetContentResponse: {
+                GetContentMessageResponseHandler responseHandler = (GetContentMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        Content content = (Content) cmd.getArguments().get(0);
+                        responseHandler.execute(content);
+                    }
+                }
+                break;
+            }
+            case SetDocumentContentResponse: {
+                SetDocumentMessageResponseHandler responseHandler = (SetDocumentMessageResponseHandler) responseHandlers.remove(cmd.getId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        long contentId = (Long) cmd.getArguments().get(0);
+                        responseHandler.execute(contentId);
+                    }
+                }
+                break;
+            }
+            case QueryTaskSummaryResponse: {
+            	BlockingTaskSummaryMessageResponseHandler responseHandler = (BlockingTaskSummaryMessageResponseHandler) responseHandlers.remove(msg.getResponseId());
+                System.out.println("responseHandler: " + responseHandler + " id searched: " + msg.getResponseId());
+                if (responseHandler != null) {
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                    } else {
+                        List<TaskSummary> results = (List<TaskSummary>) cmd.getArguments().get(0);
+                        responseHandler.execute(results);
+                    }
+                }
+                break;
+            }
+            case EventTriggerResponse: {
+                EventMessageResponseHandler responseHandler = (EventMessageResponseHandler) responseHandlers.remove(cmd.getId()); //@TODO view messaging stuff
+                System.out.println("EVENT TRIGGER RESPONSE " + responseHandler + " size " + responseHandlers.size() + " id " + cmd.getId());
+                if (responseHandler != null) {
+                	System.out.println("responseHandler---: " + responseHandler);
+                    if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof RuntimeException) {
+                        responseHandler.setError((RuntimeException) cmd.getArguments().get(0));
+                        System.out.println("EEerror");
+                    } else {
+                        Payload payload = (Payload) cmd.getArguments().get(0);
+                        System.out.println("EExecute ");
+                        responseHandler.execute(payload);
+                    }
+                }
+                break;
+            }
+        }
+    }
+    
+    public static interface GetTaskMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(Task task);
+    }
+
+    public static interface AddTaskMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(long taskId);
+    }
+
+    public static interface TaskOperationMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void setIsDone(boolean done);
+    }
+
+    public static interface AddCommentMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(long commentId);
+    }
+
+    public static interface DeleteCommentMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void setIsDone(boolean done);
+    }
+
+    public static interface AddAttachmentMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(long attachmentId,
+                            long contentId);
+    }
+
+    public static interface DeleteAttachmentMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void setIsDone(boolean done);
+    }
+
+    public static interface SetDocumentMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(long contentId);
+    }
+
+    public static interface GetContentMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(Content content);
+    }
+
+    public static interface TaskSummaryMessageResponseHandler
+            extends
+            MessageResponseHandler {
+        public void execute(List<TaskSummary> results);
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskServerMessageHandlerImpl.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskServerMessageHandlerImpl.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/TaskServerMessageHandlerImpl.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,437 @@
+package org.drools.grid.task;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.mina.core.session.IdleStatus;
+import org.apache.mina.core.session.IoSession;
+import org.drools.SystemEventListener;
+import org.drools.eventmessaging.EventKey;
+import org.drools.grid.generic.GenericIoWriter;
+import org.drools.grid.generic.GenericMessageHandler;
+import org.drools.grid.generic.Message;
+import org.drools.task.Attachment;
+import org.drools.task.Comment;
+import org.drools.task.Content;
+import org.drools.task.Task;
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.Command;
+import org.drools.task.service.CommandName;
+import org.drools.task.service.ContentData;
+import org.drools.task.service.Operation;
+import org.drools.task.service.TaskService;
+import org.drools.task.service.TaskServiceSession;
+
+
+public class TaskServerMessageHandlerImpl implements GenericMessageHandler {
+    private final TaskService service;
+    private final Map<String, GenericIoWriter> clients;
+
+    /**
+     * Listener used for logging
+     */
+    private final SystemEventListener systemEventListener;
+
+    public TaskServerMessageHandlerImpl(TaskService service, SystemEventListener systemEventListener) {
+        this.service = service;
+        this.clients = new HashMap<String, GenericIoWriter>();
+        this.systemEventListener = systemEventListener;
+    }
+
+    
+    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
+        systemEventListener.exception("Uncaught exception on Server", cause);
+    }
+
+    
+    public void messageReceived(GenericIoWriter session, Message msg) throws Exception {
+        Command cmd = (Command) ((Message)msg).getPayload();
+        TaskServiceSession taskSession = service.createSession();
+        CommandName response = null;
+        try {
+            systemEventListener.debug("Message received on server : " + cmd.getName());
+            systemEventListener.debug("Arguments : " + Arrays.toString(cmd.getArguments().toArray()));
+            switch (cmd.getName()) {
+                case OperationRequest: {
+                    response = CommandName.OperationResponse;
+                    Operation operation = (Operation) cmd.getArguments().get(0);
+
+                    systemEventListener.debug("Command receieved on server was operation of type: " + operation);
+
+                    long taskId = (Long) cmd.getArguments().get(1);
+                    String userId = (String) cmd.getArguments().get(2);
+                    String targetEntityId = null;
+                    if (cmd.getArguments().size() > 3) {
+                        targetEntityId = (String) cmd.getArguments().get(3);
+                    }
+                    ContentData data = null;
+                    if (cmd.getArguments().size() > 4) {
+                        data = (ContentData) cmd.getArguments().get(4);
+                    }
+                    taskSession.taskOperation(operation, taskId, userId, targetEntityId, data);
+
+                    List args = Collections.emptyList();
+
+                    Command resultsCmnd = new Command(cmd.getId(), CommandName.OperationResponse, args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case GetTaskRequest: {
+                    response = CommandName.GetTaskResponse;
+                    long taskId = (Long) cmd.getArguments().get(0);
+
+                    Task task = taskSession.getTask(taskId);
+
+                    List args = new ArrayList(1);
+                    args.add(task);
+                    Command resultsCmnd = new Command(cmd.getId(), CommandName.GetTaskResponse, args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+
+                    break;
+                }
+                case AddTaskRequest: {
+                    response = CommandName.AddTaskResponse;
+                    Task task = (Task) cmd.getArguments().get(0);
+                    ContentData content = (ContentData) cmd.getArguments().get(1);
+                    taskSession.addTask(task, content);
+
+                    List args = new ArrayList(1);
+                    args.add(task.getId());
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.AddTaskResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case AddCommentRequest: {
+                    response = CommandName.AddCommentResponse;
+                    Comment comment = (Comment) cmd.getArguments().get(1);
+                    taskSession.addComment((Long) cmd.getArguments().get(0),
+                            comment);
+
+                    List args = new ArrayList(1);
+                    args.add(comment.getId());
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.AddCommentResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case DeleteCommentRequest: {
+                    response = CommandName.DeleteCommentResponse;
+                    long taskId = (Long) cmd.getArguments().get(0);
+                    long commentId = (Long) cmd.getArguments().get(1);
+                    taskSession.deleteComment(taskId,
+                            commentId);
+
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.DeleteCommentResponse,
+                            Collections.emptyList());
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case AddAttachmentRequest: {
+                    response = CommandName.AddAttachmentResponse;
+                    Attachment attachment = (Attachment) cmd.getArguments().get(1);
+                    Content content = (Content) cmd.getArguments().get(2);
+                    taskSession.addAttachment((Long) cmd.getArguments().get(0),
+                            attachment,
+                            content);
+
+                    List args = new ArrayList(2);
+                    args.add(attachment.getId());
+                    args.add(content.getId());
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.AddAttachmentResponse,
+                            args);
+                   session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case DeleteAttachmentRequest: {
+                    response = CommandName.DeleteAttachmentResponse;
+                    long taskId = (Long) cmd.getArguments().get(0);
+                    long attachmentId = (Long) cmd.getArguments().get(1);
+                    long contentId = (Long) cmd.getArguments().get(2);
+                    taskSession.deleteAttachment(taskId,
+                            attachmentId,
+                            contentId);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.DeleteAttachmentResponse,
+                            Collections.emptyList());
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case SetDocumentContentRequest: {
+                    response = CommandName.SetDocumentContentResponse;
+                    long taskId = (Long) cmd.getArguments().get(0);
+                    Content content = (Content) cmd.getArguments().get(1);
+                    taskSession.setDocumentContent(taskId,
+                            content);
+
+                    List args = new ArrayList(1);
+                    args.add(content.getId());
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.SetDocumentContentResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case GetContentRequest: {
+                    response = CommandName.GetContentResponse;
+                    long contentId = (Long) cmd.getArguments().get(0);
+                    Content content = taskSession.getContent(contentId);
+                    List args = new ArrayList(1);
+                    args.add(content);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.GetContentResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksOwned: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksOwned((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsBusinessAdministrator: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsBusinessAdministrator((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsPotentialOwner: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsPotentialOwner((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsPotentialOwnerWithGroup: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsPotentialOwner(
+                    		(String) cmd.getArguments().get(0),
+                            (List<String>) cmd.getArguments().get(1),
+                            (String) cmd.getArguments().get(2));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsPotentialOwnerByGroup: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsPotentialOwnerByGroup((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QuerySubTasksAssignedAsPotentialOwner: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getSubTasksAssignedAsPotentialOwner((Long) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1),
+                            (String) cmd.getArguments().get(2));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryGetSubTasksByParentTaskId: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getSubTasksByParent((Long) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+
+
+                case QueryTasksAssignedAsTaskInitiator: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsTaskInitiator((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsExcludedOwner: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsExcludedOwner((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsRecipient: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsRecipient((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case QueryTasksAssignedAsTaskStakeholder: {
+                    response = CommandName.QueryTaskSummaryResponse;
+                    List<TaskSummary> results = taskSession.getTasksAssignedAsTaskStakeholder((String) cmd.getArguments().get(0),
+                            (String) cmd.getArguments().get(1));
+                    List args = new ArrayList(1);
+                    args.add(results);
+                    Command resultsCmnd = new Command(cmd.getId(),
+                            CommandName.QueryTaskSummaryResponse,
+                            args);
+                    session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+                    break;
+                }
+                case RegisterForEventRequest: {
+                    response = CommandName.EventTriggerResponse;
+                    EventKey key = (EventKey) cmd.getArguments().get(0);
+                    boolean remove = (Boolean) cmd.getArguments().get(1);
+                    String uuid = (String) cmd.getArguments().get(2);
+                    clients.put(uuid,
+                            session);
+                    GenericEventTransport transport = new GenericEventTransport(String.valueOf(msg.getSessionId()), //this is wrong
+                            msg.getResponseId(), //this is wrong
+                            clients,
+                            remove);
+                    service.getEventKeys().register(key,
+                            transport);
+                    break;
+                }
+                case RegisterClient: {
+                    String uuid = (String) cmd.getArguments().get(0);
+                    clients.put(uuid, session);
+                    break;
+                }
+                default: {
+                    systemEventListener.debug("Unknown command recieved on server");
+                }
+            }
+        } catch (RuntimeException e) {
+            systemEventListener.exception(e.getMessage(),e);
+            e.printStackTrace(System.err);
+            List<Object> list = new ArrayList<Object>(1);
+            list.add(e);
+            Command resultsCmnd = new Command(cmd.getId(), response, list);
+            session.write(new Message( msg.getSessionId(),
+                                        msg.getResponseId(),
+                                        msg.isAsync(),
+                                        resultsCmnd ), null);
+        } finally {
+            taskSession.dispose();
+        }
+    }
+
+    
+    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
+        systemEventListener.debug("Server IDLE " + session.getIdleCount(status));
+    }
+
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/eventmessaging/EventMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/eventmessaging/EventMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/eventmessaging/EventMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,10 @@
+package org.drools.grid.task.eventmessaging;
+
+import org.drools.eventmessaging.Payload;
+import org.drools.grid.generic.MessageResponseHandler;
+
+
+
+public interface EventMessageResponseHandler extends MessageResponseHandler {
+    public void execute(Payload payload);
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddAttachmentMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddAttachmentMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddAttachmentMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,17 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingAddAttachmentResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddAttachmentMessageResponseHandler;
+
+public class BlockingAddAttachmentMessageResponseHandler extends BlockingAddAttachmentResponseHandler implements AddAttachmentMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		Long attachmentId = (Long) cmd.getArguments().get(0);
+		Long contentId = (Long) cmd.getArguments().get(1);
+		execute(attachmentId, contentId);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddCommentMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddCommentMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddCommentMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,16 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingAddCommentResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddCommentMessageResponseHandler;
+
+public class BlockingAddCommentMessageResponseHandler extends BlockingAddCommentResponseHandler implements AddCommentMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		Long commentId = (Long) cmd.getArguments().get(0);
+		execute(commentId);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddTaskMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddTaskMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingAddTaskMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,16 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingAddTaskResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.AddTaskMessageResponseHandler;
+
+public class BlockingAddTaskMessageResponseHandler extends BlockingAddTaskResponseHandler implements AddTaskMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		Long taskId = (Long) cmd.getArguments().get(0);
+		execute(taskId);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteAttachmentMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteAttachmentMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteAttachmentMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,13 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.responsehandlers.BlockingDeleteAttachmentResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.DeleteAttachmentMessageResponseHandler;
+
+public class BlockingDeleteAttachmentMessageResponseHandler extends BlockingDeleteAttachmentResponseHandler implements DeleteAttachmentMessageResponseHandler {
+
+	public void receive(Message message) {
+		setDone(true);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteCommentMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteCommentMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingDeleteCommentMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,13 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.responsehandlers.BlockingDeleteCommentResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.DeleteCommentMessageResponseHandler;
+
+public class BlockingDeleteCommentMessageResponseHandler extends BlockingDeleteCommentResponseHandler implements DeleteCommentMessageResponseHandler {
+
+	public void receive(Message message) {
+		setIsDone(true);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingEventMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingEventMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingEventMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,17 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.eventmessaging.Payload;
+import org.drools.grid.generic.Message;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingEventResponseHandler;
+import org.drools.grid.task.eventmessaging.EventMessageResponseHandler;
+
+public class BlockingEventMessageResponseHandler extends BlockingEventResponseHandler implements EventMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		Payload payload = (Payload) cmd.getArguments().get(0);
+		execute(payload);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetContentMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetContentMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetContentMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,17 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.Content;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingGetContentResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetContentMessageResponseHandler;
+
+public class BlockingGetContentMessageResponseHandler extends BlockingGetContentResponseHandler implements GetContentMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		Content content = (Content) cmd.getArguments().get(0);
+		execute(content);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetTaskMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetTaskMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingGetTaskMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,17 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.Task;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingGetTaskResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.GetTaskMessageResponseHandler;
+
+public class BlockingGetTaskMessageResponseHandler extends BlockingGetTaskResponseHandler implements GetTaskMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		Task task = (Task) cmd.getArguments().get(0);
+		execute(task);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingSetContentMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingSetContentMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingSetContentMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,16 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingSetContentResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.SetDocumentMessageResponseHandler;
+
+public class BlockingSetContentMessageResponseHandler extends BlockingSetContentResponseHandler implements SetDocumentMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		long contentId = (Long) cmd.getArguments().get(0);
+		execute(contentId);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskOperationMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskOperationMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskOperationMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,13 @@
+package org.drools.grid.task.responseHandlers;
+
+import org.drools.grid.generic.Message;
+import org.drools.task.service.responsehandlers.BlockingTaskOperationResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.TaskOperationMessageResponseHandler;
+
+public class BlockingTaskOperationMessageResponseHandler extends BlockingTaskOperationResponseHandler implements TaskOperationMessageResponseHandler {
+
+	public void receive(Message message) {
+		setDone(true);
+	}
+
+}
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskSummaryMessageResponseHandler.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskSummaryMessageResponseHandler.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/main/java/org/drools/grid/task/responseHandlers/BlockingTaskSummaryMessageResponseHandler.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,20 @@
+package org.drools.grid.task.responseHandlers;
+
+import java.util.List;
+import org.drools.grid.generic.Message;
+
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.Command;
+import org.drools.task.service.responsehandlers.BlockingTaskSummaryResponseHandler;
+import org.drools.grid.task.TaskClientMessageHandlerImpl.TaskSummaryMessageResponseHandler;
+
+public class BlockingTaskSummaryMessageResponseHandler extends BlockingTaskSummaryResponseHandler implements TaskSummaryMessageResponseHandler {
+
+	public void receive(Message message) {
+		Command cmd = (Command) message.getPayload();
+		List<TaskSummary> results = (List<TaskSummary>) cmd.getArguments().get(0);
+		execute(results);
+	}
+
+}
+

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/BaseTaskServiceTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/BaseTaskServiceTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/BaseTaskServiceTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,777 @@
+package org.drools.grid.task;
+
+import org.drools.grid.task.CommandBasedServicesWSHumanTaskHandler;
+import org.drools.grid.task.HumanTaskService;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import junit.framework.Assert;
+
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.RemoteConnection;
+import org.drools.grid.task.responseHandlers.BlockingGetContentMessageResponseHandler;
+import org.drools.grid.task.responseHandlers.BlockingGetTaskMessageResponseHandler;
+import org.drools.grid.task.responseHandlers.BlockingTaskOperationMessageResponseHandler;
+import org.drools.grid.task.responseHandlers.BlockingTaskSummaryMessageResponseHandler;
+import org.drools.task.AccessType;
+import org.drools.task.Group;
+import org.drools.task.Status;
+import org.drools.task.Task;
+import org.drools.task.User;
+import org.drools.task.query.TaskSummary;
+import org.drools.task.service.ContentData;
+import org.drools.task.service.PermissionDeniedException;
+import org.junit.Test;
+
+
+
+
+public abstract class BaseTaskServiceTest {
+
+    protected CommandBasedServicesWSHumanTaskHandler handler;
+    protected HumanTaskService humanTaskClient;
+    protected static final int DEFAULT_WAIT_TIME = 5000;
+    protected static final int MANAGER_COMPLETION_WAIT_TIME = DEFAULT_WAIT_TIME;
+    protected static final int MANAGER_ABORT_WAIT_TIME = DEFAULT_WAIT_TIME;
+    protected Map<String, User> users;
+    protected Map<String, Group> groups;
+    protected ExecutionNode node;
+    protected RemoteConnection connection = new RemoteConnection();
+
+    @Test
+    public void testTask() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary task = tasks.get(0);
+        Assert.assertEquals("TaskName", task.getName());
+        Assert.assertEquals(10, task.getPriority());
+        Assert.assertEquals("Comment", task.getDescription());
+        Assert.assertEquals(Status.Reserved, task.getStatus());
+        Assert.assertEquals("Darth Vader", task.getActualOwner().getId());
+
+        System.out.println("Starting task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started task " + task.getId());
+
+        System.out.println("Completing task " + task.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.complete(task.getId(), "Darth Vader", null, operationResponseHandler);
+        operationResponseHandler.waitTillDone(15000);
+        System.out.println("Completed task " + task.getId());
+        Assert.assertTrue(manager.waitTillCompleted(DEFAULT_WAIT_TIME));
+        Thread.sleep(500);
+    }
+    @Test
+    public void testTaskMultipleActors() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader, Dalai Lama");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary task = tasks.get(0);
+        Assert.assertEquals("TaskName", task.getName());
+        Assert.assertEquals(10, task.getPriority());
+        Assert.assertEquals("Comment", task.getDescription());
+        Assert.assertEquals(Status.Ready, task.getStatus());
+
+        System.out.println("Claiming task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.claim(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Claimed task " + task.getId());
+
+        System.out.println("Starting task " + task.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started task " + task.getId());
+
+        System.out.println("Completing task " + task.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.complete(task.getId(), "Darth Vader", null, operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Completed task " + task.getId());
+
+        Assert.assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
+
+        Thread.sleep(500);
+    }
+    @Test
+    public void testTaskGroupActors() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("GroupId", "Crusaders");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        List<String> groupIds = new ArrayList<String>();
+        groupIds.add("Crusaders");
+        humanTaskClient.getTasksAssignedAsPotentialOwner(null, groupIds, "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary taskSummary = tasks.get(0);
+        Assert.assertEquals("TaskName", taskSummary.getName());
+        Assert.assertEquals(10, taskSummary.getPriority());
+        Assert.assertEquals("Comment", taskSummary.getDescription());
+        Assert.assertEquals(Status.Ready, taskSummary.getStatus());
+
+        System.out.println("Claiming task " + taskSummary.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.claim(taskSummary.getId(), "Darth Vader", operationResponseHandler);
+        PermissionDeniedException denied = null;
+        System.out.println("1");
+        try {
+            operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+            System.out.println("2");
+        } catch (PermissionDeniedException e) {
+        	System.out.println("EXCEPTION: " + e);
+                denied = e;
+        }
+        //@TODO: not working I don't know why!
+        //Assert.assertNotNull("Should get permissed denied exception", denied);
+        System.out.println("Claimed task " + taskSummary.getId());
+
+        //Check if the parent task is InProgress
+        BlockingGetTaskMessageResponseHandler getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(taskSummary.getId(), getTaskResponseHandler);
+        Task task = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.Ready, task.getTaskData().getStatus());
+
+        Thread.sleep(500);
+    }
+    @Test
+    public void testTaskSingleAndGroupActors() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task One");
+        workItem.setParameter("TaskName", "TaskNameOne");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("GroupId", "Crusaders");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        workItem = new WorkItemImpl();
+        workItem.setName("Human Task Two");
+        workItem.setParameter("TaskName", "TaskNameTwo");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        List<String> groupIds = new ArrayList<String>();
+        groupIds.add("Crusaders");
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", groupIds, "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(2, tasks.size());
+
+        Thread.sleep(500);
+    }
+    @Test
+    public void testTaskFail() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary task = tasks.get(0);
+        Assert.assertEquals("TaskName", task.getName());
+        Assert.assertEquals(10, task.getPriority());
+        Assert.assertEquals("Comment", task.getDescription());
+        Assert.assertEquals(Status.Reserved, task.getStatus());
+        Assert.assertEquals("Darth Vader", task.getActualOwner().getId());
+
+        System.out.println("Starting task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started task " + task.getId());
+
+        System.out.println("Failing task " + task.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.fail(task.getId(), "Darth Vader", null, operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Failed task " + task.getId());
+
+        Assert.assertTrue(manager.waitTillAborted(MANAGER_ABORT_WAIT_TIME));
+
+        Thread.sleep(500);
+    }
+    @Test
+    public void testTaskSkip() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary task = tasks.get(0);
+        Assert.assertEquals("TaskName", task.getName());
+        Assert.assertEquals(10, task.getPriority());
+        Assert.assertEquals("Comment", task.getDescription());
+        Assert.assertEquals(Status.Reserved, task.getStatus());
+        Assert.assertEquals("Darth Vader", task.getActualOwner().getId());
+
+        System.out.println("Skipping task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.skip(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Skipped task " + task.getId());
+
+        Assert.assertTrue(manager.waitTillAborted(MANAGER_ABORT_WAIT_TIME));
+    }
+    @Test
+    public void testTaskAbortSkippable() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        handler.abortWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(0, tasks.size());
+    }
+    @Test
+    public void testTaskAbortNotSkippable() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("Skippable", "false");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+
+        handler.abortWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+    }
+    @Test
+    public void testTaskData() throws Exception {
+        TestWorkItemManager manager = new TestWorkItemManager();
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskName");
+        workItem.setParameter("Comment", "Comment");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("Content", "This is the content");
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary taskSummary = tasks.get(0);
+        Assert.assertEquals("TaskName", taskSummary.getName());
+        Assert.assertEquals(10, taskSummary.getPriority());
+        Assert.assertEquals("Comment", taskSummary.getDescription());
+        Assert.assertEquals(Status.Reserved, taskSummary.getStatus());
+        Assert.assertEquals("Darth Vader", taskSummary.getActualOwner().getId());
+
+        BlockingGetTaskMessageResponseHandler getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(taskSummary.getId(), getTaskResponseHandler);
+        Task task = getTaskResponseHandler.getTask();
+        Assert.assertEquals(AccessType.Inline, task.getTaskData().getDocumentAccessType());
+        long contentId = task.getTaskData().getDocumentContentId();
+        Assert.assertTrue(contentId != -1);
+        BlockingGetContentMessageResponseHandler getContentResponseHandler = new BlockingGetContentMessageResponseHandler();
+        humanTaskClient.getContent(contentId, getContentResponseHandler);
+        ByteArrayInputStream bis = new ByteArrayInputStream(getContentResponseHandler.getContent().getContent());
+        ObjectInputStream in = new ObjectInputStream(bis);
+        Object data = in.readObject();
+        in.close();
+        Assert.assertEquals("This is the content", data);
+
+        System.out.println("Starting task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started task " + task.getId());
+
+        System.out.println("Completing task " + task.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        ContentData result = new ContentData();
+        result.setAccessType(AccessType.Inline);
+        result.setType("java.lang.String");
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream(bos);
+        out.writeObject("This is the result");
+        out.close();
+        result.setContent(bos.toByteArray());
+        humanTaskClient.complete(task.getId(), "Darth Vader", result, operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Completed task " + task.getId());
+
+        Assert.assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
+        Map<String, Object> results = manager.getResults();
+        Assert.assertNotNull(results);
+        Assert.assertEquals("Darth Vader", results.get("ActorId"));
+        Assert.assertEquals("This is the result", results.get("Result"));
+    }
+    @Test
+    public void testOnAllSubTasksEndParentEndStrategy() throws Exception {
+
+        TestWorkItemManager manager = new TestWorkItemManager();
+        //Create the parent task
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskNameParent");
+        workItem.setParameter("Comment", "CommentParent");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        //Set the subtask policy
+        workItem.setParameter("SubTaskStrategies", "OnAllSubTasksEndParentEnd");
+        handler.executeWorkItem(workItem, manager);
+
+
+        Thread.sleep(500);
+
+        //Test if the task is succesfully created
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary task = tasks.get(0);
+        Assert.assertEquals("TaskNameParent", task.getName());
+        Assert.assertEquals(10, task.getPriority());
+        Assert.assertEquals("CommentParent", task.getDescription());
+        Assert.assertEquals(Status.Reserved, task.getStatus());
+        Assert.assertEquals("Darth Vader", task.getActualOwner().getId());
+
+        //Create the child task
+        workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskNameChild1");
+        workItem.setParameter("Comment", "CommentChild1");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Create the child task2
+        workItem = new WorkItemImpl();
+        workItem.setName("Human Task2");
+        workItem.setParameter("TaskName", "TaskNameChild2");
+        workItem.setParameter("Comment", "CommentChild2");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Start the parent task
+        System.out.println("Starting task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started task " + task.getId());
+
+        //Check if the parent task is InProgress
+        BlockingGetTaskMessageResponseHandler getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(task.getId(), getTaskResponseHandler);
+        Task parentTask = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.InProgress, parentTask.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), parentTask.getTaskData().getActualOwner());
+
+        //Get all the subtask created for the parent task based on the potential owner
+        responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getSubTasksAssignedAsPotentialOwner(parentTask.getId(), "Darth Vader", "en-UK", responseHandler);
+        List<TaskSummary> subTasks = responseHandler.getResults();
+        Assert.assertEquals(2, subTasks.size());
+        TaskSummary subTaskSummary1 = subTasks.get(0);
+        TaskSummary subTaskSummary2 = subTasks.get(1);
+        Assert.assertNotNull(subTaskSummary1);
+        Assert.assertNotNull(subTaskSummary2);
+
+        //Starting the sub task 1
+        System.out.println("Starting sub task " + subTaskSummary1.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(subTaskSummary1.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started sub task " + subTaskSummary1.getId());
+
+        //Starting the sub task 2
+        System.out.println("Starting sub task " + subTaskSummary2.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(subTaskSummary2.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started sub task " + subTaskSummary2.getId());
+
+        //Check if the child task 1 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTaskSummary1.getId(), getTaskResponseHandler);
+        Task subTask1 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.InProgress, subTask1.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());
+
+        //Check if the child task 2 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTaskSummary2.getId(), getTaskResponseHandler);
+        Task subTask2 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.InProgress, subTask2.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());
+
+        // Complete the child task 1
+        System.out.println("Completing sub task " + subTask1.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.complete(subTask1.getId(), "Darth Vader", null, operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Completed sub task " + subTask1.getId());
+
+        // Complete the child task 2
+        System.out.println("Completing sub task " + subTask2.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.complete(subTask2.getId(), "Darth Vader", null, operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Completed sub task " + subTask2.getId());
+
+        //Check if the child task 1 is Completed
+
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTask1.getId(), getTaskResponseHandler);
+        subTask1 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.Completed, subTask1.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());
+
+        //Check if the child task 2 is Completed
+
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTask2.getId(), getTaskResponseHandler);
+        subTask2 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.Completed, subTask2.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());
+
+        // Check is the parent task is Complete
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(parentTask.getId(), getTaskResponseHandler);
+        parentTask = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.Completed, parentTask.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), parentTask.getTaskData().getActualOwner());
+
+        Assert.assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
+    }
+    @Test
+    public void testOnParentAbortAllSubTasksEndStrategy() throws Exception {
+
+        TestWorkItemManager manager = new TestWorkItemManager();
+        //Create the parent task
+        WorkItemImpl workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskNameParent");
+        workItem.setParameter("Comment", "CommentParent");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        //Set the subtask policy
+        workItem.setParameter("SubTaskStrategies", "OnParentAbortAllSubTasksEnd");
+        handler.executeWorkItem(workItem, manager);
+
+
+        Thread.sleep(500);
+
+        //Test if the task is succesfully created
+        BlockingTaskSummaryMessageResponseHandler responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getTasksAssignedAsPotentialOwner("Darth Vader", "en-UK", responseHandler);
+        responseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        List<TaskSummary> tasks = responseHandler.getResults();
+        Assert.assertEquals(1, tasks.size());
+        TaskSummary task = tasks.get(0);
+        Assert.assertEquals("TaskNameParent", task.getName());
+        Assert.assertEquals(10, task.getPriority());
+        Assert.assertEquals("CommentParent", task.getDescription());
+        Assert.assertEquals(Status.Reserved, task.getStatus());
+        Assert.assertEquals("Darth Vader", task.getActualOwner().getId());
+
+        //Create the child task
+        workItem = new WorkItemImpl();
+        workItem.setName("Human Task");
+        workItem.setParameter("TaskName", "TaskNameChild1");
+        workItem.setParameter("Comment", "CommentChild1");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Create the child task2
+        workItem = new WorkItemImpl();
+        workItem.setName("Human Task2");
+        workItem.setParameter("TaskName", "TaskNameChild2");
+        workItem.setParameter("Comment", "CommentChild2");
+        workItem.setParameter("Priority", "10");
+        workItem.setParameter("ActorId", "Darth Vader");
+        workItem.setParameter("ParentId", task.getId());
+        handler.executeWorkItem(workItem, manager);
+
+        Thread.sleep(500);
+
+        //Start the parent task
+        System.out.println("Starting task " + task.getId());
+        BlockingTaskOperationMessageResponseHandler operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(task.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started task " + task.getId());
+
+        //Check if the parent task is InProgress
+        BlockingGetTaskMessageResponseHandler getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(task.getId(), getTaskResponseHandler);
+        Task parentTask = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.InProgress, parentTask.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), parentTask.getTaskData().getActualOwner());
+
+        //Get all the subtask created for the parent task based on the potential owner
+        responseHandler = new BlockingTaskSummaryMessageResponseHandler();
+        humanTaskClient.getSubTasksAssignedAsPotentialOwner(parentTask.getId(), "Darth Vader", "en-UK", responseHandler);
+        List<TaskSummary> subTasks = responseHandler.getResults();
+        Assert.assertEquals(2, subTasks.size());
+        TaskSummary subTaskSummary1 = subTasks.get(0);
+        TaskSummary subTaskSummary2 = subTasks.get(1);
+        Assert.assertNotNull(subTaskSummary1);
+        Assert.assertNotNull(subTaskSummary2);
+
+        //Starting the sub task 1
+        System.out.println("Starting sub task " + subTaskSummary1.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(subTaskSummary1.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started sub task " + subTaskSummary1.getId());
+
+        //Starting the sub task 2
+        System.out.println("Starting sub task " + subTaskSummary2.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.start(subTaskSummary2.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Started sub task " + subTaskSummary2.getId());
+
+        //Check if the child task 1 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTaskSummary1.getId(), getTaskResponseHandler);
+        Task subTask1 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.InProgress, subTask1.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());
+
+        //Check if the child task 2 is InProgress
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTaskSummary2.getId(), getTaskResponseHandler);
+        Task subTask2 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.InProgress, subTask2.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());
+
+        // Complete the parent task
+        System.out.println("Completing parent task " + parentTask.getId());
+        operationResponseHandler = new BlockingTaskOperationMessageResponseHandler();
+        humanTaskClient.skip(parentTask.getId(), "Darth Vader", operationResponseHandler);
+        operationResponseHandler.waitTillDone(DEFAULT_WAIT_TIME);
+        System.out.println("Completed parent task " + parentTask.getId());
+
+        //Check if the child task 1 is Completed
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTaskSummary1.getId(), getTaskResponseHandler);
+        subTask1 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.Completed, subTask1.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask1.getTaskData().getActualOwner());
+
+        //Check if the child task 2 is Completed
+        getTaskResponseHandler = new BlockingGetTaskMessageResponseHandler();
+        humanTaskClient.getTask(subTaskSummary2.getId(), getTaskResponseHandler);
+        subTask2 = getTaskResponseHandler.getTask();
+        Assert.assertEquals(Status.Completed, subTask2.getTaskData().getStatus());
+        Assert.assertEquals(users.get("darth"), subTask2.getTaskData().getActualOwner());
+
+        Assert.assertTrue(manager.waitTillCompleted(MANAGER_COMPLETION_WAIT_TIME));
+    }
+
+    private class TestWorkItemManager implements WorkItemManager {
+
+        private volatile boolean completed;
+        private volatile boolean aborted;
+        private volatile Map<String, Object> results;
+
+        public synchronized boolean waitTillCompleted(long time) {
+            if (!isCompleted()) {
+                try {
+                    wait(time);
+                } catch (InterruptedException e) {
+                    // swallow and return state of completed
+                }
+            }
+
+            return isCompleted();
+        }
+
+        public synchronized boolean waitTillAborted(long time) {
+            if (!isAborted()) {
+                try {
+                    wait(time);
+                } catch (InterruptedException e) {
+                    // swallow and return state of aborted
+                }
+            }
+
+            return isAborted();
+        }
+
+        public void abortWorkItem(long id) {
+            setAborted(true);
+        }
+
+        public synchronized boolean isAborted() {
+            return aborted;
+        }
+
+        private synchronized void setAborted(boolean aborted) {
+            this.aborted = aborted;
+            notifyAll();
+        }
+
+        public void completeWorkItem(long id, Map<String, Object> results) {
+            this.results = results;
+            setCompleted(true);
+        }
+
+        private synchronized void setCompleted(boolean completed) {
+            this.completed = completed;
+            notifyAll();
+        }
+
+        public synchronized boolean isCompleted() {
+            return completed;
+        }
+
+        public WorkItem getWorkItem(long id) {
+            return null;
+        }
+
+        public Set<WorkItem> getWorkItems() {
+            return null;
+        }
+
+        public Map<String, Object> getResults() {
+            return results;
+        }
+
+        public void internalAbortWorkItem(long id) {
+        }
+
+        public void internalAddWorkItem(WorkItem workItem) {
+        }
+
+        public void internalExecuteWorkItem(WorkItem workItem) {
+        }
+
+        public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+        }
+
+        @Override
+        public void registerWorkItemHandler(String workItemName, org.drools.runtime.process.WorkItemHandler handler) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
+    }
+
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandlerTest.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandlerTest.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/grid/task/CommandBasedServicesWSHumanTaskHandlerTest.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,227 @@
+package org.drools.grid.task;
+
+import org.drools.grid.task.CommandBasedServicesWSHumanTaskHandler;
+import org.drools.grid.task.HumanTaskServiceProviderRemoteClient;
+import org.drools.grid.task.HumanTaskFactoryService;
+import org.drools.grid.task.TaskServerMessageHandlerImpl;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.Date;
+import java.util.Map;
+import java.util.Properties;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import org.apache.commons.collections.map.HashedMap;
+
+import org.apache.mina.transport.socket.SocketAcceptor;
+import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.SystemEventListenerFactory;
+import org.drools.io.impl.ClassPathResource;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.grid.generic.NodeData;
+import org.drools.grid.generic.GenericNodeConnector;
+import org.drools.grid.generic.GenericMessageHandlerImpl;
+import org.drools.grid.remote.mina.MinaAcceptor;
+import org.drools.grid.remote.mina.MinaNodeConnector;
+import org.drools.grid.remote.mina.MinaIoHandler;
+import org.drools.grid.strategies.ReturnAlwaysTheFirstSelectionStrategy;
+import org.drools.task.Group;
+import org.drools.task.MockUserInfo;
+import org.drools.task.User;
+import org.drools.task.service.SendIcal;
+import org.drools.task.service.TaskService;
+import org.drools.task.service.TaskServiceSession;
+import org.junit.After;
+import org.junit.Before;
+import org.mvel2.MVEL;
+import org.mvel2.ParserContext;
+import org.mvel2.compiler.ExpressionCompiler;
+
+public class CommandBasedServicesWSHumanTaskHandlerTest extends BaseTaskServiceTest {
+
+    
+    
+    private MinaAcceptor server;
+    private MinaAcceptor humanTaskServer;
+    //private NodeConnector nodeConnection;
+  
+    protected EntityManagerFactory emf;
+    
+    protected static TaskService taskService;
+    protected TaskServiceSession taskSession;
+    protected GenericNodeConnector htMinaClient;
+    protected GenericNodeConnector minaClient;
+    @Before
+    public void setUpTaskService() throws Exception {
+        Properties conf = new Properties();
+        conf.setProperty("mail.smtp.host", "localhost");
+        conf.setProperty("mail.smtp.port", "2345");
+        conf.setProperty("from", "from at domain.com");
+        conf.setProperty("replyTo", "replyTo at domain.com");
+        conf.setProperty("defaultLanguage", "en-UK");
+        SendIcal.initInstance(conf);
+
+        // Use persistence.xml configuration
+        emf = Persistence.createEntityManagerFactory("org.drools.task");
+
+        taskService = new TaskService(emf, SystemEventListenerFactory.getSystemEventListener());
+        taskSession = taskService.createSession();
+        MockUserInfo userInfo = new MockUserInfo();
+        taskService.setUserinfo(userInfo);
+        Map vars = new HashedMap();
+
+        Reader reader = null;
+
+        try {
+            reader = new InputStreamReader(new ClassPathResource("org/drools/task/LoadUsers.mvel").getInputStream());
+            users = (Map<String, User>) eval(reader, vars);
+            for (User user : users.values()) {
+                taskSession.addUser(user);
+            }
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+            reader = null;
+        }
+
+        try {
+            reader = new InputStreamReader(new ClassPathResource("org/drools/task/LoadGroups.mvel").getInputStream());
+            groups = (Map<String, Group>) eval(reader, vars);
+            for (Group group : groups.values()) {
+                taskSession.addGroup(group);
+            }
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+    
+        
+        SocketAddress address = new InetSocketAddress("127.0.0.1", 9123);
+        NodeData nodeData = new NodeData();
+        // Setup Execution Node Server
+        SocketAcceptor acceptor = new NioSocketAcceptor();
+        acceptor.setHandler(new MinaIoHandler(SystemEventListenerFactory.getSystemEventListener(),
+                new GenericMessageHandlerImpl(nodeData,
+                SystemEventListenerFactory.getSystemEventListener())));
+        this.server = new MinaAcceptor(acceptor, address);
+        this.server.start();
+        Thread.sleep(5000);
+        // End Execution Server
+
+        // Human task Server configuration
+        SocketAddress htAddress = new InetSocketAddress("127.0.0.1", 9124);
+        SocketAcceptor htAcceptor = new NioSocketAcceptor();
+
+        htAcceptor.setHandler(new MinaIoHandler(SystemEventListenerFactory.getSystemEventListener(),
+                new TaskServerMessageHandlerImpl(taskService,
+                SystemEventListenerFactory.getSystemEventListener())));
+        this.humanTaskServer = new MinaAcceptor(htAcceptor, htAddress);
+        this.humanTaskServer.start();
+        Thread.sleep(5000);
+        // End Human task Server configuration
+
+        // setup the ht client
+        NioSocketConnector htclientConnector = new NioSocketConnector();
+        htclientConnector.setHandler(new MinaIoHandler(SystemEventListenerFactory.getSystemEventListener()));
+        htMinaClient = new MinaNodeConnector("client ht",
+                htclientConnector,
+                htAddress,
+                SystemEventListenerFactory.getSystemEventListener());
+
+         boolean connected = htMinaClient.connect();
+            if (!connected) {
+                throw new IllegalArgumentException("Could not connect task client");
+            }
+
+        // setup RemoteService client
+        NioSocketConnector clientConnector = new NioSocketConnector();
+        clientConnector.setHandler(new MinaIoHandler(SystemEventListenerFactory.getSystemEventListener()));
+        minaClient = new MinaNodeConnector("client SM",
+                clientConnector,
+                address,
+                SystemEventListenerFactory.getSystemEventListener());
+
+
+
+        connection.addNodeConnector(minaClient);
+
+        node = connection.getExecutionNode(new ReturnAlwaysTheFirstSelectionStrategy(connection));
+        //nodeConnection.connect();
+        
+        
+        
+
+        
+        KnowledgeBase kbase = this.node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        int sessionId = ksession.getId();
+
+        node.set(HumanTaskFactoryService.class, new HumanTaskServiceProviderRemoteClient(htMinaClient, sessionId));
+
+        this.humanTaskClient = this.node.get(HumanTaskFactoryService.class).newHumanTaskService();
+        
+
+        this.handler = new CommandBasedServicesWSHumanTaskHandler(ksession);
+        
+        
+    }
+    @After
+    public void tearDown() throws Exception {
+        this.humanTaskClient.disconnect();
+        
+        for(GenericNodeConnector connector : connection.getNodeConnectors()){
+            connector.disconnect();
+        }
+        
+        this.handler.dispose();
+        this.server.stop();
+        this.humanTaskServer.stop();
+        
+        taskSession.dispose();
+        emf.close();
+        
+       
+    }
+
+    public Object eval(Reader reader,
+                       Map vars) {
+        try {
+            return eval(toString(reader),
+                    vars);
+        } catch (IOException e) {
+            throw new RuntimeException("Exception Thrown",
+                    e);
+        }
+    }
+
+    public String toString(Reader reader) throws IOException {
+        StringBuilder sb = new StringBuilder(1024);
+        int charValue;
+
+        while ((charValue = reader.read()) != -1) {
+            sb.append((char) charValue);
+        }
+        return sb.toString();
+    }
+
+    public Object eval(String str, Map vars) {
+        ExpressionCompiler compiler = new ExpressionCompiler(str.trim());
+
+        ParserContext context = new ParserContext();
+        context.addPackageImport("org.drools.task");
+        context.addPackageImport("org.drools.task.service");
+        context.addPackageImport("org.drools.task.query");
+        context.addPackageImport("java.util");
+
+        vars.put("now", new Date());
+        return MVEL.executeExpression(compiler.compile(context), vars);
+    }
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/task/MockUserInfo.java
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/task/MockUserInfo.java	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/java/org/drools/task/MockUserInfo.java	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,74 @@
+package org.drools.task;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MockUserInfo implements UserInfo {
+
+    private Map<Group, List<OrganizationalEntity>> groups = new HashMap<Group, List<OrganizationalEntity>>();
+
+    private Map<OrganizationalEntity, String> emails = new HashMap<OrganizationalEntity, String>();
+
+    private Map<OrganizationalEntity, String> languages = new HashMap<OrganizationalEntity, String>();
+
+    private Map<OrganizationalEntity, String> displayNames = new HashMap<OrganizationalEntity, String>();
+
+    public Map<Group, List<OrganizationalEntity>> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(Map<Group, List<OrganizationalEntity>> groups) {
+        this.groups = groups;
+    }
+
+    public Map<OrganizationalEntity, String> getEmails() {
+        return emails;
+    }
+
+    public void setEmails(Map<OrganizationalEntity, String> emails) {
+        this.emails = emails;
+    }
+
+    public String getEmailForEntity(OrganizationalEntity entity) {
+        return emails.get( entity );
+    }
+
+
+
+    public Map<OrganizationalEntity, String> getDisplayNames() {
+        return displayNames;
+    }
+
+    public void setDisplayNames(Map<OrganizationalEntity, String> displayNames) {
+        this.displayNames = displayNames;
+    }
+
+    public Map<OrganizationalEntity, String> getLanguages() {
+        return languages;
+    }
+
+    public void setLanguages(Map<OrganizationalEntity, String> languages) {
+        this.languages = languages;
+    }
+
+    public Iterator<OrganizationalEntity> getMembersForGroup(Group group) {
+        return groups.get( group ).iterator();
+    }
+
+    public boolean hasEmail(Group group) {
+        return emails.containsKey( group );
+    }
+
+    public String getDisplayName(OrganizationalEntity entity) {
+        String displayName = displayNames.get( entity );
+        return ( displayName != null ) ? displayName : entity.getId();
+    }
+
+    public String getLanguageForEntity(OrganizationalEntity entity) {
+        return languages.get( entity );
+    }
+
+
+}

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/drools.email.conf
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/drools.email.conf	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/drools.email.conf	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,5 @@
+from = from at domain.com
+replyTo = replyTo at domain.com
+mail.smtp.host = localhost
+mail.smtp.port = 25
+defaultLanguage = en-UK
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/orm.xml
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/orm.xml	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/orm.xml	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,535 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+               version="1.0">
+      <named-query name="TasksAssignedAsBusinessAdministrator">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity businessAdministrator
+where
+    businessAdministrator.id = :userId and
+    businessAdministrator in elements ( t.peopleAssignments.businessAdministrators  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+      <named-query name="TasksAssignedAsExcludedOwner">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity excludedOwners
+where
+    excludedOwners.id = :userId and
+    excludedOwners in elements ( t.peopleAssignments.excludedOwners  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+      <named-query name="TasksAssignedAsPotentialOwner">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subject.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t
+    left join t.taskData.createdBy
+    left join t.taskData.actualOwner
+    left join t.subjects as subject,
+    I18NText names,
+    I18NText descriptions,
+    OrganizationalEntity potentialOwners
+where
+    potentialOwners.id = :userId and
+    potentialOwners in elements ( t.peopleAssignments.potentialOwners  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subject.language = :language
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+
+
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+            <named-query name="TasksAssignedAsPotentialOwnerWithGroups">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy left join t.taskData.actualOwner,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity potentialOwners
+where
+    ( potentialOwners.id = :userId or potentialOwners.id in (:groupIds) ) and
+    potentialOwners in elements ( t.peopleAssignments.potentialOwners )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+
+       <named-query name="TasksAssignedAsPotentialOwnerByGroup">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy left join t.taskData.actualOwner,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity potentialOwners
+where
+    potentialOwners.id = :groupId and
+    potentialOwners in elements ( t.peopleAssignments.potentialOwners  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+
+      <named-query name="SubTasksAssignedAsPotentialOwner">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy left join t.taskData.actualOwner,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity potentialOwners
+where
+    t.taskData.parentId = :parentId and
+    potentialOwners.id = :userId and
+    potentialOwners in elements ( t.peopleAssignments.potentialOwners  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+
+<named-query name="GetSubTasksByParentTaskId">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions
+
+where
+    t.taskData.parentId = :parentId and
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.status in ('Created', 'Ready', 'Reserved', 'InProgress', 'Suspended') and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+
+
+      <named-query name="TasksAssignedAsRecipient">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity recipients
+where
+    recipients.id = :userId and
+    recipients in elements ( t.peopleAssignments.recipients  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+      <named-query name="TasksAssignedAsTaskInitiator">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity taskInitiator
+where
+    taskInitiator.id = :userId and
+    taskInitiator = t.peopleAssignments.taskInitiator and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+      <named-query name="TasksAssignedAsTaskStakeholder">
+          <query>
+select
+     new org.drools.task.query.TaskSummary(
+     t.id,
+     names.text,
+     subjects.text,
+     descriptions.text,
+     t.taskData.status,
+     t.priority,
+     t.taskData.skipable,
+     t.taskData.actualOwner,
+     t.taskData.createdBy,
+     t.taskData.createdOn,
+     t.taskData.activationTime,
+     t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions,
+    OrganizationalEntity taskStakeholder
+where
+    taskStakeholder.id = :userId and
+    taskStakeholder in elements ( t.peopleAssignments.taskStakeholders  )  and
+
+    names.language = :language and
+    names in elements( t.names) and
+
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+      <named-query name="TasksOwned">
+          <query>
+select
+    new org.drools.task.query.TaskSummary(
+    t.id,
+    names.text,
+    subjects.text,
+    descriptions.text,
+    t.taskData.status,
+    t.priority,
+    t.taskData.skipable,
+    t.taskData.actualOwner,
+    t.taskData.createdBy,
+    t.taskData.createdOn,
+    t.taskData.activationTime,
+    t.taskData.expirationTime)
+from
+    Task t left join t.taskData.createdBy,
+    I18NText names,
+    I18NText subjects,
+    I18NText descriptions
+where
+    t.taskData.actualOwner.id = :userId and
+    names in elements( t.names) and
+    names.language = :language and
+              
+    (
+    subjects.language = :language and
+    subjects in elements( t.subjects)
+    or t.subjects.size = 0
+    ) and
+
+    (
+    descriptions.language = :language and
+    descriptions in elements( t.descriptions)
+    or t.descriptions.size = 0
+    ) and
+
+    t.taskData.expirationTime is null
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+	  <named-query name="UnescalatedDeadlines">
+          <query>
+select
+     new org.drools.task.query.DeadlineSummary(
+     t.id,
+     d.id,
+     d.date)
+from
+    Task t,
+    Deadline d
+where
+    (d in elements( t.deadlines.startDeadlines ) or d in elements( t.deadlines.endDeadlines ) ) and
+    d.escalated = false
+order by
+    d.date
+          </query>
+          <!-- hint name="org.hibernate.timeout" value="200"/ -->
+      </named-query>
+</entity-mappings>

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/persistence.xml	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/META-INF/persistence.xml	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<persistence version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
+http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence">
+    <persistence-unit name="org.drools.task">
+        <provider>org.hibernate.ejb.HibernatePersistence</provider>
+        <class>org.drools.task.Attachment</class>
+        <class>org.drools.task.Content</class>
+        <class>org.drools.task.BooleanExpression</class>
+        <class>org.drools.task.Comment</class>
+        <class>org.drools.task.Deadline</class>
+        <class>org.drools.task.Comment</class>
+        <class>org.drools.task.Deadline</class>
+        <class>org.drools.task.Delegation</class>
+        <class>org.drools.task.Escalation</class>
+        <class>org.drools.task.Group</class>
+        <class>org.drools.task.I18NText</class>
+        <class>org.drools.task.Notification</class>
+        <class>org.drools.task.EmailNotification</class>
+        <class>org.drools.task.EmailNotificationHeader</class>
+        <class>org.drools.task.PeopleAssignments</class>
+        <class>org.drools.task.Reassignment</class>
+        <class>org.drools.task.Status</class>
+        <class>org.drools.task.Task</class>
+        <class>org.drools.task.TaskData</class>
+        <class>org.drools.task.SubTasksStrategy</class>
+        <class>org.drools.task.OnParentAbortAllSubTasksEndStrategy</class>
+        <class>org.drools.task.OnAllSubTasksEndParentEndStrategy</class>
+
+        <class>org.drools.task.User</class>
+
+	    <properties>
+	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
+	        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
+	        <property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" />
+	        <!--  property name="hibernate.connection.url" value="jdbc:h2:file:\dev\drools\trunk7\drools-process\drools-process-task\mydb"/ -->
+
+<!--			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>-->
+<!--	        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>	  	        -->
+<!--	        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/postgres"/>-->
+
+
+	        <property name="hibernate.connection.username" value="sa"/>
+	        <property name="hibernate.connection.password" value="sasa"/>
+	        <property name="hibernate.connection.autocommit" value="false" />
+	        <property name="hibernate.max_fetch_depth" value="3"/>
+		    <property name="hibernate.hbm2ddl.auto" value="create" />
+            <property name="hibernate.show_sql" value="true" />
+	    </properties>
+    </persistence-unit>
+
+</persistence>

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/FullyPopulatedTask.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,138 @@
+with ( new Task() ) { 
+    priority = 100,
+    peopleAssignments = (with ( new PeopleAssignments() ) {        
+        taskInitiator = users['darth' ],
+        potentialOwners = [users['bobba' ], users['jabba' ]],
+        excludedOwners = [users['dalai' ], users['christoper' ]],
+        taskStakeholders = [users['stuart' ], users['jane' ]],
+        businessAdministrators = [users['peter' ], users['steve' ]],
+        recipients = [users['sly' ], users['liz' ]]
+    }),
+    taskData = (with ( new TaskData() ) {
+        actualOwner = users[ 'liz' ],
+        createdBy = users[ 'sly' ],
+        activationTime = new Date( 10000000 ),
+        createdOn = new Date( 10000000 ),
+        expirationTime = new Date( 10000000 ),
+        status = Status.Ready,
+        documentAccessType = AccessType.Inline,
+        documentType = "mvel",
+        documentContentId = 20,
+        attachments = [ 
+            (with ( new Attachment() ) {
+                accessType = AccessType.Inline,
+                attachedAt = new Date( 10000000 ),                            
+                attachedBy = users['liz' ],
+                contentType = "text",
+                name = "file.txt",
+                size = 5000,
+                attachmentContentId = 5           
+             }),
+             (with ( new Attachment() ) {
+                 accessType = AccessType.Url, 
+                 attachedAt = new Date( 10000000 ),
+                 attachedBy = users['liz' ],
+                 contentType = "text",
+                 name = "file2.txt",
+                 size = 500,
+                 attachmentContentId = 3
+             })
+        ],
+        comments = [ 
+            (with ( new Comment ) {
+                addedBy = users['peter' ],
+                addedAt = new Date( 10000000 ),
+                text = "this is a short comment"
+             }),
+             (with ( new Comment ) {
+                 addedBy = users['steve' ],
+                 addedAt = new Date( 10000000 ),
+                 text = "this is a loooooooooooooooooooooooooooooooooooooooooooooooong comment"
+             })
+        ]
+    }),
+    names = [ new I18NText( "en-UK", "This is my task name" ),
+              new I18NText( "en-DK", "Dies ist mein task Name" )],
+    subjects = [ new I18NText( "en-UK", "This is my task subject" ),
+                 new I18NText( "en-DK", "Das ist mein task Thema" ) ],
+    descriptions = [ new I18NText( "en-UK", "This is my task description" ),
+                     new I18NText( "en-DK", "Das ist mein task Beschreibung" ) ],
+    delegation = ( with( new Delegation() ) {
+        allowed = AllowedToDelegate.PotentialOwners,
+        delegates = [ groups['crusaders' ], groups['knightsTempler' ] ]                                                                
+    }),
+    deadlines = ( with ( new Deadlines() ) {
+        startDeadlines = [ 
+            (with (new Deadline()) {
+                date = new Date( 10000000 ),
+                escalated = true,
+                documentation = [ new I18NText( "en-UK", "Start Deadline documentation" ),
+                                  new I18NText( "en-DK", "Start Termin Dokumentation" ) ],
+                escalations = [ 
+                    (with (new Escalation()) {
+                        name = "My Start Escalation",
+                        constraints = [new BooleanExpression( "mvel", "true" )],
+                        notifications = [ 
+                            (with (new Notification()) {
+                                documentation =  [ new I18NText( "en-UK", "Start Notification documentation" ),
+                                                   new I18NText( "en-DK", "Start Anmeldung Dokumentation" ) ],
+                                businessAdministrators = [ users['bruce' ], users['peter' ] ],
+                                recipients = [ users['tony' ], users['darth' ] ],                                                                                        
+                                names = [ new I18NText( "en-UK", "This is my start notification name" ),
+                                          new I18NText( "en-DK", "Dies ist mein start anmeldung Name" ) ],
+                                subjects = [ new I18NText( "en-UK", "This is my start notification subject" ), 
+                                             new I18NText( "en-DK", "Das ist mein start anmeldung Thema" ) ],
+                                descriptions = [new I18NText( "en-UK", "This is my start notification description" ),
+                                                new I18NText( "en-DK", "Das ist mein start anmeldung Beschreibung" ) ]                                                                                                                                                                                       
+                            }) 
+                        ],
+                        reassignments = [
+                            (with (new Reassignment()) {
+                                documentation =  [ new I18NText( "en-UK", "Start Reassignment documentation" ),
+                                                   new I18NText( "en-DK", "Start Neuzuweisung Dokumentation" ) ], 
+                                potentialOwners = [  users['bobba' ], users['luke' ] ]
+                             })                          
+                        ]                        
+                        
+                    }) 
+                ]
+            })
+        ],
+        endDeadlines = [ 
+            (with (new Deadline()) {
+                date = new Date( 10000000 ),
+                escalated = true,
+                documentation = [ new I18NText( "en-UK", "End Deadline documentation" ),
+                                  new I18NText( "en-DK", "Ende Termin Dokumentation" ) ],
+                escalations = [ 
+                    (with (new Escalation()) {
+                        name = "My End Escalation",
+                        constraints = [new BooleanExpression( "mvel", "true" )],
+                        notifications = [ 
+                            (with (new Notification()) {
+                                documentation =  [ new I18NText( "en-UK", "End Notification documentation" ),
+                                                   new I18NText( "en-DK", "Ende Anmeldung Dokumentation" ) ],
+                                businessAdministrators = [ users['bobba' ], users['darth' ] ],
+                                recipients = [ users['liz' ], users['jane' ] ],                                                                                        
+                                names = [ new I18NText( "en-UK", "This is my end notification name" ),
+                                          new I18NText( "en-DK", "Dies ist mein ende anmeldung Name" ) ],
+                                subjects = [ new I18NText( "en-UK", "This is my end notification subject" ), 
+                                             new I18NText( "en-DK", "Das ist mein ende anmeldung Thema" ) ],
+                                descriptions = [new I18NText( "en-UK", "This is my end notification description" ),
+                                                new I18NText( "en-DK", "Das ist mein ende anmeldung Beschreibung" ) ]                                                                                                  
+                            }) 
+                        ],
+                        reassignments = [
+                            (with (new Reassignment()) {
+                                documentation =  [ new I18NText( "en-UK", "End Reassignment documentation" ),
+                                                   new I18NText( "en-DK", "Ende Neuzuweisung Dokumentation" ) ], 
+                                potentialOwners = [  users['stuart' ], users['dalai' ] ]
+                             })                          
+                        ]                        
+                        
+                    }) 
+                ]
+            })
+        ]
+    })        
+};
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadGroups.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadGroups.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadGroups.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,6 @@
+groups = [ 'knightsTempler' : new Group( "Knights Templer" ),
+           'crusaders' : new Group( "Crusaders" )
+         ];
+
+return groups;
+        
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadUsers.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadUsers.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/LoadUsers.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,12 @@
+users = [ 'darth'  : new User('Darth Vader'),  
+          'bobba'  : new User( 'Bobba Fet'),     'jabba'      : new User('Jabba Hutt'),
+          'dalai'  : new User('Dalai Lama'),     'christoper' : new User('Christoper Columbus'),
+          'stuart' : new User('Stuart Little'),  'jane'       : new User('Jane Austin'),
+          'peter'  : new User('Peter Parker'),   'steve'      : new User('Steve Rogers'),
+          'sly'    : new User('Sly Stalone'),    'liz'        : new User('Elizabeth Windsor'),
+          'bruce'  : new User('Bruce Wayne' ),   'tony'       : new User('Tony Stark'),
+          'luke'   : new User('Luke Cage'),      'admin'      : new User('Administrator')
+        ];       
+
+return users;
+        
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/QueryData_UnescalatedDeadlines.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/QueryData_UnescalatedDeadlines.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/QueryData_UnescalatedDeadlines.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,121 @@
+format = new java.text.SimpleDateFormat( "dd/MMM/yyyy" );
+
+tasks = [
+	(with ( new Task() ) { 
+	    priority = 20,
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'peter' ],
+	        createdBy = users[ 'sly' ],
+	        createdOn = format.parse( "15/Jan/2008" ),	        
+	        activationTime = format.parse( "20/Jan/2008" ),
+	        status = Status.Created,
+	    }),
+	    deadlines = ( with ( new Deadlines() ) {
+	        startDeadlines = [ 
+	            (with (new Deadline()) {
+	                date = new Date( now.getTime() + 20000 ),
+	                escalated = false,
+	                escalations = [ 
+	                    (with (new Escalation()) {
+	                        name = "My Start Escalation",
+	                        constraints = [new BooleanExpression( "mvel", "true" )],
+	                        notifications = [ 
+	                            (with (new Notification()) {
+	                                recipients = [ users['tony' ], users['darth' ] ],                                                                                                                                                                                                                                                                               
+	                            }) 
+	                        ],
+	                        reassignments = [
+	                            (with (new Reassignment()) { 
+	                                potentialOwners = [  users['bobba' ], users['luke' ] ]
+	                             })                          
+	                        ]                        
+	                        
+	                    }) 
+	                ]
+	            })
+	        ],
+	        endDeadlines = [ 
+	            (with (new Deadline()) {
+	                date =  new Date( now.getTime() + 22000 ),
+	                escalated = false,
+	                escalations = [ 
+	                    (with (new Escalation()) {
+	                        name = "My End Escalation",
+	                        constraints = [new BooleanExpression( "mvel", "true" )],
+	                        notifications = [ 
+	                            (with (new Notification()) {
+	                                recipients = [ users['liz' ], users['jane' ] ],                                                                                                                                                                                          
+	                            }) 
+	                        ],
+	                        reassignments = [
+	                            (with (new Reassignment()) { 
+	                                potentialOwners = [  users['stuart' ], users['dalai' ] ]
+	                             })                          
+	                        ]                        
+	                        
+	                    }) 
+	                ]
+	            })
+	        ]
+	    })  	    	    
+	}),
+	(with ( new Task() ) { 
+	    priority = 150,
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'steve' ],
+	        createdBy = users[ 'tony' ],
+	        createdOn = format.parse( "15/Feb/2008" ),
+	        activationTime = format.parse( "20/Feb/2008" ),
+	        status = Status.Created,
+	    }),   
+	    deadlines = ( with ( new Deadlines() ) {
+	        startDeadlines = [ 
+	            (with (new Deadline()) {
+	                date = new Date( now.getTime() - 1000 ),
+	                escalated = true,
+	                escalations = [ 
+	                    (with (new Escalation()) {
+	                        name = "My Start Escalation",
+	                        constraints = [new BooleanExpression( "mvel", "true" )],
+	                        notifications = [ 
+	                            (with (new Notification()) {
+	                                recipients = [ users['tony' ], users['darth' ] ],                                                                                                                                                                                                                                                                               
+	                            }) 
+	                        ],
+	                        reassignments = [
+	                            (with (new Reassignment()) { 
+	                                potentialOwners = [  users['bobba' ], users['luke' ] ]
+	                             })                          
+	                        ]                        
+	                        
+	                    }) 
+	                ]
+	            })
+	        ],
+	        endDeadlines = [ 
+	            (with (new Deadline()) {
+	                date =  new Date( now.getTime() + 24000 ),
+	                escalations = [ 
+	                    (with (new Escalation()) {
+	                        name = "My End Escalation",
+	                        constraints = [new BooleanExpression( "mvel", "true" )],
+	                        notifications = [ 
+	                            (with (new Notification()) {
+	                                recipients = [ users['liz' ], users['jane' ] ],                                                                                                                                                                                          
+	                            }) 
+	                        ],
+	                        reassignments = [
+	                            (with (new Reassignment()) { 
+	                                potentialOwners = [  users['stuart' ], users['dalai' ] ]
+	                             })                          
+	                        ]                        
+	                        
+	                    }) 
+	                ]
+	            })
+	        ]
+	    }) 	         
+	})
+]
+
+return tasks;
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithNotification.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithNotification.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithNotification.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,29 @@
+with ( new Task() ) { 
+    taskData = (with ( new TaskData() ) {
+                   documentAccessType = AccessType.Inline,
+                   documentType = "MVEL"
+                }),
+    deadlines = ( with ( new Deadlines() ) {
+        startDeadlines = [ 
+            (with (new Deadline()) {
+                date = new Date( now.time + 5000 ),            
+                escalations = [ 
+                    (with (new Escalation()) {
+                        name = "My Start Escalation",
+                        constraints = [new BooleanExpression( "mvel", "true" )],
+                        notifications = [ 
+                            (with (new EmailNotification()) {
+                                recipients = [ users['tony' ], users['darth' ] ],
+                                emailHeaders = [ 'en-UK' : (with (new EmailNotificationHeader()) { 
+                                    language = 'en-UK',
+                                    subject = "@{doc.subject}",
+                                    body = "@{doc.body}"
+                                }) ]                                                                                                                                                                                  
+                            }) 
+                        ]                                               
+                    }) 
+                ]
+            })
+        ]
+    })        
+};
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithReassignment.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithReassignment.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/DeadlineWithReassignment.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,25 @@
+with ( new Task() ) { 
+    peopleAssignments = (with ( new PeopleAssignments() ) {        
+        potentialOwners = [users['luke' ], users['tony']],
+    }),
+    taskData = (with ( new TaskData() ) {
+                   documentAccessType = AccessType.Inline,
+                   documentType = "MVEL"
+                }),
+    deadlines = ( with ( new Deadlines() ) {
+        startDeadlines = [ 
+            (with (new Deadline()) {
+                date = new Date( now.time + 5000 ),            
+                escalations = [ 
+                    (with (new Escalation()) {
+                        name = "My Start Escalation",
+                        constraints = [new BooleanExpression( "mvel", "true" )],
+                        reassignments = [(with ( new Reassignment() ) {
+                            potentialOwners = [users['bobba' ], users['jabba' ]]
+                        })]
+                    }) 
+                ]
+            })
+        ]
+    })        
+};
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryData_TasksOwned.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryData_TasksOwned.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryData_TasksOwned.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,117 @@
+format = new java.text.SimpleDateFormat( "dd/MMM/yyyy" );
+
+tasks = [
+	(with ( new Task() ) { 
+	    priority = 20,
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'peter' ],
+	        createdOn = format.parse( "15/Jan/2008" ),	        
+	        activationTime = format.parse( "20/Jan/2008" ),
+	        status = Status.Created,
+	    }),
+	    peopleAssignments = (with ( new PeopleAssignments() ) {        
+	        taskInitiator = users['darth' ],
+	        potentialOwners = [users['bobba' ], users['jabba' ]],
+	        excludedOwners = [users['liz' ], users['dalai' ], users['christoper' ]]
+	    }),	    
+        names = [ new I18NText( "en-UK", "This is my task name Jan" ),
+                  new I18NText( "en-DK", "Dies ist mein task Name Jan" )],
+        subjects = [ new I18NText( "en-UK", "This is my task subject Jan" ),
+                     new I18NText( "en-DK", "Das ist mein task Thema Jan" ) ],
+        descriptions = [ new I18NText( "en-UK", "This is my task description Jan" ),
+                         new I18NText( "en-DK", "Das ist mein task Beschreibung Jan" ) ]    
+	}),
+	(with ( new Task() ) { 
+	    priority = 150,
+	    peopleAssignments = (with ( new PeopleAssignments() ) {     
+	        excludedOwners = [users['liz' ], users['dalai' ], users['christoper' ]],
+	        potentialOwners = [users['bobba' ], users['jabba' ]], 
+	        taskStakeholders = [users['liz' ], users['stuart' ], users['jane' ]],
+	        businessAdministrators = [users['peter' ], users['steve' ]],
+	        recipients = [users['sly' ], users['bobba' ], users['liz' ]]
+	    }),	 	    
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'steve' ],
+	        createdBy = users[ 'tony' ],
+	        createdOn = format.parse( "15/Feb/2008" ),
+	        activationTime = format.parse( "20/Feb/2008" ),
+	        status = Status.Created,
+	    }),
+        names = [ new I18NText( "en-UK", "This is my task name Feb" ),
+                  new I18NText( "en-DK", "Dies ist mein task Name Feb" )],
+        subjects = [ new I18NText( "en-UK", "This is my task subject Feb" ),
+                     new I18NText( "en-DK", "Das ist mein task Thema Feb" ) ],
+        descriptions = [ new I18NText( "en-UK", "This is my task description Feb" ),
+                         new I18NText( "en-DK", "Das ist mein task Beschreibung Feb" ) ]          
+	}),
+	(with ( new Task() ) { 
+	    priority = 90,
+	    peopleAssignments = (with ( new PeopleAssignments() ) {
+	    businessAdministrators = [users['liz' ], users['darth' ]],     
+	        potentialOwners = [users['bobba' ], users['jabba' ]], 
+	    }),	 	    
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'peter' ],
+	        createdBy = users[ 'steve' ],
+	        createdOn = format.parse( "15/Mar/2008" ),	        
+	        activationTime = format.parse( "20/Mar/2008" ),
+	        status = Status.Created,
+	    }),
+        names = [ new I18NText( "en-UK", "This is my task name Mar" ),
+                  new I18NText( "en-DK", "Dies ist mein task Name Mar" )],
+        subjects = [ new I18NText( "en-UK", "This is my task subject Mar" ),
+                     new I18NText( "en-DK", "Das ist mein task Thema Mar" ) ],
+        descriptions = [ new I18NText( "en-UK", "This is my task description Mar" ),
+                         new I18NText( "en-DK", "Das ist mein task Beschreibung Mar" ) ]       
+	}),
+	(with ( new Task() ) { 
+	    priority = 20,
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'darth' ],
+	        createdBy = users[ 'bobba' ],
+	        createdOn = format.parse( "15/Apr/2008" ),	        
+	        activationTime = format.parse( "20/Apr/2008" ),
+	        status = Status.Created,
+	    }),
+        names = [ new I18NText( "en-UK", "This is my task name Apr" ),
+                  new I18NText( "en-DK", "Dies ist mein task Name Apr" )],
+        subjects = [ new I18NText( "en-UK", "This is my task subject Apr" ),
+                     new I18NText( "en-DK", "Das ist mein task Thema Apr" ) ],
+        descriptions = [ new I18NText( "en-UK", "This is my task description Apr" ),
+                         new I18NText( "en-DK", "Das ist mein task Beschreibung Apr" ) ]     
+	}),
+	(with ( new Task() ) { 
+	    priority = 20,
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'peter' ],
+	        createdBy = users[ 'steve' ],
+	        createdOn = format.parse( "15/May/2008" ),	        
+	        activationTime = format.parse( "20/May/2008" ),
+	        status = Status.Created,
+	    }),
+        names = [ new I18NText( "en-UK", "This is my task name May" ),
+                  new I18NText( "en-DK", "Dies ist mein task Name May" )],
+        subjects = [ new I18NText( "en-UK", "This is my task subject May" ),
+                     new I18NText( "en-DK", "Das ist mein task Thema May" ) ],
+        descriptions = [ new I18NText( "en-UK", "This is my task description May" ),
+                         new I18NText( "en-DK", "Das ist mein task Beschreibung May" ) ]   
+	}),	
+	(with ( new Task() ) { 
+	    priority = 15,
+	    taskData = (with ( new TaskData() ) {
+	        actualOwner = users[ 'steve' ],
+	        createdBy = users[ 'steve' ],
+	        createdOn = format.parse( "15/Jun/2008" ),	        
+	        activationTime = format.parse( "20/Jun/2008" ),
+	        status = Status.Created,
+	    }),
+        names = [ new I18NText( "en-UK", "This is my task name Jun" ),
+                  new I18NText( "en-DK", "Dies ist mein task Name Jun" )],
+        subjects = [ new I18NText( "en-UK", "This is my task subject Jun" ),
+                     new I18NText( "en-DK", "Das ist mein task Thema Jun" ) ],
+        descriptions = [ new I18NText( "en-UK", "This is my task description Jun" ),
+                         new I18NText( "en-DK", "Das ist mein task Beschreibung Jun" ) ]    
+	})			
+]
+
+return tasks;
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_PeopleAssignmentQuerries.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_PeopleAssignmentQuerries.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_PeopleAssignmentQuerries.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,27 @@
+format = new java.text.SimpleDateFormat( "dd/MMM/yyyy" );
+        
+[ 'darth' : [ new TaskSummary( 1, 'This is my task name Jan', 'This is my task subject Jan', 'This is my task description Jan',
+                               Status.Ready, 20, false, users[ 'peter' ], null,
+                               format.parse( "15/Jan/2008" ), format.parse( "20/Jan/2008" ), null ) ],
+  'bobba' : [ new TaskSummary( 1, 'This is my task name Jan', 'This is my task subject Jan', 'This is my task description Jan',
+                               Status.Ready, 20, false, users[ 'peter' ], null,
+                               format.parse( "15/Jan/2008" ), format.parse( "20/Jan/2008" ), null ),
+              new TaskSummary( 1, 'This is my task name Feb', 'This is my task subject Feb', 'This is my task description Feb',
+                               Status.Ready, 150, false, users[ 'steve' ], users[ 'tony' ], 
+                               format.parse( "15/Feb/2008" ), format.parse( "20/Feb/2008" ), null ),  
+              new TaskSummary( 1, 'This is my task name Mar', 'This is my task subject Mar', 'This is my task description Mar',
+                               Status.Ready, 90, false, users[ 'peter' ], users[ 'steve' ], 
+                               format.parse( "15/Mar/2008" ), format.parse( "20/Mar/2008" ), null ) ],
+   'steve' : [ new TaskSummary( 1, 'This is my task name Feb', 'This is my task subject Feb', 'This is my task description Feb',
+                                Status.Ready, 150, false, users[ 'steve' ], users[ 'tony' ], 
+                                format.parse( "15/Feb/2008" ), format.parse( "20/Feb/2008" ), null  ) ],
+   'liz' : [ new TaskSummary( 1, 'This is my task name Jan', 'This is my task subject Jan', 'This is my task description Jan',
+                              Status.Ready, 20, false, users[ 'peter' ], null,
+                              format.parse( "15/Jan/2008" ), format.parse( "20/Jan/2008" ), null ),
+            new TaskSummary( 1, 'This is my task name Feb', 'This is my task subject Feb', 'This is my task description Feb',
+                             Status.Ready, 150, false, users[ 'steve' ], users[ 'tony' ], 
+                             format.parse( "15/Feb/2008" ), format.parse( "20/Feb/2008" ), null ) ],
+   'sly' : [ new TaskSummary( 1, 'This is my task name Feb', 'This is my task subject Feb', 'This is my task description Feb',
+                                Status.Ready, 150, false, users[ 'steve' ], users[ 'tony' ], 
+                                format.parse( "15/Feb/2008" ), format.parse( "20/Feb/2008" ), null  ) ]                                                 
+]
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInEnglish.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInEnglish.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInEnglish.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,21 @@
+format = new java.text.SimpleDateFormat( "dd/MMM/yyyy" );
+        
+[ 'peter' : [ new TaskSummary( 1, 'This is my task name Jan', 'This is my task subject Jan', 'This is my task description Jan',
+                               Status.Ready, 20, false, users[ 'peter' ], null, 
+                               format.parse( "15/Jan/2008" ), format.parse( "20/Jan/2008" ), null ),
+              new TaskSummary( 1, 'This is my task name May', 'This is my task subject May', 'This is my task description May',
+                               Status.Created, 20, false, users[ 'peter' ], users[ 'steve' ], 
+                               format.parse( "15/May/2008" ), format.parse( "20/May/2008" ), null ),
+              new TaskSummary( 1, 'This is my task name Mar', 'This is my task subject Mar', 'This is my task description Mar',
+                               Status.Ready, 90, false, users[ 'peter' ], users[ 'steve' ], 
+                               format.parse( "15/Mar/2008" ), format.parse( "20/Mar/2008" ), null ) ],                                                                     
+  'steve' : [new TaskSummary( 1, 'This is my task name Feb', 'This is my task subject Feb', 'This is my task description Feb',
+                              Status.Ready, 150, false, users[ 'steve' ], users[ 'tony' ], 
+                              format.parse( "15/Feb/2008" ), format.parse( "20/Feb/2008" ), null ),
+             new TaskSummary( 1, 'This is my task name Jun', 'This is my task subject Jun', 'This is my task description Jun',
+                              Status.Created, 15, false, users[ 'steve' ], users[ 'steve' ], 
+                              format.parse( "15/Jun/2008" ), format.parse( "20/Jun/2008" ), null ) ]                      
+  'darth' : [ new TaskSummary( 1, 'This is my task name Apr', 'This is my task subject Apr', 'This is my task description Apr',
+                               Status.Created, 20, false, users[ 'darth' ], users[ 'bobba' ], 
+                               format.parse( "15/Apr/2008" ), format.parse( "20/Apr/2008" ), null ) ]                                                                                                                                              
+]
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInGerman.mvel
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInGerman.mvel	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/drools-grid-task/src/test/resources/org/drools/task/service/QueryResults_TasksOwnedInGerman.mvel	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,21 @@
+format = new java.text.SimpleDateFormat( "dd/MMM/yyyy" );
+        
+[ 'peter' : [ new TaskSummary( 1, 'Dies ist mein task Name Jan', 'Das ist mein task Thema Jan', 'Das ist mein task Beschreibung Jan',
+                               Status.Ready, 20, false, users[ 'peter' ], null, 
+                               format.parse( "15/Jan/2008" ), format.parse( "20/Jan/2008" ), null ),
+              new TaskSummary( 1, 'Dies ist mein task Name May', 'Das ist mein task Thema May', 'Das ist mein task Beschreibung May',
+                               Status.Created, 20, false, users[ 'peter' ], users[ 'steve' ], 
+                               format.parse( "15/May/2008" ), format.parse( "20/May/2008" ),null ),
+              new TaskSummary( 1, 'Dies ist mein task Name Mar', 'Das ist mein task Thema Mar', 'Das ist mein task Beschreibung Mar',
+                               Status.Ready, 90, false, users[ 'peter' ], users[ 'steve' ], 
+                               format.parse( "15/Mar/2008" ), format.parse( "20/Mar/2008" ), null ) ],                                                                     
+  'steve' : [ new TaskSummary( 1, 'Dies ist mein task Name Feb', 'Das ist mein task Thema Feb', 'Das ist mein task Beschreibung Feb',
+                               Status.Ready, 150, false, users[ 'steve' ], users[ 'tony' ], 
+                               format.parse( "15/Feb/2008" ), format.parse( "20/Feb/2008" ), null ),
+              new TaskSummary( 1, 'Dies ist mein task Name Jun', 'Das ist mein task Thema Jun', 'Das ist mein task Beschreibung Jun',
+                               Status.Created, 15, false, users[ 'steve' ], users[ 'steve' ], 
+                               format.parse( "15/Jun/2008" ), format.parse( "20/Jun/2008" ), null ) ]                      
+  'darth' : [ new TaskSummary( 1, 'Dies ist mein task Name Apr', 'Das ist mein task Thema Apr', 'Das ist mein task Beschreibung Apr',
+                               Status.Created, 20, false, users[ 'darth' ], users[ 'bobba' ], 
+                               format.parse( "15/Apr/2008" ), format.parse( "20/Apr/2008" ), null ) ]                                                                                                                                              
+]
\ No newline at end of file

Added: labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/pom.xml
===================================================================
--- labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/pom.xml	                        (rev 0)
+++ labs/jbossrules/branches/salaboy_ServiceAPIs/drools-grid/pom.xml	2010-04-04 16:25:30 UTC (rev 32401)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>drools</artifactId>
+    <groupId>org.drools</groupId>
+    <version>5.1.0.SNAPSHOT</version>
+  </parent>
+  
+  <artifactId>drools-grid</artifactId>
+  <packaging>pom</packaging>
+  <name>Drools :: Grid</name>
+
+  <modules>
+      <module>drools-grid-core</module>
+      <module>drools-grid-task</module>
+      <module>drools-grid-rio</module>
+  </modules>
+  
+</project>



More information about the jboss-svn-commits mailing list