001 // Copyright 2011 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.internal.jpa;
016
017 import java.util.Collections;
018 import java.util.Map;
019 import java.util.Map.Entry;
020
021 import javax.persistence.EntityManager;
022 import javax.persistence.spi.PersistenceUnitInfo;
023
024 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
025 import org.apache.tapestry5.ioc.services.ThreadCleanupListener;
026 import org.apache.tapestry5.jpa.EntityManagerManager;
027 import org.apache.tapestry5.jpa.EntityManagerSource;
028 import org.slf4j.Logger;
029
030 public class EntityManagerManagerImpl implements EntityManagerManager, ThreadCleanupListener
031 {
032 private final EntityManagerSource entityManagerSource;
033
034 private final Logger logger;
035
036 private final Map<String, EntityManager> entityManagers = CollectionFactory.newMap();
037
038 public EntityManagerManagerImpl(final EntityManagerSource entityManagerSource,
039 final Logger logger)
040 {
041 super();
042 this.entityManagerSource = entityManagerSource;
043 this.logger = logger;
044 }
045
046 /**
047 * {@inheritDoc}
048 */
049 public EntityManager getEntityManager(final String persistenceUnitName)
050 {
051 return getOrCreateEntityManager(persistenceUnitName);
052 }
053
054 /**
055 * {@inheritDoc}
056 */
057 public Map<String, EntityManager> getEntityManagers()
058 {
059 createAllEntityManagers();
060
061 return Collections.unmodifiableMap(entityManagers);
062 }
063
064 private void createAllEntityManagers()
065 {
066 for (final PersistenceUnitInfo info : entityManagerSource.getPersistenceUnitInfos())
067 {
068 getOrCreateEntityManager(info.getPersistenceUnitName());
069 }
070 }
071
072 private EntityManager getOrCreateEntityManager(final String persistenceUnitName)
073 {
074 EntityManager em = entityManagers.get(persistenceUnitName);
075
076 if (em == null)
077 {
078 em = entityManagerSource.create(persistenceUnitName);
079
080 entityManagers.put(persistenceUnitName, em);
081 }
082
083 return em;
084 }
085
086 public void threadDidCleanup()
087 {
088 for (final Entry<String, EntityManager> next : entityManagers.entrySet())
089 {
090 try
091 {
092 final EntityManager em = next.getValue();
093
094 if (em.isOpen())
095 {
096 em.close();
097 }
098 }
099 catch (final Exception e)
100 {
101 logger.info(String.format(
102 "Failed to close EntityManager for persistence unit '%s'", next.getKey()));
103 }
104 }
105
106 entityManagers.clear();
107
108 }
109
110 }