[jboss-svn-commits] JBL Code SVN: r21593 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/persistence and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Aug 18 03:05:28 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-08-18 03:05:28 -0400 (Mon, 18 Aug 2008)
New Revision: 21593

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/PersistenceManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryPersistenceManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryXaResource.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryXaResourceTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/MockByteArraySnapshotter.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/
Log:
JBRULES-1738 Support XAResource transactions and generic save points
JBRULES-1739 in-memory XAResource
-some refactoring to add a PersistenceManager and rename the package from transaction to persistence

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java (from rev 21588, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/ByteArraySnapshotter.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,10 @@
+/**
+ * 
+ */
+package org.drools.persistence;
+
+public interface ByteArraySnapshotter {
+    public byte[] getSnapshot();
+    
+    public void loadSnapshot(byte[] bytes);       
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/ByteArraySnapshotter.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java (from rev 21588, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/DroolsXid.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,39 @@
+package org.drools.persistence;
+
+import javax.transaction.xa.*;
+
+    
+    public class DroolsXid implements Xid
+    {
+        protected int formatId;
+        protected byte gtrid[];
+        protected byte bqual[];
+
+        public DroolsXid()
+        {
+        }
+
+        public DroolsXid(int formatId, byte gtrid[], byte bqual[])
+        {
+            this.formatId = formatId;
+            this.gtrid = gtrid;
+            this.bqual = bqual;
+        }
+
+
+        public int getFormatId()
+        {
+            return formatId;
+        }
+
+        public byte[] getBranchQualifier()
+        {
+            return bqual;
+        }
+
+        public byte[] getGlobalTransactionId()
+        {
+            return gtrid;
+        }
+
+    }


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/DroolsXid.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/PersistenceManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/PersistenceManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/PersistenceManager.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,16 @@
+package org.drools.persistence;
+
+import javax.transaction.xa.XAResource;
+
+
+public interface PersistenceManager {
+
+	XAResource getXAResource();
+
+	Transaction getTransaction();
+
+	void save();
+
+	void load();
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java (from rev 21588, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/Transaction.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,48 @@
+package org.drools.persistence;
+
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+public class Transaction {
+    private Xid xid;    
+    
+    XAResource xaResource;
+    
+    public Transaction(Xid xid, XAResource xaResource) {
+        this.xid = xid;
+        this.xaResource = xaResource;
+    }
+    
+    public Xid getXid() {
+        return xid;
+    }    
+    
+    public void start() throws XAException {
+        this.xaResource.start( xid, XAResource.TMNOFLAGS );
+    }
+    
+    public void rollback() throws XAException {
+    	this.xaResource.rollback( xid );
+    }
+    
+    public void commit() throws XAException {
+        this.xaResource.commit( xid, true );
+    }        
+
+    public int hashCode() {
+        return xid.hashCode();
+    }
+
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        Transaction other = (Transaction) obj;
+        if ( xid == null ) {
+            if ( other.xid != null ) return false;
+        } else if ( !xid.equals( other.xid ) ) return false;
+        return true;
+    }       
+     
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/Transaction.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory (from rev 21590, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/memory)


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryPersistenceManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryPersistenceManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryPersistenceManager.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,60 @@
+package org.drools.persistence.memory;
+
+import org.drools.persistence.ByteArraySnapshotter;
+import org.drools.persistence.PersistenceManager;
+import org.drools.persistence.Transaction;
+
+public class MemoryPersistenceManager implements ByteArraySnapshotter, PersistenceManager {  
+    ByteArraySnapshotter snapshotter;
+    byte[] lastSave;  
+    MemoryXaResource xaResource;
+	
+	public MemoryPersistenceManager(ByteArraySnapshotter snapshotter) {
+		this.snapshotter = snapshotter;
+	}
+	
+	public MemoryXaResource getXAResource() {
+		if ( xaResource == null ) {
+			xaResource = new MemoryXaResource( this );
+		}
+		return xaResource;
+	}
+	
+	public Transaction getTransaction() {
+		return new Transaction( null, getXAResource() );
+	}
+	
+	public void save() {
+		if ( xaResource != null && xaResource.isInTransaction() ) {
+			throw new RuntimeException("You cannot call a persistence save point while a transaction is open" );
+		}
+		lastSave = getSnapshot();
+	}
+
+	public void load() {
+		if ( xaResource != null && xaResource.isInTransaction() ) {
+			throw new RuntimeException("You cannot call a persistence save point while a transaction is open" );
+		}		
+		loadSnapshot( lastSave );
+	}
+	
+	public boolean isInTransaction() {
+		return false;
+	}
+	
+	public void setLastSave(byte[] lastSave) {
+		this.lastSave = lastSave;
+	}
+	
+	public byte[] getLastSave() {
+		return lastSave;
+	}
+	
+    public byte[] getSnapshot() {
+    	return snapshotter.getSnapshot();
+    }
+    
+    public void loadSnapshot(byte[] bytes) {
+    	this.snapshotter.loadSnapshot( bytes );
+    }
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryXaResource.java (from rev 21590, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/InMemoryXaResource.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryXaResource.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryXaResource.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,103 @@
+package org.drools.persistence.memory;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import org.drools.persistence.ByteArraySnapshotter;
+
+public class MemoryXaResource implements XAResource {
+    private MemoryPersistenceManager pm;
+    
+    Map<Xid, byte[]> data = new HashMap<Xid, byte[]>();
+    LinkedList<Xid> list = new LinkedList<Xid>();      
+
+    public MemoryXaResource(MemoryPersistenceManager pm) {
+        this.pm = pm;
+    }
+    
+    public boolean isInTransaction() {
+    	return list.size() > 0;
+    }
+
+    public void start(Xid xid,
+                      int flags) throws XAException {
+        byte[] bytes = pm.getSnapshot();
+        // The start of the first transaction is recorded as  save point, for HA.
+        if ( this.list.isEmpty() ) {
+        	pm.setLastSave( bytes );
+        }        
+        
+        this.list.add( xid );
+        this.data.put( xid, bytes );
+    }     
+    
+    public void rollback(Xid xid) throws XAException {   
+        if ( this.list.isEmpty() ) {
+            // nothing to rollback
+            return;
+        }
+        byte[] bytes = this.data.get( xid );
+        
+        boolean remove = false;
+        for(java.util.Iterator<Xid> it = this.list.iterator(); it.hasNext(); ) {
+            Xid currentXid = it.next();
+            if ( !remove && currentXid.equals( xid )) {
+                remove = true;
+            } 
+            
+            if ( remove ) {
+                this.data.remove( currentXid );
+                it.remove();
+            }                        
+        }
+                        
+        pm.loadSnapshot( bytes );
+    }    
+    
+    public void commit(Xid xid,
+                       boolean onePhase) throws XAException {
+        if ( this.list.getFirst().equals( xid ) && this.list.size() > 1 ) {
+            // first one has committed, so move save point to next transaction
+            pm.setLastSave( this.data.get( this.list.get( 1 ) ) );                   
+        } else if ( this.list.size() == 1 ) {
+            // there will be no more transactions after this is removed, so create a new lastSave point
+        	pm.setLastSave( pm.getSnapshot() );
+        }
+        
+        this.list.remove( xid );
+        this.data.remove( xid );        
+    }
+    
+    public void end(Xid xid,
+                    int flags) throws XAException {    
+    }        
+
+    public void forget(Xid xid) throws XAException {        
+    }
+
+    public int getTransactionTimeout() throws XAException {
+        return 0;
+    }
+
+    public boolean isSameRM(XAResource xares) throws XAException {
+        return false;
+    }
+
+    public int prepare(Xid xid) throws XAException {
+        return 0;
+    }
+
+    public Xid[] recover(int flag) throws XAException {
+        return null;
+    }
+
+    public boolean setTransactionTimeout(int seconds) throws XAException {
+        return false;
+    }      
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/persistence/memory/MemoryXaResource.java
___________________________________________________________________
Name: svn:mergeinfo
   + 


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryXaResourceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryXaResourceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryXaResourceTest.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,120 @@
+package org.drools.persistence.memory;
+
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import org.drools.persistence.DroolsXid;
+import org.drools.persistence.memory.MemoryPersistenceManager;
+import org.drools.persistence.memory.MemoryXaResource;
+import org.drools.transaction.MockByteArraySnapshotter;
+
+import junit.framework.TestCase;
+
+public class MemoryXaResourceTest extends  TestCase {
+    private byte[] data1 = new byte[] { 1, 1, 1, 1, 1 };
+    private byte[] data2 = new byte[] { 1, 1, 1, 1, 0 };
+    private byte[] data3 = new byte[] { 1, 1, 1, 0, 0 };
+    
+    MockByteArraySnapshotter snapshotter;
+    MemoryPersistenceManager pm;
+    
+    protected void setUp() throws Exception {
+    	snapshotter =  new MockByteArraySnapshotter();
+        pm = new MemoryPersistenceManager( snapshotter );
+    }
+    
+    public void testInitFields() {
+        MemoryXaResource xa = pm.getXAResource();
+        
+        // make sure these are initialised correctly
+        assertEquals( 0, xa.list.size() );
+        assertNull( pm.lastSave );              
+    }
+    
+    public void testSingleTransactionWithRollBack() throws Exception {
+        MemoryXaResource xa = pm.getXAResource();
+        
+        Xid xid = new DroolsXid(100, new byte[]{0x01}, new byte[]{0x01});
+
+        
+        snapshotter.bytes = data1;        
+        xa.start(xid, XAResource.TMNOFLAGS);
+        assertEquals( 1, xa.list.size() ); // we only have one transaction
+        assertSame( xa.data.get( xa.list.get( 0 )), pm.lastSave ); // lastSave is always set to begin of the first transaction
+        
+        snapshotter.bytes = data2;
+        xa.rollback(xid);      
+        
+        assertTrue( assertEquals( data1, snapshotter.bytes ) );
+        assertTrue( xa.list.isEmpty() );
+        assertTrue( xa.data.isEmpty() );        
+    }
+    
+    public void testSingleTransactionWithCommit() throws Exception {
+        MemoryXaResource xa = pm.getXAResource();
+        
+        Xid xid = new DroolsXid(100, new byte[]{0x01}, new byte[]{0x01});
+        
+        snapshotter.bytes = data1;        
+        xa.start(xid, XAResource.TMNOFLAGS);
+        
+        snapshotter.bytes = data2;
+        xa.commit(xid, true);
+        
+        // check levels are empty and that lastsave was updated to be the same as end
+        assertEquals( 0, xa.list.size() );
+        assertSame( data2, pm.lastSave );
+        
+        // should do nothing as there is nothing to rollback
+        xa.rollback(xid);
+        
+        assertTrue( assertEquals( data2, snapshotter.bytes ) );        
+        assertTrue( xa.list.isEmpty() );
+        assertTrue( xa.data.isEmpty() );
+    }         
+    
+    public void testMultipleTransactions() throws Exception {
+        MemoryXaResource xa = pm.getXAResource();
+        
+        Xid xid1 = new DroolsXid(100, new byte[]{0x01}, new byte[]{0x01});
+        
+        snapshotter.bytes = data1;        
+        xa.start(xid1, XAResource.TMNOFLAGS);
+        
+        Xid xid2 = new DroolsXid(100, new byte[]{0x02}, new byte[]{0x02});
+        snapshotter.bytes = data2;
+        xa.start(xid2, XAResource.TMNOFLAGS);        
+        assertEquals( 2, xa.list.size() ); // we now have two levels
+        assertSame( xa.data.get( xa.list.get( 0 ) ), pm.lastSave ); // check lastSave is still first transaction
+        
+        Xid xid3 = new DroolsXid(100, new byte[]{0x03}, new byte[]{0x03});
+        snapshotter.bytes = data3;
+        xa.start(xid3, XAResource.TMNOFLAGS);      
+        assertEquals( 3, xa.list.size() );  // we now have three levels.
+        
+        // commit the first, so the second should become the lastSave point
+        xa.commit( xid1, true );
+        
+        assertSame( xa.data.get( xid2 ), pm.lastSave ); // xid2 should now be the lastSave point
+
+        // rollback xid2, should result in rolling back xid3 too
+        xa.rollback( xid2  );
+        
+        assertTrue( xa.list.isEmpty() );
+        assertTrue( xa.data.isEmpty() );
+    }    
+  
+    public boolean assertEquals( byte[] bytes1, byte[] bytes2) {
+        if ( bytes1.length != bytes2.length ) {
+            return false;
+        }
+        
+        for ( int i = 0; i < bytes1.length; i++ ) {
+            if ( bytes1[i] != bytes2[i] ) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+}

Copied: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/MockByteArraySnapshotter.java (from rev 21588, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/transaction/MockByteArraySnapshotter.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/MockByteArraySnapshotter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/MockByteArraySnapshotter.java	2008-08-18 07:05:28 UTC (rev 21593)
@@ -0,0 +1,26 @@
+/**
+ * 
+ */
+package org.drools.transaction;
+
+import org.drools.persistence.ByteArraySnapshotter;
+
+public class MockByteArraySnapshotter implements ByteArraySnapshotter {
+    public byte[] bytes;
+
+    public MockByteArraySnapshotter() {
+        
+    }
+    
+    public MockByteArraySnapshotter(byte[] bytes) {
+        this.bytes = bytes;
+    }
+    
+    public byte[] getSnapshot() {
+        return bytes;
+    }
+
+    public void loadSnapshot(byte[] bytes) {
+        this.bytes = bytes;
+    }        
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/transaction/MockByteArraySnapshotter.java
___________________________________________________________________
Name: svn:mergeinfo
   + 




More information about the jboss-svn-commits mailing list