You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2016/12/03 16:56:20 UTC
[26/50] tomee git commit: Adding XA test
Adding XA test
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/bbc61e0b
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/bbc61e0b
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/bbc61e0b
Branch: refs/heads/tomee-1.7.x
Commit: bbc61e0b4e1427067377cf4b555dc4a39f220d7f
Parents: 6345d7a
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Tue Jul 26 18:52:11 2016 +0200
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Tue Jul 26 18:56:09 2016 +0200
----------------------------------------------------------------------
.../java/org/superbiz/injection/jpa/Movies.java | 5 +
.../org/superbiz/injection/jpa/MoviesXA.java | 172 +++++++++++++
.../superbiz/injection/jpa/MoviesXATest.java | 242 +++++++++++++++++++
3 files changed, 419 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/bbc61e0b/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/Movies.java
----------------------------------------------------------------------
diff --git a/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/Movies.java b/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/Movies.java
index a03baa0..4e136aa 100644
--- a/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/Movies.java
+++ b/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/Movies.java
@@ -45,5 +45,10 @@ public class Movies {
return query.getResultList();
}
+ public void deleteAll() throws Exception {
+ Query query = entityManager.createQuery("DELETE from Movie");
+ query.executeUpdate();
+ }
+
}
//END SNIPPET: code
http://git-wip-us.apache.org/repos/asf/tomee/blob/bbc61e0b/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/MoviesXA.java
----------------------------------------------------------------------
diff --git a/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/MoviesXA.java b/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/MoviesXA.java
new file mode 100644
index 0000000..d506285
--- /dev/null
+++ b/examples/xa-datasource/src/main/java/org/superbiz/injection/jpa/MoviesXA.java
@@ -0,0 +1,172 @@
+package org.superbiz.injection.jpa;
+
+import javax.annotation.Resource;
+import javax.ejb.Singleton;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+@Singleton
+public class MoviesXA {
+ private static int XA_STATE_INITIAL = 0;
+ private static int XA_STATE_STARTED = 1;
+ private static int XA_STATE_ENDED = 2;
+ private static int XA_STATE_PREPARED = 3;
+ private static int XA_STATE_DISPOSED = 4;
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Resource
+ private TransactionManager transactionManager;
+
+ private volatile boolean fail = false;
+ private volatile boolean before = false;
+
+ public void run(Movie movie) {
+ if (before) {
+ addXaResource();
+ }
+
+ em.persist(movie);
+
+ if (!before) {
+ addXaResource();
+ }
+ }
+
+ private void addXaResource() {
+ try {
+ transactionManager.getTransaction().enlistResource(new XAResource() {
+ private int state = XA_STATE_INITIAL;
+ private Xid xid = null;
+
+ private void validateXid(final Xid xid) throws XAException {
+ if (xid == null) {
+ throw new XAException("Null Xid");
+ }
+ if (this.xid == null) {
+ throw new XAException("There is no live transaction for this XAResource");
+ }
+ if (!xid.equals(this.xid)) {
+ throw new XAException("Given Xid is not that associated with this XAResource object");
+ }
+ }
+
+ @Override public void commit(final Xid xid, final boolean onePhase) throws XAException {
+ if (onePhase && state == XA_STATE_PREPARED) {
+ throw new XAException("Transaction is in a 2-phase state when 1-phase is requested");
+ }
+
+ if ((!onePhase) && state != XA_STATE_PREPARED) {
+ throw new XAException("Attempt to do a 2-phase commit when " + "transaction is not prepared");
+ }
+
+ dispose();
+ }
+
+ private void dispose() throws XAException {
+ state = XA_STATE_DISPOSED;
+ xid = null;
+ }
+
+ @Override public void end(final Xid xid, final int flags) throws XAException {
+
+ validateXid(xid);
+
+ if (state != XA_STATE_STARTED) {
+ throw new XAException("Invalid XAResource state");
+ }
+
+ state = XA_STATE_ENDED;
+ }
+
+ @Override public void forget(Xid xid) throws XAException {
+ validateXid(xid);
+
+ if (state != XA_STATE_PREPARED) {
+ throw new XAException("Attempted to forget a XAResource that " + "is not in a heuristically completed state");
+ }
+
+ dispose();
+
+ state = XA_STATE_INITIAL;
+ }
+
+ @Override public int getTransactionTimeout() throws XAException {
+ throw new XAException("Transaction timeouts not implemented yet");
+ }
+
+ @Override public boolean isSameRM(final XAResource xares) throws XAException {
+ return xares == this;
+ }
+
+ @Override public int prepare(final Xid xid) throws XAException {
+ if (state != XA_STATE_ENDED) {
+ throw new XAException("Invalid XAResource state");
+ }
+
+ state = XA_STATE_PREPARED;
+
+ if (fail) {
+ throw new XAException("oops");
+ }
+
+ return XA_OK;
+ }
+
+ @Override public Xid[] recover(final int flag) throws XAException {
+ return new Xid[0];
+ }
+
+ @Override public void rollback(Xid xid) throws XAException {
+ if (state != XA_STATE_PREPARED && state != XA_STATE_ENDED) {
+ throw new XAException("Invalid XAResource state");
+ }
+ dispose();
+ }
+
+ @Override public boolean setTransactionTimeout(final int seconds) throws XAException {
+ return false;
+ }
+
+ @Override public void start(final Xid xid, final int flags) throws XAException {
+ if (state != XA_STATE_INITIAL && state != XA_STATE_DISPOSED) {
+ throw new XAException("Invalid XAResource state");
+ }
+
+ if (xid == null) {
+ throw new XAException("Null Xid");
+ }
+
+ this.xid = xid;
+ state = XA_STATE_STARTED;
+ }
+ });
+ } catch (final RollbackException | SystemException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public Movie find() {
+ return em.createQuery("select e from Movie e", Movie.class).getResultList().iterator().next();
+ }
+
+ public void fail() {
+ fail = true;
+ }
+
+ public void reset() {
+ fail = false;
+ before = false;
+ }
+
+ public void before() {
+ before = true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/bbc61e0b/examples/xa-datasource/src/test/java/org/superbiz/injection/jpa/MoviesXATest.java
----------------------------------------------------------------------
diff --git a/examples/xa-datasource/src/test/java/org/superbiz/injection/jpa/MoviesXATest.java b/examples/xa-datasource/src/test/java/org/superbiz/injection/jpa/MoviesXATest.java
new file mode 100644
index 0000000..f396c82
--- /dev/null
+++ b/examples/xa-datasource/src/test/java/org/superbiz/injection/jpa/MoviesXATest.java
@@ -0,0 +1,242 @@
+package org.superbiz.injection.jpa;
+
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.loader.Files;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.EJB;
+import javax.ejb.EJBException;
+import java.io.File;
+import java.util.Properties;
+
+import static java.lang.Math.abs;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(ApplicationComposer.class)
+public class MoviesXATest {
+ @Module
+ @Classes(value = { MoviesXA.class, Movies.class, MoviesDirect.class })
+ public EjbJar app() {
+ return new EjbJar();
+ }
+
+ @Module
+ public PersistenceUnit jpa() {
+ final PersistenceUnit unit = new PersistenceUnit("movie-unit");
+ unit.setJtaDataSource("movieDatabase");
+ unit.setNonJtaDataSource("movieDatabaseUnmanaged");
+ unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema");
+ unit.addClass(Movie.class);
+ return unit;
+ }
+
+ @Configuration
+ public Properties config() {
+ final String db = "target/test + " + abs(System.nanoTime());
+ Files.deleteOnExit(new File(db));
+
+ final Properties p = new Properties();
+
+ p.put("movieDatabaseXA", "new://Resource?type=javax.sql.XADataSource&class-name=org.apache.derby.jdbc.EmbeddedXADataSource");
+ p.put("movieDatabaseXA.DatabaseName", db);
+ p.put("movieDatabaseXA.CreateDatabase", "create");
+
+ p.put("movieDatabase", "new://Resource?type=DataSource");
+ p.put("movieDatabase.XaDataSource", "movieDatabaseXA");
+ p.put("movieDatabase.JtaManaged", "true");
+ p.put("movieDatabase.UserName", "admin");
+ p.put("movieDatabase.Password", "admin");
+ p.put("movieDatabase.MaxActive", "128");
+ p.put("movieDatabase.MaxIdle", "25");
+ p.put("movieDatabase.MinIdle", "10");
+ p.put("movieDatabase.AccessToUnderlyingConnectionAllowed", "true");
+ p.put("movieDatabase.TestOnBorrow", "false");
+ p.put("movieDatabase.TestWhileIdle", "true");
+ p.put("movieDatabase.TimeBetweenEvictionRuns", "1 minute");
+ p.put("movieDatabase.MaxWaitTime", "0 seconds");
+ p.put("movieDatabase.PoolPreparedStatements", "true");
+ p.put("movieDatabase.MaxOpenPreparedStatements", "1024");
+ p.put("movieDatabase.ValidationQuery", "values 1");
+
+ p.put("movieDatabaseUnmanaged", "new://Resource?type=DataSource");
+ p.put("movieDatabaseUnmanaged.LogSql", "true");
+ p.put("movieDatabaseUnmanaged.JdbcDriver", "org.apache.derby.jdbc.EmbeddedDriver");
+ p.put("movieDatabaseUnmanaged.JdbcUrl", "jdbc:derby:" + db + ";create=true");
+ p.put("movieDatabaseUnmanaged.UserName", "admin");
+ p.put("movieDatabaseUnmanaged.Password", "admin");
+ p.put("movieDatabaseUnmanaged.JtaManaged", "false");
+ p.put("movieDatabaseUnmanaged.MaxActive", "128");
+ p.put("movieDatabaseUnmanaged.MaxIdle", "25");
+ p.put("movieDatabaseUnmanaged.MinIdle", "10");
+ p.put("movieDatabaseUnmanaged.AccessToUnderlyingConnectionAllowed", "true");
+ p.put("movieDatabaseUnmanaged.TestOnBorrow", "false");
+ p.put("movieDatabaseUnmanaged.TestWhileIdle", "true");
+ p.put("movieDatabaseUnmanaged.TimeBetweenEvictionRuns", "1 minute");
+ p.put("movieDatabaseUnmanaged.MaxWaitTime", "0 seconds");
+ p.put("movieDatabaseUnmanaged.PoolPreparedStatements", "true");
+ p.put("movieDatabaseUnmanaged.MaxOpenPreparedStatements", "1024");
+ p.put("movieDatabaseUnmanaged.ValidationQuery", "values 1");
+
+ /*
+
+ Configuration for MS SQL Server
+
+ p.put("movieDatabaseXA", "new://Resource?type=javax.sql.XADataSource&class-name=com.microsoft.sqlserver.jdbc.SQLServerXADataSource");
+ p.put("movieDatabaseXA.DatabaseName", "moviefun");
+ p.put("movieDatabaseXA.URL", "jdbc:sqlserver://localhost:1433;databaseName=moviefun;SelectMethod=cursor;sendStringParametersAsUnicode=false");
+
+ p.put("movieDatabase", "new://Resource?type=DataSource");
+ p.put("movieDatabase.XaDataSource", "movieDatabaseXA");
+ p.put("movieDatabase.UserName", "sa");
+ p.put("movieDatabase.Password", "XXX");
+ p.put("movieDatabase.JtaManaged", "true");
+ p.put("movieDatabase.MaxActive", "128");
+ p.put("movieDatabase.MaxIdle", "25");
+ p.put("movieDatabase.MinIdle", "10");
+ p.put("movieDatabase.AccessToUnderlyingConnectionAllowed", "true");
+ p.put("movieDatabase.TestOnBorrow", "false");
+ p.put("movieDatabase.TestWhileIdle", "true");
+ p.put("movieDatabase.TimeBetweenEvictionRuns", "1 minute");
+ p.put("movieDatabase.MaxWaitTime", "0 seconds");
+ p.put("movieDatabase.PoolPreparedStatements", "true");
+ p.put("movieDatabase.MaxOpenPreparedStatements", "1024");
+ p.put("movieDatabase.ValidationQuery", "select 1");
+
+ p.put("movieDatabaseUnmanaged", "new://Resource?type=DataSource");
+ p.put("movieDatabaseUnmanaged.LogSql", "true");
+ p.put("movieDatabaseUnmanaged.JdbcDriver", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
+ p.put("movieDatabaseUnmanaged.JdbcUrl", "jdbc:sqlserver://localhost:1433;databaseName=moviefun;SelectMethod=cursor;sendStringParametersAsUnicode=false");
+ p.put("movieDatabaseUnmanaged.UserName", "sa");
+ p.put("movieDatabaseUnmanaged.Password", "XXX");
+ p.put("movieDatabaseUnmanaged.JtaManaged", "false");
+ p.put("movieDatabaseUnmanaged.MaxActive", "128");
+ p.put("movieDatabaseUnmanaged.MaxIdle", "25");
+ p.put("movieDatabaseUnmanaged.MinIdle", "10");
+ p.put("movieDatabaseUnmanaged.AccessToUnderlyingConnectionAllowed", "true");
+ p.put("movieDatabaseUnmanaged.TestOnBorrow", "false");
+ p.put("movieDatabaseUnmanaged.TestWhileIdle", "true");
+ p.put("movieDatabaseUnmanaged.TimeBetweenEvictionRuns", "1 minute");
+ p.put("movieDatabaseUnmanaged.MaxWaitTime", "0 seconds");
+ p.put("movieDatabaseUnmanaged.PoolPreparedStatements", "true");
+ p.put("movieDatabaseUnmanaged.MaxOpenPreparedStatements", "1024");
+ p.put("movieDatabaseUnmanaged.ValidationQuery", "select 1");
+
+ p.put("movieDatabaseXA", "new://Resource?type=javax.sql.XADataSource&class-name=oracle.jdbc.xa.client.OracleXADataSource");
+ p.put("movieDatabaseXA.url", "jdbc:oracle:thin:@//localhost:1521/orcl");
+
+ */
+
+ /*
+
+ Configuration for Oracle
+
+ p.put("movieDatabase", "new://Resource?type=DataSource");
+ p.put("movieDatabase.XaDataSource", "movieDatabaseXA");
+ p.put("movieDatabase.JtaManaged", "true");
+ p.put("movieDatabase.UserName", "system");
+ p.put("movieDatabase.Password", "oracle");
+ p.put("movieDatabase.MaxActive", "128");
+ p.put("movieDatabase.MaxIdle", "25");
+ p.put("movieDatabase.MinIdle", "10");
+ p.put("movieDatabase.AccessToUnderlyingConnectionAllowed", "true");
+ p.put("movieDatabase.TestOnBorrow", "false");
+ p.put("movieDatabase.TestWhileIdle", "true");
+ p.put("movieDatabase.TimeBetweenEvictionRuns", "1 minute");
+ p.put("movieDatabase.MaxWaitTime", "0 seconds");
+ p.put("movieDatabase.PoolPreparedStatements", "true");
+ p.put("movieDatabase.MaxOpenPreparedStatements", "1024");
+ p.put("movieDatabase.ValidationQuery", "select 1 from dual");
+
+ p.put("movieDatabaseUnmanaged", "new://Resource?type=DataSource");
+ p.put("movieDatabaseUnmanaged.LogSql", "true");
+ p.put("movieDatabaseUnmanaged.JdbcDriver", "oracle.jdbc.driver.OracleDriver");
+ p.put("movieDatabaseUnmanaged.JdbcUrl", "jdbc:oracle:thin:@//localhost:1521/orcl");
+ p.put("movieDatabaseUnmanaged.UserName", "system");
+ p.put("movieDatabaseUnmanaged.Password", "oracle");
+ p.put("movieDatabaseUnmanaged.JtaManaged", "false");
+ p.put("movieDatabaseUnmanaged.MaxActive", "128");
+ p.put("movieDatabaseUnmanaged.MaxIdle", "25");
+ p.put("movieDatabaseUnmanaged.MinIdle", "10");
+ p.put("movieDatabaseUnmanaged.AccessToUnderlyingConnectionAllowed", "true");
+ p.put("movieDatabaseUnmanaged.TestOnBorrow", "false");
+ p.put("movieDatabaseUnmanaged.TestWhileIdle", "true");
+ p.put("movieDatabaseUnmanaged.TimeBetweenEvictionRuns", "1 minute");
+ p.put("movieDatabaseUnmanaged.MaxWaitTime", "0 seconds");
+ p.put("movieDatabaseUnmanaged.PoolPreparedStatements", "true");
+ p.put("movieDatabaseUnmanaged.MaxOpenPreparedStatements", "1024");
+ p.put("movieDatabaseUnmanaged.ValidationQuery", "select 1 from dual");
+
+ */
+
+ System.out.println("Using db: " + db);
+
+ return p;
+ }
+
+ @EJB
+ private Movies movies;
+
+ @EJB
+ private MoviesDirect moviesDirect;
+
+ @EJB
+ private MoviesXA runner;
+
+ @Test
+ public void run() throws Exception {
+ movies.deleteAll();
+
+ runner.reset();
+
+ final Movie movie = new Movie();
+ movie.setTitle("Bad Boys");
+ movie.setDirector("Michael Bay");
+ movie.setYear(1995);
+
+ runner.run(movie);
+ assertEquals(1, moviesDirect.count());
+
+ final Movie storedMovie = runner.find();
+ assertNotNull(storedMovie);
+ }
+
+ @Test
+ public void failBefore() {
+ runner.before();
+ doFail();
+ }
+
+ @Test
+ public void failAfter() {
+ doFail();
+ }
+
+ private void doFail() {
+ runner.fail();
+ try {
+ final Movie movie = new Movie();
+ movie.setTitle("Bad Boys");
+ movie.setDirector("Michael Bay");
+ movie.setYear(1995);
+
+ runner.run(movie);
+ } catch (final EJBException ee) {
+ System.out.flush();
+ System.err.flush();
+ System.out.println("Exception ->");
+ ee.printStackTrace();
+ System.out.println();
+ System.out.flush();
+ System.err.flush();
+ }
+
+ assertEquals(0, moviesDirect.count());
+ }
+}