[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