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 org.apache.tapestry5.ioc.internal.util.InternalUtils;
018 import org.apache.tapestry5.jpa.EntityManagerManager;
019 import org.apache.tapestry5.jpa.JpaConstants;
020
021 import javax.persistence.EntityManager;
022 import javax.persistence.EntityManagerFactory;
023 import javax.persistence.PersistenceContext;
024 import javax.persistence.metamodel.EntityType;
025 import javax.persistence.metamodel.Metamodel;
026 import java.util.Map;
027 import java.util.Set;
028
029 public class JpaInternalUtils
030 {
031 public static PersistedEntity convertApplicationValueToPersisted(
032 final EntityManagerManager entityManagerManager, final Object newValue)
033 {
034 final EntityManager em = getEntityManagerFactory(entityManagerManager, newValue);
035
036 final EntityManagerFactory emf = em.getEntityManagerFactory();
037
038 final Map<String, Object> properties = emf.getProperties();
039
040 final String persistenceUnitName = (String) properties
041 .get(JpaConstants.PERSISTENCE_UNIT_NAME);
042
043 final Object id = emf.getPersistenceUnitUtil().getIdentifier(newValue);
044
045 return new PersistedEntity(newValue.getClass(), id, persistenceUnitName);
046 }
047
048 private static EntityManager getEntityManagerFactory(
049 final EntityManagerManager entityManagerManager, final Object entity)
050 {
051 final Map<String, EntityManager> entityManagers = entityManagerManager.getEntityManagers();
052
053 for (final EntityManager em : entityManagers.values())
054 {
055 final EntityManagerFactory emf = em.getEntityManagerFactory();
056
057 final Metamodel metamodel = emf.getMetamodel();
058
059 final Set<EntityType<?>> entities = metamodel.getEntities();
060
061 for (final EntityType<?> entityType : entities)
062 {
063 if (entityType.getJavaType() == entity.getClass())
064 {
065 if (em.contains(entity))
066 {
067 return em;
068 }
069 }
070 }
071 }
072
073 throw new IllegalArgumentException(
074 String.format(
075 "Failed persisting the entity. The entity '%s' does not belong to any of the existing persistence contexts.",
076 entity));
077 }
078
079 public static EntityManager getEntityManager(EntityManagerManager entityManagerManager,
080 PersistenceContext annotation)
081 {
082 String unitName = annotation == null ? null : annotation.unitName();
083
084 if (InternalUtils.isNonBlank(unitName))
085 return entityManagerManager.getEntityManager(unitName);
086
087 Map<String, EntityManager> entityManagers = entityManagerManager.getEntityManagers();
088
089 if (entityManagers.size() == 1)
090 return entityManagers.values().iterator().next();
091
092 throw new RuntimeException("Unable to locate a single EntityManager. " +
093 "You must provide the persistence unit name as defined in the persistence.xml using the @PersistenceContext annotation.");
094 }
095 }