[jboss-svn-commits] JBL Code SVN: r36013 - in labs/jbossrules/trunk: drools-camel/src/main/java/org/drools/jax/soap and 18 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Nov 19 11:38:09 EST 2010


Author: salaboy21
Date: 2010-11-19 11:38:06 -0500 (Fri, 19 Nov 2010)
New Revision: 36013

Added:
   labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfRestTestWithLookup.java
   labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfSoapTestWithLookup.java
   labs/jbossrules/trunk/drools-camel/src/test/resources/log4j.bak.properties
   labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfRsSpringWithoutSession.xml
   labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfSoapSpringWithoutSession.xml
   labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring2.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetFactCountCommand.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/command/GetWorkItemManagerCommand.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/BaseRemoteTest.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteProcessCommandTests.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteSessionCommandTests.java
   labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/
   labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/orm.xml
   labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/persistence.xml
   labs/jbossrules/trunk/drools-server/src/main/resources/camel-server-grid.xml
   labs/jbossrules/trunk/drools-server/src/main/resources/knowledge-services-grid.xml
   labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerGridTest.java
   labs/jbossrules/trunk/drools-server/src/test/resources/beans-test-grid.xml
   labs/jbossrules/trunk/drools-server/src/test/resources/camel-embedded-server-test-grid.xml
Modified:
   labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsPolicy.java
   labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java
   labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/jax/soap/PostCxfSoapProcessor.java
   labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/XStreamBatchExecutionTest.java
   labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandleCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandlesCommand.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/pom.xml
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/impl/GridNodeServer.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/GridNodeRemoteClient.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java
   labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/NodeTests.java
   labs/jbossrules/trunk/drools-server/pom.xml
   labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfRsClientServerTest.java
   labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerTest.java
Log:
JBRULES-2803: Drools Grid Impl2 - Drools Server integration
	- adding test that show the integration between drools grid and drools-server (CxfSoapClientServerGridTest.java)
	- Adding test for remote interactions in drools-grid/drools-grid-impl
	- Adding test in camel for CXF Soap Interaction (take a look at DroolsPolicy and PostCxfSoapProcessor). It looks that it's a problem with CFXProducer in camel, so I add a hack to make it work for now.

Modified: labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsPolicy.java
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsPolicy.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsPolicy.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -281,7 +281,12 @@
         }
 
         public void process(Exchange exchange) throws Exception {
+            //Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
+            //I need to copy the body of the exachange because for some reason
+            // the getContext().getEndpoint() erase the content/or loose the reference
+            String body = exchange.getIn().getBody( String.class );
             if ( dep == null ) {
+                
                 this.dep = exchange.getContext().getEndpoint( this.droolsUri,
                                                               DroolsEndpoint.class );
             }
@@ -299,20 +304,20 @@
                     String lookup = exchange.getIn().getHeader( DroolsComponent.DROOLS_LOOKUP,
                                                                 String.class );
                     if ( StringUtils.isEmpty( lookup ) ) {
-                        lookup = dep.getLookup( exchange.getIn().getBody( String.class ) );
+                        //Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
+                        lookup = dep.getLookup( body );
+                        //lookup = dep.getLookup( exchange.getIn().getBody( String.class ) );
                     }
 
                     if ( StringUtils.isEmpty( lookup ) ) {
                         throw new RuntimeException( "No Executor defined and no lookup information available for uri " + this.dep.getEndpointUri() );
                     }
-
                     exec = dep.getCommandExecutor( lookup );
                 }
 
                 if ( exec == null ) {
                     throw new RuntimeException( "CommandExecutor cannot be found for uri " + this.dep.getEndpointUri() );
                 }
-
                 ClassLoader localClassLoader = dep.getClassLoader( exec );
                 if ( localClassLoader == null ) {
                     throw new RuntimeException( "CommandExecutor Classloader cannot be null for uri " + this.dep.getEndpointUri() );
@@ -326,13 +331,17 @@
 
                 exchange.setProperty( "drools-context",
                                       context );
+                //Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
+                // I need to re set the Body because the exchange loose the content at
+                // the begining of the method
+                 exchange.getIn().setBody(body);
 
                 boolean soap = false;
                 if ( !augmented && exchange.getFromEndpoint() instanceof CxfSpringEndpoint ) {
                     new PreCxfTransportSoapProcessor().process( exchange );
                     soap = true;
                 }
-                processor.process( exchange );
+                    processor.process( exchange );
                 if ( soap ) {
                     new PostCxfTransportSoapProcessor().process( exchange );
                 }

Modified: labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -44,6 +44,7 @@
 import org.drools.grid.GridNode;
 import org.drools.runtime.CommandExecutor;
 import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.impl.ExecutionResultImpl;
 
 public class DroolsProducer extends DefaultProducer {
 
@@ -57,20 +58,9 @@
 
     public void process(Exchange exchange) throws Exception {
 
-        try {
-            Command cmd = null;
-            //            if ( de.dataFormat != null ) {
-            //                String str = exchange.getIn().getBody( String.class );
-            //                ByteArrayInputStream bais = new ByteArrayInputStream( str.getBytes() );
-            //                cmd = (Command) de.dataFormat.unmarshal( exchange,
-            //                                                         bais );
-            //            } else {
-            //                // no data format set, so we assume it's already concrete
-            //                cmd = exchange.getIn().getBody( Command.class );
-            //            }
-
-            cmd = exchange.getIn().getBody( Command.class );
-
+            Command cmd = exchange.getIn().getBody( Command.class );
+            
+            
             if ( cmd == null ) {
                 throw new RuntimeCamelException( "Body of in message not of the expected type 'org.drools.command.Command' for uri" + de.getEndpointUri() );
             }
@@ -108,22 +98,8 @@
             if ( exec == null ) {
                 throw new RuntimeException( "No defined ksession for uri" + de.getEndpointUri() );
             }
-
+            
             ExecutionResults results = exec.execute( (BatchExecutionCommandImpl) cmd );;
-
-            //            if ( de.dataFormat != null ) {
-            //                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            //                de.dataFormat.marshal( exchange,
-            //                                       results,
-            //                                       baos );
-            //                exchange.getOut().setBody( baos.toByteArray() );
-            //            } else {
-            //                exchange.getOut().setBody( results );
-            //            }
-            exchange.getOut().setBody( results );
-        } finally {
-            // we must restore the ClassLoader
-            //            Thread.currentThread().setContextClassLoader( originalClassLoader );
-        }
+            exchange.getOut().setBody( results );     
     }
 }

Modified: labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/jax/soap/PostCxfSoapProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/jax/soap/PostCxfSoapProcessor.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-camel/src/main/java/org/drools/jax/soap/PostCxfSoapProcessor.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -38,6 +38,9 @@
 
     public void process(Exchange exchange) throws Exception {
         InputStream is = (InputStream) exchange.getIn().getBody();
+        //Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
+        //I need to copy the results here because I loose them at the end of the method
+        String results = StringUtils.toString( is );
         if ( is != null ) {
             SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
             SOAPBody body = soapMessage.getSOAPPart().getEnvelope().getBody();
@@ -49,7 +52,9 @@
                                             "ns1" );
             SOAPBodyElement payload = body.addBodyElement( payloadName );
             SOAPElement response = payload.addChildElement( responseName );
-            response.addTextNode( StringUtils.toString( is ) );
+            //Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
+            // response.addTextNode( StringUtils.toString( is ) );
+            response.addTextNode( results );
             exchange.getOut().setBody( soapMessage );
         }
     }

Modified: labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/XStreamBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/XStreamBatchExecutionTest.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/XStreamBatchExecutionTest.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -72,10 +72,15 @@
 import org.xml.sax.SAXException;
 
 import com.thoughtworks.xstream.XStream;
+import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatelessKnowledgeSessionImpl;
+import org.drools.reteoo.ReteooRuleBase;
 
 public class XStreamBatchExecutionTest extends ContextTestSupport {
     protected GridNode        node;
     protected CommandExecutor exec;
+    protected CommandExecutor exec2;
 
     protected Context createJndiContext() throws Exception {
         Context context = super.createJndiContext();
@@ -84,10 +89,14 @@
         grid.addService( WhitePages.class,
                          new WhitePagesImpl() );
         node = grid.createGridNode( "local" );
+        
+        node.set( "ksession1",
+                  this.exec );
+        
+       
+        
         context.bind( "node",
                       node );
-        node.set( "ksession1",
-                  this.exec );
         return context;
     }
 
@@ -111,6 +120,14 @@
             throw new RuntimeException( e );
         }
     }
