You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2006/08/26 18:18:52 UTC

svn commit: r437177 - in /geronimo/sandbox/jee5-jta/transaction/src: java/org/apache/geronimo/transaction/jpa/ test/org/apache/geronimo/transaction/jpa/ test/org/apache/geronimo/transaction/mockjpa/

Author: djencks
Date: Sat Aug 26 09:18:51 2006
New Revision: 437177

URL: http://svn.apache.org/viewvc?rev=437177&view=rev
Log:
Add extended EntityManager support

Added:
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java   (contents, props changed)
      - copied, changed from r434167, geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManager.java
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java   (with props)
Removed:
    geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManager.java
Modified:
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java

Added: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java?rev=437177&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java Sat Aug 26 09:18:51 2006
@@ -0,0 +1,163 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jpa;
+
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.Query;
+
+import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class CMPEntityManagerExtended implements EntityManager {
+
+    private final TransactionManagerImpl transactionManager;
+    private final String persistenceUnit;
+    private final EntityManagerFactory entityManagerFactory;
+    private final Map entityManagerProperties;
+    private final InternalCMPEntityManagerExtended entityManager;
+
+    public CMPEntityManagerExtended(TransactionManagerImpl transactionManager, String persistenceUnit, EntityManagerFactory entityManagerFactory, Map entityManagerProperties) {
+        this.transactionManager = transactionManager;
+        this.persistenceUnit = persistenceUnit;
+        this.entityManagerFactory = entityManagerFactory;
+        this.entityManagerProperties = entityManagerProperties;
+        entityManager = getEntityManager();
+    }
+
+    private InternalCMPEntityManagerExtended getEntityManager() {
+        InternalCMPEntityManagerExtended entityManager = EntityManagerExtendedRegistry.getEntityManager(persistenceUnit);
+        if (entityManager == null) {
+            entityManager = createEntityManager();
+            EntityManagerExtendedRegistry.putEntityManager(persistenceUnit, entityManager);
+        }
+        entityManager.registerBean();
+        return entityManager;
+    }
+
+    private InternalCMPEntityManagerExtended createEntityManager() {
+        EntityManager entityManager;
+        if (entityManagerProperties == null) {
+            entityManager = entityManagerFactory.createEntityManager();
+        } else {
+            entityManager = entityManagerFactory.createEntityManager(entityManagerProperties);
+        }
+        return new InternalCMPEntityManagerExtended(entityManager, persistenceUnit, transactionManager);
+    }
+
+    public void beanRemoved() {
+        entityManager.beanRemoved();
+    }
+
+
+    public void persist(Object o) {
+        entityManager.persist(o);
+    }
+
+    public <T>T merge(T t) {
+        return entityManager.merge(t);
+    }
+
+    public void remove(Object o) {
+        entityManager.remove(o);
+    }
+
+    public <T>T find(Class<T> aClass, Object o) {
+        return entityManager.find(aClass, o);
+    }
+
+    public <T>T getReference(Class<T> aClass, Object o) {
+        return entityManager.getReference(aClass, o);
+    }
+
+    public void flush() {
+        entityManager.flush();
+    }
+
+    public void setFlushMode(FlushModeType flushModeType) {
+        entityManager.setFlushMode(flushModeType);
+    }
+
+    public FlushModeType getFlushMode() {
+        return entityManager.getFlushMode();
+    }
+
+    public void lock(Object o, LockModeType lockModeType) {
+        entityManager.lock(o, lockModeType);
+    }
+
+    public void refresh(Object o) {
+        entityManager.refresh(o);
+    }
+
+    public void clear() {
+        entityManager.clear();
+    }
+
+    public boolean contains(Object o) {
+        return entityManager.contains(o);
+    }
+
+    public Query createQuery(String s) {
+        return entityManager.createQuery(s);
+    }
+
+    public Query createNamedQuery(String s) {
+        return entityManager.createNamedQuery(s);
+    }
+
+    public Query createNativeQuery(String s) {
+        return entityManager.createNativeQuery(s);
+    }
+
+    public Query createNativeQuery(String s, Class aClass) {
+        return entityManager.createNativeQuery(s, aClass);
+    }
+
+    public Query createNativeQuery(String s, String s1) {
+        return entityManager.createNativeQuery(s, s1);
+    }
+
+    public void close() {
+        throw new IllegalStateException("You cannot call close on a Container Managed Entity Manager");
+    }
+
+    public boolean isOpen() {
+        return true;
+    }
+
+    public EntityTransaction getTransaction() {
+        throw new IllegalStateException("You cannot call getTransaction on a container managed EntityManager");
+    }
+
+    public void joinTransaction() {
+        throw new IllegalStateException("You cannot call joinTransaction on a container managed EntityManager");
+    }
+
+    public Object getDelegate() {
+        return entityManager.getDelegate();
+    }
+
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerExtended.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java (from r434167, geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManager.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java?p2=geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java&p1=geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManager.java&r1=434167&r2=437177&rev=437177&view=diff
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManager.java (original)
+++ geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java Sat Aug 26 09:18:51 2006
@@ -30,113 +30,288 @@
 
 import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
 import org.apache.geronimo.transaction.manager.TransactionImpl;
-import org.apache.geronimo.transaction.manager.Closeable;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
-public class CMPEntityManager implements EntityManager {
+public class CMPEntityManagerTxScoped implements EntityManager {
 
     private final TransactionManagerImpl transactionManager;
     private final String persistenceUnit;
     private final EntityManagerFactory entityManagerFactory;
     private final Map entityManagerProperties;
-    private final boolean transactionScoped;
 
-    public CMPEntityManager(TransactionManagerImpl transactionManager, String persistenceUnit, EntityManagerFactory entityManagerFactory, Map entityManagerProperties, boolean transactionScoped) {
+    public CMPEntityManagerTxScoped(TransactionManagerImpl transactionManager, String persistenceUnit, EntityManagerFactory entityManagerFactory, Map entityManagerProperties) {
         this.transactionManager = transactionManager;
         this.persistenceUnit = persistenceUnit;
         this.entityManagerFactory = entityManagerFactory;
         this.entityManagerProperties = entityManagerProperties;
-        this.transactionScoped = transactionScoped;
     }
 
     private EntityManager getEntityManager(boolean activeRequired) {
         TransactionImpl transaction = (TransactionImpl) transactionManager.getTransaction();
-        if (transaction == null || (activeRequired && transaction.getStatus() != Status.STATUS_ACTIVE)) {
+        if (activeRequired && (transaction == null || transaction.getStatus() != Status.STATUS_ACTIVE)) {
             throw new TransactionRequiredException("No active transaction");
         }
+        if (transaction == null) {
+            return null;
+        }
         EntityManagerWrapper entityManagerWrapper = (EntityManagerWrapper) transaction.getEntityManager(persistenceUnit);
         if (entityManagerWrapper == null) {
-            EntityManager entityManager;
-            if (entityManagerProperties == null) {
-                entityManager = entityManagerFactory.createEntityManager();
-            } else {
-                entityManager = entityManagerFactory.createEntityManager(entityManagerProperties);
-            }
-            entityManagerWrapper =new EntityManagerWrapper(entityManager, transactionScoped);
+            EntityManager entityManager = createEntityManager();
+            entityManagerWrapper = new EntityManagerWrapperTxScoped(entityManager);
             transaction.setEntityManager(persistenceUnit, entityManagerWrapper);
         }
         return entityManagerWrapper.getEntityManager();
     }
 
+    private EntityManager createEntityManager() {
+        EntityManager entityManager;
+        if (entityManagerProperties == null) {
+            entityManager = entityManagerFactory.createEntityManager();
+        } else {
+            entityManager = entityManagerFactory.createEntityManager(entityManagerProperties);
+        }
+        return entityManager;
+    }
+
 
     public void persist(Object o) {
-        getEntityManager(transactionScoped).persist(o);
+        EntityManager entityManager = getEntityManager(true);
+        if (entityManager != null) {
+            entityManager.persist(o);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                entityManager.persist(o);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public <T>T merge(T t) {
-        return getEntityManager(transactionScoped).merge(t);
+        EntityManager entityManager = getEntityManager(true);
+        if (entityManager != null) {
+            return entityManager.merge(t);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.merge(t);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void remove(Object o) {
-        getEntityManager(transactionScoped).remove(o);
+        EntityManager entityManager = getEntityManager(true);
+        if (entityManager != null) {
+            entityManager.remove(o);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                entityManager.remove(o);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public <T>T find(Class<T> aClass, Object o) {
-        return getEntityManager(false).find(aClass, o);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.find(aClass, o);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.find(aClass, o);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public <T>T getReference(Class<T> aClass, Object o) {
-        return getEntityManager(false).getReference(aClass, o);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.getReference(aClass, o);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.getReference(aClass, o);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void flush() {
-        getEntityManager(false).flush();
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            entityManager.flush();
+        } else {
+            entityManager = createEntityManager();
+            try {
+                entityManager.flush();
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void setFlushMode(FlushModeType flushModeType) {
-        getEntityManager(false).setFlushMode(flushModeType);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+             entityManager.setFlushMode(flushModeType);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                 entityManager.setFlushMode(flushModeType);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public FlushModeType getFlushMode() {
-        return getEntityManager(false).getFlushMode();
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.getFlushMode();
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.getFlushMode();
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void lock(Object o, LockModeType lockModeType) {
-        getEntityManager(false).lock(o, lockModeType);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+             entityManager.lock(o, lockModeType);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                 entityManager.lock(o, lockModeType);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void refresh(Object o) {
-        getEntityManager(transactionScoped).refresh(o);
+        EntityManager entityManager = getEntityManager(true);
+        if (entityManager != null) {
+             entityManager.refresh(o);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                 entityManager.refresh(o);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void clear() {
-        getEntityManager(false).clear();
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+             entityManager.clear();
+        } else {
+            entityManager = createEntityManager();
+            try {
+                 entityManager.clear();
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public boolean contains(Object o) {
-        return getEntityManager(false).contains(o);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.contains(o);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.contains(o);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public Query createQuery(String s) {
-        return getEntityManager(false).createQuery(s);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.createQuery(s);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.createQuery(s);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public Query createNamedQuery(String s) {
-        return getEntityManager(false).createNamedQuery(s);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.createNamedQuery(s);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.createNamedQuery(s);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public Query createNativeQuery(String s) {
-        return getEntityManager(false).createNativeQuery(s);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.createNativeQuery(s);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.createNativeQuery(s);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public Query createNativeQuery(String s, Class aClass) {
-        return getEntityManager(false).createNativeQuery(s, aClass);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.createNativeQuery(s, aClass);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.createNativeQuery(s, aClass);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public Query createNativeQuery(String s, String s1) {
-        return getEntityManager(false).createNativeQuery(s, s1);
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.createNativeQuery(s, s1);
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.createNativeQuery(s, s1);
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
     public void close() {
@@ -144,37 +319,43 @@
     }
 
     public boolean isOpen() {
-        return getEntityManager(false).isOpen();
+        return true;
     }
 
     public EntityTransaction getTransaction() {
-        return getEntityManager(false).getTransaction();
+        throw new IllegalStateException("You cannot call getTransaction on a container managed EntityManager");
     }
 
     public void joinTransaction() {
-        getEntityManager(false).joinTransaction();
+        throw new IllegalStateException("You cannot call joinTransaction on a container managed EntityManager");
     }
 
     public Object getDelegate() {
-        return getEntityManager(false).getDelegate();
+        EntityManager entityManager = getEntityManager(false);
+        if (entityManager != null) {
+            return entityManager.getDelegate();
+        } else {
+            entityManager = createEntityManager();
+            try {
+                return entityManager.getDelegate();
+            } finally {
+                entityManager.close();
+            }
+        }
     }
 
-    private static class EntityManagerWrapper implements Closeable {
+    private static class EntityManagerWrapperTxScoped implements EntityManagerWrapper {
         private final EntityManager entityManager;
-        private final boolean transactionScoped;
 
-        public EntityManagerWrapper(EntityManager entityManager, boolean transactionScoped) {
+        public EntityManagerWrapperTxScoped(EntityManager entityManager) {
             if (entityManager == null) {
                 throw new IllegalArgumentException("Need a non-null entity manager");
             }
             this.entityManager = entityManager;
-            this.transactionScoped = transactionScoped;
         }
 
         public void close() {
-            if (transactionScoped) {
                 entityManager.close();
-            }
         }
 
         public EntityManager getEntityManager() {

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/CMPEntityManagerTxScoped.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java?rev=437177&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java Sat Aug 26 09:18:51 2006
@@ -0,0 +1,66 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jpa;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.transaction.Transaction;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class EntityManagerExtendedRegistry {
+
+    private static final ThreadLocal<Map<String, InternalCMPEntityManagerExtended>> entityManagerMaps = new ThreadLocal<Map<String, InternalCMPEntityManagerExtended>>() {
+        protected Map<String, InternalCMPEntityManagerExtended> initialValue() {
+            return new HashMap<String, InternalCMPEntityManagerExtended>();
+        }
+    };
+
+    public static InternalCMPEntityManagerExtended getEntityManager(String persistenceUnit) {
+        Map<String, InternalCMPEntityManagerExtended> entityManagerMap = entityManagerMaps.get();
+        return entityManagerMap.get(persistenceUnit);
+    }
+
+    public static void putEntityManager(String persistenceUnit, InternalCMPEntityManagerExtended entityManager) {
+        Map<String, InternalCMPEntityManagerExtended> entityManagerMap = entityManagerMaps.get();
+        InternalCMPEntityManagerExtended oldEntityManager = entityManagerMap.put(persistenceUnit, entityManager);
+        if (oldEntityManager != null) {
+            throw new IllegalStateException("There was already an EntityManager registered for persistenceUnit " + persistenceUnit);
+        }
+    }
+
+    public static void clearEntityManager(String persistenceUnit) {
+        Map<String, InternalCMPEntityManagerExtended> entityManagerMap = entityManagerMaps.get();
+        entityManagerMap.remove(persistenceUnit);
+    }
+
+    public static void threadAssociated(Transaction transaction) {
+        Map<String, InternalCMPEntityManagerExtended> entityManagerMap = entityManagerMaps.get();
+        for (Iterator i = entityManagerMap.values().iterator(); i.hasNext(); ) {
+            InternalCMPEntityManagerExtended entityManager = (InternalCMPEntityManagerExtended) i.next();
+            entityManager.joinTransaction();
+        }
+    }
+
+    public static void threadUnassociated(Transaction transaction) {
+        //Any way to unassociate?
+    }
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerExtendedRegistry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java?rev=437177&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java Sat Aug 26 09:18:51 2006
@@ -0,0 +1,31 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jpa;
+
+import javax.persistence.EntityManager;
+
+import org.apache.geronimo.transaction.manager.Closeable;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public interface EntityManagerWrapper extends Closeable {
+
+    EntityManager getEntityManager();
+    
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/EntityManagerWrapper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java?rev=437177&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java Sat Aug 26 09:18:51 2006
@@ -0,0 +1,161 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jpa;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.Query;
+
+import org.apache.geronimo.transaction.manager.TransactionImpl;
+import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
+
+/**
+ * InternalCMPEntityManagerExtended is an EntityManager wrapper that CMPEntityManagerExtended wraps the
+ * real EntityManager with and registers with the transaction.
+ *
+ * @version $Rev$ $Date$
+ */
+public class InternalCMPEntityManagerExtended implements EntityManager, EntityManagerWrapper {
+
+    private final EntityManager entityManager;
+    private final String persistenceUnit;
+    private final TransactionManagerImpl transactionManager;
+    //Does this need to be thread safe???
+    private final AtomicInteger count = new AtomicInteger();
+
+    public InternalCMPEntityManagerExtended(EntityManager entityManager, String persistenceUnit, TransactionManagerImpl transactionManager) {
+        this.entityManager = entityManager;
+        this.persistenceUnit = persistenceUnit;
+        this.transactionManager = transactionManager;
+        if (transactionManager.getTransaction() != null) {
+            joinTransaction();
+        }
+    }
+
+    void registerBean() {
+        count.getAndIncrement();
+    }
+
+    void beanRemoved() {
+        if (count.decrementAndGet() ==0 ) {
+            entityManager.close();
+            EntityManagerExtendedRegistry.clearEntityManager(persistenceUnit);
+        }
+
+    }
+
+    public EntityManager getEntityManager() {
+        return entityManager;
+    }
+
+    public void persist(Object o) {
+        entityManager.persist(o);
+    }
+
+    public <T>T merge(T t) {
+        return entityManager.merge(t);
+    }
+
+    public void remove(Object o) {
+        entityManager.remove(o);
+    }
+
+    public <T>T find(Class<T> aClass, Object o) {
+        return entityManager.find(aClass, o);
+    }
+
+    public <T>T getReference(Class<T> aClass, Object o) {
+        return entityManager.getReference(aClass, o);
+    }
+
+    public void flush() {
+        entityManager.flush();
+    }
+
+    public void setFlushMode(FlushModeType flushModeType) {
+        entityManager.setFlushMode(flushModeType);
+    }
+
+    public FlushModeType getFlushMode() {
+        return entityManager.getFlushMode();
+    }
+
+    public void lock(Object o, LockModeType lockModeType) {
+        entityManager.lock(o, lockModeType);
+    }
+
+    public void refresh(Object o) {
+        entityManager.refresh(o);
+    }
+
+    public void clear() {
+        entityManager.clear();
+    }
+
+    public boolean contains(Object o) {
+        return entityManager.contains(o);
+    }
+
+    public Query createQuery(String s) {
+        return entityManager.createQuery(s);
+    }
+
+    public Query createNamedQuery(String s) {
+        return entityManager.createNamedQuery(s);
+    }
+
+    public Query createNativeQuery(String s) {
+        return entityManager.createNativeQuery(s);
+    }
+
+    public Query createNativeQuery(String s, Class aClass) {
+        return entityManager.createNativeQuery(s, aClass);
+    }
+
+    public Query createNativeQuery(String s, String s1) {
+        return entityManager.createNativeQuery(s, s1);
+    }
+
+    public void close() {
+        //a no-op
+    }
+
+    public boolean isOpen() {
+        return true;
+    }
+
+    public EntityTransaction getTransaction() {
+        throw new IllegalStateException("You cannot call getTransaction on a container managed EntityManager");
+    }
+
+    public void joinTransaction() {
+            TransactionImpl transaction = (TransactionImpl) transactionManager.getTransaction();
+            //This checks section 5.6.3.1, throwing an EJBException if there is already a PersistenceContext.
+            transaction.setEntityManager(persistenceUnit, this);
+        entityManager.joinTransaction();
+    }
+
+    public Object getDelegate() {
+        return entityManager.getDelegate();
+    }
+
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/InternalCMPEntityManagerExtended.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java?rev=437177&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java Sat Aug 26 09:18:51 2006
@@ -0,0 +1,37 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jpa;
+
+import javax.transaction.Transaction;
+
+import org.apache.geronimo.transaction.manager.TransactionManagerMonitor;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class TransactionListener implements TransactionManagerMonitor {
+
+    public void threadAssociated(Transaction transaction) {
+        EntityManagerExtendedRegistry.threadAssociated(transaction);
+    }
+
+    public void threadUnassociated(Transaction transaction) {
+        EntityManagerExtendedRegistry.threadUnassociated(transaction);
+    }
+    
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/java/org/apache/geronimo/transaction/jpa/TransactionListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java?rev=437177&r1=437176&r2=437177&view=diff
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java (original)
+++ geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java Sat Aug 26 09:18:51 2006
@@ -22,6 +22,7 @@
 
 import javax.persistence.EntityManager;
 import javax.persistence.TransactionRequiredException;
+import javax.ejb.EJBException;
 
 import junit.framework.TestCase;
 import org.apache.geronimo.transaction.jta11.GeronimoTransactionManagerJTA11;
@@ -29,7 +30,7 @@
 import org.apache.geronimo.transaction.mockjpa.MockEntityManager;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public class CMPEntityManagerTest extends TestCase {
 
@@ -38,19 +39,153 @@
     private MockEntityManagerFactory entityManagerFactory;
 
     protected void setUp() throws Exception {
-        tm  = new GeronimoTransactionManagerJTA11();
+        tm = new GeronimoTransactionManagerJTA11();
+        tm.addTransactionAssociationListener(new TransactionListener());
         entityManagerFactory = new MockEntityManagerFactory();
     }
 
     /**
+     * section 3.1.1
+     * (not very clear).  getTransaction, joinTransaction throw IllegalStateException
+     */
+    public void testGetTransaction() throws Exception {
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
+        try {
+            entityManager1.getTransaction();
+            fail("Expected IllegalStateException");
+        } catch(IllegalStateException e) {
+            //expected
+        } catch (Exception e) {
+            fail("Wrong exception " + e);
+        }
+        tm.begin();
+        try {
+            entityManager1.getTransaction();
+            fail("Expected IllegalStateException");
+        } catch(IllegalStateException e) {
+            //expected
+        } catch (Exception e) {
+            fail("Wrong exception " + e);
+        }
+        tm.commit();
+    }
+
+    public void testJoinTransaction() throws Exception {
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
+        try {
+            entityManager1.joinTransaction();
+            fail("Expected IllegalStateException");
+        } catch(IllegalStateException e) {
+            //expected
+        } catch (Exception e) {
+            fail("Wrong exception " + e);
+        }
+        tm.begin();
+        try {
+            entityManager1.joinTransaction();
+            fail("Expected IllegalStateException");
+        } catch(IllegalStateException e) {
+            //expected
+        } catch (Exception e) {
+            fail("Wrong exception " + e);
+        }
+        tm.commit();
+    }
+
+    /**
+     * section 3.1.1 ????
+     * isOpen returns true
+     */
+    public void testIsOpen() throws Exception {
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
+        assertTrue(entityManager1.isOpen());
+        tm.begin();
+        assertTrue(entityManager1.isOpen());
+        tm.commit();
+        assertTrue(entityManager1.isOpen());
+        tm.begin();
+        assertTrue(entityManager1.isOpen());
+        tm.rollback();
+        assertTrue(entityManager1.isOpen());
+    }
+
+    /**
+     * section 5.6.2
+     * extended context is closed when the SFSB that caused it is removed
+     */
+    public void testExtendedClosedOnBeanRemove() throws Exception {
+        CMPEntityManagerExtended entityManager1 = new CMPEntityManagerExtended(tm, persistenceUnit, entityManagerFactory, null);
+        MockEntityManager pc1 = (MockEntityManager) entityManager1.find(EntityManager.class, "this");
+        assertTrue("base EntityManager should not be closed", !pc1.isClosed());
+        assertNotNull("InternalEntityManager should be registered", EntityManagerExtendedRegistry.getEntityManager(persistenceUnit));
+        entityManager1.beanRemoved();
+        assertTrue("base EntityManager should be closed", pc1.isClosed());
+        assertNull("InternalEntityManager should not be registered", EntityManagerExtendedRegistry.getEntityManager(persistenceUnit));
+    }
+
+    /**
+     * section 5.6.2.1
+     * extended context is closed when the SFSB that caused it and all others that share it are removed
+     */
+    public void testInheritedExtendedClosedOnBeanRemove() throws Exception {
+        CMPEntityManagerExtended entityManager1 = new CMPEntityManagerExtended(tm, persistenceUnit, entityManagerFactory, null);
+        MockEntityManager pc1 = (MockEntityManager) entityManager1.find(EntityManager.class, "this");
+        assertTrue("base EntityManager should not be closed", !pc1.isClosed());
+        InternalCMPEntityManagerExtended internalEntityManager1 = EntityManagerExtendedRegistry.getEntityManager(persistenceUnit);
+        assertNotNull("InternalEntityManager should be registered", internalEntityManager1);
+        CMPEntityManagerExtended entityManager2 = new CMPEntityManagerExtended(tm, persistenceUnit, entityManagerFactory, null);
+        InternalCMPEntityManagerExtended internalEntityManager2 = EntityManagerExtendedRegistry.getEntityManager(persistenceUnit);
+        //we should have got an exception if this isn't true
+        assertSame("2nd entity manager registering should use same internal entity manager", internalEntityManager1, internalEntityManager2);
+        MockEntityManager pc2 = (MockEntityManager) entityManager2.find(EntityManager.class, "this");
+        assertSame("2nd entity manager registering should use same mock entity manager", pc1, pc2);
+
+        //remove one bean, internal and mock entity managers should not change state
+        entityManager1.beanRemoved();
+        assertTrue("base EntityManager should not be closed", !pc1.isClosed());
+        assertNotNull("InternalEntityManager should be registered", EntityManagerExtendedRegistry.getEntityManager(persistenceUnit));
+
+        //close other bean, everything should close and unregister
+        entityManager2.beanRemoved();
+        assertTrue("base EntityManager should be closed", pc1.isClosed());
+        assertNull("InternalEntityManager should not be registered", EntityManagerExtendedRegistry.getEntityManager(persistenceUnit));
+    }
+
+    /**
+     * section 5.6.3.1
+     * Trying to propagate a JTA tx with a persistence context bound into a SFSB with Extended persistence context
+     * results in an EJBException
+     */
+    public void testNoSimultaneousEntityManagers() throws Exception {
+        //set up the extended persistence context:
+        CMPEntityManagerExtended entityManager1 = new CMPEntityManagerExtended(tm, persistenceUnit, entityManagerFactory, null);
+        //set up the caller
+        CMPEntityManagerTxScoped entityManager2 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
+        tm.begin();
+        //register the caller
+        MockEntityManager pc1 = (MockEntityManager) entityManager2.find(EntityManager.class, "this");
+        //caller calling SFSB means entityManager1 tries to join the trasaction:
+        InternalCMPEntityManagerExtended internalEntityManager = EntityManagerExtendedRegistry.getEntityManager(persistenceUnit);
+        try {
+            internalEntityManager.joinTransaction();
+            fail("Expected EJBException");
+        } catch (EJBException e) {
+            //expected
+        } catch (Exception e) {
+            fail("Unexpected exception " + e);
+        }
+        tm.commit();
+    }
+
+    /**
      * section 5.8.2
      * use the same persistence context for all work in a tx
      */
     public void testSamePersistenceContext() throws Exception {
         tm.begin();
-        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         EntityManager pc1 = entityManager1.find(EntityManager.class, "this");
-        CMPEntityManager entityManager2 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager2 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         EntityManager pc2 = entityManager2.find(EntityManager.class, "this");
         assertSame("Should get same entity manager for all work in a tx", pc1, pc2);
         tm.commit();
@@ -62,13 +197,13 @@
      */
     public void testCloseOnCommit() throws Exception {
         tm.begin();
-        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         MockEntityManager pc1 = (MockEntityManager) entityManager1.find(EntityManager.class, "this");
         assertTrue("entityManager should not be closed or cleared", !pc1.isClosed() & !pc1.isCleared());
         tm.commit();
         assertTrue("entityManager should be closed or cleared", pc1.isClosed() || pc1.isCleared());
         tm.begin();
-        CMPEntityManager entityManager2 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager2 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         MockEntityManager pc2 = (MockEntityManager) entityManager2.find(EntityManager.class, "this");
         assertTrue("entityManager should not be closed or cleared", !pc2.isClosed() & !pc2.isCleared());
         tm.rollback();
@@ -80,14 +215,14 @@
      * transaction required for persist, remove, merge, refresh
      */
     public void testTransactionRequired() throws Exception {
-        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         try {
             entityManager1.persist("foo");
             fail("expected TransactionRequiredException");
         } catch (TransactionRequiredException e) {
             //expected
         } catch (Exception e) {
-            fail ("Wrong exception" + e);
+            fail("Wrong exception" + e);
         }
         try {
             entityManager1.remove("foo");
@@ -95,7 +230,7 @@
         } catch (TransactionRequiredException e) {
             //expected
         } catch (Exception e) {
-            fail ("Wrong exception" + e);
+            fail("Wrong exception" + e);
         }
         try {
             entityManager1.merge("foo");
@@ -103,7 +238,7 @@
         } catch (TransactionRequiredException e) {
             //expected
         } catch (Exception e) {
-            fail ("Wrong exception" + e);
+            fail("Wrong exception" + e);
         }
         try {
             entityManager1.refresh("foo");
@@ -111,16 +246,28 @@
         } catch (TransactionRequiredException e) {
             //expected
         } catch (Exception e) {
-            fail ("Wrong exception" + e);
+            fail("Wrong exception" + e);
         }
     }
 
     /**
      * section 5.9.1
+     * when a SFSB/extended context starts a UserTransaction or a CMT tx starts the EM must join the transaction
+     */
+    public void testExtendedEntityManagerJoinsNewTransactions() throws Exception {
+        CMPEntityManagerExtended entityManager1 = new CMPEntityManagerExtended(tm, persistenceUnit, entityManagerFactory, null);
+        tm.begin();
+        MockEntityManager pc1 = (MockEntityManager) entityManager1.find(EntityManager.class, "this");
+
+        assertTrue("EntityManager was supposed to join the tx", pc1.isJoined());
+    }
+
+    /**
+     * section 5.9.1
      * application must not call close on its entityManager
      */
     public void testAppCallsCloseForbidden() throws Exception {
-        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager1 = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         try {
             entityManager1.close();
             fail("Application should not be able to call close on its EntityManager");
@@ -140,11 +287,12 @@
 
     /**
      * section 5.9.1
+     *
      * @throws Exception
      */
     public void testNoPropertiesUsed() throws Exception {
 
-        CMPEntityManager entityManager = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        CMPEntityManagerTxScoped entityManager = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, null);
         tm.begin();
         entityManager.contains("bar");
         Map props = entityManager.find(Map.class, "properties");
@@ -154,11 +302,12 @@
 
     /**
      * section 5.9.1
+     *
      * @throws Exception
      */
     public void testPropertiesUsed() throws Exception {
         Map properties = new HashMap();
-        CMPEntityManager entityManager = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, properties, true);
+        CMPEntityManagerTxScoped entityManager = new CMPEntityManagerTxScoped(tm, persistenceUnit, entityManagerFactory, properties);
         tm.begin();
         entityManager.contains("bar");
         Map props = entityManager.find(Map.class, "properties");

Modified: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java?rev=437177&r1=437176&r2=437177&view=diff
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java (original)
+++ geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java Sat Aug 26 09:18:51 2006
@@ -26,13 +26,14 @@
 import javax.persistence.EntityTransaction;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public class MockEntityManager implements EntityManager {
 
     private final Map properties;
     private boolean closed = false;
     private boolean cleared = false;
+    private boolean joined = false;
 
     public MockEntityManager() {
         properties = null;
@@ -123,6 +124,7 @@
     }
 
     public void joinTransaction() {
+        joined = true;
     }
 
     public Object getDelegate() {
@@ -139,5 +141,9 @@
 
     public boolean isCleared() {
         return cleared;
+    }
+
+    public boolean isJoined() {
+        return joined;
     }
 }