Author: rmannibucau
Date: Fri Mar 15 14:31:53 2013
New Revision: 1456967

URL: http://svn.apache.org/r1456967
Log:
TOMEE-798 handling re-creation of queries object when not under a transaction 
to be sure the query uses the right em and then the context is correctly closed 
after the invocation

Added:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java
    
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/jpa/
    
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/jpa/JTAPuAndBmtTest.java
Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaQuery.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaTypedQuery.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
    tomee/tomee/trunk/pom.xml

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java?rev=1456967&r1=1456966&r2=1456967&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
 Fri Mar 15 14:31:53 2013
@@ -16,11 +16,11 @@
  */
 package org.apache.openejb.persistence;
 
-import org.apache.openejb.BeanContext;
-import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.core.ivm.IntraVmArtifact;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
+import org.apache.openejb.util.reflection.Reflections;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -35,6 +35,8 @@ import javax.persistence.criteria.Criter
 import javax.persistence.metamodel.Metamodel;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
@@ -54,6 +56,15 @@ public class JtaEntityManager implements
 
     private static final Logger baseLogger = 
Logger.getInstance(LogCategory.OPENEJB.createChild("persistence"), 
JtaEntityManager.class);
 
+    private static final Method CREATE_NAMED_QUERY_FROM_NAME = 
Reflections.findMethod("createNamedQuery", EntityManager.class, String.class);
+    private static final Method CREATE_QUERY_FROM_NAME = 
Reflections.findMethod("createQuery", EntityManager.class, String.class);
+    private static final Method CREATE_NATIVE_FROM_NAME = 
Reflections.findMethod("createNativeQuery", EntityManager.class, String.class);
+    private static final Method CREATE_NAMED_QUERY_FROM_NAME_CLASS = 
Reflections.findMethod("createNamedQuery", EntityManager.class, String.class, 
Class.class);
+    private static final Method CREATE_QUERY_FROM_NAME_CLASS = 
Reflections.findMethod("createQuery", EntityManager.class, String.class, 
Class.class);
+    private static final Method CREATE_QUERY_FROM_CRITERIA = 
Reflections.findMethod("createQuery", EntityManager.class, CriteriaQuery.class);
+    private static final Method CREATE_NATIVE_FROM_NAME_CLASS = 
Reflections.findMethod("createNativeQuery", EntityManager.class, String.class, 
Class.class);
+    private static final Method CREATE_NATIVE_FROM_NAME_MAPPING = 
Reflections.findMethod("createNativeQuery", EntityManager.class, String.class, 
String.class);
+
     private final JtaEntityManagerRegistry registry;
     private final EntityManagerFactory entityManagerFactory;
     private final Map properties;
@@ -259,9 +270,7 @@ public class JtaEntityManager implements
     public Query createQuery(String qlString) {
         final Timer timer = Op.createQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            Query query = entityManager.createQuery(qlString);
-            return proxyIfNoTx(entityManager, query);
+            return proxyIfNoTx(CREATE_QUERY_FROM_NAME, qlString);
         } finally {
             timer.stop();
         }
@@ -270,9 +279,7 @@ public class JtaEntityManager implements
     public Query createNamedQuery(String name) {
         final Timer timer = Op.createNamedQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            Query query = entityManager.createNamedQuery(name);
-            return proxyIfNoTx(entityManager, query);
+            return proxyIfNoTx(CREATE_NAMED_QUERY_FROM_NAME, name);
         } finally {
             timer.stop();
         }
@@ -281,9 +288,7 @@ public class JtaEntityManager implements
     public Query createNativeQuery(String sqlString) {
         final Timer timer = Op.createNativeQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            Query query = entityManager.createNativeQuery(sqlString);
-            return proxyIfNoTx(entityManager, query);
+            return proxyIfNoTx(CREATE_NATIVE_FROM_NAME, sqlString);
         } finally {
             timer.stop();
         }
@@ -292,9 +297,7 @@ public class JtaEntityManager implements
     public Query createNativeQuery(String sqlString, Class resultClass) {
         final Timer timer = Op.createNativeQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            Query query = entityManager.createNativeQuery(sqlString, 
resultClass);
-            return proxyIfNoTx(entityManager, query);
+            return proxyIfNoTx(CREATE_NATIVE_FROM_NAME_CLASS, sqlString, 
resultClass);
         } finally {
             timer.stop();
         }