+    public void setExec2(CommandExecutor exec) {
+        this.exec2 = exec;
+        try {
+            super.setUp();
+        } catch ( Exception e ) {
+            throw new RuntimeException( e );
+        }
+    }
 
     @Override
     public void setUp() throws Exception {
@@ -1908,62 +1925,148 @@
 
     public void testExecutionNodeLookup() throws Exception {
         String str = "";
-        str += "package org.drools \n";
-        str += "import org.drools.Cheese \n";
+        str += "package org.drools \n"
+                + "declare Cheese1\n"
+                + "   type : String\n"
+                + "   price : int\n"
+                + "   oldPrice : int\n"
+                + "end \n";
+        
         str += "rule rule1 \n";
         str += "  when \n";
-        str += "    $c : Cheese() \n";
+        str += "    $c : Cheese1() \n";
         str += " \n";
         str += "  then \n";
         str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
         str += "end\n";
-
+        //System.out.println("STR = "+str);
+        String str2 = "";
+        str2 += "package org.drools \n"
+                + "declare Cheese2\n"
+                + "   type : String\n"
+                + "   price : int\n"
+                + "   oldPrice : int\n"
+                + "end \n";
+        str2 += "rule rule2 \n";
+        str2 += "  when \n";
+        str2 += "    $c : Cheese2() \n";
+        str2 += " \n";
+        str2 += "  then \n";
+        str2 += "    $c.setPrice( $c.getPrice() + 10 ); \n";
+        str2 += "end\n";
+        //System.out.println("STR2 = "+str2);
         String inXml = "";
         inXml += "<batch-execution lookup=\"ksession1\" >";
         inXml += "  <insert out-identifier='outStilton'>";
-        inXml += "    <org.drools.Cheese>";
+        inXml += "    <org.drools.Cheese1>";
         inXml += "      <type>stilton</type>";
         inXml += "      <price>25</price>";
         inXml += "      <oldPrice>0</oldPrice>";
-        inXml += "    </org.drools.Cheese>";
+        inXml += "    </org.drools.Cheese1>";
         inXml += "  </insert>";
         inXml += "  <fire-all-rules />";
         inXml += "</batch-execution>";
+        
+        String inXml2 = "";
+        inXml2 += "<batch-execution lookup=\"ksession2\" >";
+        inXml2 += "  <insert out-identifier='outStilton'>";
+        inXml2 += "    <org.drools.Cheese2>";
+        inXml2 += "      <type>stilton</type>";
+        inXml2 += "      <price>25</price>";
+        inXml2 += "      <oldPrice>0</oldPrice>";
+        inXml2 += "    </org.drools.Cheese2>";
+        inXml2 += "  </insert>";
+        inXml2 += "  <fire-all-rules />";
+        inXml2 += "</batch-execution>";
 
         StatefulKnowledgeSession ksession = getStatefulKnowledgeSession( ResourceFactory.newByteArrayResource( str.getBytes() ) );
         setExec( ksession );
+        
+        StatefulKnowledgeSession ksession2 = getStatefulKnowledgeSession( ResourceFactory.newByteArrayResource( str2.getBytes() ) );
+        
+        setExec2( ksession2 );
 
+         node.set( "ksession2",
+                  this.exec2 );
+        
         String outXml = template.requestBody( "direct:execWithLookup",
                                               inXml,
                                               String.class );
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        
+        Thread.currentThread().setContextClassLoader( getClassLoader(ksession) );
         ExecutionResults result = template.requestBody( "direct:unmarshal",
                                                         outXml,
                                                         ExecutionResults.class );
-        Cheese stilton = (Cheese) result.getValue( "outStilton" );
-        assertEquals( 30,
-                      stilton.getPrice() );
+        org.drools.definition.type.FactType fT = ksession.getKnowledgeBase().getFactType("org.drools","Cheese1");
+        
+        int price = (Integer)fT.get(result.getValue( "outStilton" ), "price");
+        assertEquals( 30, 
+                      price );
 
         FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
-        stilton = (Cheese) ksession.getObject( factHandle );
-        assertEquals( 30,
-                      stilton.getPrice() );
-
+//        stilton = (Cheese) ksession.getObject( factHandle );
+//        assertEquals( 30,
+//                      stilton.getPrice() );
+        
+        String outXml2 = template.requestBody( "direct:execWithLookup",
+                                              inXml2,
+                                              String.class );
+        
+        
+        Thread.currentThread().setContextClassLoader( getClassLoader(ksession2) );
+        ExecutionResults result2 = template.requestBody( "direct:unmarshal",
+                                                        outXml2,
+                                                        ExecutionResults.class );
+        
+        org.drools.definition.type.FactType fT2 = ksession2.getKnowledgeBase().getFactType("org.drools","Cheese2");
+        
+        int price2 = (Integer)fT2.get(result2.getValue( "outStilton" ), "price");
+        assertEquals( 35, price2 );
+        
+//        Cheese2 stilton2 = (Cheese2) result2.getValue( "outStilton" );
+//        assertEquals( 35,
+//                      stilton2.getPrice() );
+//
+          factHandle = (FactHandle) result2.getFactHandle( "outStilton" );
+//        stilton2 = (Cheese2) ksession2.getObject( factHandle );
+//        assertEquals( 35,
+//                      stilton2.getPrice() );
+        
+        
+        Thread.currentThread().setContextClassLoader( originalClassLoader );
+        
         String expectedXml = "";
         expectedXml += "<execution-results>\n";
         expectedXml += "  <result identifier=\"outStilton\">\n";
-        expectedXml += "    <org.drools.Cheese>\n";
+        expectedXml += "    <org.drools.Cheese1>\n";
         expectedXml += "      <type>stilton</type>\n";
         expectedXml += "      <oldPrice>0</oldPrice>\n";
         expectedXml += "      <price>30</price>\n";
-        expectedXml += "    </org.drools.Cheese>\n";
+        expectedXml += "    </org.drools.Cheese1>\n";
         expectedXml += "  </result>\n";
         expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
+        
+        String expectedXml2 = "";
+        expectedXml2 += "<execution-results>\n";
+        expectedXml2 += "  <result identifier=\"outStilton\">\n";
+        expectedXml2 += "    <org.drools.Cheese2>\n";
+        expectedXml2 += "      <type>stilton</type>\n";
+        expectedXml2 += "      <oldPrice>0</oldPrice>\n";
+        expectedXml2 += "      <price>35</price>\n";
+        expectedXml2 += "    </org.drools.Cheese2>\n";
+        expectedXml2 += "  </result>\n";
+        expectedXml2 += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result2.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+        expectedXml2 += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
                         outXml );
+        
+        assertXMLEqual( expectedXml2,
+                        outXml2 );
     }
-
+    
     private StatelessKnowledgeSession getStatelessKnowledgeSession(Resource resource) throws Exception {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( resource,
@@ -2003,5 +2106,39 @@
 
         return session;
     }
+    
+    private StatefulKnowledgeSession getStatefulKnowledgeSession2(Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
 
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+        return session;
+    }
+    
+    public ClassLoader getClassLoader(CommandExecutor exec) {
+        ClassLoader cl = null;
+
+        if ( exec instanceof StatefulKnowledgeSessionImpl ) {
+            cl = ((ReteooRuleBase) ((StatefulKnowledgeSessionImpl) exec).getRuleBase()).getRootClassLoader();
+        } else if ( exec instanceof StatelessKnowledgeSessionImpl ) {
+            cl = ((ReteooRuleBase) ((StatelessKnowledgeSessionImpl) exec).getRuleBase()).getRootClassLoader();
+        } else if ( exec instanceof CommandBasedStatefulKnowledgeSession ) {
+            cl = ((ReteooRuleBase) ((KnowledgeBaseImpl) ((CommandBasedStatefulKnowledgeSession) exec).getKnowledgeBase()).getRuleBase()).getRootClassLoader();
+        }
+
+        return cl;
+    }
+
 }

