You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2010/10/16 01:16:29 UTC

svn commit: r1023145 - in /openejb/trunk/openejb3: ./ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-core/src/main/java/org/apache/openejb/jun...

Author: dblevins
Date: Fri Oct 15 23:16:29 2010
New Revision: 1023145

URL: http://svn.apache.org/viewvc?rev=1023145&view=rev
Log:
merging:

OPENEJB-1353: Be more tolerant of truly empty application-client.xml and ejb-jar.xml -- zero length files

OPENEJB-1365: New log4j.category.OpenEJB.persistence log category
Also, ensure persistence unit name is always present for every refereces (set it when the unit is resolved)
Time all JTA EntityManager operations
Log debug messages for EntityManager operations that don't do anything


Modified:
    openejb/trunk/openejb3/   (props changed)
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java

Propchange: openejb/trunk/openejb3/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Oct 15 23:16:29 2010
@@ -1,3 +1,3 @@
 /openejb/branches/openejb-3.1.1:779593
-/openejb/branches/openejb-3.1.x:945409,945448
+/openejb/branches/openejb-3.1.x:945409,945448,1004381
 /openejb/branches/openejb-jcdi:984659-985270

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1023145&r1=1023144&r2=1023145&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Fri Oct 15 23:16:29 2010
@@ -882,7 +882,8 @@ public class Assembler extends Assembler
         destroyApplication(appInfo);
     }
 
