Author: tchemit Date: 2012-05-14 14:29:31 +0200 (Mon, 14 May 2012) New Revision: 2480 Url: http://nuiton.org/repositories/revision/topia/2480 Log: refs #353: use JPA api - can choose from configuration which mapping to use (hibernate or JPA) - improve code (javadoc, code style) Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java =================================================================== --- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java 2012-05-14 12:29:31 UTC (rev 2480) @@ -71,6 +71,8 @@ private static final Log log = LogFactory.getLog(TopiaHibernateConnectionProvider.class); + private static final long serialVersionUID = 1L; + /** * JDBC url of connection. * <p/> Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java =================================================================== --- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java 2012-05-14 12:29:31 UTC (rev 2480) @@ -19,6 +19,7 @@ /** * @author Arnaud Thimel <thimel@codelutin.com> + * @since 3.0 */ public class TopiaHibernateJPAEntityListener implements PreLoadEventListener, PostLoadEventListener, @@ -26,6 +27,8 @@ PreUpdateEventListener, PostUpdateEventListener, PreDeleteEventListener, PostDeleteEventListener { + private static final long serialVersionUID = 1L; + @Override public void onPreLoad(PreLoadEvent event) { // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java =================================================================== --- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-05-14 12:29:31 UTC (rev 2480) @@ -3,6 +3,7 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import org.apache.commons.lang3.tuple.Pair; import org.hibernate.cfg.Configuration; import org.hibernate.ejb.Ejb3Configuration; @@ -14,18 +15,23 @@ import javax.persistence.EntityManagerFactory; import java.io.InputStream; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** - * Hibernate implementation of the TopiaPersistenceProvider + * Hibernate implementation of the {@link TopiaPersistenceProvider}. * * @author Arnaud Thimel <thimel@codelutin.com> + * @author tchemit <chemit@codelutin.com> + * @see TopiaPersistenceProvider + * @since 3.0 */ public class TopiaHibernatePersistenceProvider extends TopiaPersistenceProvider { + public static final String USE_HIBERNATE_MAPPING_FILES = + "topia.use.hibernate.mapping.files"; + public static final Function<Class<?>, String> GET_FQN = new Function<Class<?>, String>() { @Override public String apply(Class<?> entityClass) { @@ -40,14 +46,19 @@ 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 entityNameSlashed = + GET_ENTITY_NAME_SLASHED.apply(entityClassName); String entityHbmPath = "/" + entityNameSlashed + ".hbm.xml"; - InputStream entityHbmIS = TopiaPersistenceProvider.class.getResourceAsStream(entityHbmPath); - NamedInputStream entityHbmNIS = new NamedInputStream(entityClassName, entityHbmIS); + InputStream entityHbmIS = + TopiaPersistenceProvider.class.getResourceAsStream( + entityHbmPath); + NamedInputStream entityHbmNIS = new NamedInputStream( + entityClassName, entityHbmIS); return entityHbmNIS; } }; @@ -56,34 +67,58 @@ @Override public String apply(String entityClassName) { // Get the path of the -orm.xml file - String entityNameSlashed = GET_ENTITY_NAME_SLASHED.apply(entityClassName); + 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) { + public Pair<EntityManagerFactory, TopiaSpecificUtil> configureSpecific( + String entityManagerName, + Map<String, Object> properties, + Set<Class<?>> entities) { - Map<String, Object> hibernateProperties = new HashMap<String, Object>(properties); + Map<String, Object> hibernateProperties = Maps.newHashMap(properties); + + boolean useHibernateMapping = false; // Convert everything from topia.connection.* to hibernate.connection.* + // and find out if use orm (jpa) or legacy hibernate mapping files for (String key : properties.keySet()) { if (key.startsWith("topia.connection.")) { Object value = properties.get(key); String hibernateKey = "hibernate." + key.substring(6); hibernateProperties.put(hibernateKey, value); + } else if (USE_HIBERNATE_MAPPING_FILES.equals(key)) { + String value = String.valueOf(properties.get(key)); + if (Boolean.valueOf(value)) { + // use hibernate mapping + useHibernateMapping = true; + } } } - hibernateProperties.put("hibernate.ejb.event.pre-insert", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.post-insert", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.pre-load", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.post-load", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.pre-update", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.post-update", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.pre-delete", TopiaHibernateJPAEntityListener.class.getName()); - hibernateProperties.put("hibernate.ejb.event.post-delete", TopiaHibernateJPAEntityListener.class.getName()); + String entityListenerFQN = + TopiaHibernateJPAEntityListener.class.getName(); + hibernateProperties.put("hibernate.ejb.event.pre-insert", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.post-insert", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.pre-load", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.post-load", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.pre-update", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.post-update", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.pre-delete", + entityListenerFQN); + hibernateProperties.put("hibernate.ejb.event.post-delete", + entityListenerFQN); + // For each entity, get its FQN List<String> entitiesNames = Lists.newArrayList( Iterables.transform(entities, GET_FQN)); @@ -102,18 +137,24 @@ metadata.setName(entityManagerName); // Register the entities, hbm and mappings - metadata.setClasses(entitiesNames); - metadata.setHbmfiles(entitiesHbmFiles); // HBM files -// metadata.setMappingFiles(entitiesMappingFiles); // ORM files + if (useHibernateMapping) { - // Start configuration and build EntityManagerFactory - Ejb3Configuration configured = cfg.configure(metadata, hibernateProperties); - EntityManagerFactory entityManagerFactory = null; - if (configured != null) { - entityManagerFactory = configured.buildEntityManagerFactory(); + // use specific hibernate (hbm) mapping files + loadHibernateMappingFiles(entitiesNames, metadata); + } else { + + // use JPA (orm) mapping files + loadJPAMappingFiles(entitiesNames, metadata); } - Configuration hibernateConfiguration = configured.getHibernateConfiguration(); + // Start configuration and build EntityManagerFactory + Ejb3Configuration configured = cfg.configure(metadata, + hibernateProperties); + EntityManagerFactory entityManagerFactory = + configured.buildEntityManagerFactory(); + + Configuration hibernateConfiguration = + configured.getHibernateConfiguration(); TopiaSpecificUtil specificUtil = new TopiaHibernateSpecificUtil(hibernateConfiguration); @@ -122,4 +163,31 @@ return result; } + protected void loadHibernateMappingFiles(List<String> entitiesNames, + PersistenceMetadata metadata) { + + // For each entity, get the HBM InputStream + List<NamedInputStream> entitiesHbmFiles = Lists.newArrayList( + Iterables.transform(entitiesNames, GET_HBM_NAMED_INPUT_STREAM)); + + // Register the entities mappings + metadata.setHbmfiles(entitiesHbmFiles); + } + + protected void loadJPAMappingFiles(List<String> entitiesNames, + PersistenceMetadata metadata) { + + // For each entity, get the ORM mapping path + List<String> entitiesMappingFiles = Lists.newArrayList( + Iterables.transform(entitiesNames, GET_ORM_FILE_PATH)); + + //FIXME-TC-2012-05-14 Should be moved to jpa - level ? + // add a mapping sur mapped suerp-class TopiaEntityAbstract + entitiesMappingFiles.add( + GET_ORM_FILE_PATH.apply(TopiaEntityAbstract.class.getName())); + + // Register the entities mappings + metadata.setMappingFiles(entitiesMappingFiles); + } + } Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java =================================================================== --- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java 2012-05-14 12:29:31 UTC (rev 2480) @@ -19,11 +19,17 @@ import java.util.Iterator; /** + * Hibernate implementation of the {@link TopiaSpecificUtil}. + * * @author Arnaud Thimel <thimel@codelutin.com> + * @author tchemit <chemit@codelutin.com> + * @see TopiaSpecificUtil + * @since 3.0 */ public class TopiaHibernateSpecificUtil implements TopiaSpecificUtil { - private static final Log log = LogFactory.getLog(TopiaHibernateSpecificUtil.class); + private static final Log log = + LogFactory.getLog(TopiaHibernateSpecificUtil.class); protected Configuration configuration; Modified: trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java =================================================================== --- trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java 2012-05-14 12:29:31 UTC (rev 2480) @@ -1,10 +1,40 @@ package org.nuiton.topia.tck; +import org.junit.runners.Suite; +import org.nuiton.topia.tck.mapping.test1.SimpleOneToManyRelationTest; + /** * Launch {@link TopiaTckMappingTestSuite}. * * @author tchemit <chemit@codelutin.com> * @since 3.0 */ +@Suite.SuiteClasses( + { +// // test1 + SimpleOneToManyRelationTest.class, +// SimpleOneToManyRelationWithRoleNamedTest.class, +// BiDirectionalOneToManyRelationTest.class, +// BiDirectionalOneToManyRelationWithRoleNamedTest.class, +// // test2 +// SimpleManyToOneRelationTest.class, +// SimpleManyToOneRelationWithRoleNamedTest.class, +// BiDirectionalManyToOneRelationTest.class, +// BiDirectionalManyToOneRelationWithRoleNamedTest.class, +// // test3 +// SimpleManyToManyRelationTest.class, +// SimpleManyToManyRelationWithRoleNamedTest.class, +// BiDirectionalManyToManyRelationTest.class, +// BiDirectionalManyToManyRelationWithRoleNamedTest.class, +// //test 4 +// ElementCollectionTest.class, +// // test 5 +// OneToManyCompositionTest.class, +// BiDirectionalOneToManyCompositionTest.class, + // test 6 +// SimpleOneToManyIndexedTest.class, +// SimpleOneToManyWithRoleNamedIndexedTest.class + } +) public class TopiaTckMappingHibernateTest extends TopiaTckMappingTestSuite { } Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties =================================================================== --- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties 2012-05-14 12:29:31 UTC (rev 2480) @@ -4,8 +4,9 @@ hibernate.dialect=org.hibernate.dialect.H2Dialect +topia.use.hibernate.mapping.files=true topia.connection.username=sa -topia.connection.password= +topia.connection.password=sa topia.connection.driver_class=org.h2.Driver #Not necessary, but useful Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties =================================================================== --- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties 2012-05-14 12:29:31 UTC (rev 2480) @@ -4,8 +4,9 @@ hibernate.dialect=org.hibernate.dialect.H2Dialect +topia.use.hibernate.mapping.files=true topia.connection.username=sa -topia.connection.password= +topia.connection.password=sa topia.connection.driver_class=org.h2.Driver #Not necessary, but useful Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties =================================================================== --- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties 2012-05-14 12:27:56 UTC (rev 2479) +++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties 2012-05-14 12:29:31 UTC (rev 2480) @@ -4,8 +4,9 @@ hibernate.dialect=org.hibernate.dialect.H2Dialect +topia.use.hibernate.mapping.files=true topia.connection.username=sa -topia.connection.password= +topia.connection.password=sa topia.connection.driver_class=org.h2.Driver #Not necessary, but useful