Copied: labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfRestTestWithLookup.java (from rev 35991, labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfRestTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfRestTestWithLookup.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfRestTestWithLookup.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,61 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.camel.component.cxf;
+
+import org.apache.camel.test.CamelSpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class CxfRestTestWithLookup extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext( "org/drools/camel/component/CxfRsSpringWithoutSession.xml" );
+    }
+
+    public void test1() throws Exception {
+        String cmd = "";
+        cmd += "<batch-execution lookup=\"ksession1\">\n";
+        cmd += "  <insert out-identifier=\"salaboy\">\n";
+        cmd += "      <org.drools.pipeline.camel.Person>\n";
+        cmd += "         <name>salaboy</name>\n";
+        cmd += "      </org.drools.pipeline.camel.Person>\n";
+        cmd += "   </insert>\n";
+        cmd += "   <fire-all-rules/>\n";
+        cmd += "</batch-execution>\n";
+
+        Object object = this.context.createProducerTemplate().requestBody( "direct://http",
+                                                                           cmd );
+        System.out.println( object );
+        assertTrue( object.toString().contains( "fact-handle identifier=\"salaboy\"" ) );
+        String cmd2 = "";
+        cmd2 += "<batch-execution lookup=\"ksession2\">\n";
+        cmd2 += "  <insert out-identifier=\"salaboy\">\n";
+        cmd2 += "      <org.drools.pipeline.camel.Person>\n";
+        cmd2 += "         <name>salaboy</name>\n";
+        cmd2 += "      </org.drools.pipeline.camel.Person>\n";
+        cmd2 += "   </insert>\n";
+        cmd2 += "   <fire-all-rules/>\n";
+        cmd2 += "</batch-execution>\n";
+
+        Object object2 = this.context.createProducerTemplate().requestBody( "direct://http",
+                                                                           cmd2 );
+        System.out.println( object2 );
+        assertTrue( object2.toString().contains( "fact-handle identifier=\"salaboy\"" ) );
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfSoapTestWithLookup.java (from rev 35991, labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfSoapTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfSoapTestWithLookup.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-camel/src/test/java/org/drools/camel/component/cxf/CxfSoapTestWithLookup.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,121 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.camel.component.cxf;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPMessage;
+
+
+
+import org.apache.camel.test.CamelSpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class CxfSoapTestWithLookup extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext( "org/drools/camel/component/CxfSoapSpringWithoutSession.xml" );
+    }
+    // This test fails, I make it work with some hacks.
+    // Look for //Bad Hack - Need to remote it and fix it in Camel (if it's a camel problem)
+    // In DroolsPolicy and PostCxfSoapProcessor 
+    
+    // Watch out: this functionality affects Drools Server
+    //
+    // The problem seems to be related with the CXFProducer and the async processors, 
+    // and it only appears when we do a lookup for different sessions.
+    // Using different sessions requires that camel switch classloader to execute commands
+    // in the existing sessions. That could be realted too.. 
+    // but in Drools Camel code I don't find any problem
+    // The rest endpoint is working ok
+    public void testCxfSoapSessionLookup() throws Exception {
+         
+        
+        SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
+        SOAPBody body = soapMessage.getSOAPPart().getEnvelope().getBody();
+        QName payloadName = new QName( "http://soap.jax.drools.org",
+                                       "execute",
+                                       "ns1" );
+
+        body.addBodyElement( payloadName );
+
+        String cmd = "";
+        cmd += "<batch-execution lookup=\"ksession1\">\n";
+        cmd += "  <insert out-identifier=\"salaboy\" disconnected=\"true\">\n";
+        cmd += "      <org.drools.springframework.Person2>\n";
+        cmd += "         <name>salaboy</name>\n";
+        cmd += "         <age>27</age>\n";
+        cmd += "      </org.drools.springframework.Person2>\n";
+        cmd += "   </insert>\n";
+        cmd += "   <fire-all-rules/>\n";
+        cmd += "</batch-execution>\n";
+
+        body.addTextNode( cmd );
+
+        Object object = this.context.createProducerTemplate().requestBody( "direct://http",
+                                                                           soapMessage );
+
+        OutputStream out = new ByteArrayOutputStream();
+        out = new ByteArrayOutputStream();
+        soapMessage = (SOAPMessage) object;
+        soapMessage.writeTo( out );
+        String response = out.toString();
+        assertTrue( response.contains( "fact-handle identifier=\"salaboy\"" ) );
+        
+        
+        
+         SOAPMessage soapMessage2 = MessageFactory.newInstance().createMessage();
+        SOAPBody body2 = soapMessage.getSOAPPart().getEnvelope().getBody();
+        QName payloadName2 = new QName( "http://soap.jax.drools.org",
+                                       "execute",
+                                       "ns1" );
+
+        body2.addBodyElement( payloadName2);
+
+        String cmd2 = "";
+        cmd2 += "<batch-execution lookup=\"ksession2\">\n";
+        cmd2 += "  <insert out-identifier=\"salaboy\" disconnected=\"true\">\n";
+        cmd2 += "      <org.drools.springframework.Person3>\n";
+        cmd2 += "         <name>salaboy</name>\n";
+        cmd2 += "         <age>27</age>\n";
+        cmd2 += "      </org.drools.springframework.Person3>\n";
+        cmd2 += "   </insert>\n";
+        cmd2 += "   <fire-all-rules/>\n";
+        cmd2 += "</batch-execution>\n";
+
+        body2.addTextNode( cmd2 );
+
+        Object object2 = this.context.createProducerTemplate().requestBody( "direct://http",
+                                                                           soapMessage2 );
+
+        OutputStream out2 = new ByteArrayOutputStream();
+        out2 = new ByteArrayOutputStream();
+        soapMessage2 = (SOAPMessage) object2;
+        soapMessage2.writeTo( out2 );
+        String response2 = out2.toString();
+        assertTrue( response2.contains( "fact-handle identifier=\"salaboy\"" ) );
+        
+    }
+
+}

Added: labs/jbossrules/trunk/drools-camel/src/test/resources/log4j.bak.properties
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/resources/log4j.bak.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-camel/src/test/resources/log4j.bak.properties	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,8 @@
+log4j.rootLogger=INFO, out
+
+log4j.logger.org.apache.camel=DEBUG
+
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
+#log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfRsSpringWithoutSession.xml (from rev 35991, labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfRsSpring.xml)
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfRsSpringWithoutSession.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfRsSpringWithoutSession.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xmlns:drools="http://drools.org/schema/drools-spring"
+       xsi:schemaLocation="
+       http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+	
+	<drools:grid-node id="node1" />
+  
+	<drools:kbase id="kbase1" node="node1">		
+	    <drools:resources>
+		    <drools:resource type="DRL" source="classpath:org/drools/camel/component/testSpring.drl"/>
+		</drools:resources>					
+	</drools:kbase>
+	
+	
+	<drools:ksession id="ksession1" type="stateful" name="ksession1" kbase="kbase1" node="node1">
+	    <drools:script>	    		    	
+	    	<drools:set-global identifier="list" >
+	    	   <bean class="java.util.ArrayList" />
+	    	</drools:set-global>		  
+        </drools:script>
+        </drools:ksession>  
+        <drools:ksession id="ksession2" type="stateful" name="ksession2" kbase="kbase1" node="node1">
+	    <drools:script>	    		    	
+	    	<drools:set-global identifier="list" >
+	    	   <bean class="java.util.ArrayList" />
+	    	</drools:set-global>		  
+        </drools:script>
+        
+    </drools:ksession>   
+         
+  <!-- Defined the server endpoint to create the cxf-rs consumer --> 
+  <cxf:rsServer id="rsServer" 
+  				address="http://localhost:9002/rest"
+                serviceClass="org.drools.jax.rs.CommandExecutorImpl">
+       <cxf:providers>
+           <bean class="org.drools.jax.rs.CommandMessageBodyReader"/>
+       </cxf:providers>
+  </cxf:rsServer>  
+  
+  <bean id="droolsPolicy" class="org.drools.camel.component.DroolsPolicy" />  
+    
+  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+    
+    <route>
+       <from uri="cxfrs://bean://rsServer"/>
+       <policy ref="droolsPolicy">
+	       <unmarshal ref="xstream" />       
+	       <to uri="drools:node1" />
+	       <marshal ref="xstream" />
+       </policy>
+    </route>
+    
+    <route id="x1">
+       <from uri="direct://http"/>
+       <policy ref="droolsPolicy">
+	       <to uri="cxfrs://http://localhost:9002/rest"/> 
+       </policy> 
+    </route> 
+        
+  </camelContext>
+  
+</beans>

Copied: labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfSoapSpringWithoutSession.xml (from rev 35991, labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfSoapSpring.xml)
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfSoapSpringWithoutSession.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/CxfSoapSpringWithoutSession.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xmlns:drools="http://drools.org/schema/drools-spring"
+       xsi:schemaLocation="
+       http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/cxfEndpoint.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+  <drools:grid-node id="node1" />
+
+  <drools:kbase id="kbase1" node="node1">		
+    <drools:resources>
+      <drools:resource type="DRL" source="classpath:org/drools/camel/component/testSpring.drl"/>
+    </drools:resources>					
+  </drools:kbase>
+  
+  <drools:kbase id="kbase2" node="node1">		
+    <drools:resources>
+      <drools:resource type="DRL" source="classpath:org/drools/camel/component/testSpring2.drl"/>
+    </drools:resources>					
+  </drools:kbase>
+
+  <drools:ksession id="ksession1" type="stateful" name="ksession1" kbase="kbase1" node="node1">
+    <drools:script>	    		    	
+	  <drools:set-global identifier="list" >
+	    <bean class="java.util.ArrayList" />
+	  </drools:set-global>		  
+    </drools:script>
+  </drools:ksession>
+  
+  <drools:ksession id="ksession2" type="stateful" name="ksession2" kbase="kbase2" node="node1">
+    <drools:script>	    		    	
+	  <drools:set-global identifier="list" >
+	    <bean class="java.util.ArrayList" />
+	  </drools:set-global>		  
+    </drools:script>
+  </drools:ksession>
+
+  <cxf:cxfEndpoint id="soapServer"
+   					address="http://localhost:9002/soap"
+   					serviceName="ns:CommandExecutor"
+   					endpointName="ns:CommandExecutorPort" 
+					wsdlURL="src/test/resources/org/drools/camel/component/soap.wsdl"
+					xmlns:ns="http://soap.jax.drools.org/" >
+    <cxf:properties>
+      <entry key="dataFormat" value="MESSAGE"/>
+      <entry key="defaultOperationName" value="execute"/>
+    </cxf:properties>
+  </cxf:cxfEndpoint>
+
+  <bean id="droolsPolicy" class="org.drools.camel.component.DroolsPolicy" />
+
+  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+
+    <route>
+      <from uri="cxf://bean://soapServer"/>
+      <policy ref="droolsPolicy">
+        <unmarshal ref="xstream" />       
+        <to uri="drools:node1" />
+        <marshal ref="xstream" />
+      </policy>
+    </route>
+
+    <route id="x1">
+      <from uri="direct://http"/>
+      <policy ref="droolsPolicy">
+        <to uri="cxf://bean://soapServer"/>
+      </policy>
+    </route>
+
+  </camelContext>
+
+</beans>