-    private void destroyApplication(AppInfo appInfo) throws UndeployException {
+    public void destroyApplication(AppInfo appInfo) throws UndeployException {
+        deployedApplications.remove(appInfo.path);
         logger.info("destroyApplication.start", appInfo.path);
 
         fireBeforeApplicationDestroyed(appInfo);

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1023145&r1=1023144&r2=1023145&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Fri Oct 15 23:16:29 2010
@@ -236,6 +236,7 @@ public class AutoConfig implements Dynam
         }
 
         if (unit != null){
+            ref.setPersistenceUnitName(unit.getName());
             ref.setMappedName(unit.getId());
         } else {
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java?rev=1023145&r1=1023144&r2=1023145&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java Fri Oct 15 23:16:29 2010
@@ -378,32 +378,14 @@ public class ReadDescriptors implements 
     }
 
     private static boolean isEmptyEjbJar(URL url) throws IOException, ParserConfigurationException, SAXException {
-        final LengthInputStream in = new LengthInputStream(url.openStream());
-        InputSource inputSource = new InputSource(in);
-
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        SAXParser parser = factory.newSAXParser();
-
-        try {
-            parser.parse(inputSource, new DefaultHandler(){
-                public void startElement(String uri, String localName, String qName, Attributes att) throws SAXException {
-                    if (!localName.equals("ejb-jar")) throw new SAXException(localName);
-                }
-
-                public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException {
-                    return new InputSource(new ByteArrayInputStream(new byte[0]));
-                }
-            });
-            return true;
-        } catch (SAXException e) {
-            return in.getLength() == 0;
-        }
+        return isEmpty(url, "ejb-jar");
     }
 
     private static boolean isEmptyBeansXml(URL url) throws IOException, ParserConfigurationException, SAXException {
+        return isEmpty(url, "beans");
+    }
 
+    private static boolean isEmpty(URL url, final String rootElement) throws IOException, ParserConfigurationException, SAXException {
         final LengthInputStream in = new LengthInputStream(url.openStream());
         InputSource inputSource = new InputSource(in);
 
@@ -415,7 +397,7 @@ public class ReadDescriptors implements 
         try {
             parser.parse(inputSource, new DefaultHandler(){
                 public void startElement(String uri, String localName, String qName, Attributes att) throws SAXException {
-                    if (!localName.equals("beans")) throw new SAXException(localName);
+                    if (!localName.equals(rootElement)) throw new SAXException(localName);
                 }
 
                 public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java?rev=1023145&r1=1023144&r2=1023145&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java Fri Oct 15 23:16:29 2010
@@ -34,7 +34,9 @@ import org.apache.openejb.jee.Connector;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.EnterpriseBean;
 import org.apache.openejb.jee.ManagedBean;
+import org.apache.openejb.jee.TransactionType;
 import org.apache.openejb.jee.jpa.unit.Persistence;
+import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
 import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.openejb.loader.SystemInstance;
@@ -85,7 +87,7 @@ public class ApplicationComposer extends
 
         int appModules = 0;
         int modules = 0;
-        Class[] moduleTypes = {EjbJar.class, EnterpriseBean.class, Persistence.class, Connector.class, Beans.class, Application.class};
+        Class[] moduleTypes = {EjbJar.class, EnterpriseBean.class, Persistence.class, PersistenceUnit.class, Connector.class, Beans.class, Application.class};
         for (FrameworkMethod method : testClass.getAnnotatedMethods(Module.class)) {
 
             modules++;
@@ -158,7 +160,7 @@ public class ApplicationComposer extends
                 final EjbJar ejbJar = new EjbJar();
                 final OpenejbJar openejbJar = new OpenejbJar();
                 final ManagedBean bean = ejbJar.addEnterpriseBean(new ManagedBean(javaClass));
-
+                bean.setTransactionType(TransactionType.BEAN);
                 final EjbDeployment ejbDeployment = openejbJar.addEjbDeployment(bean);
                 ejbDeployment.setDeploymentId(javaClass.getName());
 
@@ -198,6 +200,11 @@ public class ApplicationComposer extends
                     final Persistence persistence = (Persistence) obj;
                     appModule.getPersistenceModules().add(new PersistenceModule("", persistence));
 
+                } else if (obj instanceof PersistenceUnit) {
+
+                    final PersistenceUnit unit = (PersistenceUnit) obj;
+                    appModule.getPersistenceModules().add(new PersistenceModule("", new Persistence(unit)));
+
                 } else if (obj instanceof Beans) {
 
                     final Beans beans = (Beans) obj;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java?rev=1023145&r1=1023144&r2=1023145&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/persistence/JtaEntityManager.java Fri Oct 15 23:16:29 2010
@@ -21,6 +21,7 @@ import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.LogCategory;
 
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import javax.persistence.FlushModeType;
 import javax.persistence.LockModeType;
@@ -48,13 +49,14 @@ import javax.persistence.metamodel.Metam
  */
 public class JtaEntityManager implements EntityManager {
 
-    private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("persistence"), JtaEntityManager.class);
+    private static final Logger baseLogger = Logger.getInstance(LogCategory.OPENEJB.createChild("persistence"), JtaEntityManager.class);
 
     private final JtaEntityManagerRegistry registry;
     private final EntityManagerFactory entityManagerFactory;
     private final Map properties;
     private final boolean extended;
     private final String unitName;
+    private final Logger logger;
 
     public JtaEntityManager(JtaEntityManagerRegistry registry, EntityManagerFactory entityManagerFactory, Map properties, String unitName) {
         this(unitName, registry, entityManagerFactory, properties, false);
@@ -68,6 +70,7 @@ public class JtaEntityManager implements
         this.entityManagerFactory = entityManagerFactory;
         this.properties = properties;
         this.extended = extended;
+        logger = (unitName == null) ? baseLogger : baseLogger.getChildLogger(unitName);
     }
 
     private EntityManager getEntityManager() {
@@ -108,23 +111,43 @@ public class JtaEntityManager implements
 
     public void persist(Object entity) {
         assertTransactionActive();
-        getEntityManager().persist(entity);
+        final Timer timer = Op.persist.start(this);
+        try {
+            getEntityManager().persist(entity);
+        } finally {
+            timer.stop();
+        }
     }
 
     public <T>T merge(T entity) {
         assertTransactionActive();
-        return getEntityManager().merge(entity);
+        final Timer timer = Op.merge.start(this);
+        try {
+            return getEntityManager().merge(entity);
+        } finally {
+            timer.stop();
+        }
     }
 
     public void remove(Object entity) {
         assertTransactionActive();
-        getEntityManager().remove(entity);
+        final Timer timer = Op.remove.start(this);
+        try {
+            getEntityManager().remove(entity);
+        } finally {
+            timer.stop();
+        }
     }
 
     public <T>T find(Class<T> entityClass, Object primaryKey) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.find(entityClass, primaryKey);
+            final Timer timer = Op.find.start(this);
+            try {
+                return entityManager.find(entityClass, primaryKey);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -133,7 +156,12 @@ public class JtaEntityManager implements
     public <T>T getReference(Class<T> entityClass, Object primaryKey) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.getReference(entityClass, primaryKey);
+            final Timer timer = Op.getReference.start(this);
+            try {
+                return entityManager.getReference(entityClass, primaryKey);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -141,13 +169,23 @@ public class JtaEntityManager implements
 
     public void flush() {
         assertTransactionActive();
-        getEntityManager().flush();
+        final Timer timer = Op.flush.start(this);
+        try {
+            getEntityManager().flush();
+        } finally {
+            timer.stop();
+        }
     }
 
     public void setFlushMode(FlushModeType flushMode) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.setFlushMode(flushMode);
+            final Timer timer = Op.setFlushMode.start(this);
+            try {
+                entityManager.setFlushMode(flushMode);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -156,7 +194,12 @@ public class JtaEntityManager implements
     public FlushModeType getFlushMode() {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.getFlushMode();
+            final Timer timer = Op.getFlushMode.start(this);
+            try {
+                return entityManager.getFlushMode();
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -164,53 +207,98 @@ public class JtaEntityManager implements
 
     public void lock(Object entity, LockModeType lockMode) {
         assertTransactionActive();
-        getEntityManager().lock(entity, lockMode);
+        final Timer timer = Op.lock.start(this);
+        try {
+            getEntityManager().lock(entity, lockMode);
+        } finally {
+            timer.stop();
+        }
     }
 
     public void refresh(Object entity) {
         assertTransactionActive();
-        getEntityManager().refresh(entity);
+        final Timer timer = Op.refresh.start(this);
+        try {
+            getEntityManager().refresh(entity);
+        } finally {
+            timer.stop();
+        }
     }
 
     public void clear() {
         if (!extended && !isTransactionActive()) {
             return;
         }
-        getEntityManager().clear();
+        final Timer timer = Op.clear.start(this);
+        try {
+            getEntityManager().clear();
+        } finally {
+            timer.stop();
+        }
     }
 
     public boolean contains(Object entity) {
-        return isTransactionActive() && getEntityManager().contains(entity);
+        final Timer timer = Op.contains.start(this);
+        try {
+            return isTransactionActive() && getEntityManager().contains(entity);
+        } finally {
+            timer.stop();
+        }
     }
 
     public Query createQuery(String qlString) {
-        EntityManager entityManager = getEntityManager();
-        Query query = entityManager.createQuery(qlString);
-        return proxyIfNoTx(entityManager, query);
+        final Timer timer = Op.createQuery.start(this);
+        try {
+            EntityManager entityManager = getEntityManager();
+            Query query = entityManager.createQuery(qlString);
+            return proxyIfNoTx(entityManager, query);
+        } finally {
+            timer.stop();
+        }
     }
 
     public Query createNamedQuery(String name) {
-        EntityManager entityManager = getEntityManager();
-        Query query = entityManager.createNamedQuery(name);
-        return proxyIfNoTx(entityManager, query);
+        final Timer timer = Op.createNamedQuery.start(this);
+        try {
+            EntityManager entityManager = getEntityManager();
+            Query query = entityManager.createNamedQuery(name);
+            return proxyIfNoTx(entityManager, query);
+        } finally {
+            timer.stop();
+        }
     }
 
     public Query createNativeQuery(String sqlString) {
-        EntityManager entityManager = getEntityManager();
-        Query query = entityManager.createNativeQuery(sqlString);
-        return proxyIfNoTx(entityManager, query);
+        final Timer timer = Op.createNativeQuery.start(this);
+        try {
+            EntityManager entityManager = getEntityManager();
+            Query query = entityManager.createNativeQuery(sqlString);
+            return proxyIfNoTx(entityManager, query);
+        } finally {
+            timer.stop();
+        }
     }
 
     public Query createNativeQuery(String sqlString, Class resultClass) {
-        EntityManager entityManager = getEntityManager();
-        Query query = entityManager.createNativeQuery(sqlString, resultClass);
-        return proxyIfNoTx(entityManager, query);
+        final Timer timer = Op.createNativeQuery.start(this);
+        try {
+            EntityManager entityManager = getEntityManager();
+            Query query = entityManager.createNativeQuery(sqlString, resultClass);
+            return proxyIfNoTx(entityManager, query);
+        } finally {
+            timer.stop();
+        }
     }
 
     public Query createNativeQuery(String sqlString, String resultSetMapping) {
-        EntityManager entityManager = getEntityManager();
-        Query query = entityManager.createNativeQuery(sqlString, resultSetMapping);
-        return proxyIfNoTx(entityManager, query);
+        final Timer timer = Op.createNativeQuery.start(this);
+        try {
+            EntityManager entityManager = getEntityManager();
+            Query query = entityManager.createNativeQuery(sqlString, resultSetMapping);
+            return proxyIfNoTx(entityManager, query);
+        } finally {
+            timer.stop();
+        }
     }
 
     private Query proxyIfNoTx(EntityManager entityManager, Query query) {
@@ -221,9 +309,15 @@ public class JtaEntityManager implements
     }
 
     public void joinTransaction() {
+        if (logger.isDebugEnabled()) {
+            logger.debug("PersistenceUnit(name=" + unitName + ") - entityManager.joinTransaction() call ignored - not applicable to a JTA Managed EntityManager",  new Exception().fillInStackTrace());
+        }
     }
 
     public void close() {
+        if (logger.isDebugEnabled()) {
+            logger.debug("PersistenceUnit(name=" + unitName + ") - entityManager.close() call ignored - not applicable to a JTA Managed EntityManager",  new Exception().fillInStackTrace());
+        }
     }
 
     public boolean isOpen() {
@@ -241,7 +335,12 @@ public class JtaEntityManager implements
     public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.createNamedQuery(name, resultClass);
+            final Timer timer = Op.createNamedQuery.start(this);
+            try {
+                return entityManager.createNamedQuery(name, resultClass);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -252,7 +351,12 @@ public class JtaEntityManager implements
     public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.createQuery(criteriaQuery);
+            final Timer timer = Op.createQuery.start(this);
+            try {
+                return entityManager.createQuery(criteriaQuery);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -263,7 +367,12 @@ public class JtaEntityManager implements
     public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.createQuery(qlString, resultClass);
+            final Timer timer = Op.createQuery.start(this);
+            try {
+                return entityManager.createQuery(qlString, resultClass);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -274,7 +383,12 @@ public class JtaEntityManager implements
     public void detach(Object entity) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.detach(entity);
+            final Timer timer = Op.detach.start(this);
+            try {
+                entityManager.detach(entity);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -285,7 +399,12 @@ public class JtaEntityManager implements
     public <T> T find(Class<T> entityClass, Object primaryKey, Map<String, Object> properties) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.find(entityClass, primaryKey, properties);
+            final Timer timer = Op.find.start(this);
+            try {
+                return entityManager.find(entityClass, primaryKey, properties);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -296,7 +415,12 @@ public class JtaEntityManager implements
     public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.find(entityClass, entityManager, lockMode);
+            final Timer timer = Op.find.start(this);
+            try {
+                return entityManager.find(entityClass, entityManager, lockMode);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -307,7 +431,12 @@ public class JtaEntityManager implements
     public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode, Map<String, Object> properties) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.find(entityClass, entityManager, lockMode, properties);
+            final Timer timer = Op.find.start(this);
+            try {
+                return entityManager.find(entityClass, entityManager, lockMode, properties);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -324,7 +453,12 @@ public class JtaEntityManager implements
     public LockModeType getLockMode(Object entity) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.getLockMode(entity);
+            final Timer timer = Op.getLockMode.start(this);
+            try {
+                return entityManager.getLockMode(entity);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -335,7 +469,12 @@ public class JtaEntityManager implements
     public Metamodel getMetamodel() {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.getMetamodel();
+            final Timer timer = Op.getMetamodel.start(this);
+            try {
+                return entityManager.getMetamodel();
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -346,7 +485,12 @@ public class JtaEntityManager implements
     public Map<String, Object> getProperties() {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.getProperties();
+            final Timer timer = Op.getProperties.start(this);
+            try {
+                return entityManager.getProperties();
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -357,7 +501,12 @@ public class JtaEntityManager implements
     public CriteriaBuilder getCriteriaBuilder() {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.getCriteriaBuilder();
+            final Timer timer = Op.getCriteriaBuilder.start(this);
+            try {
+                return entityManager.getCriteriaBuilder();
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -368,7 +517,12 @@ public class JtaEntityManager implements
     public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.lock(entityManager, lockMode, properties);
+            final Timer timer = Op.lock.start(this);
+            try {
+                entityManager.lock(entityManager, lockMode, properties);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -379,7 +533,12 @@ public class JtaEntityManager implements
     public void refresh(Object entity, Map<String, Object> properties) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.refresh(entityManager, properties);
+            final Timer timer = Op.refresh.start(this);
+            try {
+                entityManager.refresh(entityManager, properties);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -390,7 +549,12 @@ public class JtaEntityManager implements
     public void refresh(Object entity, LockModeType lockMode) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.refresh(entityManager, lockMode);
+            final Timer timer = Op.refresh.start(this);
+            try {
+                entityManager.refresh(entityManager, lockMode);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -401,7 +565,12 @@ public class JtaEntityManager implements
     public void refresh(Object entity, LockModeType lockMode, Map<String, Object> properties) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.refresh(entityManager, lockMode, properties);
+            final Timer timer = Op.refresh.start(this);
+            try {
+                entityManager.refresh(entityManager, lockMode, properties);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -412,7 +581,12 @@ public class JtaEntityManager implements
     public void setProperty(String name, Object value) {
         EntityManager entityManager = getEntityManager();
         try {
-            entityManager.setProperty(name, value);
+            final Timer timer = Op.setProperty.start(this);
+            try {
+                entityManager.setProperty(name, value);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
@@ -423,9 +597,41 @@ public class JtaEntityManager implements
     public <T> T unwrap(Class<T> cls) {
         EntityManager entityManager = getEntityManager();
         try {
-            return entityManager.unwrap(cls);
+            final Timer timer = Op.unwrap.start(this);
+            try {
+                return entityManager.unwrap(cls);
+            } finally {
+                timer.stop();
+            }
         } finally {
             closeIfNoTx(entityManager);
         }
     }
+
+    public static class Timer {
+        private final long start = System.nanoTime();
+        private final Op operation;
+        private final JtaEntityManager em;
+
+        public Timer(Op operation, JtaEntityManager em) {
+            this.operation = operation;
+            this.em = em;
+        }
+
+        public void stop() {
+            if (!em.logger.isDebugEnabled()) return;
+
+            final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
+
+            em.logger.debug("PersistenceUnit(name=" + em.unitName + ") - entityManager." + operation + " - " + time + "ms");
+        }
+    }
+
+    private static enum Op {
+        clear, close, contains, createNamedQuery, createNativeQuery, createQuery, find, flush, getFlushMode, getReference, getTransaction, lock, merge, refresh, remove, setFlushMode, persist, detach, getLockMode, unwrap, setProperty, getCriteriaBuilder, getProperties, getMetamodel;
+
+        public Timer start(JtaEntityManager em) {
+            return new Timer(this, em);
+        }
+    }
 }