[jboss-svn-commits] JBL Code SVN: r36434 - in labs/jbossrules/dev_tags/persistence_refactor_20101216: drools-api/src/main/java/org/drools/persistence/jpa and 31 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Dec 16 12:50:19 EST 2010


Author: mark.proctor at jboss.com
Date: 2010-12-16 12:50:12 -0500 (Thu, 16 Dec 2010)
New Revision: 36434

Added:
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContext.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContextManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SessionMarshallingHelper.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SingleSessionCommandService.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronization.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronizationRegistryHelper.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/SessionInfo.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaJDKTimerService.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaPersistenceContextManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/KnowledgeStoreServiceImpl.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionSynchronizationAdapter.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/map/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/map/impl/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/map/impl/MapPersistenceTest.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/session/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/session/JpaPersistentStatefulSessionTest.java
Removed:
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/WorkItemInfo.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/session/
Modified:
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/KnowledgeStoreService.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/KnowledgeStoreBeanFactory.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringTransactionSynchronizationAdapter.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/JPASingleSessionCommandServiceFactoryTest.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/VariablePersistenceStrategyTest.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/SingleSessionCommandService.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/runtime/GetIdCommand.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalKnowledgeRuntime.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/core/util/FileManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.classpath
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.project
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/META-INF/MANIFEST.MF
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.classpath
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.project
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.eclipse.webdav/META-INF/MANIFEST.MF
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-ide-common/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/JPAWorkItemManager.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/JPAWorkItemManagerFactory.java
   labs/jbossrules/dev_tags/persistence_refactor_20101216/osgi-bundles/jxls/org.drools.osgi.wrapper.jxls-reader/maven-eclipse.xml
Log:
JBRULES-2835 Persistence Store Agnostic refactoring
-Initial refactoring to be JPA independant

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -52,7 +52,7 @@
      * 
      * @return
      */
-    public int getKnowledgeSessionId();
+    public long getKnowledgeSessionId();
 
     /**
      * Returns the total fact count current loaded into this session

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/JPAKnowledgeService.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -111,7 +111,7 @@
                                                                              environment );
     }
 
-    public static StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
+    public static StatefulKnowledgeSession loadStatefulKnowledgeSession(long id,
                                                                         KnowledgeBase kbase,
                                                                         KnowledgeSessionConfiguration configuration,
                                                                         Environment environment) {

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/KnowledgeStoreService.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/KnowledgeStoreService.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/persistence/jpa/KnowledgeStoreService.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -27,7 +27,7 @@
                                                          KnowledgeSessionConfiguration configuration,
                                                          Environment environment);
 
-    StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
+    StatefulKnowledgeSession loadStatefulKnowledgeSession(long id,
                                                           KnowledgeBase kbase,
                                                           KnowledgeSessionConfiguration configuration,
                                                           Environment environment);

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -85,7 +85,7 @@
     CommandExecutor,
     KnowledgeRuntime {
 
-    int getId();
+    long getId();
     
     /**
      * Releases all the current session resources, setting up the session for garbage collection.

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -65,399 +65,400 @@
  * @author etirelli
  */
 public class MultithreadTest extends TestCase {
-    public void test() {
+
+    /**
+     * @inheritDoc
+     *
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    /**
+     * @inheritDoc
+     *
+     * @see junit.framework.TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+    
+    public void testRuleBaseConcurrentCompilation() {
+        final int THREAD_COUNT = 30;
+        try {
+            boolean success = true;
+            final PackageBuilder builder = new PackageBuilder();
+            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadRulebaseSharing.drl" ) ) );
+            RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+            ruleBase.addPackage( builder.getPackage() );
+            ruleBase = SerializationHelper.serializeObject( ruleBase );
+            final Thread[] t = new Thread[THREAD_COUNT];
+            final RulebaseRunner[] r = new RulebaseRunner[THREAD_COUNT];
+            for ( int i = 0; i < t.length; i++ ) {
+                r[i] = new RulebaseRunner( i,
+                                           ruleBase );
+                t[i] = new Thread( r[i],
+                                   "thread-" + i );
+                t[i].start();
+            }
+            for ( int i = 0; i < t.length; i++ ) {
+                t[i].join();
+                if ( r[i].getStatus() == RulebaseRunner.Status.FAIL ) {
+                    success = false;
+                }
+            }
+            if ( !success ) {
+                fail( "Multithread test failed. Look at the stack traces for details. " );
+            }
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail( "Should not raise any exception: " + e.getMessage() );
+        }
+    }
+
+    public static class RulebaseRunner
+        implements
+        Runnable {
+
+        private static final int ITERATIONS = 300;
+        private final int        id;
+        private final RuleBase   rulebase;
+        private Status           status;
+
+        public RulebaseRunner(final int id,
+                              final RuleBase rulebase) {
+            this.id = id;
+            this.rulebase = rulebase;
+            this.status = Status.SUCCESS;
+        }
+
+        public void run() {
+            try {
+                StatefulSession session2 = this.rulebase.newStatefulSession();
+
+                for ( int k = 0; k < ITERATIONS; k++ ) {
+                    GrandParent gp = new GrandParent( "bob" );
+                    Parent parent = new Parent( "mark" );
+                    parent.setGrandParent( gp );
+
+                    Child child = new Child( "mike" );
+                    child.setParent( parent );
+
+                    session2.insert( gp );
+                    session2.insert( parent );
+                    session2.insert( child );
+                }
+
+                session2.fireAllRules();
+                session2.dispose();
+
+            } catch ( Exception e ) {
+                this.status = Status.FAIL;
+                System.out.println( Thread.currentThread().getName() + " failed: " + e.getMessage() );
+                e.printStackTrace();
+            }
+        }
+
+        public static enum Status {
+            SUCCESS, FAIL
+        }
+
+        /**
+         * @return the id
+         */
+        public int getId() {
+            return id;
+        }
+
+        /**
+         * @return the status
+         */
+        public Status getStatus() {
+            return status;
+        }
+
+    }
+
+    public void testExpectedFires() {
+        try {
+            final PackageBuilder packageBuilder = new PackageBuilder();
+            packageBuilder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadFiringCheck.drl" ) ) );
+            final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+            ruleBase.addPackage( packageBuilder.getPackage() );
+            final Queue errorList = new ConcurrentLinkedQueue();
+            final Thread t[] = new Thread[50];
+            for ( int i = 0; i < t.length; i++ ) {
+                final int count = i;
+                t[i] = new Thread( new Runnable() {
+                    public void run() {
+                        try {
+                            final int iterations = count * 15 + 3000;
+                            final List results = new ArrayList();
+                            final StatefulSession session2 = ruleBase.newStatefulSession();
+                            session2.setGlobal( "results",
+                                                results );
+                            session2.insert( new Integer( -1 ) );
+                            for ( int k = 0; k < iterations; k++ ) {
+                                session2.insert( new Integer( k ) );
+                                if ( k + 1 != session2.getAgenda().agendaSize() ) {
+                                    errorList.add( "THREAD-" + count + " ERROR: expected agenda size=" + (k + 1) + " but was " + session2.getAgenda().agendaSize() );
+                                }
+                            }
+                            session2.fireAllRules();
+                            session2.dispose();
+                            if ( results.size() != iterations ) {
+                                errorList.add( "THREAD-" + count + " ERROR: expected fire count=" + iterations + " but was " + results.size() );
+                            }
+                        } catch ( Exception e ) {
+                            errorList.add( "THREAD-" + count + " EXCEPTION: " + e.getMessage() );
+                            e.printStackTrace();
+                        }
+                    }
+                } );
+                t[i].start();
+            }
+            for ( int i = 0; i < t.length; i++ ) {
+                t[i].join();
+            }
+            assertTrue( "Errors during execution: " + errorList.toString(),
+                        errorList.isEmpty() );
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail( "No exception should have been raised: " + e.getMessage() );
+        }
+    }
+
+    public void testMultithreadDateStringConstraints() {
+        try {
+            final int THREAD_COUNT = 10;
+            final PackageBuilder packageBuilder = new PackageBuilder();
+            packageBuilder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadDateStringConstraints.drl" ) ) );
+            final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+            ruleBase.addPackage( packageBuilder.getPackage() );
+            final Vector errors = new Vector();
+
+            final Thread t[] = new Thread[THREAD_COUNT];
+            for ( int j = 0; j < 10; j++ ) {
+                for ( int i = 0; i < t.length; i++ ) {
+                    t[i] = new Thread() {
+                        public void run() {
+                            try {
+                                final int ITERATIONS = 300;
+                                StatefulSession session = ruleBase.newStatefulSession();
+                                List results = new ArrayList();
+                                session.setGlobal( "results",
+                                                   results );
+                                for ( int k = 0; k < ITERATIONS; k++ ) {
+                                    session.insert( new Order() );
+                                }
+                                session.fireAllRules();
+                                session.dispose();
+                                if ( results.size() != ITERATIONS ) {
+                                    errors.add( "Rules did not fired correctly. Expected: " + ITERATIONS + ". Actual: " + results.size() );
+                                }
+                            } catch ( Exception ex ) {
+                                ex.printStackTrace();
+                                errors.add( ex );
+                            }
+                        }
+
+                    };
+                    t[i].start();
+                }
+                for ( int i = 0; i < t.length; i++ ) {
+                    t[i].join();
+                }
+            }
+            if ( !errors.isEmpty() ) {
+                fail( " Errors occured during execution " );
+            }
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail( "Should not raise exception" );
+        }
+    }
+
+    class Runner
+        implements
+        Runnable {
+        private final long             TIME_SPAN;
+        private final StatelessSession session;
+        private final AtomicInteger    count;
+
+        public Runner(long BASE_TIME,
+                      StatelessSession session,
+                      final AtomicInteger count) {
+            this.TIME_SPAN = BASE_TIME;
+            this.session = session;
+            this.count = count;
+        }
+
+        public void run() {
+            //System.out.println( Thread.currentThread().getName() + " starting..." );
+            try {
+                count.incrementAndGet();
+                long time = System.currentTimeMillis();
+                while ( (System.currentTimeMillis() - time) < TIME_SPAN ) {
+                    //System.out.println( Thread.currentThread().getName() + ": added package at " + (System.currentTimeMillis() - time) );
+                    for ( int j = 0; j < 100; j++ ) {
+                        session.execute( getFacts() );
+                    }
+                    //System.out.println( Thread.currentThread().getName() + ": executed rules at " + (System.currentTimeMillis() - time) );
+                }
+            } catch ( Exception ex ) {
+                ex.printStackTrace();
+            }
+            if ( count.decrementAndGet() == 0 ) {
+                synchronized ( MultithreadTest.this ) {
+                    MultithreadTest.this.notifyAll();
+                }
+            }
+            //System.out.println( Thread.currentThread().getName() + " exiting..." );
+        }
+
+        private Cheese[] getFacts() {
+            final int SIZE = 100;
+            Cheese[] facts = new Cheese[SIZE];
+
+            for ( int i = 0; i < facts.length; i++ ) {
+                facts[i] = new Cheese();
+                facts[i].setPrice( i );
+                facts[i].setOldPrice( i );
+            }
+            return facts;
+        }
+    }
+
+    public void testSharedPackagesThreadDeadLock() throws Exception {
+        final int THREADS = Integer.parseInt( System.getProperty( "test.threads",
+                                                                  "10" ) );
+        final long BASE_TIME = Integer.parseInt( System.getProperty( "test.time",
+                                                                     "15" ) ) * 1000;
+
+        final AtomicInteger count = new AtomicInteger( 0 );
+
+        final Package[] pkgs = buildPackages();
+        for ( int i = 0; i < THREADS; i++ ) {
+            RuleBase ruleBase = createRuleBase( pkgs );
+            StatelessSession session = createSession( ruleBase );
+            new Thread( new Runner( BASE_TIME,
+                                    session,
+                                    count ) ).start();
+        }
+        synchronized ( this ) {
+            wait();
+        }
+    }
+
+    private RuleBase createRuleBase(Package[] pkgs) {
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        for ( Package pkg : pkgs ) {
+            ruleBase.addPackage( pkg );
+        }
+        return ruleBase;
+    }
+
+    private StatelessSession createSession(RuleBase ruleBase) {
+        StatelessSession session = ruleBase.newStatelessSession();
+        return session;
+    }
+
+    private Package[] buildPackages() throws Exception {
+        final String KEY = "REPLACE";
+        final int SIZE = 100;
+        final Package[] pkgs = new Package[SIZE];
+        final String DRL = "package org.drools\n" + 
+                           "    no-loop true\n" + 
+                           "    dialect \"java\"\n" + 
+                           "rule \"" + KEY + 
+                           "\"\n" + 
+                           "salience 1\n" + 
+                           "when\n" + 
+                           "    $fact:Cheese(price == " + KEY + ", oldPrice not in (11,5))\n" + // thread-lock
+                           "then\n" + 
+                           "    //$fact.excludeProduct(" + KEY + ", 1, null, null);\n" + 
+                           "end\n";
         
+        System.out.print( "Building " + pkgs.length + " packages" );
+        for ( int i = 0; i < pkgs.length; i++ ) {
+            pkgs[i] = getPackage( DRL.replaceAll( KEY,
+                                                  Integer.toString( i ) ) );
+            System.out.print( "." );
+        }
+        System.out.println();
+        return pkgs;
     }
+
+    private static Package getPackage(String drl) throws Exception {
+        PackageBuilder pkgBuilder = new PackageBuilder();
+        pkgBuilder.addPackageFromDrl( new StringReader( drl ) );
+        if ( pkgBuilder.hasErrors() ) {
+            StringBuilder sb = new StringBuilder();
+            for ( Object obj : pkgBuilder.getErrors() ) {
+                if ( sb.length() > 0 ) {
+                    sb.append( '\n' );
+                }
+                sb.append( obj );
+            }
+            throw new DroolsParserException( sb.toString() );
+        }
+        return pkgBuilder.getPackage();
+    }
     
-    // FIXME
+    public void testEventExpiration() {
+        String rule = 
+            "package org.drools\n" +
+            "declare StockTick @role(event) @expires(0s) end\n" +
+            "rule test no-loop true\n" + 
+            "when\n" +
+            "   $f : StockTick() from entry-point EntryPoint\n" +
+            "then\n" +
+            "   //System.out.println($f);\n" +
+            "end";
 
-//    /**
-//     * @inheritDoc
-//     *
-//     * @see junit.framework.TestCase#setUp()
-//     */
-//    protected void setUp() throws Exception {
-//        super.setUp();
-//    }
-//
-//    /**
-//     * @inheritDoc
-//     *
-//     * @see junit.framework.TestCase#tearDown()
-//     */
-//    protected void tearDown() throws Exception {
-//        super.tearDown();
-//    }
-//    
-//    public void testRuleBaseConcurrentCompilation() {
-//        final int THREAD_COUNT = 30;
-//        try {
-//            boolean success = true;
-//            final PackageBuilder builder = new PackageBuilder();
-//            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadRulebaseSharing.drl" ) ) );
-//            RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-//            ruleBase.addPackage( builder.getPackage() );
-//            ruleBase = SerializationHelper.serializeObject( ruleBase );
-//            final Thread[] t = new Thread[THREAD_COUNT];
-//            final RulebaseRunner[] r = new RulebaseRunner[THREAD_COUNT];
-//            for ( int i = 0; i < t.length; i++ ) {
-//                r[i] = new RulebaseRunner( i,
-//                                           ruleBase );
-//                t[i] = new Thread( r[i],
-//                                   "thread-" + i );
-//                t[i].start();
-//            }
-//            for ( int i = 0; i < t.length; i++ ) {
-//                t[i].join();
-//                if ( r[i].getStatus() == RulebaseRunner.Status.FAIL ) {
-//                    success = false;
-//                }
-//            }
-//            if ( !success ) {
-//                fail( "Multithread test failed. Look at the stack traces for details. " );
-//            }
-//        } catch ( Exception e ) {
-//            e.printStackTrace();
-//            fail( "Should not raise any exception: " + e.getMessage() );
-//        }
-//    }
-//
-//    public static class RulebaseRunner
-//        implements
-//        Runnable {
-//
-//        private static final int ITERATIONS = 300;
-//        private final int        id;
-//        private final RuleBase   rulebase;
-//        private Status           status;
-//
-//        public RulebaseRunner(final int id,
-//                              final RuleBase rulebase) {
-//            this.id = id;
-//            this.rulebase = rulebase;
-//            this.status = Status.SUCCESS;
-//        }
-//
-//        public void run() {
-//            try {
-//                StatefulSession session2 = this.rulebase.newStatefulSession();
-//
-//                for ( int k = 0; k < ITERATIONS; k++ ) {
-//                    GrandParent gp = new GrandParent( "bob" );
-//                    Parent parent = new Parent( "mark" );
-//                    parent.setGrandParent( gp );
-//
-//                    Child child = new Child( "mike" );
-//                    child.setParent( parent );
-//
-//                    session2.insert( gp );
-//                    session2.insert( parent );
-//                    session2.insert( child );
-//                }
-//
-//                session2.fireAllRules();
-//                session2.dispose();
-//
-//            } catch ( Exception e ) {
-//                this.status = Status.FAIL;
-//                System.out.println( Thread.currentThread().getName() + " failed: " + e.getMessage() );
-//                e.printStackTrace();
-//            }
-//        }
-//
-//        public static enum Status {
-//            SUCCESS, FAIL
-//        }
-//
-//        /**
-//         * @return the id
-//         */
-//        public int getId() {
-//            return id;
-//        }
-//
-//        /**
-//         * @return the status
-//         */
-//        public Status getStatus() {
-//            return status;
-//        }
-//
-//    }
-//
-//    public void testExpectedFires() {
-//        try {
-//            final PackageBuilder packageBuilder = new PackageBuilder();
-//            packageBuilder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadFiringCheck.drl" ) ) );
-//            final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-//            ruleBase.addPackage( packageBuilder.getPackage() );
-//            final Queue errorList = new ConcurrentLinkedQueue();
-//            final Thread t[] = new Thread[50];
-//            for ( int i = 0; i < t.length; i++ ) {
-//                final int count = i;
-//                t[i] = new Thread( new Runnable() {
-//                    public void run() {
-//                        try {
-//                            final int iterations = count * 15 + 3000;
-//                            final List results = new ArrayList();
-//                            final StatefulSession session2 = ruleBase.newStatefulSession();
-//                            session2.setGlobal( "results",
-//                                                results );
-//                            session2.insert( new Integer( -1 ) );
-//                            for ( int k = 0; k < iterations; k++ ) {
-//                                session2.insert( new Integer( k ) );
-//                                if ( k + 1 != session2.getAgenda().agendaSize() ) {
-//                                    errorList.add( "THREAD-" + count + " ERROR: expected agenda size=" + (k + 1) + " but was " + session2.getAgenda().agendaSize() );
-//                                }
-//                            }
-//                            session2.fireAllRules();
-//                            session2.dispose();
-//                            if ( results.size() != iterations ) {
-//                                errorList.add( "THREAD-" + count + " ERROR: expected fire count=" + iterations + " but was " + results.size() );
-//                            }
-//                        } catch ( Exception e ) {
-//                            errorList.add( "THREAD-" + count + " EXCEPTION: " + e.getMessage() );
-//                            e.printStackTrace();
-//                        }
-//                    }
-//                } );
-//                t[i].start();
-//            }
-//            for ( int i = 0; i < t.length; i++ ) {
-//                t[i].join();
-//            }
-//            assertTrue( "Errors during execution: " + errorList.toString(),
-//                        errorList.isEmpty() );
-//        } catch ( Exception e ) {
-//            e.printStackTrace();
-//            fail( "No exception should have been raised: " + e.getMessage() );
-//        }
-//    }
-//
-//    public void testMultithreadDateStringConstraints() {
-//        try {
-//            final int THREAD_COUNT = 10;
-//            final PackageBuilder packageBuilder = new PackageBuilder();
-//            packageBuilder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadDateStringConstraints.drl" ) ) );
-//            final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-//            ruleBase.addPackage( packageBuilder.getPackage() );
-//            final Vector errors = new Vector();
-//
-//            final Thread t[] = new Thread[THREAD_COUNT];
-//            for ( int j = 0; j < 10; j++ ) {
-//                for ( int i = 0; i < t.length; i++ ) {
-//                    t[i] = new Thread() {
-//                        public void run() {
-//                            try {
-//                                final int ITERATIONS = 300;
-//                                StatefulSession session = ruleBase.newStatefulSession();
-//                                List results = new ArrayList();
-//                                session.setGlobal( "results",
-//                                                   results );
-//                                for ( int k = 0; k < ITERATIONS; k++ ) {
-//                                    session.insert( new Order() );
-//                                }
-//                                session.fireAllRules();
-//                                session.dispose();
-//                                if ( results.size() != ITERATIONS ) {
-//                                    errors.add( "Rules did not fired correctly. Expected: " + ITERATIONS + ". Actual: " + results.size() );
-//                                }
-//                            } catch ( Exception ex ) {
-//                                ex.printStackTrace();
-//                                errors.add( ex );
-//                            }
-//                        }
-//
-//                    };
-//                    t[i].start();
-//                }
-//                for ( int i = 0; i < t.length; i++ ) {
-//                    t[i].join();
-//                }
-//            }
-//            if ( !errors.isEmpty() ) {
-//                fail( " Errors occured during execution " );
-//            }
-//        } catch ( Exception e ) {
-//            e.printStackTrace();
-//            fail( "Should not raise exception" );
-//        }
-//    }
-//
-//    class Runner
-//        implements
-//        Runnable {
-//        private final long             TIME_SPAN;
-//        private final StatelessSession session;
-//        private final AtomicInteger    count;
-//
-//        public Runner(long BASE_TIME,
-//                      StatelessSession session,
-//                      final AtomicInteger count) {
-//            this.TIME_SPAN = BASE_TIME;
-//            this.session = session;
-//            this.count = count;
-//        }
-//
-//        public void run() {
-//            //System.out.println( Thread.currentThread().getName() + " starting..." );
-//            try {
-//                count.incrementAndGet();
-//                long time = System.currentTimeMillis();
-//                while ( (System.currentTimeMillis() - time) < TIME_SPAN ) {
-//                    //System.out.println( Thread.currentThread().getName() + ": added package at " + (System.currentTimeMillis() - time) );
-//                    for ( int j = 0; j < 100; j++ ) {
-//                        session.execute( getFacts() );
-//                    }
-//                    //System.out.println( Thread.currentThread().getName() + ": executed rules at " + (System.currentTimeMillis() - time) );
-//                }
-//            } catch ( Exception ex ) {
-//                ex.printStackTrace();
-//            }
-//            if ( count.decrementAndGet() == 0 ) {
-//                synchronized ( MultithreadTest.this ) {
-//                    MultithreadTest.this.notifyAll();
-//                }
-//            }
-//            //System.out.println( Thread.currentThread().getName() + " exiting..." );
-//        }
-//
-//        private Cheese[] getFacts() {
-//            final int SIZE = 100;
-//            Cheese[] facts = new Cheese[SIZE];
-//
-//            for ( int i = 0; i < facts.length; i++ ) {
-//                facts[i] = new Cheese();
-//                facts[i].setPrice( i );
-//                facts[i].setOldPrice( i );
-//            }
-//            return facts;
-//        }
-//    }
-//
-//    public void testSharedPackagesThreadDeadLock() throws Exception {
-//        final int THREADS = Integer.parseInt( System.getProperty( "test.threads",
-//                                                                  "10" ) );
-//        final long BASE_TIME = Integer.parseInt( System.getProperty( "test.time",
-//                                                                     "15" ) ) * 1000;
-//
-//        final AtomicInteger count = new AtomicInteger( 0 );
-//
-//        final Package[] pkgs = buildPackages();
-//        for ( int i = 0; i < THREADS; i++ ) {
-//            RuleBase ruleBase = createRuleBase( pkgs );
-//            StatelessSession session = createSession( ruleBase );
-//            new Thread( new Runner( BASE_TIME,
-//                                    session,
-//                                    count ) ).start();
-//        }
-//        synchronized ( this ) {
-//            wait();
-//        }
-//    }
-//
-//    private RuleBase createRuleBase(Package[] pkgs) {
-//        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-//        for ( Package pkg : pkgs ) {
-//            ruleBase.addPackage( pkg );
-//        }
-//        return ruleBase;
-//    }
-//
-//    private StatelessSession createSession(RuleBase ruleBase) {
-//        StatelessSession session = ruleBase.newStatelessSession();
-//        return session;
-//    }
-//
-//    private Package[] buildPackages() throws Exception {
-//        final String KEY = "REPLACE";
-//        final int SIZE = 100;
-//        final Package[] pkgs = new Package[SIZE];
-//        final String DRL = "package org.drools\n" + "    no-loop true\n" + "    dialect \"java\"\n" + "rule \"" + KEY + "\"\n" + "salience 1\n" + "when\n" + "    $fact:Cheese(price == " + KEY + ", oldPrice not in (11,5))\n" + // thread-lock
-//                           "then\n" + "    //$fact.excludeProduct(" + KEY + ", 1, null, null);\n" + "end\n";
-//        System.out.print( "Building " + pkgs.length + " packages" );
-//        for ( int i = 0; i < pkgs.length; i++ ) {
-//            pkgs[i] = getPackage( DRL.replaceAll( KEY,
-//                                                  Integer.toString( i ) ) );
-//            System.out.print( "." );
-//        }
-//        System.out.println();
-//        return pkgs;
-//    }
-//
-//    private static Package getPackage(String drl) throws Exception {
-//        PackageBuilder pkgBuilder = new PackageBuilder();
-//        pkgBuilder.addPackageFromDrl( new StringReader( drl ) );
-//        if ( pkgBuilder.hasErrors() ) {
-//            StringBuilder sb = new StringBuilder();
-//            for ( Object obj : pkgBuilder.getErrors() ) {
-//                if ( sb.length() > 0 ) {
-//                    sb.append( '\n' );
-//                }
-//                sb.append( obj );
-//            }
-//            throw new DroolsParserException( sb.toString() );
-//        }
-//        return pkgBuilder.getPackage();
-//    }
-//    
-//    public void testEventExpiration() {
-//        String rule = 
-//            "package org.drools\n" +
-//            "declare StockTick @role(event) @expires(0s) end\n" +
-//            "rule test no-loop true\n" + 
-//            "when\n" +
-//            "   $f : StockTick() from entry-point EntryPoint\n" +
-//            "then\n" +
-//            "   //System.out.println($f);\n" +
-//            "end";
-//
-//        final StatefulKnowledgeSession session;
-//        final WorkingMemoryEntryPoint entryPoint;
-//
-//        KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory
-//            .newKnowledgeBaseConfiguration();
-//        kbaseConf.setOption(EventProcessingOption.STREAM);
-//            
-//        KnowledgeBuilder builder = KnowledgeBuilderFactory
-//            .newKnowledgeBuilder();
-//            
-//        builder.add(ResourceFactory.newReaderResource(new StringReader(rule)),
-//            ResourceType.DRL);
-//
-//        if (builder.hasErrors()) {
-//            throw new RuntimeException(builder.getErrors().toString());
-//        }
-//            
-//        final KnowledgeBase knowledgeBase = KnowledgeBaseFactory
-//            .newKnowledgeBase(kbaseConf);
-//
-//        knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
-//            
-//        session = knowledgeBase.newStatefulKnowledgeSession();
-//        WorkingMemoryEventListener wmel = Mockito.mock( WorkingMemoryEventListener.class );
-//        session.addEventListener( wmel );
-//            
-//        entryPoint = session
-//            .getWorkingMemoryEntryPoint("EntryPoint");
-//            
-//        new Thread(new Runnable() {
-//            public void run() {
-//                session.fireUntilHalt();
-//            }
-//        }).start();
-//            
-//        for (int x = 0; x < 10000; x++) {
-//            entryPoint.insert(new StockTick(x, "RHT", 10, 10+x));
-//            Thread.yield();
-//        }
-//        
-//        session.halt();
-//        session.fireAllRules();
-//        
-//        // facts are being expired
-//        verify( wmel, atLeastOnce() ).objectRetracted( any( ObjectRetractedEvent.class ) );
-//    }
+        final StatefulKnowledgeSession session;
+        final WorkingMemoryEntryPoint entryPoint;
 
+        KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+        kbaseConf.setOption(EventProcessingOption.STREAM);
+            
+        KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+            
+        builder.add(ResourceFactory.newReaderResource(new StringReader(rule)),
+                    ResourceType.DRL);
 
+        if (builder.hasErrors()) {
+            throw new RuntimeException(builder.getErrors().toString());
+        }
+            
+        final KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConf);
+
+        knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
+            
+        session = knowledgeBase.newStatefulKnowledgeSession();
+        WorkingMemoryEventListener wmel = Mockito.mock( WorkingMemoryEventListener.class );
+        session.addEventListener( wmel );
+            
+        entryPoint = session.getWorkingMemoryEntryPoint("EntryPoint");
+            
+        new Thread(new Runnable() {
+            public void run() {
+                session.fireUntilHalt();
+            }
+        }).start();
+            
+        for (int x = 0; x < 10000; x++) {
+            entryPoint.insert(new StockTick(x, "RHT", 10, 10+x));
+            Thread.yield();
+        }
+        
+        session.halt();
+        session.fireAllRules();
+        
+        // facts are being expired
+        verify( wmel, atLeastOnce() ).objectRetracted( any( ObjectRetractedEvent.class ) );
+    }
+
+
 }

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -124,7 +124,7 @@
         return null;
     }
 