Modified: labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring.drl
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring.drl	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring.drl	2010-11-19 16:38:06 UTC (rev 36013)
@@ -16,13 +16,15 @@
 
 package  org.drools.springframework
 
-import org.drools.pipeline.camel.Person
+declare Person2
+    name : String
+end
 
 global java.util.List list;
 
 rule "rule 1"
 when
-    $p : Person();
+    $p : Person2();
 then
     list.add( $p );
 end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring2.drl (from rev 35991, labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring.drl)
===================================================================
--- labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring2.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-camel/src/test/resources/org/drools/camel/component/testSpring2.drl	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,32 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package  org.drools.springframework
+
+
+declare Person3
+    name : String
+end
+
+
+global java.util.List list;
+
+rule "rule 3"
+when
+    $p : Person3();
+then
+    list.add( $p );
+end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetFactCountCommand.java (from rev 35977, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/DisposeCommand.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetFactCountCommand.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetFactCountCommand.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,38 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.command.runtime;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+public class GetFactCountCommand
+    implements
+    GenericCommand<Long> {
+
+    public Long execute(Context context) {
+        StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
+        
+        return ksession.getFactCount();
+    }
+
+    public String toString() {
+        return "ksession.getFactCount();";
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandleCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandleCommand.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandleCommand.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -43,7 +43,7 @@
     public FactHandle execute(Context context) {
         StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
         FactHandle factHandle = ksession.getFactHandle( object );
-        if ( disconnected ){
+        if ( factHandle != null && disconnected ){
             ((DefaultFactHandle)factHandle).disconnect();
         }
         return factHandle;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandlesCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandlesCommand.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/GetFactHandlesCommand.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -21,9 +21,7 @@
 import org.drools.command.Context;
 import org.drools.command.impl.GenericCommand;
 import org.drools.command.impl.KnowledgeCommandContext;
-import org.drools.impl.StatefulKnowledgeSessionImpl.ObjectStoreWrapper;
-import org.drools.reteoo.ReteooStatefulSession;
-import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.common.DefaultFactHandle;
 import org.drools.runtime.ObjectFilter;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.FactHandle;
@@ -33,6 +31,7 @@
     GenericCommand<Collection<FactHandle>> {
 
     private ObjectFilter filter = null;
+    private boolean      disconnected = false;
 
     public GetFactHandlesCommand() {
     }
@@ -40,14 +39,30 @@
     public GetFactHandlesCommand(ObjectFilter filter) {
         this.filter = filter;
     }
+    public GetFactHandlesCommand(ObjectFilter filter, boolean disconnected) {
+        this.filter = filter;
+        this.disconnected = disconnected;
+    }
 
     public Collection<FactHandle> execute(Context context) {
         StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();        
 
         if ( filter != null ) {
-            return ksession.getFactHandles( this.filter );
+            Collection<FactHandle> factHandles = ksession.getFactHandles( this.filter );
+            if(factHandles != null && disconnected){
+                for(FactHandle factHandle: factHandles){
+                    ((DefaultFactHandle)factHandle).disconnect();
+                }
+            }
+            return factHandles;
         } else {
-            return ksession.getFactHandles( this.filter );
+            Collection<FactHandle> factHandles = ksession.getFactHandles( );
+            if(factHandles != null && disconnected){
+                for(FactHandle factHandle: factHandles){
+                    ((DefaultFactHandle)factHandle).disconnect();
+                }
+            }
+            return factHandles;
         }
     }
 

Modified: labs/jbossrules/trunk/drools-grid/drools-grid-impl/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/pom.xml	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/pom.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -104,6 +104,12 @@
       <artifactId>btm</artifactId>
       <scope>test</scope>
     </dependency>
+    
+    <dependency>
+      <groupId>org.drools</groupId>
+      <artifactId>drools-bpmn2</artifactId>
+      <scope>test</scope>
+    </dependency>
 
   </dependencies>
 

Modified: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/impl/GridNodeServer.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/impl/GridNodeServer.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/impl/GridNodeServer.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -63,7 +63,7 @@
                                                                          Conversation con,
                                                                          Message msg,
                                                                          CommandImpl cmd) {
-                                                         GridNode gnode = (GridNode) object;
+                                                         
                                                          List list = cmd.getArguments();
                                                          GenericCommand command = (GenericCommand) list.get( 0 );
 
@@ -80,6 +80,21 @@
                                                          con.respond( result );
                                                      }
                                                  } );
+                                                 put( "registerKsession",
+                                                 new Exec() {
+                                                     public void execute(Object object,
+                                                                         Conversation con,
+                                                                         Message msg,
+                                                                         CommandImpl cmd) {
+                                                         GridNode gnode = (GridNode) object;
+                                                         List list = cmd.getArguments();
+                                                         String instanceId = (String)list.get(1);
+                                                         // Set the already created session into the node localcontext
+                                                         gnode.set((String) list.get(0), data.getTemp().get(instanceId));
+                                                         // Respond nothing
+                                                         con.respond( null );
+                                                     }
+                                                 } );
                                         }
                                     };
 

Modified: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/GridNodeRemoteClient.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/GridNodeRemoteClient.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/GridNodeRemoteClient.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -17,19 +17,20 @@
 
 package org.drools.grid.remote;
 
+import java.net.InetSocketAddress;
+import java.util.Arrays;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import org.drools.KnowledgeBaseFactoryService;
-import org.drools.SystemEventListenerFactory;
 import org.drools.builder.KnowledgeBuilderFactoryService;
 import org.drools.grid.Grid;
 import org.drools.grid.GridNode;
 import org.drools.grid.GridServiceDescription;
-import org.drools.grid.io.Connector;
-import org.drools.grid.io.ConnectorFactoryService;
 import org.drools.grid.io.ConversationManager;
-import org.drools.grid.io.impl.ConversationManagerImpl;
+import org.drools.grid.io.impl.CommandImpl;
 import org.drools.grid.remote.mina.MinaConnector;
+import org.drools.grid.service.directory.Address;
 import org.drools.util.ServiceRegistry;
 import org.drools.util.ServiceRegistryImpl;
 
@@ -71,7 +72,25 @@
 
     public void set(String identifier,
                     Object object) {
-        throw new UnsupportedOperationException( "Not supported yet." );
+       //We need a way to do it more generic, so we can set whatever we want.
+        
+       if(object instanceof StatefulKnowledgeSessionRemoteClient){ 
+            String localId = UUID.randomUUID().toString();
+
+            CommandImpl cmd = new CommandImpl( "registerKsession",
+                                               Arrays.asList( new Object[]{identifier, ((StatefulKnowledgeSessionRemoteClient)object).getInstanceId()} ) );
+
+            ConversationManager connm = this.grid.get( ConversationManager.class );
+            ConversationUtil.sendMessage( connm,
+                                          (InetSocketAddress) ((Map<String, Address>)this.gsd.getAddresses()).get( "socket" ).getObject(),
+                                          this.gsd.getId(),
+                                          cmd );
+       } else{
+            
+           throw new UnsupportedOperationException( "Not supported yet." );
+       }
+
+        
     }
 
     public String getId() {

Modified: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/StatefulKnowledgeSessionRemoteClient.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -27,6 +27,7 @@
 import org.drools.command.GetSessionClockCommand;
 import org.drools.command.KnowledgeContextResolveFromContextCommand;
 import org.drools.command.runtime.DisposeCommand;
+import org.drools.command.runtime.GetFactCountCommand;
 import org.drools.command.runtime.GetGlobalsCommand;
 import org.drools.command.runtime.process.AbortProcessInstanceCommand;
 import org.drools.command.runtime.process.GetProcessInstanceCommand;
@@ -49,6 +50,7 @@
 import org.drools.grid.GridServiceDescription;
 import org.drools.grid.io.ConversationManager;
 import org.drools.grid.io.impl.CommandImpl;
+import org.drools.grid.remote.command.GetWorkItemManagerCommand;
 import org.drools.grid.remote.command.GetWorkingMemoryEntryPointRemoteCommand;
 import org.drools.runtime.Calendars;
 import org.drools.runtime.Channel;
@@ -464,7 +466,20 @@
     }
 
     public long getFactCount() {
-        throw new UnsupportedOperationException( "Not supported yet." );
+         String kresultsId = "kresults_" + this.gsd.getId();
+        CommandImpl cmd = new CommandImpl("execute",
+                Arrays.asList(new Object[]{ new KnowledgeContextResolveFromContextCommand( new GetFactCountCommand(),
+                                                                                  null,
+                                                                                  null,
+                                                                                  this.instanceId,
+                                                                                  kresultsId )}));
+        
+        Object result = ConversationUtil.sendMessage(this.cm,
+                (InetSocketAddress) this.gsd.getAddresses().get("socket").getObject(),
+                this.gsd.getId(),
+                cmd);
+        
+        return (Long)result;
     }
 
     public ProcessInstance startProcess(String processId) {
@@ -580,7 +595,29 @@
     }
 
     public WorkItemManager getWorkItemManager() {
-        throw new UnsupportedOperationException( "Not supported yet." );
+        
+        //This is not needed right??? or should I send the message to see if something is wrong..??
+        
+//         String kresultsId = "kresults_" + this.gsd.getId();
+//        
+//        CommandImpl cmd = new CommandImpl("execute",
+//                Arrays.asList(new Object[]{ new KnowledgeContextResolveFromContextCommand(new GetWorkItemManagerCommand(),
+//                                                                                  null,
+//                                                                                  null,
+//                                                                                  this.instanceId,
+//                                                                                  kresultsId )}));
+//        
+//         ConversationUtil.sendMessage(this.cm,
+//                (InetSocketAddress) this.gsd.getAddresses().get("socket").getObject(),
+//                this.gsd.getId(),
+//                cmd);
+        
+         
+           
+            
+         return new WorkItemManagerRemoteClient(this.instanceId, this.gsd, this.cm);
+        
+
     }
 
     public void addEventListener(WorkingMemoryEventListener listener) {
@@ -619,4 +656,9 @@
         throw new UnsupportedOperationException( "Not supported yet." );
     }
 
+    public String getInstanceId() {
+        return instanceId;
+    }
+    
+    
 }