@@ -303,26 +306,38 @@ public class JtaEntityManager implements
     public Query createNativeQuery(String sqlString, String resultSetMapping) {
         final Timer timer = Op.createNativeQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            Query query = entityManager.createNativeQuery(sqlString, 
resultSetMapping);
-            return proxyIfNoTx(entityManager, query);
+            return proxyIfNoTx(CREATE_NATIVE_FROM_NAME_MAPPING, sqlString, 
resultSetMapping);
         } finally {
             timer.stop();
         }
     }
 
-    private Query proxyIfNoTx(EntityManager entityManager, Query query) {
+    private Query proxyIfNoTx(Method method, Object... args) {
         if (!extended && !isTransactionActive()) {
-            return new JtaQuery(entityManager, this, query);
+            return new JtaQuery(getEntityManager(), this, method, args);
         }
-        return query;
+        return createQuery(Query.class, getEntityManager(), method, args);
     }
     
-    private <T> TypedQuery<T> proxyIfNoTx(EntityManager entityManager, 
TypedQuery<T> query) {
+    private <T> TypedQuery<T> typedProxyIfNoTx(Method method, Object... args) {
         if (!extended && !isTransactionActive()) {
-            return new JtaTypedQuery<T>(entityManager, this, query);
+            return new JtaTypedQuery<T>(getEntityManager(), this, method, 
args);
+        }
+        return createQuery(TypedQuery.class, getEntityManager(), method, args);
+    }
+
+    <T> T createQuery(final Class<T> expected, final EntityManager 
entityManager, final Method method, Object... args) {
+        try {
+            return expected.cast(method.invoke(entityManager, args));
+        } catch (IllegalAccessException e) {
+            throw new IllegalStateException(e);
+        } catch (InvocationTargetException e) {
+            final Throwable t = e.getCause();
+            if (RuntimeException.class.isInstance(t)) {
+                throw RuntimeException.class.cast(t);
+            }
+            throw new OpenEJBRuntimeException(t.getMessage(), t);
         }
-        return query;
     }
 
     public void joinTransaction() {
@@ -356,9 +371,7 @@ public class JtaEntityManager implements
     public <T> TypedQuery<T> createNamedQuery(String name, Class<T> 
resultClass) {
         final Timer timer = Op.createNamedQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            TypedQuery<T> query = entityManager.createNamedQuery(name, 
resultClass);
-            return proxyIfNoTx(entityManager, query);
+            return typedProxyIfNoTx(CREATE_NAMED_QUERY_FROM_NAME_CLASS, name, 
resultClass);
         } finally {
             timer.stop();
         }
@@ -369,9 +382,7 @@ public class JtaEntityManager implements
     public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {
         final Timer timer = Op.createQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            TypedQuery<T> query = entityManager.createQuery(criteriaQuery);
-            return proxyIfNoTx(entityManager, query);
+            return typedProxyIfNoTx(CREATE_QUERY_FROM_CRITERIA, criteriaQuery);
         } finally {
             timer.stop();
         }
@@ -382,9 +393,7 @@ public class JtaEntityManager implements
     public <T> TypedQuery<T> createQuery(String qlString, Class<T> 
resultClass) {
         final Timer timer = Op.createQuery.start(this);
         try {
-            EntityManager entityManager = getEntityManager();
-            TypedQuery<T> query = entityManager.createQuery(qlString, 
resultClass);
-            return proxyIfNoTx(entityManager, query);
+            return typedProxyIfNoTx(CREATE_QUERY_FROM_NAME_CLASS, qlString, 
resultClass);
         } finally {
             timer.stop();
         }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaQuery.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaQuery.java?rev=1456967&r1=1456966&r2=1456967&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaQuery.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaQuery.java
 Fri Mar 15 14:31:53 2013
@@ -22,7 +22,10 @@ import javax.persistence.LockModeType;
 import javax.persistence.Parameter;
 import javax.persistence.Query;
 import javax.persistence.TemporalType;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -33,22 +36,44 @@ import java.util.Set;
  * when the query is finished.  This implementation is only for 
non-transaction queryies
  */
 public class JtaQuery implements Query {
-    private final EntityManager entityManager;
+    private EntityManager entityManager;
+    private final Object[] args;
+    private final Method method;
     private final JtaEntityManager jtaEntityManager;
-    private final Query query;
+    private final Collection<QueryOperation> appliedOperations = new 
ArrayList<QueryOperation>();
 
-    public JtaQuery(EntityManager entityManager, JtaEntityManager 
jtaEntityManager, Query query) {
+    private boolean underTx = false;
+    private Query query = null;
+
+    public JtaQuery(EntityManager entityManager, JtaEntityManager 
jtaEntityManager, Method method, Object... args) {
         this.entityManager = entityManager;
         this.jtaEntityManager = jtaEntityManager;
-        this.query = query;
+        this.method = method;
+        this.args = args;
+        this.underTx = jtaEntityManager.isTransactionActive();
+        createQuery();
+    }
+
+    private void createQuery() {
+        query = jtaEntityManager.createQuery(queryType(), entityManager, 
method, args);
+        if (!underTx) {
+            for (final QueryOperation op : appliedOperations) {
+                query = op.apply(query);
+            }
+        }
+    }
+
+    protected Class<? extends Query> queryType() {
+        return Query.class;
     }
 
     private EntityManager getEntityManager() {
-        EntityManager em = entityManager;
-        if (!jtaEntityManager.isTransactionActive()) {
-            em = jtaEntityManager.getEntityManager();
+        if (!underTx) {
+            entityManager = jtaEntityManager.getEntityManager();
+            this.underTx = jtaEntityManager.isTransactionActive();
+            createQuery();
         }
-        return em;
+        return entityManager;
     }
 
     public List getResultList() {
@@ -78,53 +103,133 @@ public class JtaQuery implements Query {
         }
     }
 
-    public Query setMaxResults(int i) {
+    public Query setMaxResults(final int i) {
         query.setMaxResults(i);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setMaxResults(i);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setFirstResult(int i) {
+    public Query setFirstResult(final int i) {
         query.setFirstResult(i);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setFirstResult(i);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setFlushMode(FlushModeType flushModeType) {
+    public Query setFlushMode(final FlushModeType flushModeType) {
         query.setFlushMode(flushModeType);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setFlushMode(flushModeType);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setHint(String s, Object o) {
+    public Query setHint(final String s, final Object o) {
         query.setHint(s, o);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setHint(s, o);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setParameter(String s, Object o) {
+    public Query setParameter(final String s, final Object o) {
         query.setParameter(s, o);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(s, o);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setParameter(String s, Date date, TemporalType temporalType) {
+    public Query setParameter(final String s, final Date date, final 
TemporalType temporalType) {
         query.setParameter(s, date, temporalType);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(s, date, temporalType);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setParameter(String s, Calendar calendar, TemporalType 
temporalType) {
+    public Query setParameter(final String s, final Calendar calendar, final 
TemporalType temporalType) {
         query.setParameter(s, calendar, temporalType);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(s, calendar, temporalType);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setParameter(int i, Object o) {
+    public Query setParameter(final int i, final Object o) {
         query.setParameter(i, o);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(i, o);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setParameter(int i, Date date, TemporalType temporalType) {
+    public Query setParameter(final int i, final Date date, final TemporalType 
temporalType) {
         query.setParameter(i, date, temporalType);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(i, date, temporalType);
+                }
+            });
+        }
         return this;
     }
 
-    public Query setParameter(int i, Calendar calendar, TemporalType 
temporalType) {
+    public Query setParameter(final int i, final Calendar calendar, final 
TemporalType temporalType) {
         query.setParameter(i, calendar, temporalType);
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(i, calendar, temporalType);
+                }
+            });
+        }
         return this;
     }
 
@@ -230,28 +335,60 @@ public class JtaQuery implements Query {
     /* (non-Javadoc)
      * @see javax.persistence.Query#setLockMode(javax.persistence.LockModeType)
      */
-    public Query setLockMode(LockModeType lockMode) {
+    public Query setLockMode(final LockModeType lockMode) {
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setLockMode(lockMode);
+                }
+            });
+        }
         return query.setLockMode(lockMode);
     }
 
     /* (non-Javadoc)
      * @see javax.persistence.Query#setParameter(javax.persistence.Parameter, 
java.lang.Object)
      */
-    public <T> Query setParameter(Parameter<T> param, T value) {
+    public <T> Query setParameter(final Parameter<T> param, final T value) {
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(param, value);
+                }
+            });
+        }
         return query.setParameter(param, value);
     }
 
     /* (non-Javadoc)
      * @see javax.persistence.Query#setParameter(javax.persistence.Parameter, 
java.util.Calendar, javax.persistence.TemporalType)
      */
-    public Query setParameter(Parameter<Calendar> param, Calendar value, 
TemporalType temporalType) {
+    public Query setParameter(final Parameter<Calendar> param, final Calendar 
value, final TemporalType temporalType) {
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(param, value, temporalType);
+                }
+            });
+        }
         return query.setParameter(param, value, temporalType);
     }
 
     /* (non-Javadoc)
      * @see javax.persistence.Query#setParameter(javax.persistence.Parameter, 
java.util.Date, javax.persistence.TemporalType)
      */
-    public Query setParameter(Parameter<Date> param, Date value, TemporalType 
temporalType) {
+    public Query setParameter(final Parameter<Date> param, final Date value, 
final TemporalType temporalType) {
+        if (!underTx) {
+            appliedOperations.add(new QueryOperation() {
+                @Override
+                public Query apply(final Query query) {
+                    return query.setParameter(param, value, temporalType);
+                }
+            });
+        }
         return query.setParameter(param, value, temporalType);
     }
 

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaTypedQuery.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaTypedQuery.java?rev=1456967&r1=1456966&r2=1456967&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaTypedQuery.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaTypedQuery.java
 Fri Mar 15 14:31:53 2013
@@ -23,6 +23,7 @@ import javax.persistence.Parameter;
 import javax.persistence.Query;
 import javax.persistence.TemporalType;
 import javax.persistence.TypedQuery;
+import java.lang.reflect.Method;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
@@ -33,8 +34,13 @@ import java.util.List;
  */
 public class JtaTypedQuery<X> extends JtaQuery implements TypedQuery<X> {
 
-    public JtaTypedQuery(EntityManager entityManager, JtaEntityManager jtaEm, 
Query query) {
-        super(entityManager, jtaEm, query);
+    public JtaTypedQuery(EntityManager entityManager, JtaEntityManager jtaEm, 
Method method, Object... args) {
+        super(entityManager, jtaEm, method, args);
+    }
+
+    @Override
+    protected Class<? extends Query> queryType() {
+        return TypedQuery.class;
     }
 
     @SuppressWarnings("unchecked")
@@ -56,7 +62,7 @@ public class JtaTypedQuery<X> extends Jt
     }
 
     @Override
-    public TypedQuery<X> setFlushMode(FlushModeType flushModeType) {
+    public TypedQuery<X> setFlushMode(final FlushModeType flushModeType) {
         super.setFlushMode(flushModeType);
         return this;
     }

Added: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java?rev=1456967&view=auto
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java
 (added)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/persistence/QueryOperation.java
 Fri Mar 15 14:31:53 2013
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.persistence;
+
+import javax.persistence.Query;
+
+public interface QueryOperation {
+    Query apply(final Query query);
+}

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java?rev=1456967&r1=1456966&r2=1456967&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
 Fri Mar 15 14:31:53 2013
@@ -26,6 +26,14 @@ public final class Reflections {
         // no-op
     }
 
+    public static Method findMethod(final String name, final Class<?> type, 
final Class<?>... args) {
+        try {
+            return type.getMethod(name, args);
+        } catch (NoSuchMethodException e) {
+            throw new IllegalArgumentException("Can't find public method " + 
name + " in " + type.getName());
+        }
+    }
+
     public static Object invokeByReflection(final Object obj, final String 
mtdName, final Class<?>[] paramTypes, final Object[] args) {
         Class<?> clazz = obj.getClass();
         while (clazz != null) {

Added: 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/jpa/JTAPuAndBmtTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/jpa/JTAPuAndBmtTest.java?rev=1456967&view=auto
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/jpa/JTAPuAndBmtTest.java
 (added)
+++ 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/jpa/JTAPuAndBmtTest.java
 Fri Mar 15 14:31:53 2013
@@ -0,0 +1,141 @@
+package org.apache.openejb.jpa;
+
+import org.apache.openejb.jee.Empty;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.jee.jpa.unit.Persistence;
+import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.EJBContext;
+import javax.ejb.LocalBean;
+import javax.ejb.Stateless;
+import javax.ejb.TransactionManagement;
+import javax.ejb.TransactionManagementType;
+import javax.persistence.Entity;
+import javax.persistence.EntityManager;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.util.List;
+import java.util.Properties;
+
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(ApplicationComposer.class)
+public class JTAPuAndBmtTest {
+    @EJB
+    private BmtManager bmtManager;
+
+    @Configuration
+    public Properties config() {
+        final Properties p = new Properties();
+        p.put("JTAPuAndBmtTest", "new://Resource?type=DataSource");
+        p.put("JTAPuAndBmtTest.JdbcDriver", "org.hsqldb.jdbcDriver");
+        p.put("JTAPuAndBmtTest.JdbcUrl", "jdbc:hsqldb:mem:bval");
+        return p;
+    }
+
+    @Module
+    public StatelessBean app() throws Exception {
+        final StatelessBean bean = new StatelessBean(BmtManager.class);
+        bean.setLocalBean(new Empty());
+        return bean;
+    }
+
+    @Module
+    public Persistence persistence() {
+        final PersistenceUnit unit = new PersistenceUnit("foo-unit");
+        unit.addClass(TheEntity.class);
+        unit.setProperty("openjpa.jdbc.SynchronizeMappings", 
"buildSchema(ForeignKeys=true)");
+        unit.getProperties().setProperty("openjpa.RuntimeUnenhancedClasses", 
"supported");
+        unit.setExcludeUnlistedClasses(true);
+
+        final Persistence persistence = new Persistence(unit);
+        persistence.setVersion("2.0");
+        return persistence;
+    }
+
+    @LocalBean
+    @Stateless
+    @TransactionManagement(TransactionManagementType.BEAN)
+    public static class BmtManager {
+        @PersistenceContext
+        private EntityManager em;
+
+        @Resource
+        private EJBContext ctx;
+
+        public TheEntity persist() {
+            try {
+                ctx.getUserTransaction().begin();
+                final TheEntity entity = new TheEntity();
+                entity.setName("name");
+                em.persist(entity);
+                ctx.getUserTransaction().commit();
+                return entity;
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public TheEntity findWithJpQl() {
+            final TypedQuery<TheEntity> query = em.createQuery("select e from 
JTAPuAndBmtTest$TheEntity e", TheEntity.class);
+            query.getResultList(); // to ensure we don't break OPENEJB-1443
+            return query.getResultList().iterator().next();
+        }
+
+        public void update(final TheEntity entity) {
+            entity.setName("new");
+            try {
+                ctx.getUserTransaction().begin();
+                em.merge(entity);
+                ctx.getUserTransaction().commit();
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    @Entity
+    public static class TheEntity {
+        @Id
+        @GeneratedValue
+        private long id;
+        private String name;
+
+        public long getId() {
+            return id;
+        }
+
+        public void setId(long i) {
+            id = i;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String n) {
+            name = n;
+        }
+    }
+
+    @Test
+    public void valid() {
+        assertNotNull(bmtManager.persist());
+
+        final TheEntity entity = bmtManager.findWithJpQl();
+        assertNotNull(entity);
+
+        bmtManager.update(entity); // will throw an exception if any error
+    }
+}

Modified: tomee/tomee/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/pom.xml?rev=1456967&r1=1456966&r2=1456967&view=diff
==============================================================================
--- tomee/tomee/trunk/pom.xml (original)
+++ tomee/tomee/trunk/pom.xml Fri Mar 15 14:31:53 2013
@@ -97,7 +97,7 @@
     <maven-bundle-plugin.version>2.3.7</maven-bundle-plugin.version>
 
     <!-- This is used by a manifest classpath entry -->
-    <xbeanVersion>3.13-SNAPSHOT</xbeanVersion>
+    <xbeanVersion>3.13</xbeanVersion>
 
     <!-- OSGi bundles properties -->
     <openejb.bundle.activator/>


Reply via email to