-    public int getId() {
+    public long getId() {
         // TODO Auto-generated method stub
         return 0;
     }
@@ -215,7 +215,7 @@
         
     }
 
-    public void setId(int id) {
+    public void setId(long id) {
         // TODO Auto-generated method stub
         
     }

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/KnowledgeStoreBeanFactory.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/KnowledgeStoreBeanFactory.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/KnowledgeStoreBeanFactory.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -17,7 +17,7 @@
 package org.drools.container.spring.beans;
 
 import org.drools.persistence.jpa.KnowledgeStoreService;
-import org.drools.persistence.jpa.impl.KnowledgeStoreServiceImpl;
+import org.drools.persistence.jpa.KnowledgeStoreServiceImpl;
 import org.springframework.beans.factory.FactoryBean;
 import org.springframework.beans.factory.InitializingBean;
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -19,7 +19,9 @@
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 
-import org.drools.persistence.session.JpaManager;
+import org.drools.persistence.PersistenceContext;
+import org.drools.persistence.PersistenceContextManager;
+import org.drools.persistence.jpa.JpaPersistenceContext;
 import org.drools.runtime.Environment;
 import org.drools.runtime.EnvironmentName;
 import org.slf4j.Logger;
@@ -34,7 +36,7 @@
  */
 public class DroolsSpringJpaManager
     implements
-    JpaManager {
+    PersistenceContextManager {
 
     Logger                       logger = LoggerFactory.getLogger( getClass() );
 
@@ -50,11 +52,11 @@
         this.env = env;
         this.emf = (EntityManagerFactory) env.get( EnvironmentName.ENTITY_MANAGER_FACTORY );
 
-        getApplicationScopedEntityManager(); // we create this on initialisation so that we own the EMF reference
+        getApplicationScopedPersistenceContext(); // we create this on initialisation so that we own the EMF reference
                                              // otherwise Spring will close it after the transaction finishes
     }
 
-    public EntityManager getApplicationScopedEntityManager() {
+    public PersistenceContext getApplicationScopedPersistenceContext() {
         if ( this.appScopedEntityManager == null ) {
             // Use the App scoped EntityManager if the user has provided it, and it is open.
             this.appScopedEntityManager = (EntityManager) this.env.get( EnvironmentName.APP_SCOPED_ENTITY_MANAGER );
@@ -81,15 +83,15 @@
         if ( TransactionSynchronizationManager.isActualTransactionActive() ) {
             this.appScopedEntityManager.joinTransaction();
         }
-        return this.appScopedEntityManager;
+        return new JpaPersistenceContext( this.appScopedEntityManager );
     }
 
-    public EntityManager getCommandScopedEntityManager() {
-        return (EntityManager) this.env.get( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER );
+    public PersistenceContext getCommandScopedPersistenceContext() {
+        return  new JpaPersistenceContext( (EntityManager) this.env.get( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER ) );
     }
 
     public void beginCommandScopedEntityManager() {
-        if ( this.getCommandScopedEntityManager() == null || !this.getCommandScopedEntityManager().isOpen() ) {
+        if ( this.getCommandScopedPersistenceContext() == null || !this.getCommandScopedPersistenceContext().isOpen() ) {
             EntityManagerHolder emHolder = (EntityManagerHolder) TransactionSynchronizationManager.getResource( "cmdEM" );
             EntityManager em = null;
             if ( emHolder == null ) {
@@ -104,7 +106,7 @@
                           em );
         }
 
-        this.getCommandScopedEntityManager().joinTransaction();
+        this.getCommandScopedPersistenceContext().joinTransaction();
         this.appScopedEntityManager.joinTransaction();
 
     }
@@ -112,8 +114,8 @@
     public void endCommandScopedEntityManager() {
         if ( TransactionSynchronizationManager.hasResource( "cmdEM" ) ) {
             TransactionSynchronizationManager.unbindResource( "cmdEM" );
-            if ( getCommandScopedEntityManager() != null ) {
-                getCommandScopedEntityManager().close();
+            if ( getCommandScopedPersistenceContext() != null ) {
+                getCommandScopedPersistenceContext().close();
             }
 
         }

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -16,8 +16,8 @@
 
 package org.drools.container.spring.beans.persistence;
 
-import org.drools.persistence.session.TransactionManager;
-import org.drools.persistence.session.TransactionSynchronization;
+import org.drools.persistence.TransactionManager;
+import org.drools.persistence.TransactionSynchronization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.TransactionDefinition;

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringTransactionSynchronizationAdapter.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringTransactionSynchronizationAdapter.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringTransactionSynchronizationAdapter.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -16,15 +16,15 @@
 
 package org.drools.container.spring.beans.persistence;
 
-import org.drools.persistence.session.TransactionManager;
+import org.drools.persistence.TransactionManager;
 import org.springframework.transaction.support.TransactionSynchronization;
 
 public class SpringTransactionSynchronizationAdapter
     implements
     TransactionSynchronization {
-    private org.drools.persistence.session.TransactionSynchronization ts;
+    private org.drools.persistence.TransactionSynchronization ts;
 
-    public SpringTransactionSynchronizationAdapter(org.drools.persistence.session.TransactionSynchronization ts) {
+    public SpringTransactionSynchronizationAdapter(org.drools.persistence.TransactionSynchronization ts) {
         this.ts = ts;
     }
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/JPASingleSessionCommandServiceFactoryTest.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/JPASingleSessionCommandServiceFactoryTest.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/JPASingleSessionCommandServiceFactoryTest.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -155,7 +155,7 @@
 
         log.info( "---> create new SingleSessionCommandService" );
 
-        int sessionId = service.getId();
+        long sessionId = service.getId();
         log.info( "---> created SingleSessionCommandService id: " + sessionId );
 
         ProcessInstance processInstance = service.startProcess( "org.drools.test.TestProcess" );
@@ -244,7 +244,7 @@
 
         StatefulKnowledgeSession service = (StatefulKnowledgeSession) ctx.getBean( "jpaSingleSessionCommandService" );
 
-        int sessionId = service.getId();
+        long sessionId = service.getId();
         ProcessInstance processInstance = service.startProcess( "org.drools.test.TestProcess" );
         log.info( "Started process instance {}",
                   processInstance.getId() );
@@ -424,7 +424,7 @@
 
         StatefulKnowledgeSession service = (StatefulKnowledgeSession) ctx.getBean( "jpaSingleSessionCommandService" );
 
-        int sessionId = service.getId();
+        long sessionId = service.getId();
 
         RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.startProcess( "org.drools.test.ProcessSubProcess" );
         log.info( "Started process instance {}",
@@ -576,7 +576,7 @@
         log.info( "---> get bean jpaSingleSessionCommandService" );
         StatefulKnowledgeSession service = (StatefulKnowledgeSession) ctx.getBean( "jpaSingleSessionCommandService" );
 
-        int sessionId = service.getId();
+        long sessionId = service.getId();
         log.info( "---> created SingleSessionCommandService id: " + sessionId );
 
         ProcessInstance processInstance = service.startProcess( "org.drools.test.ProcessTimer" );
@@ -672,7 +672,7 @@
     public void testPersistenceTimer2() throws Exception {
         StatefulKnowledgeSession service = (StatefulKnowledgeSession) ctx.getBean( "jpaSingleSessionCommandService" );
 
-        int sessionId = service.getId();
+        long sessionId = service.getId();
 
         ProcessInstance processInstance = service.startProcess( "org.drools.test.ProcessTimer2" );
         log.info( "Started process instance {}",

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/VariablePersistenceStrategyTest.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/VariablePersistenceStrategyTest.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/VariablePersistenceStrategyTest.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -151,7 +151,7 @@
             }
         } );
 
-        final int sessionId = ksession.getId();
+        final long sessionId = ksession.getId();
 
         txTemplate = new TransactionTemplate( txManager );
         txTemplate.execute( new TransactionCallback() {
@@ -263,7 +263,7 @@
         log.info( "---> get bean jpaSingleSessionCommandService" );
         StatefulKnowledgeSession service = (StatefulKnowledgeSession) ctx.getBean( "jpaSingleSessionCommandService" );
 
-        int sessionId = service.getId();
+        long sessionId = service.getId();
         log.info( "---> created SingleSessionCommandService id: " + sessionId );
 
         log.info( "### Starting process ###" );

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -16,7 +16,7 @@
 public class MyDroolsBean {
 
     public static int             TIMER_TRIGGER_COUNT;
-    private static int            sessionId;
+    private static long           sessionId;
     private EntityManagerFactory  emf;
     private KnowledgeBase         kbase;
     private KnowledgeStoreService kstore;

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/SingleSessionCommandService.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/SingleSessionCommandService.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/SingleSessionCommandService.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -19,6 +19,6 @@
 import org.drools.runtime.CommandExecutor;
 
 public interface SingleSessionCommandService extends CommandService {
-	int getSessionId();
+	long getSessionId();
 	void dispose();
 }

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -108,7 +108,7 @@
         this.commandService = commandService;
     }
 
-    public int getId() {
+    public long getId() {
         return commandService.execute( new GetIdCommand() );
     }
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/runtime/GetIdCommand.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/runtime/GetIdCommand.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/command/runtime/GetIdCommand.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -28,7 +28,7 @@
 @XmlAccessorType(XmlAccessType.NONE)
 public class GetIdCommand
     implements
-    GenericCommand<Integer> {
+    GenericCommand<Long> {
 
 	private static final long serialVersionUID = 510l;
 
@@ -36,7 +36,7 @@
     public GetIdCommand() {
 	}
 
-    public Integer execute(Context context) {
+    public Long execute(Context context) {
         StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
         return ((StatefulKnowledgeSessionImpl)ksession).getId();
     }

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -118,7 +118,7 @@
     EventSupport,
     ProcessEventManager {
 
-    protected int                                                id;
+    protected long                                               id;
 
     /** The actual memory for the <code>JoinNode</code>s. */
     protected NodeMemories                                       nodeMemories;
@@ -649,11 +649,11 @@
         return this.dateFormats;
     }
 
-    public int getId() {
+    public long getId() {
         return this.id;
     }
 
-    public void setId(int id) {
+    public void setId(long id) {
         this.id = id;
     }
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalKnowledgeRuntime.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalKnowledgeRuntime.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalKnowledgeRuntime.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -22,7 +22,7 @@
 	
 	InternalProcessRuntime getProcessRuntime();
 	
-	void setId(int id);
+	void setId(long id);
 	
 	void setEndOperationListener(EndOperationListener listener);
 	

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -47,9 +47,9 @@
 public interface InternalWorkingMemory
     extends
     WorkingMemory {
-    public int getId();
+    public long getId();
     
-    public void setId(int id);
+    public void setId(long id);
 
     public void setWorkingMemoryEventSupport(WorkingMemoryEventSupport workingMemoryEventSupport);
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -37,12 +37,12 @@
                         Activation activation) throws FactException;
 
     org.drools.FactHandle insert(Object object,
-                      boolean dynamic,
-                      boolean logical,
-                      Rule rule,
-                      Activation activation) throws FactException;
+                                 boolean dynamic,
+                                 boolean logical,
+                                 Rule rule,
+                                 Activation activation) throws FactException;
 
     public org.drools.FactHandle insertLogical(Object object,
-                                    boolean dynamic) throws FactException;
+                                               boolean dynamic) throws FactException;
 
 }

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/core/util/FileManager.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/core/util/FileManager.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/core/util/FileManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -39,7 +39,7 @@
     }
 
     public void tearDown() {
-        deleteDir( root );
+        deleteFile( root );
     }
 
     public File newFile(String name) {
@@ -80,7 +80,7 @@
             if ( f.isFile() ) {
                 throw new IllegalStateException( "The temp directory exists as a file. Nuke it now !" );
             }
-            deleteDir( f );
+            deleteFile( f );
             f.mkdir();
         } else {
             f.mkdir();
@@ -89,26 +89,18 @@
         return this.root;
     }
 
-    public void deleteDir(File dir) {
-        // Will throw RuntimeException is anything fails to delete
-        String[] children = dir.list();
-        for ( String child : children ) {
-            File file = new File( dir,
-                                  child );
-            if ( file.isFile() ) {
-                deleteFile( file );
-            } else {
-                deleteDir( file );
+    public void deleteFile(File file) {   
+
+        if ( file.isDirectory() && file.list().length > 0 ) {
+            // Is is directory with children, so delete it's children first
+            // Will throw RuntimeException is anything fails to delete
+            String[] children = file.list();
+            for ( String child : children ) {
+                deleteFile( new File( file,
+                                      child ) );
             }
         }
         
-        deleteFile( dir );
-    }
-
-    public void deleteFile(File file) {
-        // This will attempt to delete a file 5 times, calling GC and Sleep between each iteration
-        // Sometimes windows takes a while to release a lock on a file.
-        // Throws an exception if it fails to delete
         if ( !file.delete() ) {
             int count = 0;
             while ( !file.delete() && count++ < 5 ) {
@@ -128,9 +120,34 @@
                 throw new RuntimeException( "Unable to delete file", e);
             }
         }
-
     }
 
+//    public void deleteFile(File file) {
+//        // This will attempt to delete a file 5 times, calling GC and Sleep between each iteration
+//        // Sometimes windows takes a while to release a lock on a file.
+//        // Throws an exception if it fails to delete
+//        if ( !file.delete() ) {
+//            int count = 0;
+//            while ( !file.delete() && count++ < 5 ) {
+//                System.gc();
+//                try {
+//                    Thread.sleep( 250 );
+//                } catch ( InterruptedException e ) {
+//                    throw new RuntimeException( "This should never happen" );
+//                }
+//            }
+//        }
+//        
+//        if ( file.exists() ) {
+//            try {
+//                throw new RuntimeException( "Unable to delete file:" + file.getCanonicalPath() );
+//            } catch ( IOException e ) {
+//                throw new RuntimeException( "Unable to delete file", e);
+//            }
+//        }
+//
+//    }
+
     public void write(File f,
                       String text) throws IOException {
         if ( f.exists() ) {

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -129,7 +129,7 @@
         return this.session.getEntryPointNode();
     }    
 
-    public int getId() {
+    public long getId() {
         return this.session.getId();
     }
 
@@ -844,7 +844,7 @@
 		this.session.queueWorkingMemoryAction(action);
 	}
 
-	public void setId(int id) {
+	public void setId(long id) {
 		this.session.setId(id);
 	}
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -116,7 +116,7 @@
     /* (non-Javadoc)
      * @see org.drools.management.KnowledgeSessionMonitoringMBean#getKnowledgeSessionId()
      */
-    public int getKnowledgeSessionId() {
+    public long getKnowledgeSessionId() {
         return ksession.getId();
     }
 

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.classpath
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.classpath	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.classpath	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,66 +1,53 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry including="**/*.java" kind="src" path="src/main/java"/>
-	<classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
-	<classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.core.commands/3.6.0.I20100512-1500/org.eclipse.core.commands-3.6.0.I20100512-1500.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.core.contenttype/3.4.100.v20100505-1235/org.eclipse.core.contenttype-3.4.100.v20100505-1235.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.core.filebuffers/3.5.100.v20100520-0800/org.eclipse.core.filebuffers-3.5.100.v20100520-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.core.jobs/3.5.1.R36x_v20100824/org.eclipse.core.jobs-3.5.1.R36x_v20100824.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.core.resources/3.6.0.v20100526-0737/org.eclipse.core.resources-3.6.0.v20100526-0737.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.core.runtime/3.6.0.v20100505/org.eclipse.core.runtime-3.6.0.v20100505.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.debug.core/3.6.0.v20100519/org.eclipse.debug.core-3.6.0.v20100519.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.debug.ui/3.6.1.v20100901_r361/org.eclipse.debug.ui-3.6.1.v20100901_r361.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.draw2d/3.6.1.v20100913-2020/org.eclipse.draw2d-3.6.1.v20100913-2020.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.app/1.3.1.R36x_v20100803/org.eclipse.equinox.app-1.3.1.R36x_v20100803.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.common/3.6.0.v20100503/org.eclipse.equinox.common-3.6.0.v20100503.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.preferences/3.3.0.v20100503/org.eclipse.equinox.preferences-3.3.0.v20100503.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.registry/3.5.0.v20100503/org.eclipse.equinox.registry-3.5.0.v20100503.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.gef/3.6.1.v20100712-1224/org.eclipse.gef-3.6.1.v20100712-1224.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.core/3.6.1.v_A68_R36x/org.eclipse.jdt.core-3.6.1.v_A68_R36x.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.debug/3.6.1.v20100715_r361/org.eclipse.jdt.debug-3.6.1.v20100715_r361.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.debug.ui/3.5.0.v20100602-0830/org.eclipse.jdt.debug.ui-3.5.0.v20100602-0830.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.junit/3.6.1.r361_v20100825-0800/org.eclipse.jdt.junit-3.6.1.r361_v20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.junit.core/3.6.1.r361_v20100825-0800/org.eclipse.jdt.junit.core-3.6.1.r361_v20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.launching/3.5.100.v20100526/org.eclipse.jdt.launching-3.5.100.v20100526.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.ui/3.6.1.r361_v20100825-0800/org.eclipse.jdt.ui-3.6.1.r361_v20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jface/3.6.1.M20100825-0800/org.eclipse.jface-3.6.1.M20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.jface.text/3.6.1.r361_v20100825-0800/org.eclipse.jface.text-3.6.1.r361_v20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ltk.core.refactoring/3.5.100.v20100526-0800/org.eclipse.ltk.core.refactoring-3.5.100.v20100526-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ltk.ui.refactoring/3.5.0.v20100526-0800/org.eclipse.ltk.ui.refactoring-3.5.0.v20100526-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.osgi/3.6.1.R36x_v20100806/org.eclipse.osgi-3.6.1.R36x_v20100806.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.swt/3.6.1.v3655c/org.eclipse.swt-3.6.1.v3655c.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.swt.gtk.linux.x86/3.6.1.v3655c/org.eclipse.swt.gtk.linux.x86-3.6.1.v3655c.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.text/3.5.0.v20100601-1300/org.eclipse.text-3.5.0.v20100601-1300.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui/3.6.1.M20100826-1330/org.eclipse.ui-3.6.1.M20100826-1330.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.console/3.5.0.v20100526/org.eclipse.ui.console-3.5.0.v20100526.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.editors/3.6.1.r361_v20100825-0800/org.eclipse.ui.editors-3.6.1.r361_v20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.forms/3.5.2.r36_v20100702/org.eclipse.ui.forms-3.5.2.r36_v20100702.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.ide/3.6.1.M20100825-0800/org.eclipse.ui.ide-3.6.1.M20100825-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.views/3.5.0.I20100527-0800/org.eclipse.ui.views-3.5.0.I20100527-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.views.properties.tabbed/3.5.100.I20100509-0800/org.eclipse.ui.views.properties.tabbed-3.5.100.I20100509-0800.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.workbench/3.6.1.M20100826-1330/org.eclipse.ui.workbench-3.6.1.M20100826-1330.jar"/>
-	<classpathentry kind="lib" path="/NotBackedUp/.m2/repository/p2/osgi/bundle/org.eclipse.ui.workbench.texteditor/3.6.1.r361_v20100714-0800/org.eclipse.ui.workbench.texteditor-3.6.1.r361_v20100714-0800.jar"/>
-	<classpathentry kind="lib" path="xpp3_min-1.1.4c.jar"/>
-	<classpathentry kind="lib" path="xstream-1.3.1.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="lib" path="lib/antlr-runtime.jar"/>
-	<classpathentry kind="lib" path="lib/drools-api.jar"/>
-	<classpathentry kind="lib" path="lib/drools-compiler.jar"/>
-	<classpathentry kind="lib" path="lib/drools-core.jar"/>
-	<classpathentry kind="lib" path="lib/drools-decisiontables.jar"/>
-	<classpathentry kind="lib" path="lib/drools-ide-common.jar"/>
-	<classpathentry kind="lib" path="lib/drools-jsr94.jar"/>
-	<classpathentry kind="lib" path="lib/drools-templates.jar"/>
-	<classpathentry kind="lib" path="lib/jbpm-bpmn2.jar"/>
-	<classpathentry kind="lib" path="lib/jbpm-flow-builder.jar"/>
-	<classpathentry kind="lib" path="lib/jbpm-flow.jar"/>
-	<classpathentry kind="lib" path="lib/jsr94.jar"/>
-	<classpathentry kind="lib" path="lib/jxl.jar"/>
-	<classpathentry kind="lib" path="lib/log4j.jar"/>
-	<classpathentry kind="lib" path="lib/mvel2.jar"/>
-	<classpathentry kind="lib" path="lib/xpp3_min.jar"/>
-	<classpathentry kind="lib" path="lib/xstream.jar"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="lib" path="antlr-runtime-3.2.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/com.ibm.icu/4.2.1.v20100412/com.ibm.icu-4.2.1.v20100412.jar"/>
+  <classpathentry kind="lib" path="jsr94-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar" sourcepath="M2_REPO/junit/junit/4.8.1/junit-4.8.1-sources.jar"/>
+  <classpathentry kind="lib" path="jxl-2.6.10.jar"/>
+  <classpathentry kind="lib" path="log4j-1.2.14.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.commands/3.6.0.I20100512-1500/org.eclipse.core.commands-3.6.0.I20100512-1500.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.contenttype/3.4.100.v20100505-1235/org.eclipse.core.contenttype-3.4.100.v20100505-1235.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.filebuffers/3.5.100.v20100520-0800/org.eclipse.core.filebuffers-3.5.100.v20100520-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.jobs/3.5.1.R36x_v20100824/org.eclipse.core.jobs-3.5.1.R36x_v20100824.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.resources/3.6.0.v20100526-0737/org.eclipse.core.resources-3.6.0.v20100526-0737.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.runtime/3.6.0.v20100505/org.eclipse.core.runtime-3.6.0.v20100505.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.debug.core/3.6.0.v20100519/org.eclipse.debug.core-3.6.0.v20100519.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.debug.ui/3.6.1.v20100901_r361/org.eclipse.debug.ui-3.6.1.v20100901_r361.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.draw2d/3.6.1.v20100913-2020/org.eclipse.draw2d-3.6.1.v20100913-2020.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.app/1.3.1.R36x_v20100803/org.eclipse.equinox.app-1.3.1.R36x_v20100803.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.common/3.6.0.v20100503/org.eclipse.equinox.common-3.6.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.preferences/3.3.0.v20100503/org.eclipse.equinox.preferences-3.3.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.registry/3.5.0.v20100503/org.eclipse.equinox.registry-3.5.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.gef/3.6.1.v20100712-1224/org.eclipse.gef-3.6.1.v20100712-1224.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.core/3.6.1.v_A68_R36x/org.eclipse.jdt.core-3.6.1.v_A68_R36x.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.debug/3.6.1.v20100715_r361/org.eclipse.jdt.debug-3.6.1.v20100715_r361.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.debug.ui/3.5.0.v20100602-0830/org.eclipse.jdt.debug.ui-3.5.0.v20100602-0830.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.junit/3.6.1.r361_v20100825-0800/org.eclipse.jdt.junit-3.6.1.r361_v20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.junit.core/3.6.1.r361_v20100825-0800/org.eclipse.jdt.junit.core-3.6.1.r361_v20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.launching/3.5.100.v20100526/org.eclipse.jdt.launching-3.5.100.v20100526.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jdt.ui/3.6.1.r361_v20100825-0800/org.eclipse.jdt.ui-3.6.1.r361_v20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jface/3.6.1.M20100825-0800/org.eclipse.jface-3.6.1.M20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jface.text/3.6.1.r361_v20100825-0800/org.eclipse.jface.text-3.6.1.r361_v20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ltk.core.refactoring/3.5.100.v20100526-0800/org.eclipse.ltk.core.refactoring-3.5.100.v20100526-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ltk.ui.refactoring/3.5.0.v20100526-0800/org.eclipse.ltk.ui.refactoring-3.5.0.v20100526-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.osgi/3.6.1.R36x_v20100806/org.eclipse.osgi-3.6.1.R36x_v20100806.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.swt/3.6.1.v3655c/org.eclipse.swt-3.6.1.v3655c.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.swt.gtk.linux.x86/3.6.1.v3655c/org.eclipse.swt.gtk.linux.x86-3.6.1.v3655c.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.text/3.5.0.v20100601-1300/org.eclipse.text-3.5.0.v20100601-1300.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui/3.6.1.M20100826-1330/org.eclipse.ui-3.6.1.M20100826-1330.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.console/3.5.0.v20100526/org.eclipse.ui.console-3.5.0.v20100526.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.editors/3.6.1.r361_v20100825-0800/org.eclipse.ui.editors-3.6.1.r361_v20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.forms/3.5.2.r36_v20100702/org.eclipse.ui.forms-3.5.2.r36_v20100702.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.ide/3.6.1.M20100825-0800/org.eclipse.ui.ide-3.6.1.M20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.views/3.5.0.I20100527-0800/org.eclipse.ui.views-3.5.0.I20100527-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.views.properties.tabbed/3.5.100.I20100509-0800/org.eclipse.ui.views.properties.tabbed-3.5.100.I20100509-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.workbench/3.6.1.M20100826-1330/org.eclipse.ui.workbench-3.6.1.M20100826-1330.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.workbench.texteditor/3.6.1.r361_v20100714-0800/org.eclipse.ui.workbench.texteditor-3.6.1.r361_v20100714-0800.jar"/>
+  <classpathentry kind="lib" path="xpp3_min-1.1.4c.jar" sourcepath="C:\Users\mproctor\.m2\repository\xpp3\xpp3_min\1.1.4c\xpp3_min-1.1.4c-sources.jar"/>
+  <classpathentry kind="lib" path="xstream-1.3.1.jar" sourcepath="C:\Users\mproctor\.m2\repository\com\thoughtworks\xstream\xstream\1.3.1\xstream-1.3.1-sources.jar"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+  <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+</classpath>
\ No newline at end of file

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.project
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.project	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse/.project	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,44 +1,56 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.drools.eclipse</name>
-	<comment>To use these drools eclipse plugins in production, use the download site linked on:
+<projectDescription>
+  <name>org.drools.eclipse</name>
+  <comment>To use these drools eclipse plugins in production, use the download site linked on:
     http://www.jboss.org/drools/downloads
     
     To use these drools eclipse plugins locally in development,
-    see the description of the module org.drools.updatesite. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>xpp3_min-1.1.4c.jar</name>
-			<type>1</type>
-			<location>/NotBackedUp/.m2/repository/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar</location>
-		</link>
-		<link>
-			<name>xstream-1.3.1.jar</name>
-			<type>1</type>
-			<location>/NotBackedUp/.m2/repository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar</location>
-		</link>
-	</linkedResources>
-</projectDescription>
+    see the description of the module org.drools.updatesite. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+    <buildCommand>
+      <name>org.eclipse.pde.ManifestBuilder</name>
+    </buildCommand>
+    <buildCommand>
+      <name>org.eclipse.pde.SchemaBuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+    <nature>org.eclipse.pde.PluginNature</nature>
+  </natures>
+  <linkedResources>
+    <link>
+      <name>xstream-1.3.1.jar</name>
+      <type>1</type>
+      <location>C:/Users/mproctor/.m2/repository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar</location>
+    </link>
+    <link>
+      <name>jsr94-1.1.jar</name>
+      <type>1</type>
+      <location>C:/Users/mproctor/.m2/repository/jsr94/jsr94/1.1/jsr94-1.1.jar</location>
+    </link>
+    <link>
+      <name>log4j-1.2.14.jar</name>
+      <type>1</type>
+      <location>C:/Users/mproctor/.m2/repository/log4j/log4j/1.2.14/log4j-1.2.14.jar</location>
+    </link>
+    <link>
+      <name>jxl-2.6.10.jar</name>
+      <type>1</type>
+      <location>C:/Users/mproctor/.m2/repository/net/sourceforge/jexcelapi/jxl/2.6.10/jxl-2.6.10.jar</location>
+    </link>
+    <link>
+      <name>antlr-runtime-3.2.jar</name>
+      <type>1</type>
+      <location>C:/Users/mproctor/.m2/repository/org/antlr/antlr-runtime/3.2/antlr-runtime-3.2.jar</location>
+    </link>
+    <link>
+      <name>xpp3_min-1.1.4c.jar</name>
+      <type>1</type>
+      <location>C:/Users/mproctor/.m2/repository/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar</location>
+    </link>
+  </linkedResources>
+</projectDescription>
\ No newline at end of file

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.classpath
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.classpath	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.classpath	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,13 +1,22 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry including="**/*.java" kind="src" path="src/main/java"/>
-	<classpathentry exported="true" kind="lib" path="lib/mina-core.jar" sourcepath="org.drools.eclipse.tasksrc.zip"/>
-	<classpathentry exported="true" kind="lib" path="lib/slf4j-api.jar" sourcepath="org.drools.eclipse.tasksrc.zip"/>
-	<classpathentry exported="true" kind="lib" path="lib/slf4j-jdk14.jar" sourcepath="org.drools.eclipse.tasksrc.zip"/>
-	<classpathentry kind="lib" path="lib/jbpm-human-task.jar"/>
-	<classpathentry kind="lib" path="lib/drools-api.jar"/>
-	<classpathentry kind="lib" path="lib/drools-core.jar"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<classpath>
+  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.1/junit-4.8.1.jar" sourcepath="M2_REPO/junit/junit/4.8.1/junit-4.8.1-sources.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.commands/3.6.0.I20100512-1500/org.eclipse.core.commands-3.6.0.I20100512-1500.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.contenttype/3.4.100.v20100505-1235/org.eclipse.core.contenttype-3.4.100.v20100505-1235.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.jobs/3.5.1.R36x_v20100824/org.eclipse.core.jobs-3.5.1.R36x_v20100824.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.core.runtime/3.6.0.v20100505/org.eclipse.core.runtime-3.6.0.v20100505.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.app/1.3.1.R36x_v20100803/org.eclipse.equinox.app-1.3.1.R36x_v20100803.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.common/3.6.0.v20100503/org.eclipse.equinox.common-3.6.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.preferences/3.3.0.v20100503/org.eclipse.equinox.preferences-3.3.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.registry/3.5.0.v20100503/org.eclipse.equinox.registry-3.5.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.servletbridge.extensionbundle/1.2.0.v20100503/org.eclipse.equinox.servletbridge.extensionbundle-1.2.0.v20100503.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.jface/3.6.1.M20100825-0800/org.eclipse.jface-3.6.1.M20100825-0800.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.osgi/3.6.1.R36x_v20100806/org.eclipse.osgi-3.6.1.R36x_v20100806.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.swt/3.6.1.v3655c/org.eclipse.swt-3.6.1.v3655c.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.swt.gtk.linux.x86/3.6.1.v3655c/org.eclipse.swt.gtk.linux.x86-3.6.1.v3655c.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui/3.6.1.M20100826-1330/org.eclipse.ui-3.6.1.M20100826-1330.jar"/>
+  <classpathentry kind="lib" path="C:/Users/mproctor/.m2/repository/p2/osgi/bundle/org.eclipse.ui.workbench/3.6.1.M20100826-1330/org.eclipse.ui.workbench-3.6.1.M20100826-1330.jar"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+  <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+</classpath>
\ No newline at end of file

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.project
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.project	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/.project	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,32 +1,25 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.drools.eclipse.task</name>
-	<comment>To use these drools eclipse plugins in production, use the download site linked on:
+<projectDescription>
+  <name>org.drools.eclipse.task</name>
+  <comment>To use these drools eclipse plugins in production, use the download site linked on:
     http://www.jboss.org/drools/downloads
     
     To use these drools eclipse plugins locally in development,
-    see the description of the module org.drools.updatesite. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+    see the description of the module org.drools.updatesite. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+    <buildCommand>
+      <name>org.eclipse.pde.ManifestBuilder</name>
+    </buildCommand>
+    <buildCommand>
+      <name>org.eclipse.pde.SchemaBuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+    <nature>org.eclipse.pde.PluginNature</nature>
+  </natures>
+  <linkedResources/>
+</projectDescription>
\ No newline at end of file

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/META-INF/MANIFEST.MF	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.drools.eclipse.task/META-INF/MANIFEST.MF	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,13 +1,17 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: Drools Eclipse Task Plug-in
-Bundle-SymbolicName: org.drools.eclipse.task; singleton:=true
-Bundle-Version: 5.2.0.qualifier
+Bundle-Name: Drools :: Eclipse :: Task
+Bundle-SymbolicName: org.drools.eclipse.task;singleton:=true
+Bundle-Version: 5.2.0.SNAPSHOT
 Bundle-Activator: org.drools.eclipse.task.Activator
 Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
+<<<<<<< .mine
+Bundle-Vendor: JBoss Inc.
+Bundle-ClassPath: .
+=======
 Bundle-ClassPath: .,
  lib/drools-api.jar,
  lib/drools-core.jar,
@@ -16,3 +20,4 @@
  lib/slf4j-jdk14.jar,
  lib/jbpm-human-task.jar
 Bundle-Vendor: JBoss by Red Hat
+>>>>>>> .r36401

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.eclipse.webdav/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.eclipse.webdav/META-INF/MANIFEST.MF	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.eclipse.webdav/META-INF/MANIFEST.MF	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,9 +1,9 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.webdav
+Bundle-Name: Drools :: Eclipse :: Webdav for Guvnor tools
+Bundle-SymbolicName: org.eclipse.webdav;singleton:=true
 Bundle-Version: 3.0.101
-Bundle-Vendor: %providerName
+Bundle-Vendor: JBoss Inc.
 Bundle-Localization: plugin
 Export-Package: org.eclipse.webdav,
  org.eclipse.webdav.client,

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,10 +1,10 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
+Bundle-Name: Drools :: Eclipse :: Guvnor tools
 Bundle-SymbolicName: org.guvnor.tools;singleton:=true
-Bundle-Version: 5.2.0.qualifier
+Bundle-Version: 5.2.0.SNAPSHOT
 Bundle-Activator: org.guvnor.tools.Activator
-Bundle-Vendor: %plugin.provider
+Bundle-Vendor: JBoss Inc.
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.ui,
  org.eclipse.ui.ide,

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-ide-common/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-ide-common/src/test/java/org/drools/testframework/MockWorkingMemory.java	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-ide-common/src/test/java/org/drools/testframework/MockWorkingMemory.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -144,7 +144,7 @@
         return null;
     }
 
-    public int getId() {
+    public long getId() {
         // TODO Auto-generated method stub
         return 0;
     }
@@ -233,7 +233,7 @@
         
     }
 
-    public void setId(int id) {
+    public void setId(long id) {
         // TODO Auto-generated method stub
         
     }

Added: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContext.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContext.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContext.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,18 @@
+package org.drools.persistence;
+
+import org.drools.persistence.info.SessionInfo;
+
+public interface PersistenceContext {
+
+    void persist(Object entity);
+
+    public <T> T find(Class<T> entityClass, 
+                      Object primaryKey);
+
+    boolean isOpen();
+
+    void joinTransaction();
+
+    void close();
+
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContextManager.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/JpaManager.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContextManager.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/PersistenceContextManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,13 @@
+package org.drools.persistence;
+
+public interface PersistenceContextManager {
+    PersistenceContext getApplicationScopedPersistenceContext();
+    
+    PersistenceContext getCommandScopedPersistenceContext();
+    
+    void beginCommandScopedEntityManager();
+    
+    void endCommandScopedEntityManager();
+
+    void dispose();
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SessionMarshallingHelper.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/JPASessionMarshallingHelper.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SessionMarshallingHelper.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SessionMarshallingHelper.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,116 @@
+package org.drools.persistence;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.drools.KnowledgeBase;
+import org.drools.marshalling.Marshaller;
+import org.drools.marshalling.MarshallerFactory;
+import org.drools.marshalling.ObjectMarshallingStrategy;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+public class SessionMarshallingHelper {
+
+    private KnowledgeBase                 kbase;
+    private KnowledgeSessionConfiguration conf;
+    private StatefulKnowledgeSession      ksession;
+    private Marshaller                    marshaller;
+    private Environment                   env;
+
+    /**
+     * Exist Info, so load session from here
+     * @param info
+     * @param ruleBase
+     * @param conf
+     * @param marshallingConfiguration
+     */
+    public SessionMarshallingHelper(KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment env) {
+        this.kbase = kbase;
+        this.conf = conf;
+        this.env = env;
+        ObjectMarshallingStrategy[] strategies = (ObjectMarshallingStrategy[]) env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES );
+        if (strategies  != null ) {
+            // use strategies if provided in the environment
+            this.marshaller = MarshallerFactory.newMarshaller( kbase, strategies );
+        } else {
+            this.marshaller = MarshallerFactory.newMarshaller( kbase ) ;  
+        }
+    }
+
+    /** 
+     * new session, don't write now as info will request it on update callback
+     * @param info
+     * @param session
+     * @param conf
+     * @param marshallingConfiguration
+     */
+    public SessionMarshallingHelper(StatefulKnowledgeSession ksession,
+                                       KnowledgeSessionConfiguration conf) {
+        this.ksession = ksession;
+        this.kbase = ksession.getKnowledgeBase();
+        this.conf = conf;
+        this.env = ksession.getEnvironment();
+        ObjectMarshallingStrategy[] strategies = (ObjectMarshallingStrategy[]) this.env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES );
+        if (strategies  != null ) {
+            // use strategies if provided in the environment
+            this.marshaller = MarshallerFactory.newMarshaller( kbase, strategies );
+        } else {
+            this.marshaller = MarshallerFactory.newMarshaller( kbase ) ;  
+        }
+        
+    }
+
+    public byte[] getSnapshot() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            marshaller.marshall( baos,
+                                 ksession );
+        } catch ( IOException e ) {
+            throw new RuntimeException( "Unable to get session snapshot",
+                                        e );
+        }
+
+        return baos.toByteArray();
+    }
+
+    public StatefulKnowledgeSession loadSnapshot(byte[] bytes,
+                                                 StatefulKnowledgeSession ksession) {
+        this.ksession = ksession;
+        ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
+        try {
+            if ( this.ksession != null ) {
+                this.marshaller.unmarshall( bais,
+                                            this.ksession );                
+            } else {
+                this.ksession = this.marshaller.unmarshall( bais,
+                                                            this.conf,
+                                                            this.env );                
+            }
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to load session snapshot",
+                                        e );
+        }
+        return this.ksession;
+    }
+
+
+    public StatefulKnowledgeSession getObject() {
+        return ksession;
+    }
+
+    public KnowledgeBase getKbase() {
+        return kbase;
+    }
+
+    public KnowledgeSessionConfiguration getConf() {
+        return conf;
+    }
+
+    
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SingleSessionCommandService.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SingleSessionCommandService.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/SingleSessionCommandService.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,364 @@
+package org.drools.persistence;
+
+import java.lang.reflect.Constructor;
+import java.util.Collections;
+import java.util.Date;
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.drools.KnowledgeBase;
+import org.drools.RuleBase;
+import org.drools.SessionConfiguration;
+import org.drools.command.Command;
+import org.drools.command.Context;
+import org.drools.command.impl.ContextImpl;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.command.runtime.DisposeCommand;
+import org.drools.common.EndOperationListener;
+import org.drools.common.InternalKnowledgeRuntime;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.persistence.info.SessionInfo;
+import org.drools.persistence.jpa.JpaJDKTimerService;
+import org.drools.persistence.jpa.JpaPersistenceContextManager;
+import org.drools.persistence.jpa.processinstance.JPAWorkItemManager;
+import org.drools.persistence.jta.JtaTransactionManager;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SingleSessionCommandService
+    implements
+    org.drools.command.SingleSessionCommandService {
+    
+    Logger                               logger                                            = LoggerFactory.getLogger( getClass() );    
+
+    private SessionInfo                 sessionInfo;
+    private SessionMarshallingHelper marshallingHelper;
+
+    private StatefulKnowledgeSession    ksession;
+    private Environment                 env;
+    private KnowledgeCommandContext     kContext;
+
+    private TransactionManager          txm;
+    private PersistenceContextManager                  jpm;
+    
+    private volatile boolean  doRollback;
+    
+    private static Map<Object, Object> synchronizations = Collections.synchronizedMap( new IdentityHashMap<Object, Object>() );
+    
+    public static Map<Object, Object> txManagerClasses = Collections.synchronizedMap( new IdentityHashMap<Object, Object>() );
+
+    public void checkEnvironment(Environment env) {
+        if ( env.get( EnvironmentName.ENTITY_MANAGER_FACTORY ) == null ) {
+            throw new IllegalArgumentException( "Environment must have an EntityManagerFactory" );
+        }
+
+        // @TODO log a warning that all transactions will be locally scoped using the EntityTransaction
+        //        if ( env.get( EnvironmentName.TRANSACTION_MANAGER ) == null ) {
+        //            throw new IllegalArgumentException( "Environment must have an EntityManagerFactory" );
+        //        }        
+    }
+
+    public SingleSessionCommandService(RuleBase ruleBase,
+                                       SessionConfiguration conf,
+                                       Environment env) {
+        this( new KnowledgeBaseImpl( ruleBase ),
+              conf,
+              env );
+    }
+
+    public SingleSessionCommandService(long sessionId,
+                                       RuleBase ruleBase,
+                                       SessionConfiguration conf,
+                                       Environment env) {
+        this( sessionId,
+              new KnowledgeBaseImpl( ruleBase ),
+              conf,
+              env );
+    }
+
+    public SingleSessionCommandService(KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment env) {
+        if ( conf == null ) {
+            conf = new SessionConfiguration();
+        }
+        this.env = env;        
+        
+        checkEnvironment( this.env );        
+        
+        this.sessionInfo = new SessionInfo();
+
+        initTransactionManager( this.env );
+        
+        // create session but bypass command service
+        this.ksession = kbase.newStatefulKnowledgeSession(conf, this.env);
+        
+        this.kContext = new KnowledgeCommandContext( new ContextImpl( "ksession",
+                                                                      null ),
+                                                     null,
+                                                     null,
+                                                     this.ksession,
+                                                     null );
+
+        ((JpaJDKTimerService) ((InternalKnowledgeRuntime) ksession).getTimerService()).setCommandService( this );
+        
+        this.marshallingHelper = new SessionMarshallingHelper( this.ksession,
+                                                                  conf );
+        this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );
+        ((InternalKnowledgeRuntime) this.ksession).setEndOperationListener( new EndOperationListenerImpl( this.sessionInfo ) );        
+        
+        // Use the App scoped EntityManager if the user has provided it, and it is open.
+
+        try {
+            this.txm.begin();
+ 
+            //this.appScopedEntityManager.joinTransaction();
+            registerRollbackSync();
+
+            jpm.getApplicationScopedPersistenceContext().persist( this.sessionInfo );
+
+            this.txm.commit();
+
+        } catch ( Exception t1 ) {
+            try {
+                this.txm.rollback();
+            } catch ( Throwable t2 ) {
+                throw new RuntimeException( "Could not commit session or rollback",
+                                            t2 );
+            }
+            throw new RuntimeException( "Could not commit session",
+                                        t1 );
+        }
+
+        // update the session id to be the same as the session info id
+        ((InternalKnowledgeRuntime) ksession).setId( this.sessionInfo.getId() );
+
+    }
+
+    public SingleSessionCommandService(long sessionId,
+                                       KnowledgeBase kbase,
+                                       KnowledgeSessionConfiguration conf,
+                                       Environment env) {
+        if ( conf == null ) {
+            conf = new SessionConfiguration();
+        }
+                
+
+        this.env = env;
+        
+        checkEnvironment( this.env );
+        
+        initTransactionManager( this.env );
+
+        initKsession( sessionId,
+                      kbase,
+                      conf );
+    }
+
+    public void initKsession(long sessionId,
+                             KnowledgeBase kbase,
+                             KnowledgeSessionConfiguration conf) {
+        if ( !doRollback && this.ksession != null ) {
+            return;
+            // nothing to initialise
+        }
+        
+        this.doRollback = false;       
+
+        try {
+            this.sessionInfo = jpm.getApplicationScopedPersistenceContext().find( SessionInfo.class,
+                                                                             sessionId );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Could not find session data for id " + sessionId,
+                                        e );
+        }
+
+        if ( sessionInfo == null ) {
+            throw new RuntimeException( "Could not find session data for id " + sessionId );
+        }
+
+        if ( this.marshallingHelper == null ) {
+            // this should only happen when this class is first constructed
+            this.marshallingHelper = new SessionMarshallingHelper( kbase,
+                                                                      conf,
+                                                                      env );
+        }
+
+        this.sessionInfo.setJPASessionMashallingHelper( this.marshallingHelper );
+
+        // if this.ksession is null, it'll create a new one, else it'll use the existing one
+        this.ksession = this.marshallingHelper.loadSnapshot( this.sessionInfo.getData(),
+                                                             this.ksession );
+
+        // update the session id to be the same as the session info id
+        ((InternalKnowledgeRuntime) ksession).setId( this.sessionInfo.getId() );
+
+        ((InternalKnowledgeRuntime) this.ksession).setEndOperationListener( new EndOperationListenerImpl( this.sessionInfo ) );
+
+        ((JpaJDKTimerService) ((InternalKnowledgeRuntime) ksession).getTimerService()).setCommandService( this );
+        
+        if ( this.kContext == null ) {
+            // this should only happen when this class is first constructed
+            this.kContext = new KnowledgeCommandContext( new ContextImpl( "ksession",
+                                                                          null ),
+                                                         null,
+                                                         null,
+                                                         this.ksession,
+                                                         null );
+        }
+
+    }
+    
+    public void initTransactionManager(Environment env) {
+        Object tm = env.get( EnvironmentName.TRANSACTION_MANAGER );
+        if ( tm != null && tm.getClass().getName().startsWith( "org.springframework" ) ) {
+            try {
+                Class<?> cls = Class.forName( "org.drools.container.spring.beans.persistence.DroolsSpringTransactionManager" );
+                Constructor<?> con = cls.getConstructors()[0];
+                this.txm = (TransactionManager) con.newInstance( tm );
+                logger.debug( "Instantiating  DroolsSpringTransactionManager" );
+                                
+                if ( tm.getClass().getName().toLowerCase().contains( "jpa" ) ) {
+                    // configure spring for JPA and local transactions
+                    cls = Class.forName( "org.drools.container.spring.beans.persistence.DroolsSpringJpaManager" );
+                    con = cls.getConstructors()[0];
+                    this.jpm =  ( PersistenceContextManager) con.newInstance( new Object[] { this.env } );
+                } else {
+                    // configure spring for JPA and distributed transactions 
+                }
+            } catch ( Exception e ) {
+                logger.warn( "Could not instatiate DroolsSpringTransactionManager" );
+                throw new RuntimeException( "Could not instatiate org.drools.container.spring.beans.persistence.DroolsSpringTransactionManager", e );
+            }
+        } else {
+            logger.debug( "Instantiating  JtaTransactionManager" );
+            this.txm = new JtaTransactionManager( env.get( EnvironmentName.TRANSACTION ),
+                                                  env.get( EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY ),
+                                                  tm ); 
+            this.jpm = new JpaPersistenceContextManager(this.env);
+        }
+    }
+
+    public static class EndOperationListenerImpl
+        implements
+        EndOperationListener {
+        private SessionInfo info;
+
+        public EndOperationListenerImpl(SessionInfo info) {
+            this.info = info;
+        }
+
+        public void endOperation(InternalKnowledgeRuntime kruntime) {
+            this.info.setLastModificationDate( new Date( kruntime.getLastIdleTimestamp() ) );
+        }
+    }
+
+    public Context getContext() {
+        return this.kContext;
+    }
+
+    public synchronized <T> T execute(Command<T> command) {
+        try {
+            txm.begin();
+            
+            initKsession( this.sessionInfo.getId(),
+                          this.marshallingHelper.getKbase(),
+                          this.marshallingHelper.getConf() );
+            
+            this.jpm.beginCommandScopedEntityManager();
+
+            //this.appScopedEntityManager.joinTransaction();
+            registerRollbackSync();
+
+            T result = ((GenericCommand<T>) command).execute( this.kContext );
+
+            txm.commit();
+
+            return result;
+
+        }catch (RuntimeException re){
+            rollbackTransaction(re);
+            throw re;
+        } catch ( Exception t1 ) {
+            rollbackTransaction(t1);
+            throw new RuntimeException("Wrapped exception see cause", t1);
+        } finally {
+            if ( command instanceof DisposeCommand ) {
+                this.jpm.dispose();
+            }
+        }
+    }
+
+    private void rollbackTransaction(Exception t1) {
+        try {
+            logger.error( "Could not commit session", t1 );
+            txm.rollback();
+        } catch ( Exception t2 ) {
+            logger.error( "Could not rollback", t2 );
+            throw new RuntimeException( "Could not commit session or rollback", t2 );
+        }
+    }
+
+    public void dispose() {
+        if ( ksession != null ) {
+            ksession.dispose();
+        }
+    }
+
+    public long getSessionId() {
+        return sessionInfo.getId();
+    }
+
+    private void registerRollbackSync() {
+        if ( synchronizations.get( this ) == null ) {
+            txm.registerTransactionSynchronization( new SynchronizationImpl( this ) );
+            synchronizations.put( this,
+                                  this );
+        }
+
+    }
+
+    private static class SynchronizationImpl
+        implements
+        TransactionSynchronization {
+
+        SingleSessionCommandService service;
+
+        public SynchronizationImpl(SingleSessionCommandService service) {
+            this.service = service;
+        }
+
+        public void afterCompletion(int status) {
+            if ( status != TransactionManager.STATUS_COMMITTED ) {
+                this.service.rollback();                
+            }
+
+            // always cleanup thread local whatever the result
+            SingleSessionCommandService.synchronizations.remove( this.service );
+            
+            this.service.jpm.endCommandScopedEntityManager();
+
+            StatefulKnowledgeSession ksession = this.service.ksession;
+            // clean up cached process and work item instances
+            if ( ksession != null ) {
+                ((InternalKnowledgeRuntime) ksession).getProcessRuntime().clearProcessInstances();
+                ((JPAWorkItemManager) ksession.getWorkItemManager()).clearWorkItems();
+            }
+
+        }
+
+        public void beforeCompletion() {
+
+        }
+
+    }
+
+    private void rollback() {
+        this.doRollback = true;
+    }
+}
\ No newline at end of file

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionManager.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/TransactionManager.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionManager.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,30 @@
+package org.drools.persistence;
+
+
+public interface TransactionManager {
+    /** Completion status in case of proper commit */
+    int STATUS_COMMITTED      = 0;
+
+    /** Completion status in case of proper rollback */
+    int STATUS_ROLLEDBACK     = 1;
+
+    /** Completion status in case of heuristic mixed completion or system errors */
+    int STATUS_UNKNOWN        = 2;
+
+    /** No existing transaction is associated with this threat */
+    int STATUS_NO_TRANSACTION = 3;
+
+    /** Transaction is Active */
+    int STATUS_ACTIVE         = 4;
+
+    int getStatus();
+
+    void begin();
+
+    void commit();
+
+    void rollback();
+
+    void registerTransactionSynchronization(TransactionSynchronization ts);
+
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronization.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/TransactionSynchronization.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronization.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronization.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,8 @@
+package org.drools.persistence;
+
+public interface TransactionSynchronization {    
+    
+    void beforeCompletion();
+    
+    void afterCompletion(int status);
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronizationRegistryHelper.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/TransactionSynchronizationRegistryHelper.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronizationRegistryHelper.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/TransactionSynchronizationRegistryHelper.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,12 @@
+package org.drools.persistence;
+
+import javax.transaction.TransactionSynchronizationRegistry;
+
+import org.drools.persistence.jta.JtaTransactionSynchronizationAdapter;
+
+public class TransactionSynchronizationRegistryHelper {
+    public static void registerTransactionSynchronization(final Object tsro, final TransactionSynchronization ts) {
+        TransactionSynchronizationRegistry tsr = ( TransactionSynchronizationRegistry ) tsro;
+        tsr.registerInterposedSynchronization( new JtaTransactionSynchronizationAdapter( ts ) );
+    }
+}

Added: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/SessionInfo.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/SessionInfo.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/SessionInfo.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,81 @@
+package org.drools.persistence.info;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+import org.drools.persistence.EntityInfo;
+import org.drools.persistence.SessionMarshallingHelper;
+
+ at Entity
+public class SessionInfo implements EntityInfo {
+    private @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    long                        id;
+
+    @Version
+    @Column(name = "OPTLOCK")     
+    private int                version;
+
+    private Date               startDate;
+    private Date               lastModificationDate;    
+    
+    @Lob
+    private byte[]             rulesByteArray;
+
+    @Transient
+    SessionMarshallingHelper helper;
+    
+    public SessionInfo() {
+        this.startDate = new Date();
+    }
+
+    public long getId() {
+        return this.id;
+    }
+    
+    public int getVersion() {
+        return this.version;
+    }
+
+    public void setJPASessionMashallingHelper(SessionMarshallingHelper helper) {
+        this.helper = helper;
+    }
+
+    public SessionMarshallingHelper getJPASessionMashallingHelper() {
+        return helper;
+    }
+    
+    public byte[] getData() {
+        return this.rulesByteArray;
+    }
+    
+    public Date getStartDate() {
+        return this.startDate;
+    }
+
+    public Date getLastModificationDate() {
+        return this.lastModificationDate;
+    }
+
+    public void setLastModificationDate(Date date) {
+        this.lastModificationDate = date;
+    }
+    
+
+    @PrePersist 
+    @PreUpdate 
+    public void update() {
+        this.rulesByteArray  = this.helper.getSnapshot();
+    }
+
+}

Added: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/info/WorkItemInfo.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,127 @@
+package org.drools.persistence.info;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.PreUpdate;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+import org.drools.marshalling.impl.InputMarshaller;
+import org.drools.marshalling.impl.MarshallerReaderContext;
+import org.drools.marshalling.impl.MarshallerWriteContext;
+import org.drools.marshalling.impl.OutputMarshaller;
+import org.drools.persistence.EntityInfo;
+import org.drools.process.instance.WorkItem;
+import org.drools.runtime.Environment;
+
+ at Entity
+public class WorkItemInfo implements EntityInfo  {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private long   workItemId;
+
+    @Version
+    @Column(name = "OPTLOCK")
+    private int    version;
+
+    private String name;
+    private Date   creationDate;
+    private long   processInstanceId;
+    private long   state;
+    private @Lob
+    byte[]         workItemByteArray;
+    private @Transient
+    WorkItem       workItem;
+
+    private @Transient
+    Environment                               env;
+    
+    protected WorkItemInfo() {
+    }
+
+    public WorkItemInfo(WorkItem workItem, Environment env) {
+        this.workItem = workItem;
+        this.name = workItem.getName();
+        this.creationDate = new Date();
+        this.processInstanceId = workItem.getProcessInstanceId();
+        this.env = env;
+    }
+
+    public long getId() {
+        return workItemId;
+    }
+    
+    public int getVersion() {
+        return this.version;
+    }    
+
+    public String getName() {
+        return name;
+    }
+
+    public Date getCreationDate() {
+        return creationDate;
+    }
+
+    public long getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public long getState() {
+        return state;
+    }
+
+    public WorkItem getWorkItem(Environment env) {
+        this.env = env;
+        if ( workItem == null ) {
+            try {
+                ByteArrayInputStream bais = new ByteArrayInputStream( workItemByteArray );
+                MarshallerReaderContext context = new MarshallerReaderContext( bais,
+                                                                               null,
+                                                                               null,
+                                                                               null,
+                                                                               env);
+                workItem = InputMarshaller.readWorkItem( context );
+                context.close();
+            } catch ( IOException e ) {
+                e.printStackTrace();
+                throw new IllegalArgumentException( "IOException while loading process instance: " + e.getMessage() );
+            }
+        }
+        return workItem;
+    }
+
+     
+
+    @PreUpdate
+    public void update() {
+        this.state = workItem.getState();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            MarshallerWriteContext context = new MarshallerWriteContext( baos,
+                                                                         null,
+                                                                         null,
+                                                                         null,
+                                                                         null,
+                                                                         this.env);
+            
+            OutputMarshaller.writeWorkItem( context,
+                                                 workItem );
+
+            context.close();
+            this.workItemByteArray = baos.toByteArray();
+        } catch ( IOException e ) {
+            throw new IllegalArgumentException( "IOException while storing workItem " + workItem.getId() + ": " + e.getMessage() );
+        }
+    }
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaJDKTimerService.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/JpaJDKTimerService.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaJDKTimerService.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaJDKTimerService.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,106 @@
+/**
+ * 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.persistence.jpa;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
+import org.drools.command.CommandService;
+import org.drools.command.Context;
+import org.drools.command.impl.GenericCommand;
+import org.drools.time.Job;
+import org.drools.time.JobContext;
+import org.drools.time.Trigger;
+import org.drools.time.impl.JDKTimerService;
+
+/**
+ * A default Scheduler implementation that uses the
+ * JDK built-in ScheduledThreadPoolExecutor as the
+ * scheduler and the system clock as the clock.
+ * 
+ */
+public class JpaJDKTimerService extends JDKTimerService {
+    
+	private CommandService commandService;
+
+    public void setCommandService(CommandService commandService) {
+    	this.commandService = commandService;
+    }
+    
+    public JpaJDKTimerService() {
+        this(1);
+    }
+
+    public JpaJDKTimerService(int size) {
+        super(size);
+    }
+
+    protected Callable<Void> createCallableJob(Job job,
+									           JobContext ctx,
+									           Trigger trigger,
+									           JDKJobHandle handle,
+									           ScheduledThreadPoolExecutor scheduler) {
+    	return new JpaJDKCallableJob( job,
+                ctx,
+                trigger,
+                handle,
+                this.scheduler );
+    }
+
+	public class JpaJDKCallableJob extends JDKCallableJob {
+
+		public JpaJDKCallableJob(Job job,
+					             JobContext ctx,
+					             Trigger trigger,
+					             JDKJobHandle handle,
+					             ScheduledThreadPoolExecutor scheduler) {
+			super(job, ctx, trigger, handle, scheduler);
+		}
+
+        public Void call() throws Exception {
+        	JDKCallableJobCommand command = new JDKCallableJobCommand(this);
+        	commandService.execute(command);
+        	return null;
+        }
+        
+        private Void internalCall() throws Exception {
+        	return super.call();
+        }
+    }
+    
+    public static class JDKCallableJobCommand implements GenericCommand<Void> {
+
+		private static final long serialVersionUID = 4L;
+		
+		private JpaJDKCallableJob job;
+    	
+    	public JDKCallableJobCommand(JpaJDKCallableJob job) {
+    		this.job = job;
+    	}
+    	
+    	public Void execute(Context context) {
+    		try {
+    			return job.internalCall();
+    		} catch (Exception e) {
+    			e.printStackTrace();
+    		}
+    		return null;
+    	}
+    	
+    }
+
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaPersistenceContextManager.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/DefaultJpaManager.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaPersistenceContextManager.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/JpaPersistenceContextManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,93 @@
+package org.drools.persistence.jpa;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.drools.persistence.PersistenceContext;
+import org.drools.persistence.PersistenceContextManager;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+
+public class JpaPersistenceContextManager
+    implements
+    PersistenceContextManager {
+    Environment                  env;
+
+    private EntityManagerFactory emf;
+
+    private EntityManager        appScopedEntityManager;
+    private EntityManager        cmdScopedEntityManager;
+
+    private boolean              internalAppScopedEntityManager;
+    private boolean              internalCmdScopedEntityManager;
+
+    public JpaPersistenceContextManager(Environment env) {
+        this.env = env;
+        this.emf = ( EntityManagerFactory ) env.get( EnvironmentName.ENTITY_MANAGER_FACTORY );
+    }    
+    
+    public PersistenceContext getApplicationScopedPersistenceContext() {
+        if ( this.appScopedEntityManager == null ) {
+            // Use the App scoped EntityManager if the user has provided it, and it is open.
+            this.appScopedEntityManager = (EntityManager) this.env.get( EnvironmentName.APP_SCOPED_ENTITY_MANAGER );
+            if ( this.appScopedEntityManager != null && !this.appScopedEntityManager.isOpen() ) {
+                throw new RuntimeException("Provided APP_SCOPED_ENTITY_MANAGER is not open");
+            }
+            
+            if ( this.appScopedEntityManager == null ) {
+                internalAppScopedEntityManager = true;
+                this.appScopedEntityManager = this.emf.createEntityManager();
+
+                this.env.set( EnvironmentName.APP_SCOPED_ENTITY_MANAGER,
+                              this.appScopedEntityManager );
+            } else {
+                internalAppScopedEntityManager = false;
+            }            
+        }
+        return new JpaPersistenceContext( appScopedEntityManager );
+    }
+
+    public PersistenceContext getCommandScopedPersistenceContext() {
+        return new JpaPersistenceContext( this.cmdScopedEntityManager );
+    }    
+
+    public void beginCommandScopedEntityManager() {
+        EntityManager cmdScopedEntityManager = (EntityManager) env.get( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER );
+        if ( cmdScopedEntityManager == null || !cmdScopedEntityManager.isOpen() ) {
+            internalCmdScopedEntityManager = true;
+            cmdScopedEntityManager = this.emf.createEntityManager(); // no need to call joinTransaction as it will do so if one already exists
+            this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER,
+                          cmdScopedEntityManager );
+        } else {
+            internalCmdScopedEntityManager = false;
+        }
+        cmdScopedEntityManager.joinTransaction();
+        appScopedEntityManager.joinTransaction();
+    }
+
+    public void endCommandScopedEntityManager() {
+        if ( this.internalCmdScopedEntityManager ) {
+            this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER, 
+                          null );
+        }
+    }
+
+    public void dispose() {
+        if ( this.internalAppScopedEntityManager ) {
+            if (  this.appScopedEntityManager != null && this.appScopedEntityManager.isOpen() ) {
+                this.appScopedEntityManager.close();
+            }
+            this.internalAppScopedEntityManager = false;
+            this.env.set( EnvironmentName.APP_SCOPED_ENTITY_MANAGER, null );
+        }
+        
+        if ( this.internalCmdScopedEntityManager ) {
+            if (  this.cmdScopedEntityManager != null && this.cmdScopedEntityManager.isOpen() ) {
+                this.cmdScopedEntityManager.close();
+            }
+            this.internalCmdScopedEntityManager = false;
+            this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER, null );            
+        }        
+    }
+
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/KnowledgeStoreServiceImpl.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/KnowledgeStoreServiceImpl.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/KnowledgeStoreServiceImpl.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/KnowledgeStoreServiceImpl.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,192 @@
+package org.drools.persistence.jpa;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Properties;
+
+import org.drools.KnowledgeBase;
+import org.drools.SessionConfiguration;
+import org.drools.command.CommandService;
+import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
+import org.drools.persistence.SingleSessionCommandService;
+import org.drools.persistence.jpa.KnowledgeStoreService;
+import org.drools.persistence.jpa.processinstance.JPAWorkItemManagerFactory;
+import org.drools.process.instance.WorkItemManagerFactory;
+import org.drools.runtime.CommandExecutor;
+import org.drools.runtime.Environment;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.time.TimerService;
+
+public class KnowledgeStoreServiceImpl
+    implements
+    KnowledgeStoreService {
+
+    private Class< ? extends CommandExecutor>               commandServiceClass;
+    private Class< ? extends WorkItemManagerFactory>        workItemManagerFactoryClass;
+    private Class< ? extends TimerService>                  timerServiceClass;
+
+    private Properties                                      configProps = new Properties();
+
+    public KnowledgeStoreServiceImpl() {
+        setDefaultImplementations();
+    }
+
+    protected void setDefaultImplementations() {
+        setCommandServiceClass( SingleSessionCommandService.class );
+        setProcessInstanceManagerFactoryClass( "org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory" );
+        setWorkItemManagerFactoryClass( JPAWorkItemManagerFactory.class );
+        setProcessSignalManagerFactoryClass( "org.jbpm.persistence.processinstance.JPASignalManagerFactory" );
+        setTimerServiceClass( JpaJDKTimerService.class );
+    }
+
+    public StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
+                                                                KnowledgeSessionConfiguration configuration,
+                                                                Environment environment) {
+        if ( configuration == null ) {
+            configuration = new SessionConfiguration();
+        }
+
+        if ( environment == null ) {
+            throw new IllegalArgumentException( "Environment cannot be null" );
+        }
+
+        return new CommandBasedStatefulKnowledgeSession( (CommandService) buildCommanService( kbase,
+                                                                             mergeConfig( configuration ),
+                                                                             environment ) );
+    }
+
+    public StatefulKnowledgeSession loadStatefulKnowledgeSession(long id,
+                                                                 KnowledgeBase kbase,
+                                                                 KnowledgeSessionConfiguration configuration,
+                                                                 Environment environment) {
+        if ( configuration == null ) {
+            configuration = new SessionConfiguration();
+        }
+
+        if ( environment == null ) {
+            throw new IllegalArgumentException( "Environment cannot be null" );
+        }
+
+        return new CommandBasedStatefulKnowledgeSession( (CommandService) buildCommanService( id,
+                                                                                              kbase,
+                                                                                              mergeConfig( configuration ),
+                                                                                              environment ) );
+    }
+
+    private CommandExecutor buildCommanService(long sessionId,
+                                              KnowledgeBase kbase,
+                                              KnowledgeSessionConfiguration conf,
+                                              Environment env) {
+
+        try {
+            Class< ? extends CommandExecutor> serviceClass = getCommandServiceClass();
+            Constructor< ? extends CommandExecutor> constructor = serviceClass.getConstructor( int.class,
+                                                                                              KnowledgeBase.class,
+                                                                                              KnowledgeSessionConfiguration.class,
+                                                                                              Environment.class );
+            return constructor.newInstance( sessionId,
+                                            kbase,
+                                            conf,
+                                            env );
+        } catch ( SecurityException e ) {
+            throw new IllegalStateException( e );
+        } catch ( NoSuchMethodException e ) {
+            throw new IllegalStateException( e );
+        } catch ( IllegalArgumentException e ) {
+            throw new IllegalStateException( e );
+        } catch ( InstantiationException e ) {
+            throw new IllegalStateException( e );
+        } catch ( IllegalAccessException e ) {
+            throw new IllegalStateException( e );
+        } catch ( InvocationTargetException e ) {
+            throw new IllegalStateException( e );
+        }
+    }
+
+    private CommandExecutor buildCommanService(KnowledgeBase kbase,
+                                              KnowledgeSessionConfiguration conf,
+                                              Environment env) {
+
+        Class< ? extends CommandExecutor> serviceClass = getCommandServiceClass();
+        try {
+            Constructor< ? extends CommandExecutor> constructor = serviceClass.getConstructor( KnowledgeBase.class,
+                                                                                              KnowledgeSessionConfiguration.class,
+                                                                                              Environment.class );
+            return constructor.newInstance( kbase,
+                                            conf,
+                                            env );
+        } catch ( SecurityException e ) {
+            throw new IllegalStateException( e );
+        } catch ( NoSuchMethodException e ) {
+            throw new IllegalStateException( e );
+        } catch ( IllegalArgumentException e ) {
+            throw new IllegalStateException( e );
+        } catch ( InstantiationException e ) {
+            throw new IllegalStateException( e );
+        } catch ( IllegalAccessException e ) {
+            throw new IllegalStateException( e );
+        } catch ( InvocationTargetException e ) {
+            throw new IllegalStateException( e );
+        }
+    }
+
+    private KnowledgeSessionConfiguration mergeConfig(KnowledgeSessionConfiguration configuration) {
+        ((SessionConfiguration) configuration).addProperties( configProps );
+        return configuration;
+    }
+
+    public long getStatefulKnowledgeSessionId(StatefulKnowledgeSession ksession) {
+        if ( ksession instanceof CommandBasedStatefulKnowledgeSession ) {
+            SingleSessionCommandService commandService = (SingleSessionCommandService) ((CommandBasedStatefulKnowledgeSession) ksession).getCommandService();
+            return commandService.getSessionId();
+        }
+        throw new IllegalArgumentException( "StatefulKnowledgeSession must be an a CommandBasedStatefulKnowledgeSession" );
+    }
+
+    public void setCommandServiceClass(Class< ? extends CommandExecutor> commandServiceClass) {
+        if ( commandServiceClass != null ) {
+            this.commandServiceClass = commandServiceClass;
+            configProps.put( "drools.commandService",
+                             commandServiceClass.getName() );
+        }
+    }
+
+    public Class< ? extends CommandExecutor> getCommandServiceClass() {
+        return commandServiceClass;
+    }
+
+    public void setTimerServiceClass(Class< ? extends TimerService> timerServiceClass) {
+        if ( timerServiceClass != null ) {
+            this.timerServiceClass = timerServiceClass;
+            configProps.put( "drools.timerService",
+            		         timerServiceClass.getName() );
+        }
+    }
+
+    public Class< ? extends TimerService> getTimerServiceClass() {
+        return timerServiceClass;
+    }
+
+    public void setProcessInstanceManagerFactoryClass(String processInstanceManagerFactoryClass) {
+        configProps.put( "drools.processInstanceManagerFactory",
+                         processInstanceManagerFactoryClass );
+    }
+
+    public void setWorkItemManagerFactoryClass(Class< ? extends WorkItemManagerFactory> workItemManagerFactoryClass) {
+        if ( workItemManagerFactoryClass != null ) {
+            this.workItemManagerFactoryClass = workItemManagerFactoryClass;
+            configProps.put( "drools.workItemManagerFactory",
+                             workItemManagerFactoryClass.getName() );
+        }
+    }
+
+    public Class< ? extends WorkItemManagerFactory> getWorkItemManagerFactoryClass() {
+        return workItemManagerFactoryClass;
+    }
+
+    public void setProcessSignalManagerFactoryClass(String processSignalManagerFactoryClass) {
+        configProps.put( "drools.processSignalManagerFactory",
+                         processSignalManagerFactoryClass );
+    }
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance)

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2010-12-14 00:22:42 UTC (rev 36401)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/JPAWorkItemManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,4 +1,4 @@
-package org.drools.persistence.processinstance;
+package org.drools.persistence.jpa.processinstance;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -9,6 +9,7 @@
 
 import org.drools.WorkItemHandlerNotFoundException;
 import org.drools.common.InternalKnowledgeRuntime;
+import org.drools.persistence.info.WorkItemInfo;
 import org.drools.process.instance.WorkItem;
 import org.drools.process.instance.WorkItemManager;
 import org.drools.process.instance.impl.WorkItemImpl;

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/JPAWorkItemManagerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManagerFactory.java	2010-12-14 00:22:42 UTC (rev 36401)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/JPAWorkItemManagerFactory.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,4 +1,4 @@
-package org.drools.persistence.processinstance;
+package org.drools.persistence.jpa.processinstance;
 
 import org.drools.common.InternalKnowledgeRuntime;
 import org.drools.process.instance.WorkItemManager;

Deleted: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/WorkItemInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2010-12-14 00:22:42 UTC (rev 36401)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/processinstance/WorkItemInfo.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,126 +0,0 @@
-package org.drools.persistence.processinstance;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.PreUpdate;
-import javax.persistence.Transient;
-import javax.persistence.Version;
-
-import org.drools.marshalling.impl.InputMarshaller;
-import org.drools.marshalling.impl.MarshallerReaderContext;
-import org.drools.marshalling.impl.MarshallerWriteContext;
-import org.drools.marshalling.impl.OutputMarshaller;
-import org.drools.process.instance.WorkItem;
-import org.drools.runtime.Environment;
-
- at Entity
-public class WorkItemInfo {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)
-    private long   workItemId;
-
-    @Version
-    @Column(name = "OPTLOCK")
-    private int    version;
-
-    private String name;
-    private Date   creationDate;
-    private long   processInstanceId;
-    private long   state;
-    private @Lob
-    byte[]         workItemByteArray;
-    private @Transient
-    WorkItem       workItem;
-
-    private @Transient
-    Environment                               env;
-    
-    protected WorkItemInfo() {
-    }
-
-    public WorkItemInfo(WorkItem workItem, Environment env) {
-        this.workItem = workItem;
-        this.name = workItem.getName();
-        this.creationDate = new Date();
-        this.processInstanceId = workItem.getProcessInstanceId();
-        this.env = env;
-    }
-
-    public long getId() {
-        return workItemId;
-    }
-    
-    public int getVersion() {
-        return this.version;
-    }    
-
-    public String getName() {
-        return name;
-    }
-
-    public Date getCreationDate() {
-        return creationDate;
-    }
-
-    public long getProcessInstanceId() {
-        return processInstanceId;
-    }
-
-    public long getState() {
-        return state;
-    }
-
-    public WorkItem getWorkItem(Environment env) {
-        this.env = env;
-        if ( workItem == null ) {
-            try {
-                ByteArrayInputStream bais = new ByteArrayInputStream( workItemByteArray );
-                MarshallerReaderContext context = new MarshallerReaderContext( bais,
-                                                                               null,
-                                                                               null,
-                                                                               null,
-                                                                               env);
-                workItem = InputMarshaller.readWorkItem( context );
-                context.close();
-            } catch ( IOException e ) {
-                e.printStackTrace();
-                throw new IllegalArgumentException( "IOException while loading process instance: " + e.getMessage() );
-            }
-        }
-        return workItem;
-    }
-
-     
-
-    @PreUpdate
-    public void update() {
-        this.state = workItem.getState();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            MarshallerWriteContext context = new MarshallerWriteContext( baos,
-                                                                         null,
-                                                                         null,
-                                                                         null,
-                                                                         null,
-                                                                         this.env);
-            
-            OutputMarshaller.writeWorkItem( context,
-                                                 workItem );
-
-            context.close();
-            this.workItemByteArray = baos.toByteArray();
-        } catch ( IOException e ) {
-            throw new IllegalArgumentException( "IOException while storing workItem " + workItem.getId() + ": " + e.getMessage() );
-        }
-    }
-}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionManager.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/JtaTransactionManager.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionManager.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionManager.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,229 @@
+package org.drools.persistence.jta;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.transaction.Status;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+
+import org.drools.persistence.TransactionManager;
+import org.drools.persistence.TransactionSynchronization;
+import org.drools.persistence.TransactionSynchronizationRegistryHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JtaTransactionManager
+    implements
+    TransactionManager {
+
+    Logger                               logger                                            = LoggerFactory.getLogger( getClass() );
+
+    public static final String           DEFAULT_USER_TRANSACTION_NAME                     = "java:comp/UserTransaction";
+
+    public static final String[]         FALLBACK_TRANSACTION_MANAGER_NAMES                = new String[]{"java:comp/TransactionManager", "java:appserver/TransactionManager", "java:pm/TransactionManager", "java:/TransactionManager"};
+
+    /**
+     * Standard Java EE 5 JNDI location for the JTA TransactionSynchronizationRegistry.
+     * Autodetected when available.
+     */
+    public static final String           DEFAULT_TRANSACTION_SYNCHRONIZATION_REGISTRY_NAME = "java:comp/TransactionSynchronizationRegistry";
+
+    private static final String          TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME   = "javax.transaction.TransactionSynchronizationRegistry";
+
+    private static Class< ? >            transactionSynchronizationRegistryClass;
+
+    static {
+        ClassLoader cl = JtaTransactionManager.class.getClassLoader();
+        try {
+            transactionSynchronizationRegistryClass = cl.loadClass( TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME );
+        } catch ( ClassNotFoundException e ) {
+            // JTA 1.1 API not available... simply proceed the JTA 1.0 way.
+        }
+    }
+
+    UserTransaction                      ut;
+    Object                               tsr;
+    javax.transaction.TransactionManager tm;
+    
+    private boolean localTransaction;
+
+    public JtaTransactionManager(Object ut,
+                                 Object tsr,
+                                 Object tm) {
+        if ( ut instanceof UserTransaction ) {
+            this.ut = ( UserTransaction ) ut;
+        } else {
+            this.ut = ( UserTransaction ) ( (ut != null) ? ut : findUserTransaction() );    
+        }
+        
+        if ( tm instanceof javax.transaction.TransactionManager ) {
+            this.tm = ( javax.transaction.TransactionManager ) tm;
+        } else {
+            this.tm = ( javax.transaction.TransactionManager ) ( (tm != null) ? tm : findTransactionManager( this.ut ) );
+        }
+        this.tsr = (tsr != null) ? tsr : findTransactionSynchronizationRegistry( this.ut,
+                                                                                 this.tm );
+    }
+
+    protected javax.transaction.TransactionManager findTransactionManager(UserTransaction ut) {
+        if ( ut instanceof TransactionManager ) {
+            logger.debug( "JTA UserTransaction object [{}] implements TransactionManager",
+                          ut );
+            return (javax.transaction.TransactionManager) ut;
+        }
+
+        InitialContext context = null;
+
+        try {
+            context = new InitialContext();
+        } catch ( NamingException ex ) {
+            logger.debug( "Could not initialise JNDI InitialContext",
+                          ex );
+            return null;
+        }
+
+        // Check fallback JNDI locations.
+        for ( String jndiName : FALLBACK_TRANSACTION_MANAGER_NAMES ) {
+            try {
+                javax.transaction.TransactionManager tm = (javax.transaction.TransactionManager) context.lookup( jndiName );
+                logger.debug( "JTA TransactionManager found at fallback JNDI location [{}]",
+                              jndiName );
+                return tm;
+            } catch ( NamingException ex ) {
+                logger.debug( "No JTA TransactionManager found at fallback JNDI location [{}]",
+                              jndiName,
+                              ex );
+            }
+        }
+
+        // OK, so no JTA TransactionManager is available...
+        return null;
+    }
+
+    protected UserTransaction findUserTransaction() {
+        try {
+            InitialContext context = new InitialContext();
+            return (UserTransaction) context.lookup( DEFAULT_USER_TRANSACTION_NAME );
+        } catch ( NamingException ex ) {
+            logger.debug( "No UserTransaction found at JNDI location [{}]",
+                          DEFAULT_USER_TRANSACTION_NAME,
+                          ex );
+            return null;
+        }
+    }
+
+    protected Object findTransactionSynchronizationRegistry(UserTransaction ut,
+                                                            javax.transaction.TransactionManager tm) {
+
+        if ( transactionSynchronizationRegistryClass == null ) {
+            // JTA 1.1 API not present - skip.
+            logger.debug( "JTA 1.1 [{}] API not available",
+                          TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME );
+            return null;
+        }
+
+        String jndiName = DEFAULT_TRANSACTION_SYNCHRONIZATION_REGISTRY_NAME;
+        try {
+            InitialContext context = new InitialContext();
+            context.lookup( jndiName );
+            logger.debug( "JTA TransactionSynchronizationRegistry found at default JNDI location [{}]",
+                          jndiName );
+            return tsr;
+        } catch ( NamingException ex ) {
+            logger.debug( "No JTA TransactionSynchronizationRegistry found at default JNDI location [{}]",
+                          jndiName,
+                          ex );
+        }
+        // Check whether the UserTransaction or TransactionManager implements it...
+        if ( transactionSynchronizationRegistryClass.isInstance( ut ) ) {
+            return ut;
+        }
+        if ( transactionSynchronizationRegistryClass.isInstance( tm ) ) {
+            return tm;
+        }
+        // OK, so no JTA 1.1 TransactionSynchronizationRegistry is available,
+        // despite the API being present...
+        return null;
+    }
+
+    public void begin() {
+        if ( getStatus() == TransactionManager.STATUS_NO_TRANSACTION ) {
+            this.localTransaction = true;
+            try {
+                this.ut.begin();
+            } catch ( Exception e ) {
+                logger.warn( "Unable to begin transaction", e);
+                throw new RuntimeException( "Unable to begin transaction",
+                                            e );
+            }
+        } else {
+            this.localTransaction = false;
+        }
+    }
+
+    public void commit() {
+        if ( this.localTransaction ) {
+            try {
+                this.ut.commit();
+            } catch ( Exception e ) {
+                logger.warn( "Unable to commit transaction", e);
+                throw new RuntimeException( "Unable to commit transaction",
+                                            e );
+            }
+        } else {
+            localTransaction = false;   
+        }
+    }
+    
+    public void rollback() {
+        localTransaction = false;
+        try {
+            this.ut.rollback();
+        } catch ( Exception e ) {
+            logger.warn( "Unable to rollback transaction", e);
+            throw new RuntimeException( "Unable to rollback transaction",
+                                        e );
+        }
+    }    
+
+    public int getStatus() {
+        int s;
+        try {
+            s = this.ut.getStatus();
+        } catch ( SystemException e ) {
+            throw new RuntimeException( "Unable to get status for transaction",
+                                        e );
+        }
+
+        switch ( s ) {
+            case Status.STATUS_COMMITTED :
+                return TransactionManager.STATUS_COMMITTED;
+            case Status.STATUS_ROLLEDBACK :
+                return TransactionManager.STATUS_ROLLEDBACK;
+            case Status.STATUS_NO_TRANSACTION :
+                return TransactionManager.STATUS_NO_TRANSACTION;
+            default :
+                return TransactionManager.STATUS_UNKNOWN;
+        }
+    }
+
+    public void registerTransactionSynchronization(final TransactionSynchronization ts) {
+        if ( this.tsr != null ) {
+            TransactionSynchronizationRegistryHelper.registerTransactionSynchronization( this.tsr,
+                                                                                         ts );
+        } else if ( this.tm != null ) {
+            try {
+                this.tm.getTransaction().registerSynchronization( new JtaTransactionSynchronizationAdapter( ts ) );
+            } catch ( Exception e ) {
+                // No JTA TransactionManager available - log a warning.
+                logger.warn( "Participating in existing JTA transaction, but no JTA TransactionManager or TransactionSychronizationRegistry available: ",
+                             e );
+
+            }
+        } else {
+            // No JTA TransactionManager available - log a warning.
+            logger.warn( "Participating in existing JTA transaction, but no JTA TransactionManager or TransactionSychronizationRegistry available: " );
+        }
+    }
+
+}

Copied: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionSynchronizationAdapter.java (from rev 36401, labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/JtaTransactionSynchronizationAdapter.java)
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionSynchronizationAdapter.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/main/java/org/drools/persistence/jta/JtaTransactionSynchronizationAdapter.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,41 @@
+package org.drools.persistence.jta;
+
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+
+import org.drools.persistence.TransactionManager;
+import org.drools.persistence.TransactionSynchronization;
+
+public class JtaTransactionSynchronizationAdapter
+    implements
+    Synchronization {
+    TransactionSynchronization ts;
+
+    public JtaTransactionSynchronizationAdapter(TransactionSynchronization ts) {
+        super();
+        this.ts = ts;
+    }
+
+    public void afterCompletion(int status) {
+        switch ( status ) {
+            case Status.STATUS_COMMITTED :
+                this.ts.afterCompletion( TransactionManager.STATUS_COMMITTED );
+                break;
+            case Status.STATUS_ROLLEDBACK :
+                this.ts.afterCompletion( TransactionManager.STATUS_ROLLEDBACK );
+                break;
+            case Status.STATUS_NO_TRANSACTION :
+                this.ts.afterCompletion(  TransactionManager.STATUS_NO_TRANSACTION );
+                break;
+            case Status.STATUS_ACTIVE :
+                this.afterCompletion( TransactionManager.STATUS_ACTIVE );
+                break;
+            default :
+                this.ts.afterCompletion( TransactionManager.STATUS_UNKNOWN );
+        }
+    }
+
+    public void beforeCompletion() {
+        this.ts.beforeCompletion();
+    }
+}

Added: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/map/impl/MapPersistenceTest.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/map/impl/MapPersistenceTest.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/map/impl/MapPersistenceTest.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,8 @@
+package org.drools.persistence.map.impl;
+
+import junit.framework.TestCase;
+
+
+public class MapPersistenceTest extends TestCase {
+
+}

Added: labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/session/JpaPersistentStatefulSessionTest.java
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/session/JpaPersistentStatefulSessionTest.java	                        (rev 0)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/drools-persistence-jpa/src/test/java/org/drools/persistence/session/JpaPersistentStatefulSessionTest.java	2010-12-16 17:50:12 UTC (rev 36434)
@@ -0,0 +1,757 @@
+package org.drools.persistence.session;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.naming.InitialContext;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.transaction.UserTransaction;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.base.MapGlobalResolver;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.event.process.ProcessCompletedEvent;
+import org.drools.event.process.ProcessEvent;
+import org.drools.event.process.ProcessEventListener;
+import org.drools.event.process.ProcessNodeLeftEvent;
+import org.drools.event.process.ProcessNodeTriggeredEvent;
+import org.drools.event.process.ProcessStartedEvent;
+import org.drools.io.ResourceFactory;
+import org.drools.io.impl.ClassPathResource;
+import org.drools.persistence.jpa.JPAKnowledgeService;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+
+import bitronix.tm.TransactionManagerServices;
+import bitronix.tm.resource.jdbc.PoolingDataSource;
+
+public class JpaPersistentStatefulSessionTest extends TestCase {
+
+    PoolingDataSource ds1;
+
+    @Override
+    protected void setUp() throws Exception {
+        ds1 = new PoolingDataSource();
+        ds1.setUniqueName( "jdbc/testDS1" );
+        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setMaxPoolSize( 3 );
+        ds1.setAllowLocalTransactions( true );
+        ds1.getDriverProperties().put( "user",
+                                       "sa" );
+        ds1.getDriverProperties().put( "password",
+                                       "sasa" );
+        ds1.getDriverProperties().put( "URL",
+                                       "jdbc:h2:mem:mydb" );
+        ds1.init();
+
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        ds1.close();
+    }
+
+    public void testLocalTransactionPerStatement() {
+        String str = "";
+        str += "package org.drools.test\n";
+        str += "global java.util.List list\n";
+        str += "rule rule1\n";
+        str += "when\n";
+        str += "  Integer(intValue > 0)\n";
+        str += "then\n";
+        str += "  list.add( 1 );\n";
+        str += "end\n";
+        str += "\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( EnvironmentName.TRANSACTION_MANAGER,
+                 TransactionManagerServices.getTransactionManager() );
+        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+
+        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+        List<?> list = new ArrayList<Object>();
+
+        ksession.setGlobal( "list",
+                            list );
+
+        ksession.insert( 1 );
+        ksession.insert( 2 );
+        ksession.insert( 3 );
+
+        ksession.fireAllRules();
+
+        assertEquals( 3,
+                      list.size() );
+
+    }
+
+    public void testUserTransactions() throws Exception {
+        String str = "";
+        str += "package org.drools.test\n";
+        str += "global java.util.List list\n";
+        str += "rule rule1\n";
+        str += "when\n";
+        str += "  $i : Integer(intValue > 0)\n";
+        str += "then\n";
+        str += "  list.add( $i );\n";
+        str += "end\n";
+        str += "\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+                 emf );
+        env.set( EnvironmentName.TRANSACTION_MANAGER,
+                 TransactionManagerServices.getTransactionManager() );
+        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+
+        UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+        ut.commit();
+
+        //      EntityManager em = emf.createEntityManager();
+        //      SessionInfo sInfo = em.find( SessionInfo.class, 1 );
+        //      assertNotNull( sInfo );
+        //      //System.out.println( "session creation : " + sInfo.getVersion() );
+        //      em.close();
+
+        List<?> list = new ArrayList<Object>();
+
+        // insert and commit
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.insert( 1 );
+        ksession.insert( 2 );
+        ut.commit();
+//
+        // insert and rollback
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 3 );
+        ut.rollback();
+
+        // check we rolled back the state changes from the 3rd insert
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();        
+        ksession.fireAllRules();
+        ut.commit();
+        assertEquals( 2,
+                      list.size() );
+
+//        // insert and commit
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 3 );
+        ksession.insert( 4 );
+        ut.commit();
+
+        // rollback again, this is testing that we can do consecutive rollbacks and commits without issue
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 5 );
+        ksession.insert( 6 );
+        ut.rollback();
+
+        ksession.fireAllRules();
+
+        assertEquals( 4,
+                      list.size() );
+        
+        // now load the ksession
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( ksession.getId(), kbase, null, env );
+        
+        ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+        ut.begin();
+        ksession.insert( 7 );
+        ksession.insert( 8 );
+        ut.commit();
+
+        ksession.fireAllRules();
+
+        assertEquals( 6,
+                      list.size() );
+    }
+
+    public void test1() {
+        
+    }
+    
+//    public void testPersistenceWorkItems() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        ksession.insert( "TestString" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//
+//        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+//        WorkItem workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertEquals( 1,
+//                      ksession.getObjects().size() );
+//        for ( Object o : ksession.getObjects() ) {
+//            System.out.println( o );
+//        }
+//        assertNull( processInstance );
+//
+//    }
+//    
+//    public void testPersistenceWorkItems2() throws Exception {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        
+//        UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+//        ut.begin();
+//        
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        ksession.insert( "TestString" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//
+//        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+//        WorkItem workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//        
+//        workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ut.commit();
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertEquals( 1,
+//                      ksession.getObjects().size() );
+//        for ( Object o : ksession.getObjects() ) {
+//            System.out.println( o );
+//        }
+//        assertNull( processInstance );
+//
+//    }
+//    
+//    public void testPersistenceWorkItems3() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        ksession.getWorkItemManager().registerWorkItemHandler("MyWork", new SystemOutWorkItemHandler());
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        ksession.insert( "TestString" );
+//        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+//    }
+//    
+//    public void testPersistenceState() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "StateProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+//        env.set( EnvironmentName.TRANSACTION_MANAGER,
+//                 TransactionManagerServices.getTransactionManager() );        
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.insert(new ArrayList<Object>());
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNull( processInstance );
+//    }
+//    
+//    public void testPersistenceRuleSet() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "RuleSetProcess.rf" ),
+//                      ResourceType.DRF );
+//        kbuilder.add( new ClassPathResource( "RuleSetRules.drl" ),
+//                      ResourceType.DRL );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+//        env.set( EnvironmentName.TRANSACTION_MANAGER,
+//                 TransactionManagerServices.getTransactionManager() );        
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        
+//        ksession.insert(new ArrayList<Object>());
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.fireAllRules();
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNull( processInstance );
+//    }
+//    
+//    public void testPersistenceEvents() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "EventsProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//
+//        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+//        WorkItem workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
+//        
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession.signalEvent("MyEvent1", null, processInstance.getId());
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession.signalEvent("MyEvent2", null, processInstance.getId());
+//        
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNull( processInstance );
+//    }
+//    
+//    public void testProcessListener() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        final List<ProcessEvent> events = new ArrayList<ProcessEvent>();
+//        ProcessEventListener listener = new ProcessEventListener() {
+//            public void afterNodeLeft(ProcessNodeLeftEvent event) {
+//                System.out.println("After node left: " + event.getNodeInstance().getNodeName());
+//                events.add(event);              
+//            }
+//            public void afterNodeTriggered(ProcessNodeTriggeredEvent event) {
+//                System.out.println("After node triggered: " + event.getNodeInstance().getNodeName());
+//                events.add(event);              
+//            }
+//            public void afterProcessCompleted(ProcessCompletedEvent event) {
+//                System.out.println("After process completed");
+//                events.add(event);              
+//            }
+//            public void afterProcessStarted(ProcessStartedEvent event) {
+//                System.out.println("After process started");
+//                events.add(event);              
+//            }
+//            public void beforeNodeLeft(ProcessNodeLeftEvent event) {
+//                System.out.println("Before node left: " + event.getNodeInstance().getNodeName());
+//                events.add(event);              
+//            }
+//            public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
+//                System.out.println("Before node triggered: " + event.getNodeInstance().getNodeName());
+//                events.add(event);              
+//            }
+//            public void beforeProcessCompleted(ProcessCompletedEvent event) {
+//                System.out.println("Before process completed");
+//                events.add(event);              
+//            }
+//            public void beforeProcessStarted(ProcessStartedEvent event) {
+//                System.out.println("Before process started");
+//                events.add(event);              
+//            }
+//        };
+//        ksession.addEventListener(listener);
+//        
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//        
+//        assertEquals(12, events.size());
+//        assertTrue(events.get(0) instanceof ProcessStartedEvent);
+//        assertTrue(events.get(1) instanceof ProcessNodeTriggeredEvent);
+//        assertTrue(events.get(2) instanceof ProcessNodeLeftEvent);
+//        assertTrue(events.get(3) instanceof ProcessNodeTriggeredEvent);
+//        assertTrue(events.get(4) instanceof ProcessNodeLeftEvent);
+//        assertTrue(events.get(5) instanceof ProcessNodeTriggeredEvent);
+//        assertTrue(events.get(6) instanceof ProcessNodeTriggeredEvent);
+//        assertTrue(events.get(7) instanceof ProcessNodeLeftEvent);
+//        assertTrue(events.get(8) instanceof ProcessNodeTriggeredEvent);
+//        assertTrue(events.get(9) instanceof ProcessNodeLeftEvent);
+//        assertTrue(events.get(10) instanceof ProcessNodeTriggeredEvent);
+//        assertTrue(events.get(11) instanceof ProcessStartedEvent);
+//        
+//        ksession.removeEventListener(listener);
+//        events.clear();
+//        
+//        processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//        
+//        assertTrue(events.isEmpty());
+//    }
+//
+//    public void testPersistenceSubProcess() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "SuperProcess.rf" ),
+//                      ResourceType.DRF );
+//        kbuilder.add( new ClassPathResource( "SubProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        
+//        ProcessInstance processInstance = ksession.startProcess( "com.sample.SuperProcess" );
+//        System.out.println( "Started process instance " + processInstance.getId() );
+//
+//        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+//        WorkItem workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
+//                                                       null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNull( processInstance );
+//    }
+//    
+//    public void testPersistenceVariables() {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "VariablesProcess.rf" ), ResourceType.DRF );
+//        for (KnowledgeBuilderError error: kbuilder.getErrors()) {
+//            System.out.println(error);
+//        }
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+//
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//
+//        Map<String, Object> parameters = new HashMap<String, Object>();
+//        parameters.put("name", "John Doe");
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess", parameters );
+//
+//        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+//        WorkItem workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//        assertEquals( "John Doe", workItem.getParameter("name"));
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNotNull( workItem );
+//        assertEquals( "John Doe", workItem.getParameter("text"));
+//        
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
+//
+//        workItem = handler.getWorkItem();
+//        assertNull( workItem );
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNull( processInstance );
+//    }
+//
+//    public void testSetFocus() {
+//        String str = "";
+//        str += "package org.drools.test\n";
+//        str += "global java.util.List list\n";
+//        str += "rule rule1\n";
+//        str += "agenda-group \"badfocus\"";
+//        str += "when\n";
+//        str += "  Integer(intValue > 0)\n";
+//        str += "then\n";
+//        str += "  list.add( 1 );\n";
+//        str += "end\n";
+//        str += "\n";
+//
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+//                      ResourceType.DRL );
+//        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+//
+//        if ( kbuilder.hasErrors() ) {
+//            fail( kbuilder.getErrors().toString() );
+//        }
+//
+//        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
+//                 emf );
+//        env.set( EnvironmentName.TRANSACTION_MANAGER,
+//                 TransactionManagerServices.getTransactionManager() );
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        List<?> list = new ArrayList<Object>();
+//
+//        ksession.setGlobal( "list",
+//                            list );
+//
+//        ksession.insert( 1 );
+//        ksession.insert( 2 );
+//        ksession.insert( 3 );
+//        ksession.getAgenda().getAgendaGroup("badfocus").setFocus();
+//
+//        ksession.fireAllRules();
+//
+//        assertEquals( 3,
+//                      list.size() );
+//    }
+//
+//    public void testPersistenceTimer() throws Exception {
+//        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+//        kbuilder.add( new ClassPathResource( "TimerProcess.rf" ),
+//                      ResourceType.DRF );
+//        KnowledgeBase kbase = kbuilder.newKnowledgeBase();
+//
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+//        Environment env = KnowledgeBaseFactory.newEnvironment();
+//        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+//        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+//
+//        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+//        int id = ksession.getId();
+//        ksession.dispose();
+//        
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+//        ksession.dispose();
+//
+//        assertNotNull(TestWorkItemHandler.getInstance().getWorkItem());
+//        
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNotNull( processInstance );
+//        
+//        Thread.sleep(2000);
+//        
+//        ksession.dispose();
+//
+//        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+//        processInstance = ksession.getProcessInstance( processInstance.getId() );
+//        assertNull( processInstance );
+//    }
+    
+}

Modified: labs/jbossrules/dev_tags/persistence_refactor_20101216/osgi-bundles/jxls/org.drools.osgi.wrapper.jxls-reader/maven-eclipse.xml
===================================================================
--- labs/jbossrules/dev_tags/persistence_refactor_20101216/osgi-bundles/jxls/org.drools.osgi.wrapper.jxls-reader/maven-eclipse.xml	2010-12-16 17:35:19 UTC (rev 36433)
+++ labs/jbossrules/dev_tags/persistence_refactor_20101216/osgi-bundles/jxls/org.drools.osgi.wrapper.jxls-reader/maven-eclipse.xml	2010-12-16 17:50:12 UTC (rev 36434)
@@ -1,11 +1,11 @@
-<project default="copy-resources">
-  <target name="init"/>
-  <target name="copy-resources" depends="init">
-    <copy todir="target/classes/META-INF" filtering="false">
-      <fileset dir="META-INF" includes="" excludes="**/*.java"/>
-    </copy>
-    <copy todir="target/classes/lib" filtering="false">
-      <fileset dir="lib" includes="*.jar" excludes="**/*.java"/>
-    </copy>
-  </target>
+<project default="copy-resources">
+  <target name="init"/>
+  <target name="copy-resources" depends="init">
+    <copy todir="target/classes/META-INF" filtering="false">
+      <fileset dir="META-INF" includes="" excludes="**/*.java"/>
+    </copy>
+    <copy todir="target/classes/lib" filtering="false">
+      <fileset dir="lib" includes="*.jar" excludes="**/*.java"/>
+    </copy>
+  </target>
 </project>
\ No newline at end of file



More information about the jboss-svn-commits mailing list