Copied: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java (from rev 35977, labs/jbossrules/trunk/drools-grid/drools-grid-remote-api/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java)
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/WorkItemManagerRemoteClient.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,103 @@
+package org.drools.grid.remote;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.Arrays;
+import java.util.Map;
+import org.drools.command.KnowledgeContextResolveFromContextCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+import org.drools.command.runtime.process.RegisterWorkItemHandlerCommand;
+import org.drools.grid.GridNode;
+import org.drools.grid.GridServiceDescription;
+
+import org.drools.grid.io.ConversationManager;
+import org.drools.grid.io.impl.CommandImpl;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+
+/**
+ *
+ * @author salaboy
+ */
+public class WorkItemManagerRemoteClient
+    implements
+    WorkItemManager,
+    Serializable {
+
+    private static final long    serialVersionUID = 1L;
+
+    
+    private String               instanceId;
+    private ConversationManager  cm;
+    private GridServiceDescription<GridNode> gsd;
+
+    public WorkItemManagerRemoteClient(String instanceId, GridServiceDescription gsd, ConversationManager cm) {
+        this.instanceId = instanceId;
+        this.cm = cm;
+        this.gsd = gsd;
+    }
+
+    
+    
+    public void abortWorkItem(long id) {
+        String kresultsId = "kresults_" + this.gsd.getId();
+        
+        CommandImpl cmd = new CommandImpl("execute",
+                Arrays.asList(new Object[]{ new KnowledgeContextResolveFromContextCommand( new AbortWorkItemCommand( id ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  this.instanceId,
+                                                                                  kresultsId )}));
+        
+         ConversationUtil.sendMessage(this.cm,
+                (InetSocketAddress) this.gsd.getAddresses().get("socket").getObject(),
+                this.gsd.getId(),
+                cmd);
+    }
+
+    public void completeWorkItem(long id,
+                                 Map<String, Object> results) {
+        
+        String kresultsId = "kresults_" + this.gsd.getId();
+        
+        CommandImpl cmd = new CommandImpl("execute",
+                Arrays.asList(new Object[]{ new KnowledgeContextResolveFromContextCommand( new CompleteWorkItemCommand( id,
+                                                                                                               results ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  this.instanceId,
+                                                                                  kresultsId )}));
+        
+         ConversationUtil.sendMessage(this.cm,
+                (InetSocketAddress) this.gsd.getAddresses().get("socket").getObject(),
+                this.gsd.getId(),
+                cmd);
+        
+        
+
+    }
+
+    public void registerWorkItemHandler(String workItemName,
+                                        WorkItemHandler handler) {
+        
+        String kresultsId = "kresults_" + this.gsd.getId();
+        
+        CommandImpl cmd = new CommandImpl("execute",
+                Arrays.asList(new Object[]{ new KnowledgeContextResolveFromContextCommand( new RegisterWorkItemHandlerCommand( workItemName,
+                                                                                                               handler ),
+                                                                                  null,
+                                                                                  null,
+                                                                                  this.instanceId,
+                                                                                  kresultsId )}));
+        
+         ConversationUtil.sendMessage(this.cm,
+                (InetSocketAddress) this.gsd.getAddresses().get("socket").getObject(),
+                this.gsd.getId(),
+                cmd);
+        
+    }
+
+   
+
+}

Copied: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/command/GetWorkItemManagerCommand.java (from rev 35977, labs/jbossrules/trunk/drools-grid/drools-grid-remote-api/src/main/java/org/drools/grid/remote/internal/commands/GetWorkItemManagerCommand.java)
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/command/GetWorkItemManagerCommand.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/java/org/drools/grid/remote/command/GetWorkItemManagerCommand.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,27 @@
+package org.drools.grid.remote.command;
+
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.runtime.process.WorkItemManager;
+
+/**
+ * 
+ * @author salaboy
+ *
+ */
+public class GetWorkItemManagerCommand
+    implements
+    GenericCommand<WorkItemManager> {
+
+    private static final long serialVersionUID = 1L;
+
+    public WorkItemManager execute(Context context) {
+        WorkItemManager workItemManager = ((KnowledgeCommandContext) context).getWorkItemManager();
+        return workItemManager;
+    }
+    
+    
+   
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/NodeTests.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/NodeTests.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/NodeTests.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -17,7 +17,7 @@
 
 package org.drools.grid;
 
-import java.io.Serializable;
+import java.io.Serializable; 
 import java.util.HashMap;
 import java.util.Map;
 import org.drools.KnowledgeBase;
@@ -314,6 +314,29 @@
         public void setName(String name) {
             this.name = name;
         }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            final MyObject other = (MyObject) obj;
+            if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int hash = 7;
+            hash = 97 * hash + (this.name != null ? this.name.hashCode() : 0);
+            return hash;
+        }
         
+        
     }
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/BaseRemoteTest.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/BaseRemoteTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/BaseRemoteTest.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,223 @@
+/*
+ * 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.commands;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.SystemEventListenerFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderErrors;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.grid.ConnectionFactoryService;
+import org.drools.grid.Grid;
+import org.drools.grid.GridConnection;
+import org.drools.grid.GridNode;
+import org.drools.grid.GridServiceDescription;
+import org.drools.grid.SocketService;
+import org.drools.grid.conf.GridPeerServiceConfiguration;
+import org.drools.grid.conf.impl.GridPeerConfiguration;
+import org.drools.grid.impl.GridImpl;
+import org.drools.grid.impl.MultiplexSocketServerImpl;
+import org.drools.grid.io.impl.MultiplexSocketServiceCongifuration;
+import org.drools.grid.remote.mina.MinaAcceptorFactoryService;
+import org.drools.grid.service.directory.WhitePages;
+import org.drools.grid.service.directory.impl.CoreServicesLookupConfiguration;
+import org.drools.grid.service.directory.impl.WhitePagesLocalConfiguration;
+import org.drools.grid.timer.impl.CoreServicesSchedulerConfiguration;
+import org.drools.io.impl.ByteArrayResource;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+
+/**
+ *
+ * @author salaboy
+ */
+public abstract class BaseRemoteTest {
+    
+    private Map<String, GridServiceDescription> coreServicesMap;
+    protected Grid grid1;
+    protected GridNode remoteN1;
+    
+    @Before
+    public void setUp() {
+        this.coreServicesMap = new HashMap();
+        createRemoteNode();
+    }
+
+    @After
+    public void tearDown() {
+        remoteN1.dispose(); 
+        grid1.get(SocketService.class).close();
+    }
+    
+    private void createRemoteNode(){
+        grid1 = new GridImpl( new HashMap<String, Object>() );
+        configureGrid1( grid1,
+                        8000,
+                        null );
+
+        Grid grid2 = new GridImpl( new HashMap<String, Object>() );
+        configureGrid1( grid2,
+                        -1,
+                        grid1.get( WhitePages.class ) );
+
+        GridNode n1 = grid1.createGridNode( "n1" );
+        grid1.get( SocketService.class ).addService( "n1", 8000, n1 );
+               
+        GridServiceDescription<GridNode> n1Gsd = grid2.get( WhitePages.class ).lookup( "n1" );
+        GridConnection<GridNode> conn = grid2.get( ConnectionFactoryService.class ).createConnection( n1Gsd );
+        remoteN1 = conn.connect();
+    
+    }
+    
+    private void configureGrid1(Grid grid,
+                                int port,
+                                WhitePages wp) {
+
+        //Local Grid Configuration, for our client
+        GridPeerConfiguration conf = new GridPeerConfiguration();
+
+        //Configuring the Core Services White Pages
+        GridPeerServiceConfiguration coreSeviceWPConf = new CoreServicesLookupConfiguration( coreServicesMap );
+        conf.addConfiguration( coreSeviceWPConf );
+
+        //Configuring the Core Services Scheduler
+        GridPeerServiceConfiguration coreSeviceSchedulerConf = new CoreServicesSchedulerConfiguration();
+        conf.addConfiguration( coreSeviceSchedulerConf );
+
+        //Configuring the WhitePages 
+        WhitePagesLocalConfiguration wplConf = new WhitePagesLocalConfiguration();
+        wplConf.setWhitePages( wp );
+        conf.addConfiguration( wplConf );        
+
+//        //Create a Local Scheduler
+//        SchedulerLocalConfiguration schlConf = new SchedulerLocalConfiguration( "myLocalSched" );
+//        conf.addConfiguration( schlConf );
+        
+        if ( port >= 0 ) {
+            //Configuring the SocketService
+            MultiplexSocketServiceCongifuration socketConf = new MultiplexSocketServiceCongifuration( new MultiplexSocketServerImpl( "127.0.0.1",
+                                                                                                                              new MinaAcceptorFactoryService(),
+                                                                                                                              SystemEventListenerFactory.getSystemEventListener(),
+                                                                                                                              grid) );
+            socketConf.addService( WhitePages.class.getName(), wplConf.getWhitePages(), port );
+//            socketConf.addService( SchedulerService.class.getName(), schlConf.getSchedulerService(), port );
+                        
+            conf.addConfiguration( socketConf );                        
+        }
+        conf.configure( grid );
+
+    }
+    
+    protected StatefulKnowledgeSession createSession(){
+        KnowledgeBuilder kbuilder = remoteN1.get( KnowledgeBuilderFactoryService.class ).newKnowledgeBuilder();
+
+        Assert.assertNotNull( kbuilder );
+
+         String rule = "package test\n"
+                 + "import org.drools.grid.NodeTests.MyObject;\n"
+                 + "global MyObject myGlobalObj;\n"
+                 + "rule \"test\""
+                 + "  when"
+                 + "       $o: MyObject()"
+                 + "  then"
+                 + "      System.out.println(\"My Global Object -> \"+myGlobalObj.getName());"
+                 + "      System.out.println(\"Rule Fired! ->\"+$o.getName());"
+                 + " end";
+
+        kbuilder.add( new ByteArrayResource( rule.getBytes() ),
+                      ResourceType.DRL );
+
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if ( errors != null && errors.size() > 0 ) {
+            for ( KnowledgeBuilderError error : errors ) {
+                System.out.println( "Error: " + error.getMessage() );
+
+            }
+            Assert.fail("KnowledgeBase did not build");
+        }
+
+        KnowledgeBase kbase = remoteN1.get( KnowledgeBaseFactoryService.class ).newKnowledgeBase();
+
+        Assert.assertNotNull( kbase );
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+        return session;
+    
+    }
+
+    
+    protected StatefulKnowledgeSession createProcessSession(){
+        KnowledgeBuilder kbuilder = remoteN1.get( KnowledgeBuilderFactoryService.class ).newKnowledgeBuilder();
+
+        Assert.assertNotNull( kbuilder );
+
+        String process = "<definitions id=\"Definition\" "
+                + "targetNamespace=\"http://www.example.org/MinimalExample\" "
+                + "typeLanguage=\"http://www.java.com/javaTypes\" "
+                + "expressionLanguage=\"http://www.mvel.org/2.0\" "
+                + "xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" "
+                + "xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\" "
+                + "xs:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" "
+                + "xmlns:tns=\"http://www.jboss.org/drools\">"
+                + "<process id=\"Minimal\" name=\"Minimal Process\" tns:packageName=\"com.sample\">"
+                +   "<startEvent id=\"_1\" name=\"StartProcess\"/>"
+                +     "<sequenceFlow sourceRef=\"_1\" targetRef=\"_2\"/>"
+                +   "<scriptTask id=\"_2\" name=\"Hello\">"
+                +       "<script>System.out.println(\"Hello World\");</script>"
+                +   "</scriptTask>"
+                +   "<sequenceFlow sourceRef=\"_2\" targetRef=\"_3\"/>"
+                +   "<endEvent id=\"_3\" name=\"EndProcess\">"
+                +      "<terminateEventDefinition/>"
+                +   "</endEvent>"
+                + "</process>"
+                + "</definitions>";
+        System.out.println("Process = "+process);
+         
+        kbuilder.add( new ByteArrayResource( process.getBytes() ),
+                      ResourceType.BPMN2 );
+
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if ( errors != null && errors.size() > 0 ) {
+            for ( KnowledgeBuilderError error : errors ) {
+                System.out.println( "Error: " + error.getMessage() );
+
+            }
+            Assert.fail("KnowledgeBase did not build");
+        }
+
+        KnowledgeBase kbase = remoteN1.get( KnowledgeBaseFactoryService.class ).newKnowledgeBase();
+
+        Assert.assertNotNull( kbase );
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+        return session;
+    
+    }
+
+}

Added: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteProcessCommandTests.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteProcessCommandTests.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteProcessCommandTests.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,61 @@
+/*
+ * 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.commands;
+
+
+
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ * @author salaboy
+ */
+public class RemoteProcessCommandTests extends BaseRemoteTest{
+
+    public RemoteProcessCommandTests() {
+    }
+
+   
+
+    
+
+     @Test
+     public void startProcessTest() {   
+        StatefulKnowledgeSession ksession = createProcessSession();
+        
+        ProcessInstance processInstance = ksession.startProcess("Minimal");
+        
+        Assert.assertNotNull(processInstance);
+        
+        Assert.assertEquals("Minimal", processInstance.getProcessId());
+     }
+     
+     
+     
+     
+      
+      
+      
+    
+     
+
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteSessionCommandTests.java
===================================================================
--- labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteSessionCommandTests.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/test/java/org/drools/grid/remote/commands/RemoteSessionCommandTests.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,174 @@
+/*
+ * 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.commands;
+
+
+
+import java.util.Collection;
+import org.drools.common.DefaultFactHandle;
+import org.drools.grid.NodeTests.MyObject;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.FactHandle;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ * @author salaboy
+ */
+public class RemoteSessionCommandTests extends BaseRemoteTest{
+
+    public RemoteSessionCommandTests() {
+    }
+
+   
+
+    
+
+     @Test
+     public void insertTest() {
+        StatefulKnowledgeSession ksession = createSession();
+        
+        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+        
+        FactHandle handle = ksession.insert(new MyObject("obj1"));
+        Assert.assertNotNull(handle);
+        Assert.assertEquals(true, ((DefaultFactHandle)handle).isDisconnected());
+        
+        int fired = ksession.fireAllRules();
+        
+        Assert.assertEquals(fired, 1);
+     
+     }
+     
+     @Test
+     public void getGlobalTest() {
+        StatefulKnowledgeSession ksession = createSession();
+        
+        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+        
+        Assert.assertEquals("myglobalObj", ((MyObject)ksession.getGlobal("myGlobalObj")).getName());
+     
+     }
+     
+     @Test
+     public void retractTest() {
+        StatefulKnowledgeSession ksession = createSession();
+        
+        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+        
+        FactHandle handle = ksession.insert(new MyObject("obj1"));
+        Assert.assertNotNull(handle);
+        Assert.assertEquals(true, ((DefaultFactHandle)handle).isDisconnected());
+        
+        int fired = ksession.fireAllRules();
+        Assert.assertEquals(fired, 1);
+        
+        Assert.assertEquals(1, ksession.getFactCount());
+        
+        ksession.retract(handle);
+        
+        Assert.assertEquals(0, ksession.getFactCount());
+     
+     }
+     
+     
+     @Test
+     public void updateTest() {
+        StatefulKnowledgeSession ksession = createSession();
+        
+        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+        
+        FactHandle handle = ksession.insert(new MyObject("obj1"));
+        Assert.assertNotNull(handle);
+        Assert.assertEquals(true, ((DefaultFactHandle)handle).isDisconnected());
+        
+        int fired = ksession.fireAllRules();
+        Assert.assertEquals(fired, 1);
+        
+        Assert.assertEquals(1, ksession.getFactCount());
+        
+        ksession.update(handle, new MyObject("obj2"));
+        
+        Assert.assertEquals(1, ksession.getFactCount());
+        
+        fired = ksession.fireAllRules();
+        Assert.assertEquals(fired, 1);
+     
+     }
+     
+//     @Test
+//     public void getFactHandleTest() {
+//        StatefulKnowledgeSession ksession = createSession();
+//        
+//        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+//        MyObject obj1 = new MyObject("obj1");
+//        FactHandle handle = ksession.insert(obj1);
+//        Assert.assertNotNull(handle);
+//        Assert.assertEquals(true, ((DefaultFactHandle)handle).isDisconnected());
+//        // The session assertMap doesn't find the factHandle for this object
+//        FactHandle newHandle = ksession.getFactHandle(obj1);
+//        
+//        Assert.assertEquals( newHandle, handle );
+//        
+//     
+//     }
+     
+     
+//     @Test
+//     public void getFactHandlesTest() {
+//        StatefulKnowledgeSession ksession = createSession();
+//        
+//        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+//        MyObject obj1 = new MyObject("obj1");
+//        FactHandle handle = ksession.insert(obj1);
+//        Assert.assertNotNull(handle);
+//        Assert.assertEquals(true, ((DefaultFactHandle)handle).isDisconnected());
+//        //I'm having problems with ObjectStoreWrapper that it's not serializable
+//        Collection<FactHandle> factHandles = ksession.getFactHandles();
+//        Assert.assertEquals(1, factHandles.size());
+//        Assert.assertEquals(handle, factHandles.iterator().next() );
+//        
+//     
+//     }
+     
+      @Test
+     public void getObjectTest() {
+        StatefulKnowledgeSession ksession = createSession();
+        
+        ksession.setGlobal("myGlobalObj", new MyObject("myglobalObj"));
+        MyObject obj1 = new MyObject("obj1");
+        FactHandle handle = ksession.insert(obj1);
+        Assert.assertNotNull(handle);
+        Assert.assertEquals(true, ((DefaultFactHandle)handle).isDisconnected());
+        
+        Object result = ksession.getObject(handle);
+        
+        Assert.assertEquals(obj1,  result);
+        
+     
+     }
+     
+      
+      
+      
+    
+     
+
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-server/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-server/pom.xml	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-server/pom.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -170,6 +170,12 @@
       <scope>test</scope>
     </dependency>
 
+     <!-- HSQLDB -->
+    <dependency>
+      <groupId>com.h2database</groupId>
+      <artifactId>h2</artifactId>
+      
+    </dependency>
   </dependencies>
 
 </project>

Copied: labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/orm.xml (from rev 35991, labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/resources/META-INF/orm.xml)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/orm.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/orm.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,40 @@
+<?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"
+                 xmlns:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+                 version="1.0">
+  <entity class="org.drools.grid.service.directory.impl.AddressImpl" access="FIELD">
+      <table name="Address"/>
+
+      <attributes>
+          <id name="id">
+              <generated-value strategy="AUTO"/>
+          </id>
+          <many-to-one name="gridServiceDescription" target-entity="org.drools.grid.service.directory.impl.GridServiceDescriptionImpl" />
+      </attributes>
+  </entity>
+  
+  <entity class="org.drools.grid.service.directory.impl.GridServiceDescriptionImpl" access="FIELD">
+      <table name="GridServiceDescription"/>
+
+      <attributes>
+          <id name="id" />        
+          <one-to-many name="addresses" mapped-by="gridServiceDescription" target-entity="org.drools.grid.service.directory.impl.AddressImpl" fetch="EAGER" >
+              <map-key name="transport" /> 
+              <cascade>
+                  <cascade-all/>
+              </cascade>
+          </one-to-many>     
+        
+      </attributes>
+  </entity>  
+  
+  <entity class="org.drools.grid.timer.impl.ScheduledJob" access="FIELD">
+      <table name="ScheduledJob"/>
+
+      <attributes>
+          <id name="id" />        
+          <transient name="jobHandle" />                      
+      </attributes>
+  </entity>    
+</entity-mappings>

Copied: labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/persistence.xml (from rev 35991, labs/jbossrules/trunk/drools-grid/drools-grid-impl/src/main/resources/META-INF/persistence.xml)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/persistence.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/main/resources/META-INF/persistence.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:orm="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 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">
+  <persistence-unit name="org.drools.grid">
+    <provider>org.hibernate.ejb.HibernatePersistence</provider>
+    <class>org.drools.grid.service.directory.impl.GridServiceDescriptionImpl</class>
+    <class>org.drools.grid.service.directory.impl.AddressImpl</class>
+    <class>java.lang.String</class>
+    <class>org.drools.grid.timer.impl.ScheduledJob</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:/h2/test;AUTO_SERVER=TRUE" /-->
+      <!--  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>

Copied: labs/jbossrules/trunk/drools-server/src/main/resources/camel-server-grid.xml (from rev 35991, labs/jbossrules/trunk/drools-server/src/main/resources/camel-server.xml)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/resources/camel-server-grid.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/main/resources/camel-server-grid.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+    
+	<import resource="classpath:META-INF/cxf/cxf.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/> 
+	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
+	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
+
+  <!--
+      !   If you are running on JBoss you will need to copy a camel-jboss.jar into the lib and set this classloader configuration 
+      |  http://camel.apache.org/camel-jboss.html
+      <bean id="jbossResolver" class="org.apache.camel.jboss.JBossPackageScanClassResolver"/>
+      -->
+
+  <!--
+   !   Define the server end point.
+   !   Copy and paste this element, changing id and the address, to expose services on different urls.
+   !   Different Camel routes can handle different end point paths.
+    --> 
+  <cxf:rsServer id="rsServer"  
+                address="/rest"
+                serviceClass="org.drools.jax.rs.CommandExecutorImpl">
+       <cxf:providers>
+           <bean class="org.drools.jax.rs.CommandMessageBodyReader"/>
+       </cxf:providers>
+  </cxf:rsServer>  
+  
+  <cxf:cxfEndpoint id="soapServer"
+  					address="/soap"
+   					serviceName="ns:CommandExecutor"
+   					endpointName="ns:CommandExecutorPort" 
+					wsdlURL="soap.wsdl"
+					xmlns:ns="http://soap.jax.drools.org/" >
+    <cxf:properties>
+      <entry key="dataFormat" value="MESSAGE"/>
+      <entry key="defaultOperationName" value="execute"/>
+    </cxf:properties>
+  </cxf:cxfEndpoint>
+
+  <!-- Leave this, as it's needed to make Camel "drools" aware -->
+  <bean id="droolsPolicy" class="org.drools.camel.component.DroolsPolicy" />  
+    
+  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">    
+    <!-- 
+     ! Routes incoming messages from end point id="rsServer".
+     ! Example route unmarshals the messages with xstream and executes against ksession1.
+     ! Copy and paste this element, changing marshallers and the 'to' uri, to target different sessions, as needed.
+     !-->
+     
+    <route>
+       <from uri="cxfrs://bean://rsServer"/>
+       <policy ref="droolsPolicy">
+	       <unmarshal ref="xstream" />       
+	       <to uri="drools:node1" />
+	       <marshal ref="xstream" />
+       </policy>
+    </route>    
+
+    <route>
+      <from uri="cxf://bean://soapServer"/>
+      <policy ref="droolsPolicy">
+        <unmarshal ref="xstream" />       
+        <to uri="drools:node1" />
+        <marshal ref="xstream" />
+      </policy>
+    </route>
+        
+  </camelContext>
+
+</beans>

Copied: labs/jbossrules/trunk/drools-server/src/main/resources/knowledge-services-grid.xml (from rev 35991, labs/jbossrules/trunk/drools-server/src/main/resources/knowledge-services.xml)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/resources/knowledge-services-grid.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/main/resources/knowledge-services-grid.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:drools="http://drools.org/schema/drools-spring"       
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+                           http://drools.org/schema/drools-spring http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-container/drools-spring/src/main/resources/org/drools/container/spring/drools-spring-1.2.0.xsd">
+	
+    <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+		<!-- org.h2.jdbcx.JdbcDataSource -->
+		<property name="driverClassName" value="org.h2.Driver" />
+		<property name="url" value="jdbc:h2:mem:mydb" />
+		<property name="username" value="sa" />
+		<property name="password" value="" />
+	</bean>	
+	
+	<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
+	     <property name="persistenceUnitName" value="org.drools.grid"/>
+	</bean>
+        
+        <bean id="shared-map" class="java.util.HashMap" />
+    
+    <bean id="localWhitePages" class="org.drools.grid.service.directory.impl.WhitePagesImpl" />
+
+    <drools:grid id="grid1">
+	   <drools:core-services ref="shared-map" />	   
+	   
+	   <drools:whitepages>
+			<drools:jpa-persistence>
+	            <drools:entity-manager-factory ref="myEmf" />   	    
+		    </drools:jpa-persistence>	   
+	   </drools:whitepages>	   
+	   
+	   <drools:socket-service acceptor="mina" ip="127.0.0.1">
+	      <drools:service name="org.drools.grid.service.directory.WhitePages" port="8000" />
+	   </drools:socket-service>    
+    </drools:grid>
+    
+    <drools:grid id="grid2">
+       <drools:core-services ref="shared-map" />
+	</drools:grid>
+    
+    <drools:grid-node id="node1" grid="grid1">
+	   <drools:socket-service port="8000" />
+	</drools:grid-node>
+        
+       <drools:kbase id="kbase1" node="node1">
+	    <drools:resources>
+            <drools:resource  type="DRL" source="classpath:test.drl"/>
+		</drools:resources>						
+	</drools:kbase>
+	
+	<drools:ksession id="ksession3" type="stateful" kbase="kbase1" node="node1"/>	
+        
+        
+	
+</beans>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfRsClientServerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfRsClientServerTest.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfRsClientServerTest.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -40,6 +40,7 @@
 
         assertTrue( response.contains( "execution-results" ) );
         assertTrue( response.contains( "echo" ) );
+        springContext.stop();
     }
 
 }

Copied: labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerGridTest.java (from rev 35991, labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerGridTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerGridTest.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,170 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.server;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+
+import junit.framework.TestCase;
+
+import org.apache.camel.CamelContext;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderErrors;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.grid.ConnectionFactoryService;
+import org.drools.grid.GridConnection;
+import org.drools.grid.GridNode;
+import org.drools.grid.GridServiceDescription;
+import org.drools.grid.SocketService;
+import org.drools.grid.impl.GridImpl;
+import org.drools.grid.service.directory.WhitePages;
+import org.drools.io.impl.ByteArrayResource;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.junit.Assert;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class CxfSoapClientServerGridTest extends TestCase {
+
+    public void test1() throws Exception {
+        ClassPathXmlApplicationContext springContext = new ClassPathXmlApplicationContext( "classpath:beans-test-grid.xml" );
+
+        SOAPMessage soapMessage = createMessageForKsession("ksession3");
+
+        Test test = new Test();
+        String response = test.execute( soapMessage,
+                                        (CamelContext) springContext.getBean( "camel-client-ctx" ) );
+        
+        //System.out.println("Response 1 = "+ response ); 
+        assertTrue( response.contains( "execution-results" ) );
+        assertTrue( response.contains( "echo" ) );
+        
+        
+        GridImpl grid2 = (GridImpl) springContext.getBean("grid2");
+        GridServiceDescription<GridNode> n1Gsd = grid2.get( WhitePages.class ).lookup( "node1" );
+        GridConnection<GridNode> conn = grid2.get( ConnectionFactoryService.class ).createConnection( n1Gsd );
+        GridNode remoteN1 = conn.connect();
+
+        KnowledgeBuilder kbuilder = remoteN1.get( KnowledgeBuilderFactoryService.class ).newKnowledgeBuilder();
+
+        Assert.assertNotNull( kbuilder );
+        
+        String rule = "package  org.grid.test\n"
+                + "declare Message2\n"
+                +    "text : String\n"
+                + "end\n"
+                + "rule \"echo2\" \n"
+                + "dialect \"mvel\"\n"
+                +   "when\n"
+                + "     $m : Message2()\n"
+                +   "then\n"
+                +       "$m.text = \"echo2:\" + $m.text;\n"
+                + "end\n";
+                //System.out.println("Rule = "+rule);
+        kbuilder.add( new ByteArrayResource( rule.getBytes() ),
+                      ResourceType.DRL );
+
+        KnowledgeBuilderErrors errors = kbuilder.getErrors();
+        if ( errors != null && errors.size() > 0 ) {
+            for ( KnowledgeBuilderError error : errors ) {
+                System.out.println( "Error: " + error.getMessage() );
+
+            }
+            fail("KnowledgeBase did not build");
+        }
+
+        KnowledgeBase kbase = remoteN1.get( KnowledgeBaseFactoryService.class ).newKnowledgeBase();
+
+        Assert.assertNotNull( kbase );
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+        Assert.assertNotNull( session );
+        
+        
+        remoteN1.set("ksession2", session);
+        
+        
+        soapMessage = createMessageForKsession("ksession2");
+        
+        String response2 = test.execute( soapMessage,
+                                        (CamelContext) springContext.getBean( "camel-client-ctx" ) );
+        
+        //System.out.println("Response 2 = "+response2  );
+        assertTrue( response2.contains( "execution-results" ) );
+        assertTrue( response2.contains( "echo2" ) );
+        
+        remoteN1.dispose();
+        GridImpl grid1 = (GridImpl) springContext.getBean("grid1");
+        grid1.get(SocketService.class).close();
+       
+        springContext.registerShutdownHook();
+        springContext.stop();
+        
+    }
+    
+    private SOAPMessage createMessageForKsession(String ksessionName) throws SOAPException{
+        
+        SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
+        SOAPBody body = soapMessage.getSOAPPart().getEnvelope().getBody();
+        QName payloadName = new QName( "http://soap.jax.drools.org",
+                                       "execute",
+                                       "ns1" );
+
+        body.addBodyElement( payloadName );
+        String add="";
+        String packages = "org.test";
+        if(ksessionName.equals("ksession2")){
+            add="2";
+            packages = "org.grid.test";
+        }
+        String cmd = "";
+        cmd += "<batch-execution lookup=\""+ksessionName+"\">\n";
+        cmd += "  <insert out-identifier=\"message\">\n";
+        cmd += "      <"+packages+".Message"+add+">\n";
+        cmd += "         <text>Helllo World"+ksessionName+"</text>\n";
+        cmd += "      </"+packages+".Message"+add+">\n";
+        cmd += "   </insert>\n";
+        cmd += "   <fire-all-rules/>\n";
+        cmd += "</batch-execution>\n";
+        
+        body.addTextNode( cmd );
+        OutputStream os = new ByteArrayOutputStream();
+        try {
+            soapMessage.writeTo(os);
+        } catch (IOException ex) {
+            Logger.getLogger(CxfSoapClientServerGridTest.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        //System.out.println("SOAP = "+os.toString());
+        return soapMessage;
+    
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerTest.java	2010-11-19 14:34:30 UTC (rev 36012)
+++ labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/CxfSoapClientServerTest.java	2010-11-19 16:38:06 UTC (rev 36013)
@@ -27,7 +27,7 @@
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 public class CxfSoapClientServerTest extends TestCase {
-
+    
     public void test1() throws Exception {
         ClassPathXmlApplicationContext springContext = new ClassPathXmlApplicationContext( "classpath:beans-test.xml" );
 
@@ -55,7 +55,8 @@
                                         (CamelContext) springContext.getBean( "camel-client-ctx" ) );
 
         assertTrue( response.contains( "execution-results" ) );
-        assertTrue( response.contains( "echo" ) );
+        assertTrue( response.contains( "echo" ) );  
+        springContext.stop();
     }
 
 }

Copied: labs/jbossrules/trunk/drools-server/src/test/resources/beans-test-grid.xml (from rev 35991, labs/jbossrules/trunk/drools-server/src/test/resources/beans-test.xml)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/resources/beans-test-grid.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/test/resources/beans-test-grid.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xmlns:drools="http://drools.org/schema/drools-spring"
+       xsi:schemaLocation="
+       http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+  
+  <import resource="classpath:knowledge-services-grid.xml" />
+    
+  <import resource="classpath:camel-embedded-server-test-grid.xml" />
+
+  <import resource="classpath:camel-client-test.xml" />
+  
+</beans>

Copied: labs/jbossrules/trunk/drools-server/src/test/resources/camel-embedded-server-test-grid.xml (from rev 35991, labs/jbossrules/trunk/drools-server/src/test/resources/camel-embedded-server-test.xml)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/resources/camel-embedded-server-test-grid.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/test/resources/camel-embedded-server-test-grid.xml	2010-11-19 16:38:06 UTC (rev 36013)
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+	<import resource="classpath:META-INF/cxf/cxf.xml"/>
+	<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>
+	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
+	<import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml"/>
+    
+  <cxf:rsServer id="rsServer"  
+                address="http://localhost:9002/rest"
+                serviceClass="org.drools.jax.rs.CommandExecutorImpl">
+       <cxf:providers>
+           <bean class="org.drools.jax.rs.CommandMessageBodyReader"/>
+       </cxf:providers>
+  </cxf:rsServer>
+  
+  <cxf:cxfEndpoint id="soapServer"
+  					address="http://localhost:9002/soap"
+   					serviceName="ns:CommandExecutor"
+   					endpointName="ns:CommandExecutorPort" 
+					wsdlURL="soap.wsdl"
+					xmlns:ns="http://soap.jax.drools.org/" >
+    <cxf:properties>
+      <entry key="dataFormat" value="MESSAGE"/>
+      <entry key="defaultOperationName" value="execute"/>
+    </cxf:properties>
+  </cxf:cxfEndpoint>
+  
+  <!-- Leave this, as it's needed to make Camel "drools" aware -->
+  <bean id="droolsPolicy" class="org.drools.camel.component.DroolsPolicy" />  
+    
+  <camelContext id="camel-server-ctx" xmlns="http://camel.apache.org/schema/spring">    
+
+    
+    <route>
+       <from uri="cxfrs://bean://rsServer"/>
+       <policy ref="droolsPolicy">
+	       <unmarshal ref="xstream" />       
+	       <to uri="drools:node1" />
+	       <marshal ref="xstream" />
+       </policy>
+    </route>    
+
+    <route>
+      <from uri="cxf://bean://soapServer"/>
+      <policy ref="droolsPolicy">
+        <unmarshal ref="xstream" />       
+        <to uri="drools:node1" />
+        <marshal ref="xstream" />
+      </policy>
+    </route>
+
+  </camelContext>
+  
+</beans>



More information about the jboss-svn-commits mailing list