Topia-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
May 2012
- 4 participants
- 135 discussions
r2480 - in trunk/topia-persistence-hibernate/src: main/java/org/nuiton/topia/framework main/java/org/nuiton/topia/persistence test/java/org/nuiton/topia/tck test/resources
by tchemit@users.nuiton.org 14 May '12
by tchemit@users.nuiton.org 14 May '12
14 May '12
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(a)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(a)codelutin.com>
+ * @author tchemit <chemit(a)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(a)codelutin.com>
+ * @author tchemit <chemit(a)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(a)codelutin.com>
* @since 3.0
*/
+(a)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
1
0
r2479 - in trunk/topia-persistence/src/main: java/org/nuiton/topia/generator resources resources/org resources/org/nuiton resources/org/nuiton/topia resources/org/nuiton/topia/persistence
by tchemit@users.nuiton.org 14 May '12
by tchemit@users.nuiton.org 14 May '12
14 May '12
Author: tchemit
Date: 2012-05-14 14:27:56 +0200 (Mon, 14 May 2012)
New Revision: 2479
Url: http://nuiton.org/repositories/revision/topia/2479
Log:
refs #2089: Use JPA (orm) mappings (add mapping for TopiaEntityAbstract + continue generator...)
Added:
trunk/topia-persistence/src/main/resources/org/
trunk/topia-persistence/src/main/resources/org/nuiton/
trunk/topia-persistence/src/main/resources/org/nuiton/topia/
trunk/topia-persistence/src/main/resources/org/nuiton/topia/persistence/
trunk/topia-persistence/src/main/resources/org/nuiton/topia/persistence/TopiaEntityAbstract-orm.xml
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java 2012-05-14 12:23:48 UTC (rev 2478)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java 2012-05-14 12:27:56 UTC (rev 2479)
@@ -14,7 +14,6 @@
import org.nuiton.eugene.models.object.ObjectModelAttribute;
import org.nuiton.eugene.models.object.ObjectModelClass;
import org.nuiton.eugene.models.object.ObjectModelGenerator;
-import org.nuiton.topia.persistence.TopiaEntity;
import javax.persistence.AccessType;
import javax.persistence.EnumType;
@@ -50,6 +49,8 @@
public static final String TAG_PACKAGE = "package";
+ public static final String TAG_MAPPED_SUPERCLASS = "mapped-superclass";
+
public static final String TAG_ENTITY = "entity";
public static final String TAG_TABLE = "table";
@@ -88,6 +89,12 @@
public static final String TAG_JOIN_COLUMN = "join-column";
+ public static final String TAG_INVERSE_JOIN_COLUMN = "inverse-join-column";
+
+ public static final String TAG_ORDER_COLUMN = "order-column";
+
+ public static final String TAG_ORDER_BY = "order-by";
+
public static final String TAG_JOIN_TABLE = "join-table";
public static final String TAG_GENERATED_VALUE = "generated-value";
@@ -120,7 +127,7 @@
public static final String ATTRIBUTE_FETCH = "fetch";
- private static final String ATTRIBUTE_ORPHAN_REMOVAL = "orphan-removal";
+ public static final String ATTRIBUTE_ORPHAN_REMOVAL = "orphan-removal";
public static final String ATTRIBUTE_COLUMN_DEFINITION = "column-definition";
@@ -142,29 +149,17 @@
public static final String ATTRIBUTE_REFERENCE_COLUMN_NAME = "referencedColumnName";
- private Map<String, String[]> columnNamesMap = new HashMap<String, String[]>();
+ private static final String ATTRIBUTE_TARGET_ENTITY = "target-entity";
+ private Map<String, String[]> columnNamesMap =
+ new HashMap<String, String[]>();
+
@Override
public String getFilenameForClass(ObjectModelClass clazz) {
String result = TopiaGeneratorUtil.getDOType(clazz, model);
return result.replace('.', File.separatorChar) + "-orm.xml";
}
-
- protected Multimap<String, ObjectModelAttribute> splitAttributes(
- ObjectModelClass input,
- List<ObjectModelAttribute> normalAttributes) {
- Multimap<String, ObjectModelAttribute> result = ArrayListMultimap.create();
- for (ObjectModelAttribute attribute : input.getAttributes()) {
- if (TopiaGeneratorUtil.isNaturalId(attribute)) {
- result.put("naturalId", attribute);
- } else {
- normalAttributes.add(attribute);
- }
- }
- return result;
- }
-
@Override
public void generateFromClass(Writer output,
ObjectModelClass input) throws IOException {
@@ -176,6 +171,19 @@
TopiaGeneratorUtil.PERSISTENCE_TYPE_HIBERNATE.equals(persistenceType)) {
return;
}
+
+ // la liste des autres attributs
+ List<ObjectModelAttribute> attributes =
+ new ArrayList<ObjectModelAttribute>();
+
+ // Split attributes for each embeddable
+ Multimap<String, ObjectModelAttribute> embeddableAttributes =
+ splitAttributes(input, attributes);
+
+ // get all unique constraints to add
+ Multimap<String, String> uniqueContraints = getUniqueConstraints(
+ input, attributes, embeddableAttributes);
+
/*{<?xml version="1.0" encoding="UTF-8"?>
}*/
Map<String, String> xmlAttributes = new TreeMap<String, String>();
@@ -194,15 +202,19 @@
/*{<%=flushTag(TAG_PACKAGE, input.getPackageName())%><%=closeStrictTag(TAG_PACKAGE)%>
}*/
+ // -- tag 'mapped-superclass' (fields are on Abstract so use a mapped-superclass)
+
+ addMappedSuperclass(output, input, attributes);
+
// -- tag 'entity'
String clazzFQN = input.getQualifiedName();
addAttribute(xmlAttributes, ATTRIBUTE_NAME, clazzFQN);
- addAttribute(xmlAttributes, ATTRIBUTE_CLASS, input.getName() + "Impl");
- addAttribute(xmlAttributes, ATTRIBUTE_ACCESS, AccessType.FIELD);
- addAttribute(xmlAttributes, ATTRIBUTE_METADATA_COMPLETE, true);
+ addAttribute(xmlAttributes, ATTRIBUTE_CLASS, input.getQualifiedName() + "Impl");
+// addAttribute(xmlAttributes, ATTRIBUTE_ACCESS, AccessType.FIELD);
+ addAttribute(xmlAttributes, ATTRIBUTE_METADATA_COMPLETE, false);
//NOTUSED addAttribute(xmlAttributes, ATTRIBUTE_CACHEABLE, true);
//NOTUSED addAttribute(xmlAttributes, ATTRIBUTE_NAME, "");
/*{<%=flushTag(TAG_ENTITY, xmlAttributes)%>
@@ -210,18 +222,6 @@
boolean haveSuper = input.getSuperclasses().size() > 0;
- // la liste des autres attributs
- List<ObjectModelAttribute> attributes =
- new ArrayList<ObjectModelAttribute>();
-
- // Split attributes for each embeddable
- Multimap<String, ObjectModelAttribute> embeddableAttributes =
- splitAttributes(input, attributes);
-
- // get all unique constraints to add
- Multimap<String, String> uniqueContraints = getUniqueConstraints(
- input, attributes, embeddableAttributes);
-
String tableName = TopiaGeneratorUtil.getDbName(input);
String isAbstract = BooleanUtils.toStringTrueFalse(input.isAbstract());
String clazzDOType = TopiaGeneratorUtil.getDOType(input, model);
@@ -253,10 +253,6 @@
}*/
}
- // generate attributes for the entity
-
- generateAttributes(output, input, attributes, true);
-
/*{<%=closeTag(TAG_ENTITY)%>
}*/
@@ -290,6 +286,26 @@
}*/
}
+ private void addMappedSuperclass(Writer output,
+ ObjectModelClass input,
+ List<ObjectModelAttribute> attributes) throws IOException {
+
+ Map<String, String> xmlAttributes = new TreeMap<String, String>();
+
+ addAttribute(xmlAttributes, ATTRIBUTE_CLASS, input.getQualifiedName() + "Abstract");
+ addAttribute(xmlAttributes, ATTRIBUTE_ACCESS, AccessType.FIELD);
+ addAttribute(xmlAttributes, ATTRIBUTE_METADATA_COMPLETE, false);
+/*{<%=flushTag(TAG_MAPPED_SUPERCLASS, xmlAttributes)%>
+}*/
+
+ // generate attributes for the entity
+
+ generateAttributes(output, input, attributes, true);
+
+/*{<%=closeTag(TAG_MAPPED_SUPERCLASS)%>
+}*/
+ }
+
private void generateAttributes(Writer output,
ObjectModelClass input,
Collection<ObjectModelAttribute> attributes,
@@ -305,29 +321,7 @@
/*{<%=flushTag(TAG_ATTRIBUTES)%>
}*/
- if (mainEntity) {
- // add id tag
-
- addAttribute(xmlAttributes, ATTRIBUTE_NAME, TopiaEntity.TOPIA_ID);
-//NOTUSED addAttribute(xmlAttributes, ATTRIBUTE_ACCESS, AccessType.FIELD);
-/*{<%=flushTag(TAG_ID, xmlAttributes)%>
-}*/
-//NOTUSED addAttribute(xmlAttributes, ATTRIBUTE_GENERATOR, "generatorFQN");
-//NOTUSED addAttribute(xmlAttributes, ATTRIBUTE_STRATEGY, GenerationType.AUTO);
-
-/*{<%=flushTag(TAG_GENERATED_VALUE, true, xmlAttributes)%>
-<%=closeTag(TAG_ID)%>
-}*/
- // add topiaCreateDate
-
- addAttribute(xmlAttributes, ATTRIBUTE_NAME, TopiaEntity.TOPIA_CREATE_DATE);
-/*{<%=flushTag(TAG_BASIC, xmlAttributes)%>
-<%=flushTag(TAG_TEMPORAL, javax.persistence.TemporalType.TIMESTAMP.name())%><%=closeStrictTag(TAG_TEMPORAL)%>
-<%=closeTag(TAG_BASIC)%>
-}*/
- }
-
// generate basic attributes
Collection<ObjectModelAttribute> basicAttributes =
attributesByType.get(PROPERTY_TYPE.BASIC);
@@ -335,20 +329,18 @@
generateBasicAttribute(output, input, attribute);
}
- if (mainEntity) {
-
- // add version tag
- addAttribute(xmlAttributes, ATTRIBUTE_NAME, TopiaEntity.TOPIA_VERSION);
-//NOTUSED addAttribute(xmlAttributes, ATTRIBUTE_ACCESS, AccessType.FIELD);
-/*{<%=flushTag(TAG_VERSION, true, xmlAttributes)%>
-}*/
- }
// generate many-to-one attributes
Collection<ObjectModelAttribute> manyToOneAttributes =
attributesByType.get(PROPERTY_TYPE.MANY_TO_ONE);
for (ObjectModelAttribute attribute : manyToOneAttributes) {
generateManyToOneAttribute(output, input, attribute, false);
}
+ // generate one-to-one attributes
+ Collection<ObjectModelAttribute> oneToOneAttributes =
+ attributesByType.get(PROPERTY_TYPE.ONE_TO_ONE);
+ for (ObjectModelAttribute attribute : oneToOneAttributes) {
+ generateOneToOneAttribute(output, input, attribute);
+ }
// generate one-to-many attributes
Collection<ObjectModelAttribute> oneToManyAttributes =
attributesByType.get(PROPERTY_TYPE.ONE_TO_MANY);
@@ -356,13 +348,6 @@
generateOneToManyAttribute(output, input, attribute);
}
- // generate one-to-one attributes
- Collection<ObjectModelAttribute> oneToOneAttributes =
- attributesByType.get(PROPERTY_TYPE.ONE_TO_ONE);
- for (ObjectModelAttribute attribute : oneToOneAttributes) {
- generateOneToOneAttribute(output, input, attribute);
- }
-
// generate many-to-many attributes
Collection<ObjectModelAttribute> manyToManyAttributes =
attributesByType.get(PROPERTY_TYPE.MANY_TO_MANY);
@@ -436,7 +421,8 @@
String[] columnNames = columnNamesMap.get(attrType);
// to know if specific column name mapping is given
- boolean noSpecifiedColumn = columnNames == null || columnNames.length == 0;
+ boolean noSpecifiedColumn = columnNames == null ||
+ columnNames.length == 0;
if (noSpecifiedColumn) {
@@ -467,7 +453,7 @@
attr, model);
EnumType type = useEnumerationName ? EnumType.STRING :
EnumType.ORDINAL;
-/*{<%=flushTag(TAG_ENUMERATED, true, type.name())%>
+/*{<%=flushTag(TAG_ENUMERATED, type.name())%><%=closeStrictTag(TAG_ENUMERATED)%>
}*/
}
/*{<%=closeTag(TAG_BASIC)%>
@@ -515,6 +501,7 @@
}
//NOTUSED addAttribute(columnAttributes, ATTRIBUTE_REFERENCE_COLUMN_NAME, TopiaEntity.TOPIA_ID);
+ addAttribute(xmlAttributes, ATTRIBUTE_TARGET_ENTITY, getType(attr));
boolean withDeleteCascade = false;
if (attr.isComposite() || attr.hasAssociationClass()) {
@@ -545,54 +532,165 @@
}*/
}
- private void generateOneToManyAttribute(Writer output,
+ private void generateManyToManyAttribute(Writer output,
ObjectModelClass input,
ObjectModelAttribute attr) throws IOException {
- Map<String, String> xmlAttributes = Maps.newTreeMap();
+
+
+ boolean bidirection = attr.isNavigable() &&
+ attr.getReverseAttribute().isNavigable();
+ boolean isInverse=false;
+ if (bidirection) {
+
+ // only use an inverse for a bidirection, otherwise no need
+
+ // Modification FD-2010-04-01 :
+ // Le tagvalue "inverse" permet de spécifier qui possède le
+ // inverse="true". Il est impératif de l'utiliser sur les deux
+ // extrémités pour ne pas avoir de surprise.
+ String inverseValue = TopiaGeneratorUtil.getInverseTagValue(attr);
+ if (StringUtils.isNotEmpty(inverseValue)) {
+ isInverse = Boolean.parseBoolean(inverseValue);
+ // Si aucun tagvalue n'est défini, le choix est arbitraire : le
+ // premier attribut dans l'ordre alphabétique sera choisi pour porter le
+ // inverse="true"
+ } else {
+ isInverse = TopiaGeneratorUtil.isFirstAttribute(attr);
+ }
+ }
+
+ // need an index
boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr);
- boolean isInverse = attr.getReverseAttribute().isNavigable();
- isInverse |= hasUnidirectionalRelationOnAbstractType(attr, model);
+ boolean needCascade = attr.isComposite() || attr.hasAssociationClass();
- Map<String, String> columnAttributes = Maps.newTreeMap();
+ Map<String, String> xmlAttributes = Maps.newTreeMap();
String attrName = getName(attr);
addAttribute(xmlAttributes, ATTRIBUTE_NAME, attrName);
- String reverseAttrDBName = TopiaGeneratorUtil.getReverseDbName(attr);
- String orderBy = TopiaGeneratorUtil.getOrderByTagValue(attr);
-
if ("true".equals(TopiaGeneratorUtil.getLazyTagValue(attr))) {
// lazy property
addAttribute(xmlAttributes, ATTRIBUTE_FETCH, FetchType.LAZY);
}
- if (attr.isComposite() || attr.hasAssociationClass()) {
- addAttribute(xmlAttributes, ATTRIBUTE_ORPHAN_REMOVAL, true);
- }
- addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName);
+ String attrType = getType(attr);
+ addAttribute(xmlAttributes, ATTRIBUTE_TARGET_ENTITY, attrType);
-/*{<%=flushTag(TAG_ONE_TO_MANY, xmlAttributes)%>
+ String reverseAttrDBName = TopiaGeneratorUtil.getReverseDbName(attr);
+ String attrDBName = TopiaGeneratorUtil.getDbName(attr);
+
+/*{<%=flushTag(TAG_MANY_TO_MANY, xmlAttributes)%>
}*/
+ if (needsIndex) {
+ // add a order-column
+ addAttribute(xmlAttributes, ATTRIBUTE_NAME, reverseAttrDBName + "_idx");
+// addAttribute(xmlAttributes, ATTRIBUTE_NULLABLE, true);
+ addAttribute(xmlAttributes, ATTRIBUTE_INSERTABLE, false);
+/*{<%=flushTag(TAG_ORDER_COLUMN, true, xmlAttributes)%>
+}*/
+ } else {
- if (StringUtils.isNotBlank(orderBy)) {
- //TODO Order-by or order-column ?
+ String orderBy = TopiaGeneratorUtil.getOrderByTagValue(attr);
+ if (StringUtils.isNotBlank(orderBy)) {
+ // add order-by
+/*{<%=flushTag(TAG_ORDER_BY, orderBy)%><%=closeStrictTag(TAG_ORDER_BY)%>
+}*/
+ }
}
- if (needsIndex) {
+ String schema = TopiaGeneratorUtil.getDbSchemaNameTagValue(input, model);
+
+ if (!bidirection) {
+
+ // master of relation add a join table
+ Map<String, String> columnAttributes = Maps.newTreeMap();
+
+ String tableName = TopiaGeneratorUtil.getManyToManyTableName(attr);
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, tableName);
+
+ if (schema != null) {
+ addAttribute(columnAttributes, ATTRIBUTE_SCHEMA, schema);
+ }
+
+/*{<%=flushTag(TAG_JOIN_TABLE, columnAttributes)%>
+}*/
+ // add join-column
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName);
+/*{<%=flushTag(TAG_JOIN_COLUMN, true, columnAttributes)%>
+}*/
+ // add a reverse-join-column
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, attrDBName);
+/*{<%=flushTag(TAG_INVERSE_JOIN_COLUMN, true, columnAttributes)%>
+}*/
+
+/*{<%=closeTag(TAG_JOIN_TABLE)%>
+}*/
+
} else {
- }
- if (MapUtils.isNotEmpty(columnAttributes)) {
+ if (isInverse) {
+
+ // inverse of relation
+
+ Map<String, String> columnAttributes = Maps.newTreeMap();
+
+ String tableName = TopiaGeneratorUtil.getManyToManyTableName(attr);
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, tableName);
+
+ if (schema != null) {
+ addAttribute(columnAttributes, ATTRIBUTE_SCHEMA, schema);
+ }
+
+/*{<%=flushTag(TAG_JOIN_TABLE, columnAttributes)%>
+}*/
+ // add join-column
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName);
/*{<%=flushTag(TAG_JOIN_COLUMN, true, columnAttributes)%>
}*/
+ // add inverse-join-column
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, attrDBName);
+/*{<%=flushTag(TAG_INVERSE_JOIN_COLUMN, true, columnAttributes)%>
+}*/
+/*{<%=closeTag(TAG_JOIN_TABLE)%>
+}*/
+ } else {
+
+ // master of relation
+
+ // master of relation add a join table
+ Map<String, String> columnAttributes = Maps.newTreeMap();
+
+ String tableName = TopiaGeneratorUtil.getManyToManyTableName(attr);
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, tableName);
+
+ if (schema != null) {
+ addAttribute(columnAttributes, ATTRIBUTE_SCHEMA, schema);
+ }
+
+/*{<%=flushTag(TAG_JOIN_TABLE, columnAttributes)%>
+}*/
+ // add join-column
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName);
+/*{<%=flushTag(TAG_JOIN_COLUMN, true, columnAttributes)%>
+}*/
+ // add inverse-join-column
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, attrDBName);
+/*{<%=flushTag(TAG_INVERSE_JOIN_COLUMN, true, columnAttributes)%>
+}*/
+/*{<%=closeTag(TAG_JOIN_TABLE)%>
+}*/
+ }
}
+ if (needCascade) {
/*{<%=flushTag(TAG_CASCADE)%>
-<%=flushTag(TAG_CASCADE_ALL, true)%>
+<%=flushTag(TAG_CASCADE_REMOVE, true)%>
<%=closeTag(TAG_CASCADE)%>
}*/
-/*{<%=closeTag(TAG_ONE_TO_MANY)%>
+ }
+
+/*{<%=closeTag(TAG_MANY_TO_MANY)%>
}*/
}
@@ -608,16 +706,98 @@
generateManyToOneAttribute(output, input, attr, unique);
}
- private void generateManyToManyAttribute(Writer output,
+ private void generateOneToManyAttribute(Writer output,
ObjectModelClass input,
ObjectModelAttribute attr) throws IOException {
+
Map<String, String> xmlAttributes = Maps.newTreeMap();
+ boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr);
+//NOTUSED (no more inverse = true)
+// boolean isInverse = attr.getReverseAttribute().isNavigable();
+// isInverse |= hasUnidirectionalRelationOnAbstractType(attr, model);
+
+ Map<String, String> columnAttributes = Maps.newTreeMap();
+
+ String attrName = getName(attr);
+ addAttribute(xmlAttributes, ATTRIBUTE_NAME, attrName);
+ addAttribute(xmlAttributes, ATTRIBUTE_TARGET_ENTITY, getType(attr));
+
+ String reverseAttrDBName = TopiaGeneratorUtil.getReverseDbName(attr);
+
+ if ("true".equals(TopiaGeneratorUtil.getLazyTagValue(attr))) {
+
+ // lazy property
+ addAttribute(xmlAttributes, ATTRIBUTE_FETCH, FetchType.LAZY);
+ }
+ if (attr.isComposite() || attr.hasAssociationClass()) {
+ addAttribute(xmlAttributes, ATTRIBUTE_ORPHAN_REMOVAL, true);
+ }
+
+ addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName);
+
+/*{<%=flushTag(TAG_ONE_TO_MANY, xmlAttributes)%>
+}*/
+
+ if (needsIndex) {
+ // add a order-column
+ addAttribute(xmlAttributes, ATTRIBUTE_NAME, reverseAttrDBName + "_idx");
+// addAttribute(xmlAttributes, ATTRIBUTE_NULLABLE, true);
+ addAttribute(xmlAttributes, ATTRIBUTE_INSERTABLE, false);
+/*{<%=flushTag(TAG_ORDER_COLUMN, true, xmlAttributes)%>
+}*/
+ } else {
+
+ String orderBy = TopiaGeneratorUtil.getOrderByTagValue(attr);
+ if (StringUtils.isNotBlank(orderBy)) {
+ // add order-by
+/*{<%=flushTag(TAG_ORDER_BY, orderBy)%><%=closeStrictTag(TAG_ORDER_BY)%>
+}*/
+ }
+ }
+
+ if (MapUtils.isNotEmpty(columnAttributes)) {
+/*{<%=flushTag(TAG_JOIN_COLUMN, true, columnAttributes)%>
+}*/
+ }
+
+/*{<%=flushTag(TAG_CASCADE)%>
+<%=flushTag(TAG_CASCADE_ALL, true)%>
+<%=closeTag(TAG_CASCADE)%>
+}*/
+/*{<%=closeTag(TAG_ONE_TO_MANY)%>
+}*/
}
private void generateElementCollectionAttribute(Writer output,
ObjectModelClass input,
ObjectModelAttribute attr) throws IOException {
+ boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr);
+ String attrName = getName(attr);
+ String attrType = getType(attr);
Map<String, String> xmlAttributes = Maps.newTreeMap();
+ addAttribute(xmlAttributes, ATTRIBUTE_NAME, attrName);
+/*{<%=flushTag(TAG_ELEMENT_COLLECTION, xmlAttributes)%>
+}*/
+
+ boolean attrIsEnumeration = attr.getClassifier() != null
+ && attr.getClassifier().isEnum();
+ if (attrIsEnumeration) {
+
+ // if the user tuned the model to use name instead of
+ // ordinal to store the values, we must add a clause
+ boolean useEnumerationName =
+ TopiaGeneratorUtil.hasUseEnumerationNameTagValue(
+ attr, model);
+ EnumType type = useEnumerationName ? EnumType.STRING :
+ EnumType.ORDINAL;
+/*{<%=flushTag(TAG_ENUMERATED, type.name())%><%=closeStrictTag(TAG_ENUMERATED)%>
+}*/
+ }
+
+ //FIXME Do for temporal type
+/*{<%=closeTag(TAG_ELEMENT_COLLECTION)%>
+}*/
+
}
private void addAttribute(Map<String, String> attributes,
@@ -705,8 +885,8 @@
Map<String, String> attributes,
String textValue) {
- if (log.isInfoEnabled()) {
- log.info("flushTag <" + tagName + "> : level " + xmlLevel);
+ if (log.isDebugEnabled()) {
+ log.debug("flushTag <" + tagName + "> : level " + xmlLevel);
}
StringBuilder builder = new StringBuilder(getXmlPrefix());
xmlLevel++;
@@ -738,8 +918,8 @@
private String closeStrictTag(String tagName) {
xmlLevel--;
String result = "</" + tagName + ">";
- if (log.isInfoEnabled()) {
- log.info("closeStrictTag <" + tagName + "> : level " + xmlLevel);
+ if (log.isDebugEnabled()) {
+ log.debug("closeStrictTag <" + tagName + "> : level " + xmlLevel);
}
return result;
}
@@ -747,8 +927,8 @@
private String closeTag(String tagName) {
xmlLevel--;
String result = getXmlPrefix() + "</" + tagName + ">";
- if (log.isInfoEnabled()) {
- log.info("closeTag <" + tagName + "> : level " + xmlLevel);
+ if (log.isDebugEnabled()) {
+ log.debug("closeTag <" + tagName + "> : level " + xmlLevel);
}
return result;
}
@@ -871,4 +1051,18 @@
}
return TopiaGeneratorUtil.getDOType(type, model);
}
+
+ private Multimap<String, ObjectModelAttribute> splitAttributes(
+ ObjectModelClass input,
+ List<ObjectModelAttribute> normalAttributes) {
+ Multimap<String, ObjectModelAttribute> result = ArrayListMultimap.create();
+ for (ObjectModelAttribute attribute : input.getAttributes()) {
+ if (TopiaGeneratorUtil.isNaturalId(attribute)) {
+ result.put("naturalId", attribute);
+ } else {
+ normalAttributes.add(attribute);
+ }
+ }
+ return result;
+ }
}
Added: trunk/topia-persistence/src/main/resources/org/nuiton/topia/persistence/TopiaEntityAbstract-orm.xml
===================================================================
--- trunk/topia-persistence/src/main/resources/org/nuiton/topia/persistence/TopiaEntityAbstract-orm.xml (rev 0)
+++ trunk/topia-persistence/src/main/resources/org/nuiton/topia/persistence/TopiaEntityAbstract-orm.xml 2012-05-14 12:27:56 UTC (rev 2479)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">
+ <mapped-superclass class="org.nuiton.topia.persistence.TopiaEntityAbstract" access="FIELD">
+ <attributes>
+ <id name="topiaId" access="FIELD">
+ <generated-value strategy="IDENTITY"/>
+ </id>
+ <basic name="topiaCreateDate">
+ <temporal>TIMESTAMP</temporal>
+ </basic>
+ <version name="topiaVersion"/>
+ </attributes>
+ </mapped-superclass>
+</entity-mappings>
1
0
r2478 - trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util
by tchemit@users.nuiton.org 14 May '12
by tchemit@users.nuiton.org 14 May '12
14 May '12
Author: tchemit
Date: 2012-05-14 14:23:48 +0200 (Mon, 14 May 2012)
New Revision: 2478
Url: http://nuiton.org/repositories/revision/topia/2478
Log:
this classes are not deprecated
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperatorStore.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java 2012-05-14 12:23:24 UTC (rev 2477)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java 2012-05-14 12:23:48 UTC (rev 2478)
@@ -76,9 +76,7 @@
* @param <B> type de l'entite
* @author tchemit <chemit(a)codelutin.com>
* @since 2.2.0
- * @deprecated since 3.0 not useful anymore
*/
-@Deprecated
public class EntityOperator<B extends TopiaEntity> {
/** Logger */
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperatorStore.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperatorStore.java 2012-05-14 12:23:24 UTC (rev 2477)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperatorStore.java 2012-05-14 12:23:48 UTC (rev 2478)
@@ -35,9 +35,7 @@
*
* @author tchemit <chemit(a)codelutin.com>
* @see EntityOperator
- * @deprecated since 3.0 not useful anymore
*/
-@Deprecated
public class EntityOperatorStore {
/**
1
0
r2477 - trunk/topia-persistence/src/main/java/org/nuiton/topia/generator
by tchemit@users.nuiton.org 14 May '12
by tchemit@users.nuiton.org 14 May '12
14 May '12
Author: tchemit
Date: 2012-05-14 14:23:24 +0200 (Mon, 14 May 2012)
New Revision: 2477
Url: http://nuiton.org/repositories/revision/topia/2477
Log:
remove old commented code
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2012-05-14 10:20:01 UTC (rev 2476)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2012-05-14 12:23:24 UTC (rev 2477)
@@ -590,31 +590,6 @@
getProperty(PROP_DEFAULT_PACKAGE) + '.' + daoHelper;
addImport(result, daoHelperFQN);
- //FIXME_-FC-20100413 Use a TopiaQuery (use HQLin elements)
-// // Add DAOHelper
-// String daoHelper = modelName + "DAOHelper";
-// String daoHelperFQN = getOutputProperties().
-// getProperty(PROP_DEFAULT_PACKAGE) + '.' + daoHelper;
-// addImport(result, daoHelperFQN);
-//
-// // Add import for TopiaQuery
-// addImport(result, TopiaQuery.class);
-//
-// // Entity DAO and reversePropertyName
-// String entityDAO = attrType + "DAO";
-// String reverseAttrNameProperty =
-// attrType + "." + getConstantName(reverseAttrName);
-//
-//
-// <%=entityDAO%> dao = <%=daoHelper%>.get<%=entityDAO%>(getContext());
-// TopiaQuery query = dao.createQuery("B").
-// addFrom(entity.getClass(), "A").
-// add("A", entity).
-// addInElements("A", "B." + <%=reverseAttrNameProperty%>);
-//
-// System.out.println("Query : " + query);
-// List<<%=attrType%>> list = dao.findAllByQuery(query);
-
String removeName = getJavaBeanMethodName("remove", reverseAttrName);
body.append(""
/*{
@@ -628,14 +603,6 @@
" AND A = :A")
.setParameter("A", entity)
.getResultList();
-// List<<%=attrType%>> list = getContext().getEntityManager().createNativeQuery(
-// "SELECT main.topiaid " +
-// "from <%=attrClassifierDBName%> main, <%=attrJoinTableName%> secondary " +
-// "where main.topiaid=secondary.<%=attrDBName%>" +
-// " and secondary.<%=attrReverseDBName%>='" + entity.getTopiaId() + "'")
-// //.addEntity("main", <%=providerFQN%>(<%=attrType%>.class))
-// .getResultList();
-
for (<%=attrType%> item : list) {
item.<%=removeName%>(entity);
}
1
0
r2476 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence
by athimel@users.nuiton.org 14 May '12
by athimel@users.nuiton.org 14 May '12
14 May '12
Author: athimel
Date: 2012-05-14 12:20:01 +0200 (Mon, 14 May 2012)
New Revision: 2476
Url: http://nuiton.org/repositories/revision/topia/2476
Log:
Start of implementation of events on Hibernate
Added:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java
Modified:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2012-05-14 10:10:27 UTC (rev 2475)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2012-05-14 10:20:01 UTC (rev 2476)
@@ -570,15 +570,8 @@
TopiaContextImplementor parent, EntityManager hibernate) {
TopiaContextImplementor result = null;
- // FD-20100421 : Ano #546 : no need to copy childContexts, the
- // {@link #getChildContext()} provides a thread-safe copy to iterate
- // on it.
-// Set<TopiaContextImplementor> contextChilds = new HashSet<TopiaContextImplementor>(parent.getChildContext());
for (TopiaContextImplementor context : parent.getChildContexts()) {
-// by sletellier 24/09/09 : Fix concurent acces error
-// ArrayList<TopiaContextImplementor> children = new ArrayList(parent.getChildContext());
-// for (TopiaContextImplementor context : children) {
try {
if (context.getEntityManager() == hibernate) {
result = context;
Added: 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 (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java 2012-05-14 10:20:01 UTC (rev 2476)
@@ -0,0 +1,73 @@
+package org.nuiton.topia.framework;
+
+import org.hibernate.event.spi.PostDeleteEvent;
+import org.hibernate.event.spi.PostDeleteEventListener;
+import org.hibernate.event.spi.PostInsertEvent;
+import org.hibernate.event.spi.PostInsertEventListener;
+import org.hibernate.event.spi.PostLoadEvent;
+import org.hibernate.event.spi.PostLoadEventListener;
+import org.hibernate.event.spi.PostUpdateEvent;
+import org.hibernate.event.spi.PostUpdateEventListener;
+import org.hibernate.event.spi.PreDeleteEvent;
+import org.hibernate.event.spi.PreDeleteEventListener;
+import org.hibernate.event.spi.PreInsertEvent;
+import org.hibernate.event.spi.PreInsertEventListener;
+import org.hibernate.event.spi.PreLoadEvent;
+import org.hibernate.event.spi.PreLoadEventListener;
+import org.hibernate.event.spi.PreUpdateEvent;
+import org.hibernate.event.spi.PreUpdateEventListener;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TopiaHibernateJPAEntityListener
+ implements PreLoadEventListener, PostLoadEventListener,
+ PreInsertEventListener, PostInsertEventListener,
+ PreUpdateEventListener, PostUpdateEventListener,
+ PreDeleteEventListener, PostDeleteEventListener {
+
+ @Override
+ public void onPreLoad(PreLoadEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ }
+
+ @Override
+ public void onPostLoad(PostLoadEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ }
+
+ @Override
+ public boolean onPreInsert(PreInsertEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ return false;
+ }
+
+ @Override
+ public void onPostInsert(PostInsertEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ }
+
+
+ @Override
+ public boolean onPreUpdate(PreUpdateEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ return false;
+ }
+
+ @Override
+ public void onPostUpdate(PostUpdateEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ }
+
+ @Override
+ public boolean onPreDelete(PreDeleteEvent event) {
+ // TODO AThimel 14/05/2012 Find a way to identify the TopiaContext
+ return false;
+ }
+
+ @Override
+ public void onPostDelete(PostDeleteEvent 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 10:10:27 UTC (rev 2475)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-05-14 10:20:01 UTC (rev 2476)
@@ -8,6 +8,7 @@
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.ejb.packaging.NamedInputStream;
import org.hibernate.ejb.packaging.PersistenceMetadata;
+import org.nuiton.topia.framework.TopiaHibernateJPAEntityListener;
import org.nuiton.topia.framework.TopiaPersistenceProvider;
import org.nuiton.topia.framework.TopiaSpecificUtil;
@@ -74,6 +75,15 @@
}
}
+ 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());
+
// For each entity, get its FQN
List<String> entitiesNames = Lists.newArrayList(
Iterables.transform(entities, GET_FQN));
1
0
r2475 - in trunk/topia-persistence-hibernate/src: main/java/org/nuiton/topia/framework main/java/org/nuiton/topia/persistence main/resources/META-INF/services test/java/org/nuiton/topia/framework test/resources
by athimel@users.nuiton.org 14 May '12
by athimel@users.nuiton.org 14 May '12
14 May '12
Author: athimel
Date: 2012-05-14 12:10:27 +0200 (Mon, 14 May 2012)
New Revision: 2475
Url: http://nuiton.org/repositories/revision/topia/2475
Log:
Remove useless .hibernate. package in topia-persistence-hibernate
Added:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.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
Removed:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/
Modified:
trunk/topia-persistence-hibernate/src/main/resources/META-INF/services/javax.persistence.spi.PersistenceProvider
trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.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
Copied: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java (from rev 2474, trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/TopiaHibernateConnectionProvider.java)
===================================================================
--- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java 2012-05-14 10:10:27 UTC (rev 2475)
@@ -0,0 +1,343 @@
+/*
+ * #%L
+ * ToPIA :: Persistence
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.topia.framework;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.internal.util.ReflectHelper;
+import org.hibernate.internal.util.config.ConfigurationHelper;
+import org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator;
+import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
+import org.hibernate.cfg.Environment;
+import org.hibernate.service.spi.Configurable;
+import org.hibernate.service.spi.Stoppable;
+
+import javax.persistence.PersistenceException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Customized connection provider.
+ * <p/>
+ * This provider fix the following bug :
+ * http://nuiton.org/issues/show/561
+ * <p/>
+ * To use this connection provider, add this property to topia configuration
+ * <p/>
+ * <pre>
+ * config.setProperty(AvailableSettings.CONNECTION_PROVIDER, TopiaHibernateConnectionProvider.class.getName());
+ * </pre>
+ * <p/>
+ * or in a properties file :
+ * <p/>
+ * <pre>
+ * hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaHibernateConnectionProvider
+ * </pre>
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 2.5.3
+ */
+public class TopiaHibernateConnectionProvider implements ConnectionProvider, Configurable, Stoppable {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(TopiaHibernateConnectionProvider.class);
+
+ /**
+ * JDBC url of connection.
+ * <p/>
+ * This is a mandatory hibernate configuration vi the property
+ * {@link Environment#URL}.
+ */
+ private String url;
+
+ /** All grabbed connection properties */
+ private Properties connectionProps;
+
+ /**
+ * Sql isolation level to use in connection.
+ * <p/>
+ * Can be configured by hibernate property {@link Environment#ISOLATION_LEVELS}.
+ *
+ * @see Connection#getTransactionIsolation()
+ */
+ private Integer isolation;
+
+ /**
+ * auto commit connection state.
+ * <p/>
+ * Can be configured by hibernate property {@link Environment#AUTOCOMMIT}.
+ *
+ * @see Connection#getAutoCommit()
+ */
+ private boolean autocommit;
+
+ /**
+ * Size of connection pool.
+ * <p/>
+ * By default use {@code 20}, can be specify by using the hibernate
+ * configuration property {@link Environment#POOL_SIZE}.
+ */
+ private int poolSize;
+
+ /** Our pool of connections which are not closed and availables. */
+ private final List<Connection> pool;
+
+ public TopiaHibernateConnectionProvider() {
+ pool = new ArrayList<Connection>();
+ }
+
+ @Override
+ public void configure(Map map) {
+ Map<String, String> configurationValues = (Map<String, String>)map;
+
+ String driverClass = configurationValues.get(Environment.DRIVER);
+
+ poolSize = ConfigurationHelper.getInt(AvailableSettings.POOL_SIZE, configurationValues, 20); // default pool size 20
+ if (log.isDebugEnabled()) {
+ log.debug("Connection pool size: " + poolSize);
+ }
+
+ autocommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues );
+ if (log.isDebugEnabled())
+ log.debug("autocommit mode: " + autocommit);
+
+ isolation = ConfigurationHelper.getInteger( AvailableSettings.ISOLATION, configurationValues );
+ if (isolation != null) {
+ if (log.isDebugEnabled()) {
+ log.debug("JDBC isolation level: " +
+ Environment.isolationLevelToString(isolation));
+ }
+ }
+
+ if (driverClass == null) {
+
+ if (log.isWarnEnabled()) {
+ log.warn("no JDBC Driver class was specified by property " +
+ Environment.DRIVER);
+ }
+ } else {
+ try {
+ // trying via forName() first to be as close to DriverManager's semantics
+ Class.forName(driverClass);
+ } catch (ClassNotFoundException cnfe) {
+ try {
+ ReflectHelper.classForName(driverClass);
+ } catch (ClassNotFoundException e) {
+ String msg = "JDBC Driver class not found: " + driverClass;
+ log.error(msg, e);
+ throw new PersistenceException(msg, e);
+ }
+ }
+ }
+
+ url = configurationValues.get(Environment.URL);
+ if (url == null) {
+ String msg = "JDBC URL was not specified by property " +
+ Environment.URL;
+ if (log.isErrorEnabled()) {
+ log.error(msg);
+ }
+ throw new PersistenceException(msg);
+ }
+
+ connectionProps =
+ ConnectionProviderInitiator.getConnectionProperties(configurationValues);
+
+ if (log.isDebugEnabled()) {
+ log.debug("using driver: " + driverClass + " at URL: " + url);
+ }
+ // if debug level is enabled, then log the password, otherwise mask it
+ if (log.isTraceEnabled()) {
+ log.debug("connection properties: " + connectionProps);
+ } else if (log.isDebugEnabled()) {
+ log.debug("connection properties: " +
+ ConfigurationHelper.maskOut(connectionProps, "password"));
+ }
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+
+ Connection connection = null;
+
+ synchronized (pool) {
+
+ // try to use a connection from the pool (if any)
+
+ while (!pool.isEmpty() && connection == null) {
+ int last = pool.size() - 1;
+ if (log.isTraceEnabled()) {
+ log.trace("using pooled JDBC connection, pool size: " +
+ last);
+ }
+
+ connection = pool.remove(last);
+ if (connection.isClosed()) {
+
+ // this connection is closed!, don't use it
+ connection = null;
+
+ if (log.isDebugEnabled()) {
+ log.debug("Remove already closed connection from pool " +
+ connection);
+ }
+ }
+ }
+ }
+
+ if (connection == null) {
+
+ // the pool was empty, creates a new connection
+
+ if (log.isDebugEnabled()) {
+ log.debug("opening new JDBC connection to " + url);
+ }
+ connection = DriverManager.getConnection(url, connectionProps);
+ }
+
+ // configure connection
+
+ if (isolation != null) {
+ connection.setTransactionIsolation(isolation);
+ }
+ if (connection.getAutoCommit() != autocommit) {
+ connection.setAutoCommit(autocommit);
+ }
+
+ return connection;
+ }
+
+ @Override
+ public void closeConnection(Connection conn) throws SQLException {
+
+ // if connection is already closed, nothing has to be done
+ // we can't keep this connection (and can not be push in pool)
+
+ if (conn.isClosed()) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("Connection [" + conn +
+ "] alreay closed!, will not use it any longer ");
+ }
+ return;
+ }
+
+ // connection was not closed, can push it in the pool (if pool is not
+ // full)
+
+ synchronized (pool) {
+ int currentSize = pool.size();
+ if (currentSize < getPoolSize()) {
+ if (log.isTraceEnabled()) {
+ log.trace("returning connection to pool, pool size: " +
+ (currentSize + 1));
+ }
+ pool.add(conn);
+ return;
+ }
+ }
+
+ // pool was full, must release the connection which will be loose
+
+ if (log.isDebugEnabled()) {
+ log.debug("closing JDBC connection");
+ }
+
+ conn.close();
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ super.finalize();
+ stop();
+ }
+
+ @Override
+ public void stop() {
+
+ if (log.isDebugEnabled()) {
+ log.debug("cleaning up connection pool: " + url);
+ }
+
+ for (Connection connection : pool) {
+ try {
+ connection.close();
+ } catch (SQLException sqle) {
+ if (log.isWarnEnabled()) {
+ log.warn("problem closing pooled connection", sqle);
+ }
+ }
+ }
+ pool.clear();
+
+ }
+
+ @Override
+ public boolean supportsAggressiveRelease() {
+ return false;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public Properties getConnectionProps() {
+ return connectionProps;
+ }
+
+ public Integer getIsolation() {
+ return isolation;
+ }
+
+ public List<Connection> getPool() {
+ return pool;
+ }
+
+ public int getPoolSize() {
+ return poolSize;
+ }
+
+ public boolean isAutocommit() {
+ return autocommit;
+ }
+
+ @Override
+ public boolean isUnwrappableAs(Class unwrapType) {
+ return false;
+ }
+
+ @Override
+ public <T> T unwrap(Class<T> unwrapType) {
+ return null;
+ }
+
+}
Property changes on: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateConnectionProvider.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Copied: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java (from rev 2474, 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/TopiaHibernatePersistenceProvider.java (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-05-14 10:10:27 UTC (rev 2475)
@@ -0,0 +1,115 @@
+package org.nuiton.topia.persistence;
+
+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;
+import org.nuiton.topia.framework.TopiaPersistenceProvider;
+import org.nuiton.topia.framework.TopiaSpecificUtil;
+
+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
+ *
+ * @author Arnaud Thimel <thimel(a)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);
+ // Convert everything from topia.connection.* to hibernate.connection.*
+ 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);
+ }
+ }
+
+ // For each entity, get its FQN
+ List<String> entitiesNames = Lists.newArrayList(
+ Iterables.transform(entities, GET_FQN));
+
+ // For each entity, get the HBM InputStream
+ List<NamedInputStream> entitiesHbmFiles = Lists.newArrayList(
+ Iterables.transform(entitiesNames, GET_HBM_NAMED_INPUT_STREAM));
+
+ // For each entity, get the ORM mapping path
+ List<String> entitiesMappingFiles = Lists.newArrayList(
+ Iterables.transform(entitiesNames, GET_ORM_FILE_PATH));
+
+ // 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); // 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(hibernateConfiguration);
+
+ Pair<EntityManagerFactory, TopiaSpecificUtil> result =
+ Pair.of(entityManagerFactory, specificUtil);
+ return result;
+ }
+
+}
Copied: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java (from rev 2474, trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernateSpecificUtil.java)
===================================================================
--- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java 2012-05-14 10:10:27 UTC (rev 2475)
@@ -0,0 +1,114 @@
+package org.nuiton.topia.persistence;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Table;
+import org.hibernate.tool.hbm2ddl.DatabaseMetadata;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.hbm2ddl.SchemaUpdate;
+import org.hibernate.tool.hbm2ddl.TableMetadata;
+import org.nuiton.topia.framework.TopiaSpecificUtil;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Iterator;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TopiaHibernateSpecificUtil implements TopiaSpecificUtil {
+
+ private static final Log log = LogFactory.getLog(TopiaHibernateSpecificUtil.class);
+
+ protected Configuration configuration;
+
+ public TopiaHibernateSpecificUtil(Configuration configuration) {
+ this.configuration = configuration;
+ }
+
+ @Override
+ public void createSchema(boolean showSchema) {
+ SchemaExport schemaExport = new SchemaExport(configuration);
+ schemaExport.create(showSchema, true);
+ }
+
+ @Override
+ public void showCreateSchema() {
+ new SchemaExport(configuration).execute(true, false, false, true);
+ }
+
+ @Override
+ public void updateSchema(boolean showSchema) {
+ new SchemaUpdate(configuration).execute(showSchema, true);
+ }
+
+ @Override
+ public boolean isSchemaExist(Class<?> clazz) {
+ String entityName = clazz.getName();
+
+ boolean result = false;
+ try {
+ PersistentClass classMapping =
+ configuration.getClassMapping(entityName);
+ if (classMapping == null) {
+ if (log.isInfoEnabled()) {
+ Iterator<?> itr = configuration.getClassMappings();
+ while (itr.hasNext()) {
+ log.info("available mapping " + itr.next());
+ }
+ }
+ throw new IllegalArgumentException(
+ "could not find entity with name " + entityName);
+ }
+ Table testTable = classMapping.getTable();
+
+ if (testTable == null) {
+ throw new IllegalArgumentException(
+ "could not find entity with name " + entityName);
+ }
+// ConnectionProvider connectionProvider =
+// ConnectionProviderFactory.newConnectionProvider(
+// configuration.getProperties());
+
+ Dialect dialect = Dialect.getDialect(configuration.getProperties());
+
+ Connection connection = null;
+ try {
+// connection = connectionProvider.getConnection();
+
+ // FIXME AThimel 10/05/2012 It would be better to re-use the ConnectionProvider but I can't find how to do it for the moment
+ String url = configuration.getProperty(AvailableSettings.URL);
+ String username = configuration.getProperty(AvailableSettings.USER);
+ String password = configuration.getProperty(AvailableSettings.PASS);
+ connection = DriverManager.getConnection(url, username, password);
+
+ DatabaseMetadata meta = new DatabaseMetadata(connection, dialect);
+
+ TableMetadata tmd = meta.getTableMetadata(
+ testTable.getName(), testTable.getSchema(),
+ testTable.getCatalog(), testTable.isQuoted());
+
+ if (tmd != null) {
+ //table exist
+ result = true;
+ }
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+
+ } catch (SQLException e) {
+ log.error("Cant connect to database", e);
+// } catch (TopiaNotFoundException e) {
+// log.error("Cant connect to database", e);
+ }
+
+ return result;
+ }
+}
Modified: trunk/topia-persistence-hibernate/src/main/resources/META-INF/services/javax.persistence.spi.PersistenceProvider
===================================================================
--- trunk/topia-persistence-hibernate/src/main/resources/META-INF/services/javax.persistence.spi.PersistenceProvider 2012-05-14 09:58:22 UTC (rev 2474)
+++ trunk/topia-persistence-hibernate/src/main/resources/META-INF/services/javax.persistence.spi.PersistenceProvider 2012-05-14 10:10:27 UTC (rev 2475)
@@ -1 +1 @@
-org.nuiton.topia.persistence.hibernate.TopiaHibernatePersistenceProvider
+org.nuiton.topia.persistence.TopiaHibernatePersistenceProvider
\ No newline at end of file
Modified: trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java
===================================================================
--- trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java 2012-05-14 09:58:22 UTC (rev 2474)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java 2012-05-14 10:10:27 UTC (rev 2475)
@@ -46,7 +46,7 @@
import static org.junit.Assert.assertNotNull;
/**
- * To test the {@link org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider} and make sure all connections
+ * To test the {@link TopiaHibernateConnectionProvider} and make sure all connections
* are done from here...
*
* @author tchemit <chemit(a)codelutin.com>
Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties
===================================================================
--- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties 2012-05-14 09:58:22 UTC (rev 2474)
+++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties 2012-05-14 10:10:27 UTC (rev 2475)
@@ -9,4 +9,4 @@
topia.connection.driver_class=org.h2.Driver
#Not necessary, but useful
-hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
+hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaHibernateConnectionProvider
Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties
===================================================================
--- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties 2012-05-14 09:58:22 UTC (rev 2474)
+++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties 2012-05-14 10:10:27 UTC (rev 2475)
@@ -9,4 +9,4 @@
topia.connection.driver_class=org.h2.Driver
#Not necessary, but useful
-hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
+hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaHibernateConnectionProvider
Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties
===================================================================
--- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties 2012-05-14 09:58:22 UTC (rev 2474)
+++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties 2012-05-14 10:10:27 UTC (rev 2475)
@@ -9,4 +9,4 @@
topia.connection.driver_class=org.h2.Driver
#Not necessary, but useful
-hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
+hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaHibernateConnectionProvider
1
0
r2474 - trunk/topia-persistence/src/main/java/org/nuiton/topia/framework
by athimel@users.nuiton.org 14 May '12
by athimel@users.nuiton.org 14 May '12
14 May '12
Author: athimel
Date: 2012-05-14 11:58:22 +0200 (Mon, 14 May 2012)
New Revision: 2474
Url: http://nuiton.org/repositories/revision/topia/2474
Log:
Review the way JPAConfiguration is built
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.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 17:05:07 UTC (rev 2473)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-05-14 09:58:22 UTC (rev 2474)
@@ -26,7 +26,9 @@
package org.nuiton.topia.framework;
import com.google.common.base.Splitter;
-import org.apache.commons.lang3.StringUtils;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.topia.TopiaContext;
@@ -322,7 +324,7 @@
if (getParentContext() != null) {
entityManagerFactory = getParentContext().getEntityManagerFactory();
} else {
- Map params = getJPAConfiguration();
+ Map<String, Object> params = getJPAConfiguration();
entityManagerFactory = Persistence.createEntityManagerFactory(
TopiaPersistenceProvider.TOPIA_PERSISTENCE_UNIT_NAME, params);
}
@@ -383,53 +385,62 @@
String listPersistenceClasses = getConfig().getProperty(
TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES, "");
- Iterable<String> classes = Splitter.on(",")
+ Iterable<String> classNames = Splitter.on(",")
.trimResults()
.omitEmptyStrings()
.split(listPersistenceClasses);
- for (String className : classes) {
- className = className.trim();
+ // Loop on classNames, and check if each Class exists
+ // If a of the class does not exist, throw a TopiaNotFoundException
+ for (String className : classNames) {
- if (StringUtils.isNotEmpty(className)) {
- if (log.isDebugEnabled()) {
- log.debug("Load persistent class : " + className);
- }
+ if (log.isDebugEnabled()) {
+ log.debug("Load persistent class : " + className);
+ }
- // XXX echatellier 20111007 ce cqui est dommage ici, c'est
- // la definition de cette classe ne sert a rien (apart security)
- // car pour hibernate hibernateConfiguration.addClass(persistanceClass)
- // il ne se sert pas de la classe en fait et fait seulement
- // un className.replace( '.', '/' ) + ".hbm.xml";
- // pour obtenir le mapping et la reinstancier ensuite
-
- Class<?> clazz;
- try {
- clazz = Class.forName(className);
- } catch (ClassNotFoundException eee) {
- String message = String.format(
- "Persistent class %s not found",
- className);
- if (log.isWarnEnabled()) {
- log.warn(message);
- }
- throw new TopiaNotFoundException(message, eee);
+ Class<?> clazz;
+ try {
+ clazz = Class.forName(className);
+ } catch (ClassNotFoundException eee) {
+ String message = String.format(
+ "Persistent class '%s' not found",
+ className);
+ if (log.isWarnEnabled()) {
+ log.warn(message);
}
- persistenceClasses.add(clazz);
+ throw new TopiaNotFoundException(message, eee);
}
+ persistenceClasses.add(clazz);
}
- jpaConfiguration.put(TopiaPersistenceProvider.TOPIA_ENTITIES, persistenceClasses);
- jpaConfiguration.put(TopiaPersistenceProvider.TOPIA_CONTEXT, this);
+ // allProperties will be a flatten version of all the properties
+ Properties allProperties = new Properties();
+ allProperties.putAll(getConfig());
- // 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()) {
- Object key = entry.getKey();
- if (key instanceof String) {
- jpaConfiguration.put((String)key, entry.getValue());
+ // Strange behavior, all properties are already loaded from
+ // constructor. Difficult to use this behavior, need to have
+ // TOPIA_PERSISTENCE_PROPERTIES_FILE in config.
+ Properties propertiesFromClasspath =
+ TopiaUtil.getProperties(getConfig().
+ getProperty(TopiaContextFactory.CONFIG_PERSISTENCE_PROPERTIES_FILE));
+
+ if (!propertiesFromClasspath.isEmpty()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Load properties from file : " +
+ propertiesFromClasspath);
}
+ allProperties.putAll(propertiesFromClasspath);
}
+ // Push all properties from Properties to jpaConfiguration Map
+ ImmutableMap<String,String> allPropertiesMap = Maps.fromProperties(allProperties);
+ jpaConfiguration.putAll(allPropertiesMap);
+
+ // Add mandatory properties
+ ImmutableSet<Class<?>> entitiesClasses = ImmutableSet.copyOf(persistenceClasses);
+ jpaConfiguration.put(TopiaPersistenceProvider.TOPIA_ENTITIES, entitiesClasses);
+ jpaConfiguration.put(TopiaPersistenceProvider.TOPIA_CONTEXT, this);
+
}
}
return jpaConfiguration;
@@ -526,86 +537,7 @@
// hibernateConfiguration.addDirectory(new File(dir));
// }
// }
-//
-// // ajout des classes dites persistentes
-// Set<Class<?>> hibernatePersistanceClasses = new HashSet<Class<?>>();
-// for (TopiaService service : getServices().values()) {
-// Class<?>[] classes = service.getPersistenceClasses();
-//
-// // certains service n'ont pas de classe persistantes
-// if (classes != null) {
-// // sletellier 20110411 : http://www.nuiton.org/issues/show/1454
-// hibernatePersistanceClasses.addAll(Arrays.asList(classes));
-//// for (Class<?> clazz : classes) {
-//// hibernateConfiguration.addClass(clazz);
-//// }
-// }
-// }
-//
-// String listPersistenceClasses = getConfig().getProperty(
-// TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES, "");
-//
-// String[] classes = listPersistenceClasses.split(",");
-// for (String classname : classes) {
-// classname = classname.trim();
-// if (StringUtils.isNotEmpty(classname)) {
-// if (log.isDebugEnabled()) {
-// log.debug("Load persistent class : " + classname);
-// }
-//
-// // XXX echatellier 20111007 ce cqui est dommage ici, c'est
-// // la definition de cette classe ne sert a rien (apart security)
-// // car pour hibernate hibernateConfiguration.addClass(persistanceClass)
-// // il ne se sert pas de la classe en fait et fait seulement
-// // un classname.replace( '.', '/' ) + ".hbm.xml";
-// // pour obtenir le mapping et la reinstancier ensuite
-//
-// Class<?> clazz;
-// try {
-// clazz = Class.forName(classname);
-// } catch (ClassNotFoundException eee) {
-// if (log.isDebugEnabled()) {
-// log.debug("Class " + classname + " not found");
-// }
-// throw new TopiaNotFoundException(
-// _("topia.persistence.error.class.not.found",
-// classname));
-// }
-// persistenceClasses.add(clazz);
-//
-// // sletellier 20110411 : http://www.nuiton.org/issues/show/1454
-//// hibernateConfiguration.addClass(clazz);
-// hibernatePersistanceClasses.add(clazz);
-// }
-// }
-//
-// // sletellier 20110411 : http://www.nuiton.org/issues/show/1454
-// // Add persistance classes in hibernate config
-// for (Class<?> persistanceClass : hibernatePersistanceClasses) {
-// hibernateConfiguration.addClass(persistanceClass);
-// }
-//
-// Properties prop = new Properties();
-// prop.putAll(hibernateConfiguration.getProperties());
-// prop.putAll(getConfig());
-//
-// // Strange behavior, all properties are already loaded from
-// // constructor. Difficult to use this behavior, need to have
-// // TOPIA_PERSISTENCE_PROPERTIES_FILE in config.
-// Properties propertiesFromClasspath =
-// TopiaUtil.getProperties(getConfig().
-// getProperty(TopiaContextFactory.CONFIG_PERSISTENCE_PROPERTIES_FILE));
-//
-// if (!propertiesFromClasspath.isEmpty()) {
-// if (log.isDebugEnabled()) {
-// log.debug("Load properties from file : " +
-// propertiesFromClasspath);
-// }
-// prop.putAll(propertiesFromClasspath);
-// }
-//
-// hibernateConfiguration.setProperties(prop);
-//
+
// // tchemit 2011-05-26 When using hibernate > 3.3, need to make sure all mappings are loaded (the one from directory files are not still done).
// hibernateConfiguration.buildMappings();
// }
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2012-05-10 17:05:07 UTC (rev 2473)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2012-05-14 09:58:22 UTC (rev 2474)
@@ -26,25 +26,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-//import org.hibernate.cfg.Configuration;
-//import org.hibernate.connection.ConnectionProvider;
-//import org.hibernate.connection.ConnectionProviderFactory;
-//import org.hibernate.dialect.Dialect;
-//import org.hibernate.mapping.PersistentClass;
-//import org.hibernate.mapping.Table;
-//import org.hibernate.tool.hbm2ddl.DatabaseMetadata;
-//import org.hibernate.tool.hbm2ddl.TableMetadata;
-import org.nuiton.topia.TopiaContext;
-import org.nuiton.topia.TopiaContextFactory;
import org.nuiton.topia.TopiaNotFoundException;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.util.RecursiveProperties;
import org.nuiton.util.Resource;
import java.net.URL;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Iterator;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
1
0
r2473 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate
by athimel@users.nuiton.org 10 May '12
by athimel@users.nuiton.org 10 May '12
10 May '12
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(a)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);
1
0
Author: athimel
Date: 2012-05-10 18:29:00 +0200 (Thu, 10 May 2012)
New Revision: 2472
Url: http://nuiton.org/repositories/revision/topia/2472
Log:
Reimplement TopiaConnectionProvider in t-p-hibernate
Create TopiaSpecificUtil for all non-JPA standard operations
Move isSchemaExist from TopiaUtil to TopiaContext
Added:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/TopiaHibernateConnectionProvider.java
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernateSpecificUtil.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java
Removed:
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java
Modified:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernatePersistenceProvider.java
trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderHardCoded.java
trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.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
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/TopiaContextFactoryTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/legacy/framework/TopiaUtilTest.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaPersistenceProvider.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContext.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -123,6 +123,15 @@
throws TopiaNotFoundException;
/**
+ * Detect if the table is created on storage for a given persistent class.
+ *
+ * @param clazz the researched class
+ * @return true if the table exists on storage
+ * @throws TopiaException if the context is not initialized
+ */
+ boolean isSchemaExist(Class<?> clazz) throws TopiaException;
+
+ /**
* Permet de créer le schema de la base de données.
*
* @throws TopiaException if any exception
Deleted: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -1,328 +0,0 @@
-/*
- * #%L
- * ToPIA :: Persistence
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2004 - 2011 CodeLutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-package org.nuiton.topia.framework;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-//import org.hibernate.cfg.Environment;
-//import org.hibernate.connection.ConnectionProvider;
-//import org.hibernate.connection.ConnectionProviderFactory;
-//import org.hibernate.util.PropertiesHelper;
-//import org.hibernate.util.ReflectHelper;
-
-import javax.persistence.PersistenceException;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * Customized connection provider.
- * <p/>
- * This provider fix the following bug :
- * http://nuiton.org/issues/show/561
- * <p/>
- * To use this connection provider, add this property to topia configuration
- * <p/>
- * <pre>
- * config.setProperty(Environment.CONNECTION_PROVIDER, TopiaConnectionProvider.class.getName());
- * </pre>
- * <p/>
- * or in a properties file :
- * <p/>
- * <pre>
- * hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaConnectionProvider
- * </pre>
- *
- * @author tchemit <chemit(a)codelutin.com>
- * @since 2.5.3
- */
-public class TopiaConnectionProvider {
-// implements ConnectionProvider {
-
- /** Logger. */
- private static final Log log =
- LogFactory.getLog(TopiaConnectionProvider.class);
-
- /**
- * JDBC url of connection.
- * <p/>
- * This is a mandatory hibernate configuration vi the property
- * {@link Environment#URL}.
- */
- private String url;
-
- /** All grabbed connection properties */
- private Properties connectionProps;
-
- /**
- * Sql isolation level to use in connection.
- * <p/>
- * Can be configured by hibernate property {@link Environment#ISOLATION_LEVELS}.
- *
- * @see Connection#getTransactionIsolation()
- */
- private Integer isolation;
-
- /**
- * auto commit connection state.
- * <p/>
- * Can be configured by hibernate property {@link Environment#AUTOCOMMIT}.
- *
- * @see Connection#getAutoCommit()
- */
- private boolean autocommit;
-
- /**
- * Size of connection pool.
- * <p/>
- * By default use {@code 20}, can be specify by using the hibernate
- * configuration property {@link Environment#POOL_SIZE}.
- */
- private int poolSize;
-
- /** Our pool of connections which are not closed and availables. */
- private final List<Connection> pool;
-
- public TopiaConnectionProvider() {
- pool = new ArrayList<Connection>();
- }
-
-// @Override
- public void configure(Properties props) throws PersistenceException {
-// String driverClass = props.getProperty(Environment.DRIVER);
-//
-// poolSize = PropertiesHelper.getInt(Environment.POOL_SIZE, props, 20); //default pool size 20
-// if (log.isDebugEnabled()) {
-// log.debug("Connection pool size: " + poolSize);
-// }
-//
-// autocommit = PropertiesHelper.getBoolean(Environment.AUTOCOMMIT, props);
-// if (log.isDebugEnabled())
-// log.debug("autocommit mode: " + autocommit);
-//
-// isolation = PropertiesHelper.getInteger(Environment.ISOLATION, props);
-// if (isolation != null) {
-// if (log.isDebugEnabled()) {
-// log.debug("JDBC isolation level: " +
-// Environment.isolationLevelToString(isolation));
-// }
-// }
-//
-// if (driverClass == null) {
-//
-// if (log.isWarnEnabled()) {
-// log.warn("no JDBC Driver class was specified by property " +
-// Environment.DRIVER);
-// }
-// } else {
-// try {
-// // trying via forName() first to be as close to DriverManager's semantics
-// Class.forName(driverClass);
-// } catch (ClassNotFoundException cnfe) {
-// try {
-// ReflectHelper.classForName(driverClass);
-// } catch (ClassNotFoundException e) {
-// String msg = "JDBC Driver class not found: " + driverClass;
-// log.error(msg, e);
-// throw new PersistenceException(msg, e);
-// }
-// }
-// }
-//
-// url = props.getProperty(Environment.URL);
-// if (url == null) {
-// String msg = "JDBC URL was not specified by property " +
-// Environment.URL;
-// if (log.isErrorEnabled()) {
-// log.error(msg);
-// }
-// throw new PersistenceException(msg);
-// }
-//
-// connectionProps =
-// ConnectionProviderFactory.getConnectionProperties(props);
-//
-// if (log.isDebugEnabled()) {
-// log.debug("using driver: " + driverClass + " at URL: " + url);
-// }
-// // if debug level is enabled, then log the password, otherwise mask it
-// if (log.isTraceEnabled()) {
-// log.debug("connection properties: " + connectionProps);
-// } else if (log.isDebugEnabled()) {
-// log.debug("connection properties: " +
-// PropertiesHelper.maskOut(connectionProps, "password"));
-// }
- }
-
-// @Override
- public Connection getConnection() throws SQLException {
-
- Connection connection = null;
-
- synchronized (pool) {
-
- // try to use a connection from the pool (if any)
-
- while (!pool.isEmpty() && connection == null) {
- int last = pool.size() - 1;
- if (log.isTraceEnabled()) {
- log.trace("using pooled JDBC connection, pool size: " +
- last);
- }
-
- connection = pool.remove(last);
- if (connection.isClosed()) {
-
- // this connection is closed!, don't use it
- connection = null;
-
- if (log.isDebugEnabled()) {
- log.debug("Remove already closed connection from pool " +
- connection);
- }
- }
- }
- }
-
- if (connection == null) {
-
- // the pool was empty, creates a new connection
-
- if (log.isDebugEnabled()) {
- log.debug("opening new JDBC connection to " + url);
- }
- connection = DriverManager.getConnection(url, connectionProps);
- }
-
- // configure connection
-
- if (isolation != null) {
- connection.setTransactionIsolation(isolation);
- }
- if (connection.getAutoCommit() != autocommit) {
- connection.setAutoCommit(autocommit);
- }
-
- return connection;
- }
-
-// @Override
- public void closeConnection(Connection conn) throws SQLException {
-
- // if connection is already closed, nothing has to be done
- // we can't keep this connection (and can not be push in pool)
-
- if (conn.isClosed()) {
-
- if (log.isDebugEnabled()) {
- log.debug("Connection [" + conn +
- "] alreay closed!, will not use it any longer ");
- }
- return;
- }
-
- // connection was not closed, can push it in the pool (if pool is not
- // full)
-
- synchronized (pool) {
- int currentSize = pool.size();
- if (currentSize < getPoolSize()) {
- if (log.isTraceEnabled()) {
- log.trace("returning connection to pool, pool size: " +
- (currentSize + 1));
- }
- pool.add(conn);
- return;
- }
- }
-
- // pool was full, must release the connection which will be loose
-
- if (log.isDebugEnabled()) {
- log.debug("closing JDBC connection");
- }
-
- conn.close();
- }
-
- @Override
- protected void finalize() throws Throwable {
- super.finalize();
- close();
- }
-
-// @Override
- public void close() {
-
- if (log.isDebugEnabled()) {
- log.debug("cleaning up connection pool: " + url);
- }
-
- for (Connection connection : pool) {
- try {
- connection.close();
- } catch (SQLException sqle) {
- if (log.isWarnEnabled()) {
- log.warn("problem closing pooled connection", sqle);
- }
- }
- }
- pool.clear();
-
- }
-
-// @Override
- public boolean supportsAggressiveRelease() {
- return false;
- }
-
- public String getUrl() {
- return url;
- }
-
- public Properties getConnectionProps() {
- return connectionProps;
- }
-
- public Integer getIsolation() {
- return isolation;
- }
-
- public List<Connection> getPool() {
- return pool;
- }
-
- public int getPoolSize() {
- return poolSize;
- }
-
- public boolean isAutocommit() {
- return autocommit;
- }
-
-}
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 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -29,18 +29,6 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-//import org.hibernate.EntityMode;
-//import org.hibernate.ReplicationMode;
-//import org.hibernate.event.PostDeleteEventListener;
-//import org.hibernate.event.PostInsertEventListener;
-//import org.hibernate.event.PostLoadEventListener;
-//import org.hibernate.event.PostUpdateEventListener;
-//import org.hibernate.event.PreDeleteEventListener;
-//import org.hibernate.event.PreInsertEventListener;
-//import org.hibernate.event.PreLoadEventListener;
-//import org.hibernate.event.PreUpdateEventListener;
-//import org.hibernate.tool.hbm2ddl.SchemaExport;
-//import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaContextFactory;
import org.nuiton.topia.TopiaException;
@@ -87,6 +75,19 @@
import static org.nuiton.i18n.I18n._;
+//import org.hibernate.EntityMode;
+//import org.hibernate.ReplicationMode;
+//import org.hibernate.event.PostDeleteEventListener;
+//import org.hibernate.event.PostInsertEventListener;
+//import org.hibernate.event.PostLoadEventListener;
+//import org.hibernate.event.PostUpdateEventListener;
+//import org.hibernate.event.PreDeleteEventListener;
+//import org.hibernate.event.PreInsertEventListener;
+//import org.hibernate.event.PreLoadEventListener;
+//import org.hibernate.event.PreUpdateEventListener;
+//import org.hibernate.tool.hbm2ddl.SchemaExport;
+//import org.hibernate.tool.hbm2ddl.SchemaUpdate;
+
/**
* Le TopiaContextImpl est le point d'entrée pour accéder aux données. Il est
* configuré par un fichier de propriétés.
@@ -216,6 +217,12 @@
*/
protected Set<Class<?>> persistenceClasses;
+ /**
+ * Provides all the support for non-JPA operations. The instance will be
+ * shared with the parent context.
+ */
+ protected TopiaSpecificUtil specificUtil;
+
/** Default constructor, To be used for tests only. */
protected TopiaContextImpl() {
}
@@ -232,7 +239,7 @@
this.config = config;
services = loadServices(config);
preInitServices(services);
- getJPAConfiguration(); // Force configuration loading
+ getJPAConfiguration(); // Force mapping loading
postInitServices(services);
}
@@ -324,6 +331,29 @@
}
@Override
+ public TopiaSpecificUtil getSpecificUtil() throws TopiaException {
+ TopiaSpecificUtil result = specificUtil;
+ if (getParentContext() != null) {
+ result = getParentContext().getSpecificUtil();
+ }
+ if (result == null) {
+ throw new TopiaException("No TopiaSpecificUtil found.");
+ }
+ return result;
+ }
+
+ @Override
+ public void registerSpecificUtil(TopiaSpecificUtil specificUtil) {
+ if (getParentContext() == null) {
+ this.specificUtil = specificUtil;
+ } else {
+ if (log.isWarnEnabled()) {
+ log.warn("Try to set a specific util to non root context");
+ }
+ }
+ }
+
+ @Override
public Set<Class<?>> getPersistenceClasses() {
if (getParentContext() != null) {
return getParentContext().getPersistenceClasses();
@@ -390,6 +420,7 @@
}
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
// 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()) {
@@ -1112,56 +1143,55 @@
throws TopiaException {
checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
"replicateEntity"));
- boolean result = TopiaUtil.isSchemaExist(this, clazz.getName());
+
+ boolean result = getSpecificUtil().isSchemaExist(clazz);
+
return result;
}
@Override
public void createSchema() throws TopiaException {
-// try {
-// boolean showSchema = false;
-// if (log.isDebugEnabled()) {
-// showSchema = true;
-// }
-// getFiresSupport().firePreCreateSchema(this);
-// new SchemaExport(getHibernateConfiguration()).create(showSchema,
-// true);
-// getFiresSupport().firePostCreateSchema(this);
-// } catch (PersistenceException eee) {
-// throw new TopiaException(
-// _("topia.persistence.error.create.schema",
-// eee.getMessage()), eee);
-// }
+ try {
+ boolean showSchema = false;
+ if (log.isDebugEnabled()) {
+ showSchema = true;
+ }
+ getFiresSupport().firePreCreateSchema(this);
+ getSpecificUtil().createSchema(showSchema);
+ getFiresSupport().firePostCreateSchema(this);
+ } catch (PersistenceException eee) {
+ throw new TopiaException(
+ _("topia.persistence.error.create.schema",
+ eee.getMessage()), eee);
+ }
}
@Override
public void showCreateSchema() throws TopiaException {
-// try {
-// new SchemaExport(getHibernateConfiguration()).
-// execute(true, false, false, true);
-// } catch (PersistenceException eee) {
-// throw new TopiaException(
-// _("topia.persistence.error.create.schema",
-// eee.getMessage()), eee);
-// }
+ try {
+ getSpecificUtil().showCreateSchema();
+ } catch (PersistenceException eee) {
+ throw new TopiaException(
+ _("topia.persistence.error.create.schema",
+ eee.getMessage()), eee);
+ }
}
@Override
public void updateSchema() throws TopiaException {
-// try {
-// boolean showSchema = false;
-// if (log.isDebugEnabled()) {
-// showSchema = true;
-// }
-// getFiresSupport().firePreUpdateSchema(this);
-// new SchemaUpdate(getHibernateConfiguration()).execute(showSchema,
-// true);
-// getFiresSupport().firePostUpdateSchema(this);
-// } catch (PersistenceException eee) {
-// throw new TopiaException(
-// _("topia.persistence.error.update.schema",
-// eee.getMessage()), eee);
-// }
+ try {
+ boolean showSchema = false;
+ if (log.isDebugEnabled()) {
+ showSchema = true;
+ }
+ getFiresSupport().firePreUpdateSchema(this);
+ getSpecificUtil().updateSchema(showSchema);
+ getFiresSupport().firePostUpdateSchema(this);
+ } catch (PersistenceException eee) {
+ throw new TopiaException(
+ _("topia.persistence.error.update.schema",
+ eee.getMessage()), eee);
+ }
}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -95,15 +95,6 @@
void setUseFlushMode(boolean useFlushMode);
/**
- * Detect if the table is created on storage for a given persistant class.
- *
- * @param clazz the researched class
- * @return Returns the hibernate.
- * @throws TopiaException si aucune transaction n'est ouverte
- */
- boolean isSchemaExist(Class<?> clazz) throws TopiaException;
-
- /**
* Get DAO for specified class. If Specialized DAO exists then it returned
* otherwize TopiaDAO<entityClass> is returned
*
@@ -136,5 +127,23 @@
Set<Class<?>> getPersistenceClasses();
+ /**
+ * Get the registered the TopiaSpecificUtil. It may be null, meaning that
+ * the chosen JPA implementation does not support specific operations.
+ *
+ * @return the specificUtil instance registered
+ * @see TopiaSpecificUtil
+ */
+ TopiaSpecificUtil getSpecificUtil() throws TopiaException;
+
+ /**
+ * Used to register the TopiaSpecificUtil. The registered instance will be
+ * used to achieve any operation that does not fit the JPA standard.
+ *
+ * @param specificUtil the instance to register
+ * @see TopiaSpecificUtil
+ */
+ void registerSpecificUtil(TopiaSpecificUtil specificUtil);
+
} //TopiaContextImplementor
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 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaPersistenceProvider.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -1,17 +1,12 @@
package org.nuiton.topia.framework;
+import org.apache.commons.lang3.tuple.Pair;
import org.nuiton.topia.TopiaRuntimeException;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.ProviderUtil;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -22,12 +17,14 @@
public static final String TOPIA_PERSISTENCE_UNIT_NAME = "topia";
- public abstract EntityManagerFactory configureSpecific(String emName, Map<String, Object> map, Set<Class<?>> entities);
+ 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);
+
@Override
public EntityManagerFactory createEntityManagerFactory(String emName, Map map) {
- EntityManagerFactory result = null;
+ EntityManagerFactory entityManagerFactory = null;
if (TOPIA_PERSISTENCE_UNIT_NAME.equals(emName)) {
// Use PersistenceProvider of the underlying JPA library
@@ -35,12 +32,25 @@
Set<Class<?>> entityClasses = (Set<Class<?>>) map.get("topia.entities");
if (entityClasses == null) {
- throw new TopiaRuntimeException("topia.entities list must be provided");
+ String message = String.format(MISSING_PROPERTY, "topia.entities");
+ throw new TopiaRuntimeException(message);
}
- result = configureSpecific(TOPIA_PERSISTENCE_UNIT_NAME, properties, entityClasses);
+ TopiaContextImplementor topiaContext = (TopiaContextImplementor)map.get("topia.context");
+ if (topiaContext == null) {
+ String message = String.format(MISSING_PROPERTY, "topia.context");
+ throw new TopiaRuntimeException(message);
+ }
+
+ Pair<EntityManagerFactory, TopiaSpecificUtil> emfUtilPair =
+ configureSpecific(TOPIA_PERSISTENCE_UNIT_NAME, properties, entityClasses);
+
+ entityManagerFactory = emfUtilPair.getLeft();
+
+ TopiaSpecificUtil specificUtil = emfUtilPair.getRight();
+ topiaContext.registerSpecificUtil(specificUtil);
}
- return result;
+ return entityManagerFactory;
}
@Override
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -0,0 +1,51 @@
+package org.nuiton.topia.framework;
+
+
+import org.nuiton.topia.TopiaContext;
+
+/**
+ * Provides all non-JPA standard methods (specific to an implementation) needed
+ * by ToPIA
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public interface TopiaSpecificUtil {
+
+ /**
+ * Implementation-dependent method to detect if the table is created on
+ * storage for a given persistent class. This is used within the
+ * TopiaContext
+ *
+ * @param clazz the researched class
+ * @return true if the table exists on storage
+ * @see TopiaContext#isSchemaExist(Class)
+ */
+ boolean isSchemaExist(Class<?> clazz);
+
+ /**
+ * Implementation-dependent method to create the schema on storage. This is
+ * used within the TopiaContext
+ *
+ * @param showSchema indicates if schema must be displayed
+ * @see TopiaContext#createSchema()
+ */
+ void createSchema(boolean showSchema);
+
+ /**
+ * Implementation-dependent method to display the SQL queries for the
+ * schema creation on storage. This is used within the TopiaContext
+ *
+ * @see TopiaContext#showCreateSchema()
+ */
+ void showCreateSchema();
+
+ /**
+ * Implementation-dependent method to update the schema on storage. This is
+ * used within the TopiaContext
+ *
+ * @param showSchema indicates if schema must be displayed
+ * @see TopiaContext#updateSchema()
+ */
+ void updateSchema(boolean showSchema);
+
+}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -151,76 +151,6 @@
return buffer.substring(2);
}
- /**
- * Test si une entite donnee correspondant a une configuration existe en
- * base.
- *
- * @param tx la session topia
- * @param entityName le nom de l'entite a tester
- * @return <tt>true</tt> si le schema de la table existe
- * @since 2.6.4
- */
- public static boolean isSchemaExist(TopiaContext tx,
- String entityName) {
-
- boolean exist = false;
-
-// try {
-// Configuration configuration =
-// ((TopiaContextImplementor) tx).getHibernateConfiguration();
-// PersistentClass classMapping =
-// configuration.getClassMapping(entityName);
-// if (classMapping == null) {
-// if (log.isInfoEnabled()) {
-// Iterator<?> itr = configuration.getClassMappings();
-// while (itr.hasNext()) {
-// log.info("available mapping " + itr.next());
-// }
-// }
-// throw new IllegalArgumentException(
-// "could not find entity with name " + entityName);
-// }
-// Table testTable = classMapping.getTable();
-//
-// if (testTable == null) {
-// throw new IllegalArgumentException(
-// "could not find entity with name " + entityName);
-// }
-// ConnectionProvider connectionProvider =
-// ConnectionProviderFactory.newConnectionProvider(
-// configuration.getProperties());
-//
-// Dialect dialect = Dialect.getDialect(configuration.getProperties());
-//
-// Connection connection = null;
-// try {
-// connection = connectionProvider.getConnection();
-//
-// DatabaseMetadata meta = new DatabaseMetadata(connection, dialect);
-//
-// TableMetadata tmd = meta.getTableMetadata(
-// testTable.getName(), testTable.getSchema(),
-// testTable.getCatalog(), testTable.isQuoted());
-//
-// if (tmd != null) {
-// //table exist
-// exist = true;
-// }
-// } finally {
-// if (connection != null) {
-// connection.close();
-// }
-// }
-//
-// } catch (SQLException e) {
-// log.error("Cant connect to database", e);
-// } catch (TopiaNotFoundException e) {
-// log.error("Cant connect to database", e);
-// }
-
- return exist;
- }
-
// /**
// * Test si une entite donnee correspondant a une configuration existe en
// * base.
@@ -285,18 +215,18 @@
//
// return exist;
// }
-
- /**
- * Test if the db associated to the given {@code configuration} contaisn any of
- * the dealed entities.
- *
- * @param configuration hibernate db configuration
- * @return {@code true} if there is no schema for any of the dealed entities,
- * {@code false} otherwise.
- * @since 2.5.3
- */
- public static boolean isSchemaEmpty(/*Configuration configuration*/) {
-
+//
+// /**
+// * Test if the db associated to the given {@code configuration} contaisn any of
+// * the dealed entities.
+// *
+// * @param configuration hibernate db configuration
+// * @return {@code true} if there is no schema for any of the dealed entities,
+// * {@code false} otherwise.
+// * @since 2.5.3
+// */
+// public static boolean isSchemaEmpty(Configuration configuration) {
+//
// try {
//
// ConnectionProvider connectionProvider =
@@ -351,10 +281,10 @@
// } catch (SQLException e) {
// log.error("Cant connect to database", e);
// }
+//
+// return true;
+// }
- return true;
- }
-
/**
* Return hibernate schema name
*
Copied: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/TopiaHibernateConnectionProvider.java (from rev 2470, trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java)
===================================================================
--- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/TopiaHibernateConnectionProvider.java (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/TopiaHibernateConnectionProvider.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -0,0 +1,343 @@
+/*
+ * #%L
+ * ToPIA :: Persistence
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2011 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.topia.framework.hibernate;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.internal.util.ReflectHelper;
+import org.hibernate.internal.util.config.ConfigurationHelper;
+import org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator;
+import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
+import org.hibernate.cfg.Environment;
+import org.hibernate.service.spi.Configurable;
+import org.hibernate.service.spi.Stoppable;
+
+import javax.persistence.PersistenceException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Customized connection provider.
+ * <p/>
+ * This provider fix the following bug :
+ * http://nuiton.org/issues/show/561
+ * <p/>
+ * To use this connection provider, add this property to topia configuration
+ * <p/>
+ * <pre>
+ * config.setProperty(AvailableSettings.CONNECTION_PROVIDER, TopiaHibernateConnectionProvider.class.getName());
+ * </pre>
+ * <p/>
+ * or in a properties file :
+ * <p/>
+ * <pre>
+ * hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
+ * </pre>
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 2.5.3
+ */
+public class TopiaHibernateConnectionProvider implements ConnectionProvider, Configurable, Stoppable {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(TopiaHibernateConnectionProvider.class);
+
+ /**
+ * JDBC url of connection.
+ * <p/>
+ * This is a mandatory hibernate configuration vi the property
+ * {@link Environment#URL}.
+ */
+ private String url;
+
+ /** All grabbed connection properties */
+ private Properties connectionProps;
+
+ /**
+ * Sql isolation level to use in connection.
+ * <p/>
+ * Can be configured by hibernate property {@link Environment#ISOLATION_LEVELS}.
+ *
+ * @see Connection#getTransactionIsolation()
+ */
+ private Integer isolation;
+
+ /**
+ * auto commit connection state.
+ * <p/>
+ * Can be configured by hibernate property {@link Environment#AUTOCOMMIT}.
+ *
+ * @see Connection#getAutoCommit()
+ */
+ private boolean autocommit;
+
+ /**
+ * Size of connection pool.
+ * <p/>
+ * By default use {@code 20}, can be specify by using the hibernate
+ * configuration property {@link Environment#POOL_SIZE}.
+ */
+ private int poolSize;
+
+ /** Our pool of connections which are not closed and availables. */
+ private final List<Connection> pool;
+
+ public TopiaHibernateConnectionProvider() {
+ pool = new ArrayList<Connection>();
+ }
+
+ @Override
+ public void configure(Map map) {
+ Map<String, String> configurationValues = (Map<String, String>)map;
+
+ String driverClass = configurationValues.get(Environment.DRIVER);
+
+ poolSize = ConfigurationHelper.getInt(AvailableSettings.POOL_SIZE, configurationValues, 20); // default pool size 20
+ if (log.isDebugEnabled()) {
+ log.debug("Connection pool size: " + poolSize);
+ }
+
+ autocommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues );
+ if (log.isDebugEnabled())
+ log.debug("autocommit mode: " + autocommit);
+
+ isolation = ConfigurationHelper.getInteger( AvailableSettings.ISOLATION, configurationValues );
+ if (isolation != null) {
+ if (log.isDebugEnabled()) {
+ log.debug("JDBC isolation level: " +
+ Environment.isolationLevelToString(isolation));
+ }
+ }
+
+ if (driverClass == null) {
+
+ if (log.isWarnEnabled()) {
+ log.warn("no JDBC Driver class was specified by property " +
+ Environment.DRIVER);
+ }
+ } else {
+ try {
+ // trying via forName() first to be as close to DriverManager's semantics
+ Class.forName(driverClass);
+ } catch (ClassNotFoundException cnfe) {
+ try {
+ ReflectHelper.classForName(driverClass);
+ } catch (ClassNotFoundException e) {
+ String msg = "JDBC Driver class not found: " + driverClass;
+ log.error(msg, e);
+ throw new PersistenceException(msg, e);
+ }
+ }
+ }
+
+ url = configurationValues.get(Environment.URL);
+ if (url == null) {
+ String msg = "JDBC URL was not specified by property " +
+ Environment.URL;
+ if (log.isErrorEnabled()) {
+ log.error(msg);
+ }
+ throw new PersistenceException(msg);
+ }
+
+ connectionProps =
+ ConnectionProviderInitiator.getConnectionProperties(configurationValues);
+
+ if (log.isDebugEnabled()) {
+ log.debug("using driver: " + driverClass + " at URL: " + url);
+ }
+ // if debug level is enabled, then log the password, otherwise mask it
+ if (log.isTraceEnabled()) {
+ log.debug("connection properties: " + connectionProps);
+ } else if (log.isDebugEnabled()) {
+ log.debug("connection properties: " +
+ ConfigurationHelper.maskOut(connectionProps, "password"));
+ }
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+
+ Connection connection = null;
+
+ synchronized (pool) {
+
+ // try to use a connection from the pool (if any)
+
+ while (!pool.isEmpty() && connection == null) {
+ int last = pool.size() - 1;
+ if (log.isTraceEnabled()) {
+ log.trace("using pooled JDBC connection, pool size: " +
+ last);
+ }
+
+ connection = pool.remove(last);
+ if (connection.isClosed()) {
+
+ // this connection is closed!, don't use it
+ connection = null;
+
+ if (log.isDebugEnabled()) {
+ log.debug("Remove already closed connection from pool " +
+ connection);
+ }
+ }
+ }
+ }
+
+ if (connection == null) {
+
+ // the pool was empty, creates a new connection
+
+ if (log.isDebugEnabled()) {
+ log.debug("opening new JDBC connection to " + url);
+ }
+ connection = DriverManager.getConnection(url, connectionProps);
+ }
+
+ // configure connection
+
+ if (isolation != null) {
+ connection.setTransactionIsolation(isolation);
+ }
+ if (connection.getAutoCommit() != autocommit) {
+ connection.setAutoCommit(autocommit);
+ }
+
+ return connection;
+ }
+
+ @Override
+ public void closeConnection(Connection conn) throws SQLException {
+
+ // if connection is already closed, nothing has to be done
+ // we can't keep this connection (and can not be push in pool)
+
+ if (conn.isClosed()) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("Connection [" + conn +
+ "] alreay closed!, will not use it any longer ");
+ }
+ return;
+ }
+
+ // connection was not closed, can push it in the pool (if pool is not
+ // full)
+
+ synchronized (pool) {
+ int currentSize = pool.size();
+ if (currentSize < getPoolSize()) {
+ if (log.isTraceEnabled()) {
+ log.trace("returning connection to pool, pool size: " +
+ (currentSize + 1));
+ }
+ pool.add(conn);
+ return;
+ }
+ }
+
+ // pool was full, must release the connection which will be loose
+
+ if (log.isDebugEnabled()) {
+ log.debug("closing JDBC connection");
+ }
+
+ conn.close();
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ super.finalize();
+ stop();
+ }
+
+ @Override
+ public void stop() {
+
+ if (log.isDebugEnabled()) {
+ log.debug("cleaning up connection pool: " + url);
+ }
+
+ for (Connection connection : pool) {
+ try {
+ connection.close();
+ } catch (SQLException sqle) {
+ if (log.isWarnEnabled()) {
+ log.warn("problem closing pooled connection", sqle);
+ }
+ }
+ }
+ pool.clear();
+
+ }
+
+ @Override
+ public boolean supportsAggressiveRelease() {
+ return false;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public Properties getConnectionProps() {
+ return connectionProps;
+ }
+
+ public Integer getIsolation() {
+ return isolation;
+ }
+
+ public List<Connection> getPool() {
+ return pool;
+ }
+
+ public int getPoolSize() {
+ return poolSize;
+ }
+
+ public boolean isAutocommit() {
+ return autocommit;
+ }
+
+ @Override
+ public boolean isUnwrappableAs(Class unwrapType) {
+ return false;
+ }
+
+ @Override
+ public <T> T unwrap(Class<T> unwrapType) {
+ return null;
+ }
+
+}
Property changes on: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/hibernate/TopiaHibernateConnectionProvider.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
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 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernatePersistenceProvider.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -1,15 +1,16 @@
package org.nuiton.topia.persistence.hibernate;
+import org.apache.commons.lang3.tuple.Pair;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.ejb.packaging.NamedInputStream;
import org.hibernate.ejb.packaging.PersistenceMetadata;
import org.nuiton.topia.framework.TopiaPersistenceProvider;
+import org.nuiton.topia.framework.TopiaSpecificUtil;
import javax.persistence.EntityManagerFactory;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -20,7 +21,7 @@
public class TopiaHibernatePersistenceProvider extends TopiaPersistenceProvider {
@Override
- public EntityManagerFactory 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);
// On convertit tout ce qui est en topia.connection.* vers hibernate.connection.*
@@ -55,10 +56,17 @@
metadata.setHbmfiles(entitiesHbmFiles);
Ejb3Configuration configured = cfg.configure(metadata, hibernateProperties);
- EntityManagerFactory result = null;
+ EntityManagerFactory entityManagerFactory = null;
if (configured != null) {
- result = configured.buildEntityManagerFactory();
+ entityManagerFactory = configured.buildEntityManagerFactory();
}
+
+ TopiaSpecificUtil specificUtil =
+ new TopiaHibernateSpecificUtil(configured.getHibernateConfiguration());
+
+ Pair<EntityManagerFactory, TopiaSpecificUtil> result =
+ Pair.of(entityManagerFactory, specificUtil);
return result;
}
+
}
Added: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernateSpecificUtil.java
===================================================================
--- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernateSpecificUtil.java (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/hibernate/TopiaHibernateSpecificUtil.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -0,0 +1,119 @@
+package org.nuiton.topia.persistence.hibernate;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Table;
+import org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator;
+import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
+import org.hibernate.tool.hbm2ddl.DatabaseMetadata;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.hbm2ddl.SchemaUpdate;
+import org.hibernate.tool.hbm2ddl.TableMetadata;
+import org.nuiton.topia.TopiaNotFoundException;
+import org.nuiton.topia.framework.TopiaContextImplementor;
+import org.nuiton.topia.framework.TopiaSpecificUtil;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Iterator;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TopiaHibernateSpecificUtil implements TopiaSpecificUtil {
+
+ private static final Log log = LogFactory.getLog(TopiaHibernateSpecificUtil.class);
+
+ protected Configuration configuration;
+
+ public TopiaHibernateSpecificUtil(Configuration configuration) {
+ this.configuration = configuration;
+ }
+
+ @Override
+ public void createSchema(boolean showSchema) {
+ SchemaExport schemaExport = new SchemaExport(configuration);
+ schemaExport.create(showSchema, true);
+ }
+
+ @Override
+ public void showCreateSchema() {
+ new SchemaExport(configuration).execute(true, false, false, true);
+ }
+
+ @Override
+ public void updateSchema(boolean showSchema) {
+ new SchemaUpdate(configuration).execute(showSchema, true);
+ }
+
+ @Override
+ public boolean isSchemaExist(Class<?> clazz) {
+ String entityName = clazz.getName();
+
+ boolean result = false;
+ try {
+ PersistentClass classMapping =
+ configuration.getClassMapping(entityName);
+ if (classMapping == null) {
+ if (log.isInfoEnabled()) {
+ Iterator<?> itr = configuration.getClassMappings();
+ while (itr.hasNext()) {
+ log.info("available mapping " + itr.next());
+ }
+ }
+ throw new IllegalArgumentException(
+ "could not find entity with name " + entityName);
+ }
+ Table testTable = classMapping.getTable();
+
+ if (testTable == null) {
+ throw new IllegalArgumentException(
+ "could not find entity with name " + entityName);
+ }
+// ConnectionProvider connectionProvider =
+// ConnectionProviderFactory.newConnectionProvider(
+// configuration.getProperties());
+
+ Dialect dialect = Dialect.getDialect(configuration.getProperties());
+
+ Connection connection = null;
+ try {
+// connection = connectionProvider.getConnection();
+
+ // FIXME AThimel 10/05/2012 It would be better to re-use the ConnectionProvider but I can't find how to do it for the moment
+ String url = configuration.getProperty(AvailableSettings.URL);
+ String username = configuration.getProperty(AvailableSettings.USER);
+ String password = configuration.getProperty(AvailableSettings.PASS);
+ connection = DriverManager.getConnection(url, username, password);
+
+ DatabaseMetadata meta = new DatabaseMetadata(connection, dialect);
+
+ TableMetadata tmd = meta.getTableMetadata(
+ testTable.getName(), testTable.getSchema(),
+ testTable.getCatalog(), testTable.isQuoted());
+
+ if (tmd != null) {
+ //table exist
+ result = true;
+ }
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+
+ } catch (SQLException e) {
+ log.error("Cant connect to database", e);
+// } catch (TopiaNotFoundException e) {
+// log.error("Cant connect to database", e);
+ }
+
+ return result;
+ }
+}
Modified: trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderHardCoded.java
===================================================================
--- trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderHardCoded.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderHardCoded.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -27,15 +27,21 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
+import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Environment;
+import org.hibernate.internal.util.ReflectHelper;
+import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator;
import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
+import org.hibernate.service.spi.Configurable;
+import org.hibernate.service.spi.Stoppable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.Map;
import java.util.Properties;
/**
@@ -44,7 +50,7 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 2.5.3
*/
-public class TopiaConnectionProviderHardCoded implements ConnectionProvider {
+public class TopiaConnectionProviderHardCoded implements ConnectionProvider, Configurable, Stoppable {
private String url;
@@ -64,23 +70,19 @@
private static final Log log =
LogFactory.getLog(TopiaConnectionProviderHardCoded.class);
- public TopiaConnectionProviderHardCoded() {
- System.out.println("created");
- }
- public void configure(Properties props) throws HibernateException {
- String driverClass = props.getProperty(Environment.DRIVER);
+ @Override
+ public void configure(Map map) throws HibernateException {
+ Map<String, String> props = (Map<String, String>)map;
+ String driverClass = props.get(Environment.DRIVER);
-// poolSize = PropertiesHelper.getInt(Environment.POOL_SIZE, props, 20); //default pool size 20
- poolSize = 20; //default pool size 20
+ poolSize = ConfigurationHelper.getInt(AvailableSettings.POOL_SIZE, props, 20); // default pool size 20
log.info("Using Hibernate built-in connection pool (not for production use!)");
log.info("Hibernate connection pool size: " + poolSize);
-// autocommit = PropertiesHelper.getBoolean(Environment.AUTOCOMMIT, props);
- autocommit = true;
+ autocommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, props );
log.info("autocommit mode: " + autocommit);
-// isolation = PropertiesHelper.getInteger(Environment.ISOLATION, props);
- isolation = 0;
+ isolation = ConfigurationHelper.getInteger( AvailableSettings.ISOLATION, props );
if (isolation != null)
log.info("JDBC isolation level: " + Environment.isolationLevelToString(isolation));
@@ -91,13 +93,13 @@
// trying via forName() first to be as close to DriverManager's semantics
Class.forName(driverClass);
} catch (ClassNotFoundException cnfe) {
-// try {
-// ReflectHelper.classForName(driverClass);
-// } catch (ClassNotFoundException e) {
-// String msg = "JDBC Driver class not found: " + driverClass;
-// log.error(msg, e);
-// throw new HibernateException(msg, e);
-// }
+ try {
+ ReflectHelper.classForName(driverClass);
+ } catch (ClassNotFoundException e) {
+ String msg = "JDBC Driver class not found: " + driverClass;
+ log.error(msg, e);
+ throw new HibernateException(msg, e);
+ }
}
}
@@ -105,17 +107,10 @@
// the real directory where db is and then make sure hibernate always
// use the connection provider...
String directory =
- props.getProperty(TopiaConnectionProviderTest.TEST_URL);
+ props.get(TopiaConnectionProviderTest.TEST_URL);
url = directory;
-// url = props.getProperty(Environment.URL);
-// if (url == null) {
-// String msg = "JDBC URL was not specified by property " + Environment.URL;
-// log.error(msg);
-// throw new HibernateException(msg);
-// }
-
connectionProps = ConnectionProviderInitiator.getConnectionProperties(props);
log.info("using driver: " + driverClass + " at URL: " + url);
@@ -123,7 +118,7 @@
if (log.isDebugEnabled()) {
log.info("connection properties: " + connectionProps);
} else if (log.isInfoEnabled()) {
-// log.info("connection properties: " + PropertiesHelper.maskOut(connectionProps, "password"));
+ log.info("connection properties: " + ConfigurationHelper.maskOut(connectionProps, "password"));
}
}
@@ -186,10 +181,11 @@
@Override
protected void finalize() throws Throwable {
super.finalize();
- close();
+ stop();
}
- public void close() {
+ @Override
+ public void stop() {
log.info("cleaning up connection pool: " + url);
Modified: trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java
===================================================================
--- trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -24,8 +24,9 @@
*/
package org.nuiton.topia.framework;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.junit.Assert;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.nuiton.topia.TopiaContext;
@@ -45,7 +46,7 @@
import static org.junit.Assert.assertNotNull;
/**
- * To test the {@link TopiaConnectionProvider} and make sure all connections
+ * To test the {@link org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider} and make sure all connections
* are done from here...
*
* @author tchemit <chemit(a)codelutin.com>
@@ -53,8 +54,8 @@
*/
public class TopiaConnectionProviderTest {
-// private static final Log log =
-// LogFactory.getLog(TopiaConnectionProviderTest.class);
+ private static final Log log =
+ LogFactory.getLog(TopiaConnectionProviderTest.class);
public static final String TEST_URL = "testURL";
@@ -87,32 +88,11 @@
};
@Test
- @Ignore // FIXME AThimel 09/05/2012 Remove @Ignore
public void testWithHardcoded() throws Exception {
-// Properties dbProperties = TestHelper.loadHibernateConfiguration(
-// "/TopiaConnectionProviderHardcoded.properties");
-//
-// File directory = new File(TestHelper.getDbName(testBasedir, "testWithHardcoded"));
-
String dbPath = (String) db.getDbConfiguration().get("dbPath");
String dbPathFake = (String) db.getDbConfiguration().get("dbPathFake");
-// new File(directory, "real" + File.separator + "db").getAbsolutePath();
-// Assert.assertFalse(new File(dbPath).getParentFile().exists());
-
-// String dbPathFake = new File(directory, "fake" + File.separator + "db").getAbsolutePath();
-
-// Assert.assertFalse(new File(dbPathFake).getParentFile().exists());
-
-// // give the path where connection provider will create db
-// dbProperties.setProperty(TEST_URL, "jdbc:h2:file:" + dbPath);
-//
-// // give a fake db path (we will make sure it is never create after hibernate usage).
-// dbProperties.setProperty(Environment.URL, "jdbc:h2:file:" + dbPathFake);
-//
-// root = TopiaContextFactory.getContext(dbProperties);
-
Locale.setDefault(Locale.FRANCE);
doStuffOnDb();
Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties
===================================================================
--- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties 2012-05-10 16:29:00 UTC (rev 2472)
@@ -6,4 +6,7 @@
topia.connection.username=sa
topia.connection.password=
-topia.connection.driver_class=org.h2.Driver
\ No newline at end of file
+topia.connection.driver_class=org.h2.Driver
+
+#Not necessary, but useful
+hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties
===================================================================
--- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-legacy.properties 2012-05-10 16:29:00 UTC (rev 2472)
@@ -6,4 +6,7 @@
topia.connection.username=sa
topia.connection.password=
-topia.connection.driver_class=org.h2.Driver
\ No newline at end of file
+topia.connection.driver_class=org.h2.Driver
+
+#Not necessary, but useful
+hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
Modified: trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties
===================================================================
--- trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-mapping.properties 2012-05-10 16:29:00 UTC (rev 2472)
@@ -6,4 +6,7 @@
topia.connection.username=sa
topia.connection.password=
-topia.connection.driver_class=org.h2.Driver
\ No newline at end of file
+topia.connection.driver_class=org.h2.Driver
+
+#Not necessary, but useful
+hibernate.connection.provider_class=org.nuiton.topia.framework.hibernate.TopiaHibernateConnectionProvider
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/TopiaContextFactoryTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/TopiaContextFactoryTest.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/TopiaContextFactoryTest.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -76,7 +76,7 @@
String databaseName = "h2data-testGetContextByPropertie";
File dbDirectory = new File(testBasedir, databaseName);
String url = "jdbc:h2:file:" + dbDirectory;
- properties.setProperty("hibernate.connection.url", url);
+ properties.setProperty(TopiaContextFactory.CONFIG_URL, url);
TopiaContextImpl test = new TopiaContextImpl(properties);
TopiaContextFactory.contextCache.put(properties, test);
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/legacy/framework/TopiaUtilTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/legacy/framework/TopiaUtilTest.java 2012-05-10 10:37:36 UTC (rev 2471)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/legacy/framework/TopiaUtilTest.java 2012-05-10 16:29:00 UTC (rev 2472)
@@ -94,20 +94,25 @@
@Test(expected = IllegalArgumentException.class)
public void testIsSchemaExistFailed() throws Exception {
- TopiaUtil.isSchemaExist(db.getRootCtxt(), "fake");
+ TopiaContext rootContext = db.getRootCtxt();
+ rootContext.beginTransaction();
+ rootContext.isSchemaExist(String.class);
}
@Test
public void testIsSchemaExist() throws Exception {
TopiaContext rootContext = db.getRootCtxt();
- boolean actual = TopiaUtil.isSchemaExist(rootContext,
- PersonImpl.class.getName());
+ // XXX AThimel 10/05/2012 This cannot be done with ToPIA 3 because of
+ // independence regarding to the JPA implem, which changes the way EntityManager is created
+// boolean actual = rootContext.isSchemaExist(PersonImpl.class);
+ boolean actual = false;
assertFalse(actual);
+
TopiaContext tx = rootContext.beginTransaction();
tx.createSchema();
- actual = TopiaUtil.isSchemaExist(rootContext, PersonImpl.class.getName());
+ actual = rootContext.isSchemaExist(PersonImpl.class);
assertTrue(actual);
1
0
r2471 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence/src/main/java/org/nuiton/topia/generator topia-persistence/src/main/resources/i18n topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck
by athimel@users.nuiton.org 10 May '12
by athimel@users.nuiton.org 10 May '12
10 May '12
Author: athimel
Date: 2012-05-10 12:37:36 +0200 (Thu, 10 May 2012)
New Revision: 2471
Url: http://nuiton.org/repositories/revision/topia/2471
Log:
Reorganize TopiaContextImpl (re-order methods)
Fix HibernateMappingGenerator enum generation
Modified:
trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckItHibernateTest.java
trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckLegacyHibernateTest.java
trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java
trunk/topia-persistence/src/main/resources/i18n/topia-persistence_en_GB.properties
trunk/topia-persistence/src/main/resources/i18n/topia-persistence_es_ES.properties
trunk/topia-persistence/src/main/resources/i18n/topia-persistence_fr_FR.properties
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 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-05-10 10:37:36 UTC (rev 2471)
@@ -236,150 +236,10 @@
postInitServices(services);
}
- /* -------------------- SERVICES MANAGMENT -------------------------------*/
- protected String getProperExceptionMessage(Throwable eee) {
- return eee.getClass().getSimpleName() + " : " +
- eee.getMessage();
- }
+ /* -------------------- CONTEXT HIERARCHY MANAGEMENT ----------------------*/
- protected Map<String, TopiaService> loadServices(Properties config) {
- Map<String, TopiaService> result = new HashMap<String, TopiaService>();
- // recherche des services present dans la config
- for (Enumeration<?> e = config.propertyNames(); e.hasMoreElements();) {
- String key = (String) e.nextElement();
- if (key.matches("^topia\\.service\\.\\w+$")) {
- String classService = config.getProperty(key);
- try {
- Class<?> forName = Class.forName(classService);
- Object newInstance = forName.getConstructor().newInstance();
- TopiaService service = (TopiaService) newInstance;
- if (key.equals("topia.service." + service.getServiceName())) {
- result.put(service.getServiceName(), service);
- log.info(_("topia.persistence.service.loaded",
- key, classService));
- } else {
- log.warn(_("topia.persistence.warn.service.not.loaded",
- key, service.getServiceName()));
- }
- } catch (Throwable eee) {
- String message =
- _("topia.persistence.error.service.unknown",
- key, classService);
- if (log.isDebugEnabled()) {
- log.debug(message, eee);
- } else if (log.isErrorEnabled()) {
- log.error(message);
- }
- }
- }
- }
- return result;
- }
-
- protected void preInitServices(Map<String, TopiaService> services) {
- for (TopiaService service : services.values()) {
- if (!service.preInit(this)) {
- log.warn(_("topia.persistence.warn.service.not.preInit",
- service.getServiceName()));
- }
- }
- }
-
- protected void postInitServices(Map<String, TopiaService> services) {
- for (TopiaService service : services.values()) {
- if (!service.postInit(this)) {
- log.warn(_("topia.persistence.warn.service.not.postInit",
- service.getServiceName()));
- }
- }
- }
-
- protected TopiaService getService(String name) {
- TopiaService result = getServices().get(name);
- return result;
- }
-
- protected boolean serviceEnabled(String name) {
- boolean result = getServices().containsKey(name);
- return result;
- }
-
/**
- * Retrieve service name using SERVICE_NAME static field on service
- * interface.
- *
- * @param interfaceService class of the service
- * @param <E> type of the service that extends {@link
- * TopiaService}
- * @return the service name
- * @throws IllegalAccessException if field SERVICE_NAME can't be accessed
- * @throws NoSuchFieldException if no field SERVICE_NAME is defined
- */
- protected <E extends TopiaService> String getServiceName(
- Class<E> interfaceService)
- throws IllegalAccessException, NoSuchFieldException {
- Field f = interfaceService.getField("SERVICE_NAME");
- String name = (String) f.get(null);
- return name;
- }
-
- @Override
- public Map<String, TopiaService> getServices() {
- TopiaContextImplementor parent = getParentContext();
-
- Map<String, TopiaService> result;
- if (parent != null) {
- result = parent.getServices();
- } else {
- result = services;
- }
- return result;
- }
-
- @Override
- public <E extends TopiaService> E getService(Class<E> interfaceService)
- throws TopiaNotFoundException {
- E result;
- try {
- String name = getServiceName(interfaceService);
- result = (E) getService(name);
- } catch (Exception eee) {
- throw new TopiaNotFoundException(
- _("topia.persistence.error.service.not.retreaved",
- interfaceService, getProperExceptionMessage(eee)),
- eee);
- }
- if (result == null) {
- throw new TopiaNotFoundException(
- _("topia.persistence.error.service.not.found",
- interfaceService));
- }
- return result;
- }
-
- @Override
- public <E extends TopiaService> boolean serviceEnabled(
- Class<E> interfaceService) {
- boolean result = false;
- try {
- String name = getServiceName(interfaceService);
- result = serviceEnabled(name);
- } catch (Exception eee) {
- String message = _("topia.persistence.warn.service.not.found",
- interfaceService, getProperExceptionMessage(eee));
- if (log.isDebugEnabled()) {
- log.debug(message, eee);
- } else if (log.isWarnEnabled()) {
- log.warn(message);
- }
- }
- return result;
- }
-
- /* -------------------- CONTEXT HIERARCHY MANAGMENT ----------------------*/
-
- /**
* Constructor used by {@link #beginTransaction()} to instantiate child from
* {@code parentContext}.
*
@@ -435,72 +295,16 @@
return config;
}
- /**
- * Change the value of flag {@link #useFlushMode}.
- *
- * @param useFlushMode the new value to set
- * @see #useFlushMode
- * @since 2.5
- */
public void setUseFlushMode(boolean useFlushMode) {
this.useFlushMode = useFlushMode;
}
- /* -------------------- HIBERNATE MANAGMENT -----------------------------*/
-
@Override
- public void createSchema() throws TopiaException {
-// try {
-// boolean showSchema = false;
-// if (log.isDebugEnabled()) {
-// showSchema = true;
-// }
-// getFiresSupport().firePreCreateSchema(this);
-// new SchemaExport(getHibernateConfiguration()).create(showSchema,
-// true);
-// getFiresSupport().firePostCreateSchema(this);
-// } catch (PersistenceException eee) {
-// throw new TopiaException(
-// _("topia.persistence.error.create.schema",
-// eee.getMessage()), eee);
-// }
- }
-
- @Override
- public void showCreateSchema() throws TopiaException {
-// try {
-// new SchemaExport(getHibernateConfiguration()).
-// execute(true, false, false, true);
-// } catch (PersistenceException eee) {
-// throw new TopiaException(
-// _("topia.persistence.error.create.schema",
-// eee.getMessage()), eee);
-// }
- }
-
- @Override
- public void updateSchema() throws TopiaException {
-// try {
-// boolean showSchema = false;
-// if (log.isDebugEnabled()) {
-// showSchema = true;
-// }
-// getFiresSupport().firePreUpdateSchema(this);
-// new SchemaUpdate(getHibernateConfiguration()).execute(showSchema,
-// true);
-// getFiresSupport().firePostUpdateSchema(this);
-// } catch (PersistenceException eee) {
-// throw new TopiaException(
-// _("topia.persistence.error.update.schema",
-// eee.getMessage()), eee);
-// }
- }
-
- @Override
public EntityManager getEntityManager() throws TopiaException {
if (entityManager == null) {
throw new TopiaException(
- _("topia.persistence.error.no.hibernate.session"));
+ "No EntityManager found. Please open first a new " +
+ "transaction using 'beginTransaction()' method.");
}
return entityManager;
}
@@ -519,6 +323,14 @@
return entityManagerFactory;
}
+ @Override
+ public Set<Class<?>> getPersistenceClasses() {
+ if (getParentContext() != null) {
+ return getParentContext().getPersistenceClasses();
+ }
+ return persistenceClasses;
+ }
+
public Map<String, Object> getJPAConfiguration() throws TopiaNotFoundException {
if (jpaConfiguration == null) {
if (getParentContext() != null) {
@@ -786,7 +598,7 @@
_("topia.persistence.error.rootContext.access"));
}
Set<EntityType<?>> entities = getEntityManagerFactory().getMetamodel().getEntities();
- boolean found = false;
+ boolean found;
for (EntityType<?> entityType : entities) {
String entityName = entityType.getName();
found =
@@ -831,18 +643,21 @@
@SuppressWarnings({"unchecked"})
@Override
- public <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(Class<E> entityClass,
- Class<D> daoClass) throws TopiaException {
+ public <E extends TopiaEntity, D extends TopiaDAO<E>> D getDAO(
+ Class<E> entityClass, Class<D> daoClass) throws TopiaException {
return (D) getDAO(entityClass);
}
+
+ /* -------------------- TRANSACTION MANAGEMENT --------------------------*/
+
@Override
public TopiaContext beginTransaction() throws TopiaException {
checkClosed(_("topia.persistence.error.context.is.closed"));
TopiaContextImpl result = new TopiaContextImpl(this);
EntityManagerFactory factory = getEntityManagerFactory();
- result.entityManager = factory.createEntityManager(); // TODO AThimel 07/05/2012 Maybe provide a Map ? cf Configuration
+ result.entityManager = factory.createEntityManager();
// new TopiaInterceptor(result));
// on ne synchronise jamais les données avec la base tant que
@@ -878,7 +693,7 @@
eee);
}
- // 20081217 : add child AFTER hibernate session is opened
+ // 20081217 : add child AFTER EntityManager opening
addChildContext(result);
// fire event
@@ -943,7 +758,7 @@
entityManager.close();
// it's very important to change the session after rollback
// otherwize there are many error during next Entity's modification
- entityManager = getEntityManagerFactory().createEntityManager(); // TODO AThimel 07/05/2012 Maybe provide a Map ? cf Configuration
+ entityManager = getEntityManagerFactory().createEntityManager();
entityManager.setFlushMode(FlushModeType.COMMIT); // TODO AThimel 07/05/2012 Was MANUAL
// hibernate.beginTransaction();
@@ -1015,25 +830,129 @@
return closed;
}
- @Override
- public void executeSQL(String sqlScript) throws TopiaException {
- try {
- Query nativeQuery = getEntityManager().createNativeQuery(sqlScript);
- nativeQuery.executeUpdate();
- } catch (PersistenceException e) {
- throw new TopiaException("Could not execute sql code", e);
- }
- }
-
protected void checkClosed(String message) throws TopiaException {
if (closed) {
throw new TopiaException(message);
}
}
+
+ /* ------------------------ EVENT FIRING --------------------------*/
+
+ @Override
+ public TopiaFiresSupport getFiresSupport() {
+ return firesSupport;
+ }
+
+ /* Listeners adders */
+
+ @Override
+ public void addTopiaEntityListener(TopiaEntityListener listener) {
+ getFiresSupport().addTopiaEntityListener(listener);
+ }
+
+ @Override
+ public void addTopiaEntityListener(
+ Class<? extends TopiaEntity> entityClass,
+ TopiaEntityListener listener) {
+ getFiresSupport().addTopiaEntityListener(entityClass, listener);
+ }
+
+ @Override
+ public void addTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
+ getFiresSupport().addTopiaEntityVetoable(TopiaEntity.class, vetoable);
+ }
+
+ @Override
+ public void addTopiaEntityVetoable(
+ Class<? extends TopiaEntity> entityClass,
+ TopiaEntityVetoable vetoable) {
+ getFiresSupport().addTopiaEntityVetoable(entityClass, vetoable);
+ }
+
+ @Override
+ public void addTopiaTransactionListener(TopiaTransactionListener listener) {
+ getFiresSupport().addTopiaTransactionListener(listener);
+ }
+
+ @Override
+ public void addTopiaTransactionVetoable(TopiaTransactionVetoable vetoable) {
+ getFiresSupport().addTopiaTransactionVetoable(vetoable);
+ }
+
+ @Override
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ getFiresSupport().addPropertyChangeListener(listener);
+ }
+
+ @Override
+ public void addTopiaContextListener(TopiaContextListener listener) {
+ getFiresSupport().addTopiaContextListener(listener);
+ }
+
+ /* Listeners removers */
+
+ @Override
+ public void removeTopiaEntityListener(TopiaEntityListener listener) {
+ getFiresSupport().removeTopiaEntityListener(TopiaEntity.class,
+ listener);
+ }
+
+ @Override
+ public void removeTopiaEntityListener(
+ Class<? extends TopiaEntity> entityClass,
+ TopiaEntityListener listener) {
+ getFiresSupport().removeTopiaEntityListener(entityClass, listener);
+ }
+
+ @Override
+ public void removeTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
+ getFiresSupport().removeTopiaEntityVetoable(TopiaEntity.class,
+ vetoable);
+ }
+
+ @Override
+ public void removeTopiaEntityVetoable(
+ Class<? extends TopiaEntity> entityClass,
+ TopiaEntityVetoable vetoable) {
+ getFiresSupport().removeTopiaEntityVetoable(entityClass, vetoable);
+ }
+
+ @Override
+ public void removeTopiaTransactionListener(
+ TopiaTransactionListener listener) {
+ getFiresSupport().removeTopiaTransactionListener(listener);
+ }
+
+ @Override
+ public void removeTopiaTransactionVetoable(
+ TopiaTransactionVetoable vetoable) {
+ getFiresSupport().removeTopiaTransactionVetoable(vetoable);
+ }
+
+ @Override
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ getFiresSupport().removePropertyChangeListener(listener);
+ }
+
+ @Override
+ public void removeTopiaContextListener(TopiaContextListener listener) {
+ getFiresSupport().removeTopiaContextListener(listener);
+ }
+
+ @Override
+ public void addTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
+ getFiresSupport().addTopiaEntitiesVetoable(vetoable);
+ }
+
+ @Override
+ public void removeTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
+ getFiresSupport().removeTopiaEntitiesVetoable(vetoable);
+ }
+
+
/* -------------------- GLOBAL OPERATIONS ON SCHEMA ----------------------*/
-
@SuppressWarnings({"unchecked"})
@Override
public TopiaEntity findByTopiaId(String id) throws TopiaException {
@@ -1158,6 +1077,239 @@
}
@Override
+ public void executeSQL(String sqlScript) throws TopiaException {
+ try {
+ Query nativeQuery = getEntityManager().createNativeQuery(sqlScript);
+ nativeQuery.executeUpdate();
+ } catch (PersistenceException e) {
+ throw new TopiaException("Could not execute sql code", e);
+ }
+ }
+
+// public static class SQLWork implements Work {
+// private final String script;
+//
+// public SQLWork(String script) {
+// this.script = script;
+// }
+//
+// @Override
+// public void execute(Connection connection) throws SQLException {
+// PreparedStatement sta = connection.prepareStatement(script);
+// try {
+// sta.execute();
+// } finally {
+// sta.close();
+// }
+// }
+// }
+
+
+ /* -------------------- SCHEMA MANAGMENT -----------------------------*/
+
+ @Override
+ public boolean isSchemaExist(Class<?> clazz)
+ throws TopiaException {
+ checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
+ "replicateEntity"));
+ boolean result = TopiaUtil.isSchemaExist(this, clazz.getName());
+ return result;
+ }
+
+ @Override
+ public void createSchema() throws TopiaException {
+// try {
+// boolean showSchema = false;
+// if (log.isDebugEnabled()) {
+// showSchema = true;
+// }
+// getFiresSupport().firePreCreateSchema(this);
+// new SchemaExport(getHibernateConfiguration()).create(showSchema,
+// true);
+// getFiresSupport().firePostCreateSchema(this);
+// } catch (PersistenceException eee) {
+// throw new TopiaException(
+// _("topia.persistence.error.create.schema",
+// eee.getMessage()), eee);
+// }
+ }
+
+ @Override
+ public void showCreateSchema() throws TopiaException {
+// try {
+// new SchemaExport(getHibernateConfiguration()).
+// execute(true, false, false, true);
+// } catch (PersistenceException eee) {
+// throw new TopiaException(
+// _("topia.persistence.error.create.schema",
+// eee.getMessage()), eee);
+// }
+ }
+
+ @Override
+ public void updateSchema() throws TopiaException {
+// try {
+// boolean showSchema = false;
+// if (log.isDebugEnabled()) {
+// showSchema = true;
+// }
+// getFiresSupport().firePreUpdateSchema(this);
+// new SchemaUpdate(getHibernateConfiguration()).execute(showSchema,
+// true);
+// getFiresSupport().firePostUpdateSchema(this);
+// } catch (PersistenceException eee) {
+// throw new TopiaException(
+// _("topia.persistence.error.update.schema",
+// eee.getMessage()), eee);
+// }
+ }
+
+
+ /* -------------------- SERVICES MANAGMENT -------------------------------*/
+
+ protected String getProperExceptionMessage(Throwable eee) {
+ return eee.getClass().getSimpleName() + " : " +
+ eee.getMessage();
+ }
+
+ protected Map<String, TopiaService> loadServices(Properties config) {
+ Map<String, TopiaService> result = new HashMap<String, TopiaService>();
+ // recherche des services present dans la config
+ for (Enumeration<?> e = config.propertyNames(); e.hasMoreElements();) {
+ String key = (String) e.nextElement();
+ if (key.matches("^topia\\.service\\.\\w+$")) {
+ String classService = config.getProperty(key);
+ try {
+ Class<?> forName = Class.forName(classService);
+ Object newInstance = forName.getConstructor().newInstance();
+ TopiaService service = (TopiaService) newInstance;
+ if (key.equals("topia.service." + service.getServiceName())) {
+ result.put(service.getServiceName(), service);
+ log.info(_("topia.persistence.service.loaded",
+ key, classService));
+ } else {
+ log.warn(_("topia.persistence.warn.service.not.loaded",
+ key, service.getServiceName()));
+ }
+ } catch (Throwable eee) {
+ String message =
+ _("topia.persistence.error.service.unknown",
+ key, classService);
+ if (log.isDebugEnabled()) {
+ log.debug(message, eee);
+ } else if (log.isErrorEnabled()) {
+ log.error(message);
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ protected void preInitServices(Map<String, TopiaService> services) {
+ for (TopiaService service : services.values()) {
+ if (!service.preInit(this)) {
+ log.warn(_("topia.persistence.warn.service.not.preInit",
+ service.getServiceName()));
+ }
+ }
+ }
+
+ protected void postInitServices(Map<String, TopiaService> services) {
+ for (TopiaService service : services.values()) {
+ if (!service.postInit(this)) {
+ log.warn(_("topia.persistence.warn.service.not.postInit",
+ service.getServiceName()));
+ }
+ }
+ }
+
+ protected TopiaService getService(String name) {
+ TopiaService result = getServices().get(name);
+ return result;
+ }
+
+ protected boolean serviceEnabled(String name) {
+ boolean result = getServices().containsKey(name);
+ return result;
+ }
+
+ /**
+ * Retrieve service name using SERVICE_NAME static field on service
+ * interface.
+ *
+ * @param interfaceService class of the service
+ * @param <E> type of the service that extends {@link
+ * TopiaService}
+ * @return the service name
+ * @throws IllegalAccessException if field SERVICE_NAME can't be accessed
+ * @throws NoSuchFieldException if no field SERVICE_NAME is defined
+ */
+ protected <E extends TopiaService> String getServiceName(
+ Class<E> interfaceService)
+ throws IllegalAccessException, NoSuchFieldException {
+ Field f = interfaceService.getField("SERVICE_NAME");
+ String name = (String) f.get(null);
+ return name;
+ }
+
+ @Override
+ public Map<String, TopiaService> getServices() {
+ TopiaContextImplementor parent = getParentContext();
+
+ Map<String, TopiaService> result;
+ if (parent != null) {
+ result = parent.getServices();
+ } else {
+ result = services;
+ }
+ return result;
+ }
+
+ @Override
+ public <E extends TopiaService> E getService(Class<E> interfaceService)
+ throws TopiaNotFoundException {
+ E result;
+ try {
+ String name = getServiceName(interfaceService);
+ result = (E) getService(name);
+ } catch (Exception eee) {
+ throw new TopiaNotFoundException(
+ _("topia.persistence.error.service.not.retreaved",
+ interfaceService, getProperExceptionMessage(eee)),
+ eee);
+ }
+ if (result == null) {
+ throw new TopiaNotFoundException(
+ _("topia.persistence.error.service.not.found",
+ interfaceService));
+ }
+ return result;
+ }
+
+ @Override
+ public <E extends TopiaService> boolean serviceEnabled(
+ Class<E> interfaceService) {
+ boolean result = false;
+ try {
+ String name = getServiceName(interfaceService);
+ result = serviceEnabled(name);
+ } catch (Exception eee) {
+ String message = _("topia.persistence.warn.service.not.found",
+ interfaceService, getProperExceptionMessage(eee));
+ if (log.isDebugEnabled()) {
+ log.debug(message, eee);
+ } else if (log.isWarnEnabled()) {
+ log.warn(message);
+ }
+ }
+ return result;
+ }
+
+
+ /* ------------------ IMPORT / EXPORT / REPLICATION ---------------------*/
+
+ @Override
public void importXML(Reader xml) throws TopiaException {
// checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
// "importXML"));
@@ -1337,11 +1489,6 @@
replicate0(dstContextImpl, entities.toArray());
}
- @Override
- public TopiaFiresSupport getFiresSupport() {
- return firesSupport;
- }
-
/**
* Backup database in gzip compressed file.
*
@@ -1447,129 +1594,6 @@
}
}
- @Override
- public Set<Class<?>> getPersistenceClasses() {
- if (getParentContext() != null) {
- return getParentContext().getPersistenceClasses();
- }
- return persistenceClasses;
- }
-
- @Override
- public boolean isSchemaExist(Class<?> clazz)
- throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicateEntity"));
- boolean result = TopiaUtil.isSchemaExist(this, clazz.getName());
- return result;
- }
-
- /* Listeners adders */
-
- @Override
- public void addTopiaEntityListener(TopiaEntityListener listener) {
- getFiresSupport().addTopiaEntityListener(listener);
- }
-
- @Override
- public void addTopiaEntityListener(
- Class<? extends TopiaEntity> entityClass,
- TopiaEntityListener listener) {
- getFiresSupport().addTopiaEntityListener(entityClass, listener);
- }
-
- @Override
- public void addTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
- getFiresSupport().addTopiaEntityVetoable(TopiaEntity.class, vetoable);
- }
-
- @Override
- public void addTopiaEntityVetoable(
- Class<? extends TopiaEntity> entityClass,
- TopiaEntityVetoable vetoable) {
- getFiresSupport().addTopiaEntityVetoable(entityClass, vetoable);
- }
-
- @Override
- public void addTopiaTransactionListener(TopiaTransactionListener listener) {
- getFiresSupport().addTopiaTransactionListener(listener);
- }
-
- @Override
- public void addTopiaTransactionVetoable(TopiaTransactionVetoable vetoable) {
- getFiresSupport().addTopiaTransactionVetoable(vetoable);
- }
-
- @Override
- public void addPropertyChangeListener(PropertyChangeListener listener) {
- getFiresSupport().addPropertyChangeListener(listener);
- }
-
- @Override
- public void addTopiaContextListener(TopiaContextListener listener) {
- getFiresSupport().addTopiaContextListener(listener);
- }
-
- /* Listeners removers */
-
- @Override
- public void removeTopiaEntityListener(TopiaEntityListener listener) {
- getFiresSupport().removeTopiaEntityListener(TopiaEntity.class,
- listener);
- }
-
- @Override
- public void removeTopiaEntityListener(
- Class<? extends TopiaEntity> entityClass,
- TopiaEntityListener listener) {
- getFiresSupport().removeTopiaEntityListener(entityClass, listener);
- }
-
- @Override
- public void removeTopiaEntityVetoable(TopiaEntityVetoable vetoable) {
- getFiresSupport().removeTopiaEntityVetoable(TopiaEntity.class,
- vetoable);
- }
-
- @Override
- public void removeTopiaEntityVetoable(
- Class<? extends TopiaEntity> entityClass,
- TopiaEntityVetoable vetoable) {
- getFiresSupport().removeTopiaEntityVetoable(entityClass, vetoable);
- }
-
- @Override
- public void removeTopiaTransactionListener(
- TopiaTransactionListener listener) {
- getFiresSupport().removeTopiaTransactionListener(listener);
- }
-
- @Override
- public void removeTopiaTransactionVetoable(
- TopiaTransactionVetoable vetoable) {
- getFiresSupport().removeTopiaTransactionVetoable(vetoable);
- }
-
- @Override
- public void removePropertyChangeListener(PropertyChangeListener listener) {
- getFiresSupport().removePropertyChangeListener(listener);
- }
-
- @Override
- public void removeTopiaContextListener(TopiaContextListener listener) {
- getFiresSupport().removeTopiaContextListener(listener);
- }
-
- @Override
- public void addTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
- getFiresSupport().addTopiaEntitiesVetoable(vetoable);
- }
-
- @Override
- public void removeTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
- getFiresSupport().removeTopiaEntitiesVetoable(vetoable);
- }
-
/**
* Build the list of queries from the given parameter
* <code>entityAndCondition</code>.
@@ -1658,23 +1682,5 @@
}
}
-// public static class SQLWork implements Work {
-// private final String script;
-//
-// public SQLWork(String script) {
-// this.script = script;
-// }
-//
-// @Override
-// public void execute(Connection connection) throws SQLException {
-// PreparedStatement sta = connection.prepareStatement(script);
-// try {
-// sta.execute();
-// } finally {
-// sta.close();
-// }
-// }
-// }
-
} //TopiaContextImpl
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2012-05-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2012-05-10 10:37:36 UTC (rev 2471)
@@ -490,8 +490,8 @@
/*{ column="<%=attrColumn%>" node="<%=attrName%>"<%=optionalAttributes%>}*/
if (attrIsEnumeration) {
/*{>
-<%=prefix%> <type name="javax.persistence.EnumType">
-<%=prefix%> <param name="<%="javax.persistence.EnumType.ENUM"%>"><%=attrType%></param>}*/
+<%=prefix%> <type name="org.hibernate.type.EnumType">
+<%=prefix%> <param name="enumClass"><%=attrType%></param>}*/ // was: org.hibernate.type.EnumType.ENUM
// if the user tuned the model to use name instead of
// ordinal to store the values, we must add a clause
@@ -500,7 +500,7 @@
String enumSQLType = String.valueOf(Types.VARCHAR);
/*{
<%=prefix%> <!-- using name instead of ordinal to store enumeration value -->
-<%=prefix%> <param name="<%="javax.persistence.EnumType.TYPE"%>"><%=enumSQLType%></param>}*/
+<%=prefix%> <param name="type"><%=enumSQLType%></param>}*/ // was: org.hibernate.type.EnumType.TYPE
}
/*{
Modified: trunk/topia-persistence/src/main/resources/i18n/topia-persistence_en_GB.properties
===================================================================
--- trunk/topia-persistence/src/main/resources/i18n/topia-persistence_en_GB.properties 2012-05-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence/src/main/resources/i18n/topia-persistence_en_GB.properties 2012-05-10 10:37:36 UTC (rev 2471)
@@ -2,7 +2,6 @@
topia.persistence.error.context.is.closed=Context is closed, no operation is possible.
topia.persistence.error.create.schema=Schema could not be created for following reason \: %1$s
topia.persistence.error.empty.doc=Empty document
-topia.persistence.error.no.hibernate.session=No hinernate session found, you must at first, open a new transaction via 'beaginTransaction' method.
topia.persistence.error.null.param=The method '%1$s' requires a non null parameter '%2$s'.
topia.persistence.error.on.clear=
topia.persistence.error.on.commit=An error occurs while commit operation \: %1$s
Modified: trunk/topia-persistence/src/main/resources/i18n/topia-persistence_es_ES.properties
===================================================================
--- trunk/topia-persistence/src/main/resources/i18n/topia-persistence_es_ES.properties 2012-05-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence/src/main/resources/i18n/topia-persistence_es_ES.properties 2012-05-10 10:37:36 UTC (rev 2471)
@@ -2,7 +2,6 @@
topia.persistence.error.context.is.closed=Este contexto ya ha sido cerrado, no se puede comenzar una transacción
topia.persistence.error.create.schema=No se puede crear el esquema debido a la razón siguiente \: %2$s
topia.persistence.error.empty.doc=Documento vacío
-topia.persistence.error.no.hibernate.session=No se encuentra ninguna sesión hibernada, debe iniciar una transacción con el método 'BeginTransaction'
topia.persistence.error.null.param=El método '%1$s' requiere un parámetro '%2$s' no nulo.
topia.persistence.error.on.clear=
topia.persistence.error.on.commit=Se produjo un error durante el guardado \: %1$s
Modified: trunk/topia-persistence/src/main/resources/i18n/topia-persistence_fr_FR.properties
===================================================================
--- trunk/topia-persistence/src/main/resources/i18n/topia-persistence_fr_FR.properties 2012-05-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence/src/main/resources/i18n/topia-persistence_fr_FR.properties 2012-05-10 10:37:36 UTC (rev 2471)
@@ -2,7 +2,6 @@
topia.persistence.error.context.is.closed=Ce contexte a ete ferme, impossible de commencer une transaction
topia.persistence.error.create.schema=Le schéma n'a pas pu être crée pour la raison suivante \: %2$s
topia.persistence.error.empty.doc=Document vide
-topia.persistence.error.no.hibernate.session=Aucune session hibernate trouvée, vous devez démarré une transaction avec la méthode 'beginTransaction'
topia.persistence.error.null.param=La méthode '%1$s' requière un paramètre '%2$s' non null.
topia.persistence.error.on.clear=
topia.persistence.error.on.commit=Une erreur est apparue pendant le commit \: %1$s
Modified: trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckItHibernateTest.java
===================================================================
--- trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckItHibernateTest.java 2012-05-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckItHibernateTest.java 2012-05-10 10:37:36 UTC (rev 2471)
@@ -1,9 +1,9 @@
package org.nuiton.topia.tck;
-import org.junit.Ignore;
-
/**
- * Do not remove event if empty : this class represents the TCK IT tests
+ * Launch {@link TopiaTckItTestSuite}.
+ *
+ * Do not remove even if empty : this class represents the TCK IT tests
* for topia-persistence-hibernate module
*
* @author Arnaud Thimel <thimel(a)codelutin.com>
Modified: trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckLegacyHibernateTest.java
===================================================================
--- trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckLegacyHibernateTest.java 2012-05-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckLegacyHibernateTest.java 2012-05-10 10:37:36 UTC (rev 2471)
@@ -1,7 +1,5 @@
package org.nuiton.topia.tck;
-import org.junit.Ignore;
-
/**
* Launch {@link TopiaTckLegacyTestSuite}.
*
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-10 09:49:18 UTC (rev 2470)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java 2012-05-10 10:37:36 UTC (rev 2471)
@@ -1,7 +1,5 @@
package org.nuiton.topia.tck;
-import org.junit.Ignore;
-
/**
* Launch {@link TopiaTckMappingTestSuite}.
*
1
0