    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    }