r2473 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate
Author: athimel Date: 2012-05-10 19:05:07 +0200 (Thu, 10 May 2012) New Revision: 2473 Url: http://nuiton.org/repositories/revision/topia/2473 Log: Improve TopiaPersistenceProvider implementation Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernatePersistenceProvider.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaPersistenceProvider.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-05-10 16:29:00 UTC (rev 2472) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-05-10 17:05:07 UTC (rev 2473) @@ -419,8 +419,8 @@ } } - jpaConfiguration.put("topia.entities", persistenceClasses); // TODO AThimel 10/05/2012 Push topia.entities to constants - jpaConfiguration.put("topia.context", this); // TODO AThimel 10/05/2012 Push topia.context to constants + jpaConfiguration.put(TopiaPersistenceProvider.TOPIA_ENTITIES, persistenceClasses); + jpaConfiguration.put(TopiaPersistenceProvider.TOPIA_CONTEXT, this); // FIXME AThimel 10/05/2012 Don't push all the configuration, maybe only a part of it ? for (Map.Entry<Object, Object> entry : getConfig().entrySet()) { Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaPersistenceProvider.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaPersistenceProvider.java 2012-05-10 16:29:00 UTC (rev 2472) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaPersistenceProvider.java 2012-05-10 17:05:07 UTC (rev 2473) @@ -16,10 +16,22 @@ public abstract class TopiaPersistenceProvider implements PersistenceProvider { public static final String TOPIA_PERSISTENCE_UNIT_NAME = "topia"; + public static final String TOPIA_ENTITIES = "topia.entities"; + public static final String TOPIA_CONTEXT = "topia.context"; private static final String MISSING_PROPERTY = "Unable to create EntityManagerFactory, you have to provide property '%s'"; - public abstract Pair<EntityManagerFactory, TopiaSpecificUtil> configureSpecific(String emName, Map<String, Object> map, Set<Class<?>> entities); + /** + * JPA implementation-based method that creates the EntityManagerFactory and + * its TopiaSpecificUtil instance. + * + * @param entityManagerName the name of the entityManagerFactory to create + * @param properties the JPA properties + * @param entities the list of entities provided by the TopiaContext + * @return A Pair of EntityManagerFactory and TopiaSpecificUtil + */ + public abstract Pair<EntityManagerFactory, TopiaSpecificUtil> configureSpecific( + String entityManagerName, Map<String, Object> properties, Set<Class<?>> entities); @Override public EntityManagerFactory createEntityManagerFactory(String emName, Map map) { @@ -30,23 +42,27 @@ Map<String, Object> properties = (Map<String, Object>)map; - Set<Class<?>> entityClasses = (Set<Class<?>>) map.get("topia.entities"); + // Get the entities list + Set<Class<?>> entityClasses = (Set<Class<?>>) map.get(TOPIA_ENTITIES); if (entityClasses == null) { - String message = String.format(MISSING_PROPERTY, "topia.entities"); + String message = String.format(MISSING_PROPERTY, TOPIA_ENTITIES); throw new TopiaRuntimeException(message); } - TopiaContextImplementor topiaContext = (TopiaContextImplementor)map.get("topia.context"); + // Get the TopiaContextImplementor + TopiaContextImplementor topiaContext = (TopiaContextImplementor)map.get(TOPIA_CONTEXT); if (topiaContext == null) { - String message = String.format(MISSING_PROPERTY, "topia.context"); + String message = String.format(MISSING_PROPERTY, TOPIA_CONTEXT); throw new TopiaRuntimeException(message); } + // Delegate creation to the specific JPA implementation Pair<EntityManagerFactory, TopiaSpecificUtil> emfUtilPair = configureSpecific(TOPIA_PERSISTENCE_UNIT_NAME, properties, entityClasses); entityManagerFactory = emfUtilPair.getLeft(); + // Register the created TopiaSpecificUtil on the TopiaContext TopiaSpecificUtil specificUtil = emfUtilPair.getRight(); topiaContext.registerSpecificUtil(specificUtil); } Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernatePersistenceProvider.java =================================================================== --- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernatePersistenceProvider.java 2012-05-10 16:29:00 UTC (rev 2472) +++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernatePersistenceProvider.java 2012-05-10 17:05:07 UTC (rev 2473) @@ -1,6 +1,10 @@ package org.nuiton.topia.persistence.hibernate; +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import org.apache.commons.lang3.tuple.Pair; +import org.hibernate.cfg.Configuration; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.ejb.packaging.NamedInputStream; import org.hibernate.ejb.packaging.PersistenceMetadata; @@ -9,22 +13,59 @@ import javax.persistence.EntityManagerFactory; import java.io.InputStream; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** + * Hibernate implementation of the TopiaPersistenceProvider + * * @author Arnaud Thimel <thimel@codelutin.com> */ public class TopiaHibernatePersistenceProvider extends TopiaPersistenceProvider { + public static final Function<Class<?>, String> GET_FQN = new Function<Class<?>, String>() { + @Override + public String apply(Class<?> entityClass) { + return entityClass.getName(); + } + }; + + public static final Function<String, String> GET_ENTITY_NAME_SLASHED = new Function<String, String>() { + @Override + public String apply(String entityClassName) { + String result = entityClassName.replaceAll("[.]", "/"); + return result; + } + }; + public static final Function<String, NamedInputStream> GET_HBM_NAMED_INPUT_STREAM = new Function<String, NamedInputStream>() { + @Override + public NamedInputStream apply(String entityClassName) { + // Get the path of the .hbm.xml file + String entityNameSlashed = GET_ENTITY_NAME_SLASHED.apply(entityClassName); + String entityHbmPath = "/" + entityNameSlashed + ".hbm.xml"; + InputStream entityHbmIS = TopiaPersistenceProvider.class.getResourceAsStream(entityHbmPath); + NamedInputStream entityHbmNIS = new NamedInputStream(entityClassName, entityHbmIS); + return entityHbmNIS; + } + }; + + public static final Function<String, String> GET_ORM_FILE_PATH = new Function<String, String>() { + @Override + public String apply(String entityClassName) { + // Get the path of the -orm.xml file + String entityNameSlashed = GET_ENTITY_NAME_SLASHED.apply(entityClassName); + String entityMappingPath = entityNameSlashed + "-orm.xml"; + return entityMappingPath; + } + }; + @Override public Pair<EntityManagerFactory, TopiaSpecificUtil> configureSpecific(String entityManagerName, Map<String, Object> properties, Set<Class<?>> entities) { Map<String, Object> hibernateProperties = new HashMap<String, Object>(properties); - // On convertit tout ce qui est en topia.connection.* vers hibernate.connection.* + // Convert everything from topia.connection.* to hibernate.connection.* for (String key : properties.keySet()) { if (key.startsWith("topia.connection.")) { Object value = properties.get(key); @@ -33,36 +74,38 @@ } } - List<String> entitiesNames = new ArrayList<String>(); - List<NamedInputStream> entitiesHbmFiles = new ArrayList<NamedInputStream>(); + // For each entity, get its FQN + List<String> entitiesNames = Lists.newArrayList( + Iterables.transform(entities, GET_FQN)); - for (Class<?> entityClass : entities) { - String entityClassName = entityClass.getName(); - entitiesNames.add(entityClassName); + // For each entity, get the HBM InputStream + List<NamedInputStream> entitiesHbmFiles = Lists.newArrayList( + Iterables.transform(entitiesNames, GET_HBM_NAMED_INPUT_STREAM)); - String entityNameSlashed = entityClassName.replaceAll("[.]", "/"); + // For each entity, get the ORM mapping path + List<String> entitiesMappingFiles = Lists.newArrayList( + Iterables.transform(entitiesNames, GET_ORM_FILE_PATH)); - InputStream entityHbmIS = TopiaPersistenceProvider.class.getResourceAsStream("/" + entityNameSlashed + ".hbm.xml"); - NamedInputStream entityHbmNIS = new NamedInputStream(entityClassName, entityHbmIS); - - entitiesHbmFiles.add(entityHbmNIS); - } - + // This is deprecated but still the way it done inside Hibernate itself Ejb3Configuration cfg = new Ejb3Configuration(); PersistenceMetadata metadata = new PersistenceMetadata(); metadata.setName(entityManagerName); + // Register the entities, hbm and mappings metadata.setClasses(entitiesNames); - metadata.setHbmfiles(entitiesHbmFiles); + metadata.setHbmfiles(entitiesHbmFiles); // HBM files +// metadata.setMappingFiles(entitiesMappingFiles); // ORM files + // Start configuration and build EntityManagerFactory Ejb3Configuration configured = cfg.configure(metadata, hibernateProperties); EntityManagerFactory entityManagerFactory = null; if (configured != null) { entityManagerFactory = configured.buildEntityManagerFactory(); } + Configuration hibernateConfiguration = configured.getHibernateConfiguration(); TopiaSpecificUtil specificUtil = - new TopiaHibernateSpecificUtil(configured.getHibernateConfiguration()); + new TopiaHibernateSpecificUtil(hibernateConfiguration); Pair<EntityManagerFactory, TopiaSpecificUtil> result = Pair.of(entityManagerFactory, specificUtil);
participants (1)
-
athimelï¼ users.nuiton.org