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
r2490 - trunk/topia-persistence/src/main/java/org/nuiton/topia/generator
by tchemit@users.nuiton.org 16 May '12
by tchemit@users.nuiton.org 16 May '12
16 May '12
Author: tchemit
Date: 2012-05-17 00:51:43 +0200 (Thu, 17 May 2012)
New Revision: 2490
Url: http://nuiton.org/repositories/revision/topia/2490
Log:
refs #2089: Use JPA (orm) mappings (remove cascade for OneToMany relation)
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-16 22:50:12 UTC (rev 2489)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java 2012-05-16 22:51:43 UTC (rev 2490)
@@ -760,10 +760,7 @@
}*/
}
-/*{<%=flushTag(TAG_CASCADE)%>
-<%=flushTag(TAG_CASCADE_ALL, true)%>
-<%=closeTag(TAG_CASCADE)%>
-}*/
+ //TODO-tchemit-2012-05-15 Do we need any cascade ?
/*{<%=closeTag(TAG_ONE_TO_MANY)%>
}*/
}
1
0
r2489 - trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence
by tchemit@users.nuiton.org 16 May '12
by tchemit@users.nuiton.org 16 May '12
16 May '12
Author: tchemit
Date: 2012-05-17 00:50:12 +0200 (Thu, 17 May 2012)
New Revision: 2489
Url: http://nuiton.org/repositories/revision/topia/2489
Log:
refs #2078: Remove the TopiaContext from TopiaEntityAbstract (deprecate getComposite and getAggregate from TopiaEntity and rewritte them in DAO)
Added:
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceUtil.java
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java 2012-05-16 22:44:49 UTC (rev 2488)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAOImpl.java 2012-05-16 22:50:12 UTC (rev 2489)
@@ -37,6 +37,8 @@
package org.nuiton.topia.persistence;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -52,6 +54,7 @@
import javax.persistence.metamodel.Metamodel;
import java.lang.reflect.InvocationTargetException;
import java.security.Permission;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -173,21 +176,22 @@
@Override
public E create(E entity) throws TopiaException {
- // TODO EC-20100322 this code may be merged with other create() methods
- try {
- // first set topiaId
- String topiaId = TopiaId.create(entityClass);
- TopiaEntityAbstract entityAbstract = (TopiaEntityAbstract) entity;
- entityAbstract.setTopiaId(topiaId);
- entityAbstract.setTopiaContext(getContext());
-
- // save entity
- getSession().persist(entity);
- getContext().getFiresSupport().warnOnUpdateEntity(entity);
- return entity;
- } catch (PersistenceException eee) {
- throw new TopiaException(eee);
- }
+ return create0(entity);
+// // TODO EC-20100322 this code may be merged with other create() methods
+// try {
+// // first set topiaId
+// String topiaId = TopiaId.create(entityClass);
+// TopiaEntityAbstract entityAbstract = (TopiaEntityAbstract) entity;
+// entityAbstract.setTopiaId(topiaId);
+// entityAbstract.setTopiaContext(getContext());
+//
+// // save entity
+// getSession().persist(entity);
+// getContext().getFiresSupport().warnOnUpdateEntity(entity);
+// return entity;
+// } catch (PersistenceException eee) {
+// throw new TopiaException(eee);
+// }
}
@Override
@@ -227,13 +231,13 @@
// TODO reflechir s'il ne faudrait pas creer l'id avant l'event precedent
// reflechir toujours dans un context on les E pourrait ne pas
- // etre des TopiaEntity
- if (result instanceof TopiaEntity) {
- String topiaId = TopiaId.create(entityClass);
- TopiaEntityAbstract entity = (TopiaEntityAbstract) result;
- entity.setTopiaId(topiaId);
- entity.setTopiaContext(getContext());
- }
+ // etre des TopiaEntity (ce qui n'arrivera jamais vu la signature (TC)...)
+// if (result instanceof TopiaEntity) {
+// String topiaId = TopiaId.create(entityClass);
+ TopiaEntityAbstract entity = (TopiaEntityAbstract) result;
+// entity.setTopiaId(topiaId);
+ entity.setTopiaContext(getContext());
+// }
try {
for (Map.Entry<String, Object> e : properties.entrySet()) {
String propertyName = e.getKey();
@@ -250,7 +254,16 @@
throw new IllegalArgumentException(
"Can't put properties on new Object", eee);
}
+ return create0(result);
+// // on fait un save maintenant, car puisqu'on a creer l'entity au
+// // travers du DAO, on s'attend a l'avoir a disposition tout de
+// // suite pour les requetes sans avoir a faire un update dessus
+// getSession().persist(result);
+// getContext().getFiresSupport().warnOnCreateEntity(result);
+// return result;
+ }
+ protected E create0(E result) throws TopiaException {
// on fait un save maintenant, car puisqu'on a creer l'entity au
// travers du DAO, on s'attend a l'avoir a disposition tout de
// suite pour les requetes sans avoir a faire un update dessus
@@ -281,13 +294,11 @@
}
@Override
- @Deprecated
public TopiaQuery createQuery() {
return new TopiaQuery(getEntityClass());
}
@Override
- @Deprecated
public TopiaQuery createQuery(String entityAlias) {
return new TopiaQuery(getEntityClass(), entityAlias);
}
@@ -552,10 +563,22 @@
}
+ @Override
+ public Multimap<Class<? extends TopiaEntity>, TopiaEntity> getComposite(E entity) throws TopiaException {
+ throw new UnsupportedOperationException(
+ "This method must be overided in generated DAO");
+ }
+
+ @Override
+ public Multimap<Class<? extends TopiaEntity>, TopiaEntity> getAggregate(E entity) throws TopiaException {
+ throw new UnsupportedOperationException(
+ "This method must be overided in generated DAO");
+ }
+
/**
* Renvoie la Session contenue dans le contexte
*
- * @return hibernate session
+ * @return jpa session
* @throws TopiaException if any pb
*/
EntityManager getSession() throws TopiaException {
@@ -580,5 +603,34 @@
// }
return meta;
}
-
+
+ protected Multimap<Class<? extends TopiaEntity>, TopiaEntity> fillComposite(Multimap<Class<? extends TopiaEntity>, TopiaEntity> tmp2) throws TopiaException {
+
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> result =
+ ArrayListMultimap.create();
+ for (Class<? extends TopiaEntity> aClass : tmp2.keySet()) {
+ Collection<TopiaEntity> eee = tmp2.get(aClass);
+ result.putAll(aClass, eee);
+ TopiaDAO dao = getContext().getDAO(aClass);
+ for (TopiaEntity entity : eee) {
+ tmp2.putAll(dao.getComposite(entity));
+ }
+ }
+ return result;
+ }
+
+ protected Multimap<Class<? extends TopiaEntity>, TopiaEntity> fillAggregate(Multimap<Class<? extends TopiaEntity>, TopiaEntity> tmp2) throws TopiaException {
+
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> result =
+ ArrayListMultimap.create();
+ for (Class<? extends TopiaEntity> aClass : tmp2.keySet()) {
+ Collection<TopiaEntity> eee = tmp2.get(aClass);
+ result.putAll(aClass, eee);
+ TopiaDAO dao = getContext().getDAO(aClass);
+ for (TopiaEntity entity : eee) {
+ tmp2.putAll(dao.getAggregate(entity));
+ }
+ }
+ return result;
+ }
} //TopiaDAOImpl
Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceUtil.java (rev 0)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaPersistenceUtil.java 2012-05-16 22:50:12 UTC (rev 2489)
@@ -0,0 +1,44 @@
+package org.nuiton.topia.persistence;
+
+/**
+ * Util class for persistence parts of ToPIA.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 3.0
+ */
+public class TopiaPersistenceUtil {
+
+ protected TopiaPersistenceUtil() {
+ // no constructor for a util class
+ }
+
+
+ /**
+ * Obtain the *entity* contract from a given class.
+ * <p/>
+ * This is usefull when you obtain an implementation of an entity and
+ * you want his contract.
+ *
+ * @param entityType type to scan
+ * @return the *entity* contract found or {@code null} if not found.
+ * @since 3.0
+ */
+ public static Class<?> getEntityContract(Class<?> entityType) {
+ Class<?> entityInterface = null;
+ Class<?>[] interfaces = entityType.getInterfaces();
+ for (Class<?> anInterface : interfaces) {
+ if (TopiaEntity.class.isAssignableFrom(anInterface)) {
+ entityInterface = anInterface;
+ break;
+ }
+ }
+ if (entityInterface == null) {
+ // try on super class
+ Class<?> superclass = entityType.getSuperclass();
+ if (superclass != null && !Object.class.equals(superclass)) {
+ entityInterface = getEntityContract(superclass);
+ }
+ }
+ return entityInterface;
+ }
+}
1
0
r2488 - in trunk/topia-persistence/src/main/java/org/nuiton/topia: generator persistence
by tchemit@users.nuiton.org 16 May '12
by tchemit@users.nuiton.org 16 May '12
16 May '12
Author: tchemit
Date: 2012-05-17 00:44:49 +0200 (Thu, 17 May 2012)
New Revision: 2488
Url: http://nuiton.org/repositories/revision/topia/2488
Log:
refs #2078: Remove the TopiaContext from TopiaEntityAbstract (deprecate getComposite and getAggregate from TopiaEntity and rewritte them in DAO)
Modified:
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntity.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-16 22:41:20 UTC (rev 2487)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2012-05-16 22:44:49 UTC (rev 2488)
@@ -27,6 +27,8 @@
/*{generator option: parentheses = false}*/
/*{generator option: writeString = +}*/
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
@@ -46,8 +48,10 @@
import org.nuiton.topia.framework.TopiaContextImplementor;
import org.nuiton.topia.persistence.TopiaDAO;
import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.persistence.TopiaPersistenceUtil;
import org.nuiton.util.StringUtil;
+import java.io.IOException;
import java.security.Permission;
import java.util.ArrayList;
import java.util.Collection;
@@ -413,6 +417,10 @@
generateNotNull(daoAbstractClass, clazz);
+ generateCompositeOperation(daoAbstractClass, clazz);
+
+ generateAggregateOperation(daoAbstractClass, clazz);
+
for (ObjectModelAttribute attr : clazz.getAttributes()) {
if (!attr.isNavigable()) {
continue;
@@ -620,18 +628,18 @@
String setName = getJavaBeanMethodName("set", reverseAttrName);
body.append(""
- /*{
- {
- List<<%=attrSimpleType%>> list = getContext()
- .getDAO(<%=attrSimpleType%>.class)
- .findAllByProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity);
- for (<%=attrSimpleType%> item : list) {
+/*{
+ {
+ List<<%=attrSimpleType%>> list = getContext()
+ .getDAO(<%=attrSimpleType%>.class)
+ .findAllByProperties(<%=attrSimpleType%>.<%=getConstantName(reverseAttrName)%>, entity);
+ for (<%=attrSimpleType%> item : list) {
- // sletellier : Set null only if target is concerned by deletion
- if (entity.equals(item.<%=getName%>())) {
- item.<%=setName%>(null);
- }
- }*/
+ // sletellier : Set null only if target is concerned by deletion
+ if (entity.equals(item.<%=getName%>())) {
+ item.<%=setName%>(null);
+ }
+}*/
);
if (attr.isAggregate()) {
body.append(""
@@ -1178,4 +1186,205 @@
);
}
}
+
+ protected void generateCompositeOperation(ObjectModelClass result,
+ ObjectModelClass input) {
+
+ ObjectModelOperation operation =
+ addOperation(result,
+ "getComposite",
+ Multimap.class.getName() + "<Class<? extends TopiaEntity>, TopiaEntity>");
+
+ addParameter(operation, "E", "entity");
+ addException(operation, TopiaException.class);
+ addAnnotation(result, operation, Override.class.getSimpleName());
+
+ addImport(result, ArrayList.class);
+ addImport(result, List.class);
+ addImport(result, Multimap.class);
+ addImport(result, ArrayListMultimap.class);
+
+ StringBuilder body = new StringBuilder(""
+/*{
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> tmp =
+ ArrayListMultimap.create();
+
+ // pour tous les attributs rechecher les composites et les class d'asso
+ // on les ajoute dans tmp
+}*/
+ );
+ Collection<ObjectModelAttribute> compositeAttributes =
+ TopiaGeneratorUtil.getEntityAttributes(
+ input, model,
+ TopiaGeneratorUtil.IS_ATTRIBUTE_REFERENCE_CLASSIFIER,
+ TopiaGeneratorUtil.IS_ATTRIBUTE_COMPOSITE)
+ ;
+
+ // add composition attributes
+
+ for (ObjectModelAttribute attr : compositeAttributes ) {
+
+ String type = attr.getType();
+ addImport(result, type);
+ type = TopiaGeneratorUtil.getSimpleName(type);
+ String attrName = attr.getName();
+ String getterName = getJavaBeanMethodName("get", attrName);
+ if (TopiaGeneratorUtil.isNMultiplicity(attr)) {
+ addImport(result, Collection.class);
+ body.append(""
+/*{ Collection<<%=type%>> ee = entity.<%=getterName%>();
+ if (ee != null) {
+ tmp.putAll(<%=type%>.class, ee);
+ }
+}*/
+ );
+ } else {
+ body.append(""
+/*{ <%=type%> ee = entity.<%=getterName%>();
+ if (ee != null) {
+ tmp.put(<%=type%>.class, ee);
+ }
+}*/
+ );
+ }
+ }
+
+ // add association attributes
+
+ Collection<ObjectModelAttribute> associationAttributes =
+ TopiaGeneratorUtil.getEntityAttributes(
+ input, model,
+ TopiaGeneratorUtil.IS_ATTRIBUTE_REFERENCE_CLASSIFIER,
+ TopiaGeneratorUtil.IS_ATTRIBUTE_HAS_ASSOCIATION_CLASS);
+ for (ObjectModelAttribute attr : associationAttributes ) {
+
+ String assocClassFQN = attr.getAssociationClass().getQualifiedName();
+ addImport(result, assocClassFQN);
+ assocClassFQN = TopiaGeneratorUtil.getSimpleName(assocClassFQN);
+ String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(
+ attr);
+ String getterName = getJavaBeanMethodName("get", TopiaGeneratorUtil.toLowerCaseFirstLetter(
+ assocAttrName));
+ if (!TopiaGeneratorUtil.isNMultiplicity(attr)) {
+ body.append(""
+/*{ <%=assocClassFQN%> ee = entity.<%=getterName%>();
+ if (ee != null) {
+ tmp.put(<%=assocClassFQN%>.class, ee);
+ }
+}*/
+ );
+ } else {
+
+
+
+ ObjectModelAttribute reverse = attr.getReverseAttribute();
+ String reverseAttrName = reverse.getName();
+ // On utilise pas l'attribut car il est potentiellement
+ // pas a jour, car pour les asso avec cardinalité
+ // personne ne fait de add. Ce qui est normal, mais
+ // pour pouvoir faire tout de meme des delete en cascade
+ // sur les asso, le champs est dans le mapping
+ // hibernate et donc il le faut aussi dans la classe
+ // sinon hibernate rale lorsqu'il charge l'objet
+// if (<%=ref%> != null) {
+// tmp.addAll(<%=ref%>);
+// }
+
+ addImport(result, TopiaDAO.class);
+ body.append(""
+/*{ {
+ TopiaDAO<<%=assocClassFQN%>> dao = getContext().getDAO(<%=assocClassFQN%>.class);
+ List<<%=assocClassFQN%>> eee = dao.findAllByProperties("<%=reverseAttrName%>", entity);
+ if (eee != null) {
+ tmp.putAll(<%=assocClassFQN%>.class, eee);
+ }
+ }
+}*/
+ );
+ }
+ }
+
+ // merge all results
+
+ body.append(""
+/*{
+ // on refait un tour sur chaque entity de tmp pour recuperer leur
+ // composite
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> result =
+ fillComposite(tmp);
+ return result;
+ }*/
+ );
+
+ setOperationBody(operation, body.length() == 0 ? " " : body.toString());
+ }
+
+ protected void generateAggregateOperation(ObjectModelClass result,
+ ObjectModelClass input) {
+
+ ObjectModelOperation operation =
+ addOperation(result, "getAggregate",
+ Multimap.class.getName() + "<Class<? extends TopiaEntity>, TopiaEntity>");
+
+ addParameter(operation, "E", "entity");
+ addException(operation, TopiaException.class);
+ addAnnotation(result, operation, Override.class.getSimpleName());
+
+ addImport(result, ArrayList.class);
+ addImport(result, List.class);
+
+ StringBuilder body = new StringBuilder(""
+/*{
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> tmp =
+ ArrayListMultimap.create();
+
+ // pour tous les attributs rechecher les aggregates
+ // on les ajoute dans tmp
+}*/
+ );
+
+ Collection<ObjectModelAttribute> attributes =
+ TopiaGeneratorUtil.getEntityAttributes(
+ input, model,
+ TopiaGeneratorUtil.IS_ATTRIBUTE_REFERENCE_CLASSIFIER,
+ TopiaGeneratorUtil.IS_ATTRIBUTE_AGGREGATE);
+
+
+ for (ObjectModelAttribute attr : attributes) {
+
+ String attrName = attr.getName();
+ String getterName = getJavaBeanMethodName("get", attrName);
+ String type = attr.getType();
+ addImport(result, type);
+ type = TopiaGeneratorUtil.getSimpleName(type);
+ if (TopiaGeneratorUtil.isNMultiplicity(attr)) {
+ body.append(""
+/*{ <%=type%> ee = entity.<%=getterName%>();
+ if (ee != null) {
+ tmp.put(<%=type%>.class, ee);
+ }
+}*/
+ );
+ } else {
+ body.append(""
+/*{ Collection<<%=type%>> ee = entity.<%=getterName%>();
+ if (ee != null) {
+ tmp.putAll(<%=type%>.class, ee);
+ }
+}*/
+ );
+ }
+ }
+ body.append(""
+/*{
+ // on refait un tour sur chaque entity de tmp pour recuperer leur
+ // aggregate
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> result =
+ fillAggregate(tmp);
+ return result;
+ }*/
+ );
+
+ setOperationBody(operation, body.toString());
+ }
}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java 2012-05-16 22:41:20 UTC (rev 2487)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityTransformer.java 2012-05-16 22:44:49 UTC (rev 2488)
@@ -1286,6 +1286,7 @@
addException(operation, TopiaException.class);
addAnnotation(outputAbstract, operation, Override.class.getSimpleName());
+ addAnnotation(outputAbstract, operation, Deprecated.class.getSimpleName());
addImport(outputAbstract, ArrayList.class);
addImport(outputAbstract, List.class);
@@ -1390,6 +1391,7 @@
addException(operation, TopiaException.class);
addAnnotation(outputAbstract, operation, Override.class.getSimpleName());
+ addAnnotation(outputAbstract, operation, Deprecated.class.getSimpleName());
addImport(outputAbstract, ArrayList.class);
addImport(outputAbstract, List.class);
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2012-05-16 22:41:20 UTC (rev 2487)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2012-05-16 22:44:49 UTC (rev 2488)
@@ -25,6 +25,10 @@
package org.nuiton.topia.generator;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
@@ -44,6 +48,7 @@
import org.nuiton.eugene.models.object.ObjectModelParameter;
import org.nuiton.topia.persistence.TopiaDAOImpl;
+import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -1068,13 +1073,14 @@
*/
public static boolean isEntity(ObjectModelAttribute attribute,
ObjectModel model) {
- if (isPrimitiveType(attribute)) {
- return false;
+ boolean result = false;
+ if (!isPrimitiveType(attribute)) {
+ String attributeType = attribute.getType();
+ ObjectModelClassifier typeclassifier =
+ model.getClassifier(attributeType);
+ result = typeclassifier != null && isEntity(typeclassifier);
}
- String attributeType = attribute.getType();
- ObjectModelClassifier typeclassifier =
- model.getClassifier(attributeType);
- return typeclassifier != null && isEntity(typeclassifier);
+ return result;
}
/**
@@ -1706,5 +1712,62 @@
return generate;
}
+ public static Collection<ObjectModelAttribute> getEntityAttributes(ObjectModelClassifier clazz,
+ ObjectModel model,
+ Predicate<ObjectModelAttribute>... extraPredicate) {
+
+ Predicate<ObjectModelAttribute> predicate =
+ new AttributeIsEntity(model);
+ if (extraPredicate != null && extraPredicate.length > 0) {
+ predicate = Predicates.and(Lists.asList(predicate, extraPredicate));
+ }
+ Collection<ObjectModelAttribute> result = Collections2.filter(
+ clazz.getAttributes(), predicate);
+ return result;
+ }
+
+ public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_COMPOSITE = new Predicate<ObjectModelAttribute>() {
+ @Override
+ public boolean apply( ObjectModelAttribute input) {
+ return input.isComposite();
+ }
+ };
+
+ public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_AGGREGATE = new Predicate<ObjectModelAttribute>() {
+ @Override
+ public boolean apply( ObjectModelAttribute input) {
+ return input.isAggregate();
+ }
+ };
+
+ public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_REFERENCE_CLASSIFIER= new Predicate<ObjectModelAttribute>() {
+ @Override
+ public boolean apply( ObjectModelAttribute input) {
+ return input.referenceClassifier();
+ }
+ };
+
+ public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_HAS_ASSOCIATION_CLASS= new Predicate<ObjectModelAttribute>() {
+ @Override
+ public boolean apply( ObjectModelAttribute input) {
+ return input.hasAssociationClass();
+ }
+ };
+
+ public static class AttributeIsEntity implements Predicate<ObjectModelAttribute> {
+
+ private final ObjectModel model;
+
+ public AttributeIsEntity(ObjectModel model) {
+ this.model = model;
+ }
+
+ @Override
+ public boolean apply(ObjectModelAttribute input) {
+ boolean result = isEntity(input, model);
+ return result;
+ }
+ }
+
} // TopiaGeneratorUtil
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java 2012-05-16 22:41:20 UTC (rev 2487)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDAO.java 2012-05-16 22:44:49 UTC (rev 2488)
@@ -36,6 +36,7 @@
*/
package org.nuiton.topia.persistence;
+import com.google.common.collect.Multimap;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.event.TopiaEntityListener;
@@ -466,5 +467,33 @@
*/
E findByNaturalIds(Object... k) throws TopiaException;
+ /**
+ * Obtain from a given entity all objects which will be deleted if
+ * entity is deleted (such objects are called composite).
+ *
+ * <strong>Note:</strong> result is given as a Multimap indexed their type.
+ *
+ * @param entity entity to scan
+ * @return all object that must be deleted if this object is deleted
+ * @throws TopiaException if any pb
+ * @since 3.0
+ */
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> getComposite(E entity) throws TopiaException;
+
+ /**
+ * Obtains from a given entity all objects used by this entity but will not
+ * be removed when deleting given entity (such objects are called
+ * aggregate).
+ *
+ * <strong>Note:</strong> result is given as a Multimap indexed their type.
+ *
+ * @param entity entity to scan
+ * @return all object that are aggregate with the given entity,
+ * aggreate object are not removed automaticaly
+ * @throws TopiaException if any pb
+ * @since 3.0
+ */
+ Multimap<Class<? extends TopiaEntity>, TopiaEntity> getAggregate(E entity) throws TopiaException;
+
} //TopiaDAO
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntity.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntity.java 2012-05-16 22:41:20 UTC (rev 2487)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaEntity.java 2012-05-16 22:44:49 UTC (rev 2488)
@@ -73,8 +73,10 @@
String TOPIA_VERSION = "topiaVersion";
+ @Deprecated
String COMPOSITE = "composite";
-
+
+ @Deprecated
String AGGREGATE = "aggregate";
/**
@@ -133,14 +135,18 @@
/**
* @return all object that must be deleted if this object is deleted
* @throws TopiaException if any pb
+ * @deprecated since 3.0, prefer use the dao method {@link TopiaDAO#getComposite(TopiaEntity)}.
*/
+ @Deprecated
List<TopiaEntity> getComposite() throws TopiaException;
/**
* @return all object that are aggregate with this instance, aggreate object
* are not removed automaticaly
* @throws TopiaException if any pb
+ * @deprecated since 3.0, prefer use the dao method {@link TopiaDAO#getAggregate(TopiaEntity)}.
*/
+ @Deprecated
List<TopiaEntity> getAggregate() throws TopiaException;
/**
1
0
r2487 - trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence
by tchemit@users.nuiton.org 16 May '12
by tchemit@users.nuiton.org 16 May '12
16 May '12
Author: tchemit
Date: 2012-05-17 00:41:20 +0200 (Thu, 17 May 2012)
New Revision: 2487
Url: http://nuiton.org/repositories/revision/topia/2487
Log:
remove unused code
Modified:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java
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-16 22:40:42 UTC (rev 2486)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-05-16 22:41:20 UTC (rev 2487)
@@ -109,14 +109,6 @@
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();
1
0
r2486 - in trunk/topia-persistence-tck/src/main: java/org/nuiton/topia/tck/mapping/test1 java/org/nuiton/topia/tck/mapping/test2 java/org/nuiton/topia/tck/mapping/test3 java/org/nuiton/topia/tck/mapping/test6 xmi
by tchemit@users.nuiton.org 16 May '12
by tchemit@users.nuiton.org 16 May '12
16 May '12
Author: tchemit
Date: 2012-05-17 00:40:42 +0200 (Thu, 17 May 2012)
New Revision: 2486
Url: http://nuiton.org/repositories/revision/topia/2486
Log:
rename roles in mapping tests (otherwise same table can be used by more than one relations
Modified:
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/BiDirectionalOneToManyRelationWithRoleNamedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/SimpleOneToManyRelationWithRoleNamedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/BiDirectionalManyToOneRelationWithRoleNamedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/SimpleManyToOneRelationWithRoleNamedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/BiDirectionalManyToManyRelationWithRoleNamedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/SimpleManyToManyRelationWithRoleNamedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java
trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/BiDirectionalOneToManyRelationWithRoleNamedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/BiDirectionalOneToManyRelationWithRoleNamedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/BiDirectionalOneToManyRelationWithRoleNamedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -41,7 +41,7 @@
A13 a = aDAO.create();
B13 b = bDAO.create();
- a.addRoleB(b);
+ a.addRoleB13(b);
tx.commitTransaction();
@@ -53,16 +53,16 @@
A13 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(1, aBis.sizeRoleB());
- Assert.assertEquals(a.getRoleB().iterator().next(),
- aBis.getRoleB().iterator().next());
+ Assert.assertEquals(1, aBis.sizeRoleB13());
+ Assert.assertEquals(a.getRoleB13().iterator().next(),
+ aBis.getRoleB13().iterator().next());
- Assert.assertEquals(b, aBis.getRoleB().iterator().next());
+ Assert.assertEquals(b, aBis.getRoleB13().iterator().next());
B13 bBis = bDAO.findByTopiaId(b.getTopiaId());
Assert.assertEquals(b, bBis);
- Assert.assertEquals(aBis.getRoleB().iterator().next(), bBis);
- Assert.assertEquals(a, bBis.getRoleA());
+ Assert.assertEquals(aBis.getRoleB13().iterator().next(), bBis);
+ Assert.assertEquals(a, bBis.getRoleA13());
}
@Test
public void delete() throws TopiaException {
@@ -87,7 +87,7 @@
Assert.assertEquals(1, nbB);
B13 b = bDAO.findAll().get(0);
- Assert.assertNull(b.getRoleA());
+ Assert.assertNull(b.getRoleA13());
bDAO.delete(b);
tx.commitTransaction();
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/SimpleOneToManyRelationWithRoleNamedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/SimpleOneToManyRelationWithRoleNamedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test1/SimpleOneToManyRelationWithRoleNamedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -40,7 +40,7 @@
A11 a = aDAO.create();
B11 b = bDAO.create();
- a.addRoleB(b);
+ a.addRoleB11(b);
tx.commitTransaction();
@@ -52,13 +52,13 @@
A11 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(1, aBis.sizeRoleB());
- Assert.assertEquals(a.getRoleB().iterator().next(),
- aBis.getRoleB().iterator().next());
+ Assert.assertEquals(1, aBis.sizeRoleB11());
+ Assert.assertEquals(a.getRoleB11().iterator().next(),
+ aBis.getRoleB11().iterator().next());
B11 bBis = bDAO.findByTopiaId(b.getTopiaId());
Assert.assertEquals(b, bBis);
- Assert.assertEquals(aBis.getRoleB().iterator().next(), bBis);
+ Assert.assertEquals(aBis.getRoleB11().iterator().next(), bBis);
}
@Test
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/BiDirectionalManyToOneRelationWithRoleNamedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/BiDirectionalManyToOneRelationWithRoleNamedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/BiDirectionalManyToOneRelationWithRoleNamedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -41,7 +41,7 @@
A23 a = aDAO.create();
B23 b = bDAO.create();
- b.addRoleA(a);
+ b.addRoleA23(a);
tx.commitTransaction();
@@ -53,12 +53,12 @@
A23 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(b, aBis.getRoleB());
+ Assert.assertEquals(b, aBis.getRoleB23());
B23 bBis = bDAO.findByTopiaId(b.getTopiaId());
Assert.assertEquals(b, bBis);
- Assert.assertEquals(1, bBis.sizeRoleA());
- Assert.assertEquals(a, bBis.getRoleA().iterator().next());
+ Assert.assertEquals(1, bBis.sizeRoleA23());
+ Assert.assertEquals(a, bBis.getRoleA23().iterator().next());
}
@Test
public void delete() throws TopiaException {
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/SimpleManyToOneRelationWithRoleNamedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/SimpleManyToOneRelationWithRoleNamedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test2/SimpleManyToOneRelationWithRoleNamedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -40,7 +40,7 @@
A21 a = aDAO.create();
B21 b = bDAO.create();
- a.setRoleB(b);
+ a.setRoleB21(b);
tx.commitTransaction();
@@ -52,11 +52,11 @@
A21 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(b, aBis.getRoleB());
+ Assert.assertEquals(b, aBis.getRoleB21());
B21 bBis = bDAO.findByTopiaId(b.getTopiaId());
Assert.assertEquals(b, bBis);
- Assert.assertEquals(aBis.getRoleB(), bBis);
+ Assert.assertEquals(aBis.getRoleB21(), bBis);
}
@Test
public void delete() throws TopiaException {
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/BiDirectionalManyToManyRelationWithRoleNamedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/BiDirectionalManyToManyRelationWithRoleNamedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/BiDirectionalManyToManyRelationWithRoleNamedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -40,7 +40,7 @@
A33 a = aDAO.create();
B33 b = bDAO.create();
- b.addRoleA(a);
+ b.addRoleA33(a);
tx.commitTransaction();
@@ -52,14 +52,14 @@
A33 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(1, aBis.sizeRoleB());
- Assert.assertEquals(b, aBis.getRoleB().iterator().next());
- Assert.assertEquals(a.getRoleB(), aBis.getRoleB());
+ Assert.assertEquals(1, aBis.sizeRoleB33());
+ Assert.assertEquals(b, aBis.getRoleB33().iterator().next());
+ Assert.assertEquals(a.getRoleB33(), aBis.getRoleB33());
B33 bBis = bDAO.findByTopiaId(b.getTopiaId());
Assert.assertEquals(b, bBis);
- Assert.assertEquals(1, bBis.sizeRoleA());
- Assert.assertEquals(a, bBis.getRoleA().iterator().next());
+ Assert.assertEquals(1, bBis.sizeRoleA33());
+ Assert.assertEquals(a, bBis.getRoleA33().iterator().next());
}
@Test
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/SimpleManyToManyRelationWithRoleNamedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/SimpleManyToManyRelationWithRoleNamedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test3/SimpleManyToManyRelationWithRoleNamedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -40,7 +40,7 @@
A31 a = aDAO.create();
B31 b = bDAO.create();
- a.addRoleB(b);
+ a.addRoleB31(b);
tx.commitTransaction();
@@ -52,12 +52,12 @@
A31 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(1, aBis.sizeRoleB());
- Assert.assertEquals(b, aBis.getRoleB().iterator().next());
+ Assert.assertEquals(1, aBis.sizeRoleB31());
+ Assert.assertEquals(b, aBis.getRoleB31().iterator().next());
B31 bBis = bDAO.findByTopiaId(b.getTopiaId());
Assert.assertEquals(b, bBis);
- Assert.assertEquals(aBis.getRoleB().iterator().next(), bBis);
+ Assert.assertEquals(aBis.getRoleB31().iterator().next(), bBis);
}
@Test
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java 2012-05-15 16:27:19 UTC (rev 2485)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java 2012-05-16 22:40:42 UTC (rev 2486)
@@ -45,8 +45,8 @@
B61 b2 = bDAO.create();
B61 b3 = bDAO.create();
- a.addRoleB(b);
- a.addRoleB(b2);
+ a.addRoleB61(b);
+ a.addRoleB61(b2);
tx.commitTransaction();
@@ -58,8 +58,8 @@
A61 aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(2, aBis.sizeRoleB());
- List<B61> bs = aBis.getRoleB();
+ Assert.assertEquals(2, aBis.sizeRoleB61());
+ List<B61> bs = aBis.getRoleB61();
Assert.assertEquals(b, bs.get(0));
Assert.assertEquals(b2, bs.get(1));
@@ -69,13 +69,13 @@
bsBis = Lists.newArrayList();
bsBis.add(b2);
bsBis.add(b);
- a.setRoleB(bsBis);
+ a.setRoleB61(bsBis);
tx.commitTransaction();
aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(2, aBis.sizeRoleB());
- bs = aBis.getRoleB();
+ Assert.assertEquals(2, aBis.sizeRoleB61());
+ bs = aBis.getRoleB61();
Assert.assertEquals(b2, bs.get(0));
Assert.assertEquals(b, bs.get(1));
@@ -85,13 +85,13 @@
bsBis.add(b3);
bsBis.add(b2);
bsBis.add(b);
- a.setRoleB(bsBis);
+ a.setRoleB61(bsBis);
tx.commitTransaction();
aBis = aDAO.findByTopiaId(a.getTopiaId());
Assert.assertEquals(a, aBis);
- Assert.assertEquals(3, aBis.sizeRoleB());
- bs = aBis.getRoleB();
+ Assert.assertEquals(3, aBis.sizeRoleB61());
+ bs = aBis.getRoleB61();
Assert.assertEquals(b3, bs.get(0));
Assert.assertEquals(b2, bs.get(1));
Assert.assertEquals(b, bs.get(2));
Modified: trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo
===================================================================
(Binary files differ)
1
0
r2485 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events
by athimel@users.nuiton.org 15 May '12
by athimel@users.nuiton.org 15 May '12
15 May '12
Author: athimel
Date: 2012-05-15 18:27:19 +0200 (Tue, 15 May 2012)
New Revision: 2485
Url: http://nuiton.org/repositories/revision/topia/2485
Log:
There is no event propagation on hierarchy
Modified:
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.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-15 14:47:30 UTC (rev 2484)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2012-05-15 16:27:19 UTC (rev 2485)
@@ -936,7 +936,7 @@
Class<? extends TopiaEntity> entityClass,
TopiaEntityListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
entityListeners.add(entityClass, listener);
}
@@ -949,42 +949,42 @@
Class<? extends TopiaEntity> entityClass,
TopiaEntityVetoable vetoable) {
if (vetoable == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
entityVetoables.add(entityClass, vetoable);
}
public void addTopiaTransactionListener(TopiaTransactionListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
transactionListeners.add(listener);
}
public void addTopiaTransactionVetoable(TopiaTransactionVetoable vetoable) {
if (vetoable== null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
transactionVetoables.add(vetoable);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
propertyChangeListeners.add(listener);
}
public void addTopiaContextListener(TopiaContextListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
topiaContextListeners.add(listener);
}
public void addTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
if (vetoable == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
entitiesVetoables.add(vetoable);
}
@@ -999,7 +999,7 @@
Class<? extends TopiaEntity> entityClass,
TopiaEntityListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
entityListeners.remove(entityClass, listener);
}
@@ -1012,42 +1012,42 @@
Class<? extends TopiaEntity> entityClass,
TopiaEntityVetoable vetoable) {
if (vetoable == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
entityVetoables.remove(entityClass, vetoable);
}
public void removeTopiaTransactionListener(TopiaTransactionListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
transactionListeners.remove(listener);
}
public void removeTopiaTransactionVetoable(TopiaTransactionVetoable vetoable) {
if (vetoable == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
transactionVetoables.remove(vetoable);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
propertyChangeListeners.remove(listener);
}
public void removeTopiaContextListener(TopiaContextListener listener) {
if (listener == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
topiaContextListeners.remove(listener);
}
public void removeTopiaEntitiesVetoable(TopiaEntitiesVetoable vetoable) {
if (vetoable == null) {
- throw new NullPointerException("listener can not be null.");
+ throw new NullPointerException("Listener can not be null.");
}
entitiesVetoables.remove(vetoable);
}
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java 2012-05-15 14:47:30 UTC (rev 2484)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java 2012-05-15 16:27:19 UTC (rev 2485)
@@ -196,23 +196,20 @@
}
/**
- * Test the vetoable events firing on a any entity
+ * Test the vetoable events isolation between two brother contexts
*
* @throws org.nuiton.topia.TopiaException if any exception while manipulating db
*/
@Test
- public void testVetoableHierarchy() throws TopiaException {
- log.debug("START TEST : testVetoableHierarchy");
+ public void testVetoableIsolation() throws TopiaException {
+ log.debug("START TEST : testVetoableIsolation");
- VetoableCounter counterRoot = new VetoableCounter();
VetoableCounter counterChild1 = new VetoableCounter();
VetoableCounter counterChild2 = new VetoableCounter();
- TopiaContext rootContext = db.getRootCtxt();
TopiaContext childContext1 = db.beginTransaction();
TopiaContext childContext2 = db.beginTransaction();
- rootContext.addTopiaEntityVetoable(Personne.class, counterRoot);
childContext1.addTopiaEntityVetoable(Personne.class, counterChild1);
childContext2.addTopiaEntityVetoable(Personne.class, counterChild2);
@@ -223,11 +220,6 @@
Personne personne1 = dao1.create(Personne.PROPERTY_NAME, "Bob Marley");
childContext1.commitTransaction();
-// Assert.assertEquals(1, counterRoot.createCount); // FIXME AThimel 15/05/2012 Am I expecting the propagation in thr wrong direction ?
- Assert.assertEquals(0, counterRoot.loadCount);
- Assert.assertEquals(0, counterRoot.updateCount);
- Assert.assertEquals(0, counterRoot.deleteCount);
-
Assert.assertEquals(1, counterChild1.createCount);
Assert.assertEquals(0, counterChild1.loadCount);
Assert.assertEquals(0, counterChild1.updateCount);
@@ -246,11 +238,6 @@
Personne personne2 = dao2.create(Personne.PROPERTY_NAME, "Bob Moran");
childContext2.commitTransaction();
-// Assert.assertEquals(2, counterRoot.createCount); // FIXME AThimel 15/05/2012 Am I expecting the propagation in thr wrong direction ?
- Assert.assertEquals(0, counterRoot.loadCount);
- Assert.assertEquals(0, counterRoot.updateCount);
- Assert.assertEquals(0, counterRoot.deleteCount);
-
Assert.assertEquals(1, counterChild1.createCount);
Assert.assertEquals(0, counterChild1.loadCount);
Assert.assertEquals(0, counterChild1.updateCount);
@@ -261,6 +248,19 @@
Assert.assertEquals(0, counterChild2.updateCount);
Assert.assertEquals(0, counterChild2.deleteCount);
+ dao2.delete(personne2);
+ childContext2.commitTransaction();
+
+ Assert.assertEquals(1, counterChild1.createCount);
+ Assert.assertEquals(0, counterChild1.loadCount);
+ Assert.assertEquals(0, counterChild1.updateCount);
+ Assert.assertEquals(0, counterChild1.deleteCount);
+
+ Assert.assertEquals(1, counterChild2.createCount);
+ Assert.assertEquals(0, counterChild2.loadCount);
+ Assert.assertEquals(0, counterChild2.updateCount);
+ Assert.assertEquals(1, counterChild2.deleteCount);
+
}
}
\ No newline at end of file
1
0
r2484 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/framework topia-persistence/src/main/java/org/nuiton/topia/persistence/util topia-persistence/src/main/resources/i18n topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence
by athimel@users.nuiton.org 15 May '12
by athimel@users.nuiton.org 15 May '12
15 May '12
Author: athimel
Date: 2012-05-15 16:47:30 +0200 (Tue, 15 May 2012)
New Revision: 2484
Url: http://nuiton.org/repositories/revision/topia/2484
Log:
Implement 'replicate' operation (Hibernate only)
Remove i18n exception messages
Modified:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.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/TopiaSpecificUtil.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaEntityHelper.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-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-05-15 14:47:30 UTC (rev 2484)
@@ -35,6 +35,7 @@
import org.nuiton.topia.TopiaContextFactory;
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.TopiaNotFoundException;
+import org.nuiton.topia.TopiaRuntimeException;
import org.nuiton.topia.event.TopiaContextListener;
import org.nuiton.topia.event.TopiaEntitiesVetoable;
import org.nuiton.topia.event.TopiaEntityListener;
@@ -75,7 +76,6 @@
import java.util.WeakHashMap;
import java.util.zip.GZIPInputStream;
-import static org.nuiton.i18n.I18n._;
//import org.hibernate.EntityMode;
//import org.hibernate.ReplicationMode;
@@ -333,13 +333,13 @@
}
@Override
- public TopiaSpecificUtil getSpecificUtil() throws TopiaException {
+ public TopiaSpecificUtil getSpecificUtil() {
TopiaSpecificUtil result = specificUtil;
if (getParentContext() != null) {
result = getParentContext().getSpecificUtil();
}
if (result == null) {
- throw new TopiaException("No TopiaSpecificUtil found.");
+ throw new TopiaRuntimeException("No TopiaSpecificUtil found.");
}
return result;
}
@@ -455,76 +455,6 @@
// } else {
// hibernateConfiguration = new Configuration();
//
-// // Ajout du listeners pour les events
-// TopiaFiresSupport.TopiaHibernateEvent listener =
-// new TopiaFiresSupport.TopiaHibernateEvent(this);
-//
-// PreInsertEventListener[] preInsertEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPreInsertEventListeners();
-// preInsertEventListeners = ArrayUtil.concatElems(
-// preInsertEventListeners, listener);
-//
-// PreLoadEventListener[] preLoadEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPreLoadEventListeners();
-// preLoadEventListeners = ArrayUtil.concatElems(
-// preLoadEventListeners, listener);
-//
-// PreUpdateEventListener[] preUpdateEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPreUpdateEventListeners();
-// preUpdateEventListeners = ArrayUtil.concatElems(
-// preUpdateEventListeners, listener);
-//
-// PreDeleteEventListener[] preDeleteEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPreDeleteEventListeners();
-// preDeleteEventListeners = ArrayUtil.concatElems(
-// preDeleteEventListeners, listener);
-//
-// PostInsertEventListener[] postInsertEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPostInsertEventListeners();
-// postInsertEventListeners = ArrayUtil.concatElems(
-// postInsertEventListeners, listener);
-//
-// PostLoadEventListener[] postLoadEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPostLoadEventListeners();
-// postLoadEventListeners = ArrayUtil.concatElems(
-// postLoadEventListeners, listener);
-//
-// PostUpdateEventListener[] postUpdateEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPostUpdateEventListeners();
-// postUpdateEventListeners = ArrayUtil.concatElems(
-// postUpdateEventListeners, listener);
-//
-// PostDeleteEventListener[] postDeleteEventListeners =
-// hibernateConfiguration.getEventListeners().
-// getPostDeleteEventListeners();
-// postDeleteEventListeners = ArrayUtil.concatElems(
-// postDeleteEventListeners, listener);
-//
-// hibernateConfiguration.getEventListeners().
-// setPreInsertEventListeners(preInsertEventListeners);
-// hibernateConfiguration.getEventListeners().
-// setPreLoadEventListeners(preLoadEventListeners);
-// hibernateConfiguration.getEventListeners().
-// setPreUpdateEventListeners(preUpdateEventListeners);
-// hibernateConfiguration.getEventListeners().
-// setPreDeleteEventListeners(preDeleteEventListeners);
-//
-// hibernateConfiguration.getEventListeners().
-// setPostInsertEventListeners(postInsertEventListeners);
-// hibernateConfiguration.getEventListeners().
-// setPostLoadEventListeners(postLoadEventListeners);
-// hibernateConfiguration.getEventListeners().
-// setPostUpdateEventListeners(postUpdateEventListeners);
-// hibernateConfiguration.getEventListeners().
-// setPostDeleteEventListeners(postDeleteEventListeners);
-//
// // ajout des repertoires contenant les mappings hibernate
// String[] dirs = getConfig().getProperty(
// TopiaContextFactory.CONFIG_PERSISTENCE_DIRECTORIES, "").split(",");
@@ -552,13 +482,14 @@
public <E extends TopiaEntity> TopiaDAO<E> getDAO(Class<E> entityClass)
throws TopiaException {
if (entityClass == null) {
- throw new IllegalArgumentException(
- _("topia.persistence.error.null.param",
- "entityClass", "getDAO"));
+ String message = String.format(
+ "The method '%s' requires a non null parameter '%s'.",
+ "getDAO", "entityClass");
+ throw new IllegalArgumentException(message);
}
if (equals(getRootContext())) {
throw new TopiaException(
- _("topia.persistence.error.rootContext.access"));
+ "You are on root context, you MUST open a transaction to perform any database access.");
}
Set<EntityType<?>> entities = getEntityManagerFactory().getMetamodel().getEntities();
boolean found;
@@ -575,8 +506,8 @@
// if (!found) {
// log.info(_("topia.persistence.supported.classes.for.context",
// getEntityManagerFactory().getMetamodel().getEntities()));
-// throw new TopiaException(
-// _("topia.persistence.error.unsupported.class",
+// throw new TopiaException(String.format(
+// "Entity type '%s' not managed by this context, you probably forgot to declare it.",
// entityClass.getName()));
// }
@@ -616,7 +547,7 @@
@Override
public TopiaContext beginTransaction() throws TopiaException {
- checkClosed(_("topia.persistence.error.context.is.closed"));
+ checkClosed("beginTransaction");
TopiaContextImpl result = new TopiaContextImpl(this);
EntityManagerFactory factory = getEntityManagerFactory();
@@ -651,9 +582,8 @@
}
throw new TopiaException(
- _("topia.persistence.error.open.transaction.failed",
- eee.getMessage()),
- eee);
+ "An error occured while getting a new transaction : "
+ + eee.getMessage(), eee);
}
// 20081217 : add child AFTER EntityManager opening
@@ -666,12 +596,12 @@
@Override
public void commitTransaction() throws TopiaException {
- if (equals(getRootContext())) {
- throw new TopiaException(_("topia.persistence.error.unsupported.operation.on.root.context",
- "commit"));
+ boolean isRootContext = equals(getRootContext());
+ if (isRootContext) {
+ String message = String.format("Operation '%s' is not permitted on root context", "commitTransaction");
+ throw new TopiaException(message);
}
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "commit"));
+ checkClosed("commitTransaction");
try {
// for (TopiaDAO<? extends TopiaEntity> dao : daoCache.values()) {
@@ -697,19 +627,20 @@
// hibernate = getEntityManagerFactory().openSession();
// hibernate.setFlushMode(FlushMode.NEVER);
} catch (Exception eee) {
- throw new TopiaException(_("topia.persistence.error.on.commit",
- eee.getMessage()), eee);
+
+ throw new TopiaException(
+ "An error occured during commit operation : " +
+ eee.getMessage(), eee);
}
}
@Override
public void rollbackTransaction() throws TopiaException {
if (equals(getRootContext())) {
- throw new TopiaException(_("topia.persistence.error.unsupported.operation.on.root.context",
- "rollback"));
+ String message = String.format("Operation '%s' is not permitted on root context", "rollbackTransaction");
+ throw new TopiaException(message);
}
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "rollback"));
+ checkClosed("rollbackTransaction");
try {
// for (TopiaDAO<? extends TopiaEntity> dao : daoCache.values()) {
// // TODO-fdesbois-20100507 : need to be removed for 2.5 version
@@ -735,15 +666,15 @@
} catch (PersistenceException eee) {
throw new TopiaException(
- _("topia.persistence.error.on.rollback",
- eee.getMessage()), eee);
+ "An error occured during rollback operation : " +
+ eee.getMessage(), eee);
}
}
@Override
public void closeContext() throws TopiaException {
// Throw exception if context is already closed
- checkClosed(_("topia.persistence.error.context.already.closed"));
+ checkClosed("closeContext");
// FD-20100421 : Ano #546 : no need to copy childContexts, the
// {@link #getChildContext()} provides a thread-safe copy to iterate
@@ -793,8 +724,9 @@
return closed;
}
- protected void checkClosed(String message) throws TopiaException {
+ protected void checkClosed(String method) throws TopiaException {
if (closed) {
+ String message = String.format("This context is closed, unable to perform operation '%s'", method);
throw new TopiaException(message);
}
}
@@ -919,8 +851,7 @@
@SuppressWarnings({"unchecked"})
@Override
public TopiaEntity findByTopiaId(String id) throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "findById"));
+ checkClosed("findByTopiaId");
Class<TopiaEntity> entityClass = TopiaId.getClassName(id);
TopiaDAO<TopiaEntity> dao = getDAO(entityClass);
@@ -941,8 +872,7 @@
@Override
public List<?> find(String hql, Object... args) throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "find"));
+ checkClosed("find");
try {
Query query = getEntityManager().createQuery(hql);
@@ -965,16 +895,15 @@
result = firesSupport.fireEntitiesLoad(this, result);
return result;
} catch (PersistenceException eee) {
- throw new TopiaException(_("topia.persistence.error.on.query",
- hql, eee.getMessage()), eee);
+ String message = String.format("An error occured (%s) during a query operation : %s", eee.getMessage(), hql);
+ throw new TopiaException(message, eee);
}
}
@Override
public List<?> find(String hql, int startIndex, int endIndex, Object... args)
throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "find"));
+ checkClosed("find");
try {
Query query = getEntityManager().createQuery(hql);
@@ -997,8 +926,8 @@
result = firesSupport.fireEntitiesLoad(this, result);
return result;
} catch (PersistenceException eee) {
- throw new TopiaException(_("topia.persistence.error.on.query",
- hql, eee.getMessage()), eee);
+ String message = String.format("An error occured (%s) during a query operation : %s", eee.getMessage(), hql);
+ throw new TopiaException(message, eee);
}
}
@@ -1012,8 +941,7 @@
*/
@Override
public int execute(String hql, Object... args) throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "find"));
+ checkClosed("execute");
try {
Query query = getEntityManager().createQuery(hql);
@@ -1023,15 +951,14 @@
int result = query.executeUpdate();
return result;
} catch (PersistenceException eee) {
- throw new TopiaException(_("topia.persistence.error.on.query",
- hql, eee.getMessage()), eee);
+ String message = String.format("An error occured (%s) during a query operation : %s", eee.getMessage(), hql);
+ throw new TopiaException(message, eee);
}
}
@Override
public void add(TopiaEntity e) throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "add"));
+ checkClosed("add");
String id = e.getTopiaId();
Class<TopiaEntity> entityClass = TopiaId.getClassName(id);
@@ -1073,8 +1000,7 @@
@Override
public boolean isSchemaExist(Class<?> clazz)
throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicateEntity"));
+ checkClosed("isSchemaExist");
boolean result = getSpecificUtil().isSchemaExist(clazz);
@@ -1092,9 +1018,8 @@
getSpecificUtil().createSchema(showSchema);
getFiresSupport().firePostCreateSchema(this);
} catch (PersistenceException eee) {
- throw new TopiaException(
- _("topia.persistence.error.create.schema",
- eee.getMessage()), eee);
+ throw new TopiaException("Schema could not be created for the following reason : "
+ + eee.getMessage(), eee);
}
}
@@ -1103,9 +1028,8 @@
try {
getSpecificUtil().showCreateSchema();
} catch (PersistenceException eee) {
- throw new TopiaException(
- _("topia.persistence.error.create.schema",
- eee.getMessage()), eee);
+ throw new TopiaException("Schema creation could not be displayed for the following reason : "
+ + eee.getMessage(), eee);
}
}
@@ -1120,9 +1044,8 @@
getSpecificUtil().updateSchema(showSchema);
getFiresSupport().firePostUpdateSchema(this);
} catch (PersistenceException eee) {
- throw new TopiaException(
- _("topia.persistence.error.update.schema",
- eee.getMessage()), eee);
+ throw new TopiaException("Schema could not be updated for the following reason : "
+ + eee.getMessage(), eee);
}
}
@@ -1147,16 +1070,19 @@
TopiaService service = (TopiaService) newInstance;
if (key.equals("topia.service." + service.getServiceName())) {
result.put(service.getServiceName(), service);
- log.info(_("topia.persistence.service.loaded",
+
+ log.info(String.format(
+ "Service '%s' loaded (implementation %s)",
key, classService));
} else {
- log.warn(_("topia.persistence.warn.service.not.loaded",
+ log.warn(String.format(
+ "The service with key '%s' has a different name '%s' ! (service not activated)",
key, service.getServiceName()));
}
} catch (Throwable eee) {
- String message =
- _("topia.persistence.error.service.unknown",
- key, classService);
+ String message = String.format(
+ "The service %s of type %s was not found.",
+ key, classService);
if (log.isDebugEnabled()) {
log.debug(message, eee);
} else if (log.isErrorEnabled()) {
@@ -1171,7 +1097,8 @@
protected void preInitServices(Map<String, TopiaService> services) {
for (TopiaService service : services.values()) {
if (!service.preInit(this)) {
- log.warn(_("topia.persistence.warn.service.not.preInit",
+ log.warn(String.format(
+ "The service named '%s' could not be pre-initialized (service not activated)",
service.getServiceName()));
}
}
@@ -1180,7 +1107,8 @@
protected void postInitServices(Map<String, TopiaService> services) {
for (TopiaService service : services.values()) {
if (!service.postInit(this)) {
- log.warn(_("topia.persistence.warn.service.not.postInit",
+ log.warn(String.format(
+ "The service named '%s' could not be post-initialized (service not activated)",
service.getServiceName()));
}
}
@@ -1236,15 +1164,12 @@
String name = getServiceName(interfaceService);
result = (E) getService(name);
} catch (Exception eee) {
- throw new TopiaNotFoundException(
- _("topia.persistence.error.service.not.retreaved",
- interfaceService, getProperExceptionMessage(eee)),
- eee);
+ String message = String.format("Could not retrieve service '%s' for following reason : %s", interfaceService, getProperExceptionMessage(eee));
+ throw new TopiaNotFoundException(message, eee);
}
if (result == null) {
throw new TopiaNotFoundException(
- _("topia.persistence.error.service.not.found",
- interfaceService));
+ String.format("The service '%s' not found.", interfaceService));
}
return result;
}
@@ -1257,7 +1182,8 @@
String name = getServiceName(interfaceService);
result = serviceEnabled(name);
} catch (Exception eee) {
- String message = _("topia.persistence.warn.service.not.found",
+ String message = String.format(
+ "The service named '%s' could not be found for following reason : %s",
interfaceService, getProperExceptionMessage(eee));
if (log.isDebugEnabled()) {
log.debug(message, eee);
@@ -1273,7 +1199,7 @@
@Override
public void importXML(Reader xml) throws TopiaException {
-// checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
+// checkClosed(String.format("This context is closed, it is not possible to perform the operation '%s'",
// "importXML"));
//
// Document doc;
@@ -1286,8 +1212,8 @@
// }
// } catch (DocumentException de) {
// throw new TopiaException(
-// _("topia.persistence.error.on.loding.xml.doc",
-// de.getMessage()), de);
+// "Could not read XML document for following reason : %s" +
+// de.getMessage(), de);
// }
//
// if (doc != null) {
@@ -1299,22 +1225,22 @@
// try {
// sessionDom4j.replicate(entity, ReplicationMode.EXCEPTION);
// } catch (PersistenceException he) {
-// log.warn(_("topia.persistence.error.replicate.entity",
+// log.warn(String.format(
+// "Could not replicate entity '%s' pour following reason : %s",
// entity, he.getMessage()), he);
// }
// }
// // must commit data, otherwise : no effects...
// sessionDom4j.flush();
// } else {
-// throw new TopiaException(
-// _("topia.persistence.error.empty.doc"));
+// throw new TopiaException("Empty document");
// }
}
@Override
public void exportXML(Writer xml, Object... entityAndcondition)
throws TopiaException {
-// checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
+// checkClosed(String.format("This context is closed, it is not possible to perform the operation '%s'",
// "exportXML"));
//
// String[] queries = buildQueries(entityAndcondition);
@@ -1372,28 +1298,24 @@
// result.close();
//
// } catch (PersistenceException eee) {
-// throw new TopiaException(_("topia.persistence.error.on.export",
-// eee.getMessage()), eee);
+// throw new TopiaException("An error occurred during export operation : %s" +
+// eee.getMessage(), eee);
// } catch (IOException eee) {
-// throw new TopiaException(_("topia.persistence.error.on.export",
-// eee.getMessage()), eee);
+// throw new TopiaException("An error occurred during export operation : %s" +
+// eee.getMessage(), eee);
// }
}
@Override
- public void replicate(TopiaContext dstCtxt, Object... entityAndCondition)
+ public void replicate(TopiaContext destinationContext, Object... entityAndCondition)
throws TopiaException, IllegalArgumentException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicate"));
+ checkClosed("replicate");
- TopiaContextImpl dstContextImpl = (TopiaContextImpl) dstCtxt;
- dstContextImpl.checkClosed(
- _("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicate"));
+ TopiaContextImpl destinationContextImpl = (TopiaContextImpl) destinationContext;
+ destinationContextImpl.checkClosed("replicate");
- if (getRootContext().equals(dstContextImpl.getRootContext())) {
- throw new IllegalArgumentException(
- _("topia.persistence.error.replicate.on.same.context"));
+ if (getRootContext().equals(destinationContextImpl.getRootContext())) {
+ throw new IllegalArgumentException("Can not perform a replication operation on same database.");
}
String[] queries = buildQueries(entityAndCondition);
@@ -1404,51 +1326,47 @@
}
// acquire data to replicate
List<?> entities = find(query);
- replicate0(dstContextImpl, entities.toArray());
+ replicateOnDestinationContext(destinationContextImpl, entities.toArray());
if (log.isDebugEnabled()) {
log.debug("replication of entities " + query +
" was sucessfully done.");
}
}
} catch (PersistenceException eee) {
- throw new TopiaException(_("topia.persistence.error.on.replicate",
- eee.getMessage()), eee);
+ throw new TopiaException(
+ "An error occurs while a replication operation : " + eee.getMessage(), eee);
}
}
@Override
- public <T extends TopiaEntity> void replicateEntity(TopiaContext dstCtxt,
+ public <T extends TopiaEntity> void replicateEntity(TopiaContext destinationContext,
T entity)
throws TopiaException, IllegalArgumentException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicateEntity"));
+ checkClosed("replicateEntity");
- TopiaContextImpl dstContextImpl = (TopiaContextImpl) dstCtxt;
- dstContextImpl.checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicateEntity"));
- if (getRootContext().equals(dstContextImpl.getRootContext())) {
- throw new IllegalArgumentException(_(
- "topia.persistence.error.replicate.on.same.context"));
+ TopiaContextImpl destinationContextImpl = (TopiaContextImpl) destinationContext;
+ destinationContextImpl.checkClosed("replicateEntity");
+
+ if (getRootContext().equals(destinationContextImpl.getRootContext())) {
+ throw new IllegalArgumentException("Can not perform a replication operation on same database.");
}
- replicate0(dstContextImpl, entity);
+ replicateOnDestinationContext(destinationContextImpl, entity);
}
@Override
- public <T extends TopiaEntity> void replicateEntities(TopiaContext dstCtxt,
+ public <T extends TopiaEntity> void replicateEntities(TopiaContext destinationContext,
List<T> entities)
throws TopiaException, IllegalArgumentException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicateEntities"));
+ checkClosed("replicateEntities");
- TopiaContextImpl dstContextImpl = (TopiaContextImpl) dstCtxt;
- dstContextImpl.checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "replicateEntities"));
+ TopiaContextImpl destinationContextImpl = (TopiaContextImpl) destinationContext;
+ destinationContextImpl.checkClosed("replicateEntities");
- if (getRootContext().equals(dstContextImpl.getRootContext())) {
- throw new IllegalArgumentException(_("topia.persistence.error.replicate.on.same.context"));
+ if (getRootContext().equals(destinationContextImpl.getRootContext())) {
+ throw new IllegalArgumentException("Can not perform a replication operation on same database.");
}
- replicate0(dstContextImpl, entities.toArray());
+ replicateOnDestinationContext(destinationContextImpl, entities.toArray());
}
/**
@@ -1462,8 +1380,7 @@
*/
@Override
public void backup(File file, boolean compress) throws TopiaException {
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "backup"));
+ checkClosed("backup");
try {
String options = "";
if (compress) {
@@ -1475,9 +1392,8 @@
query.getResultList();
} catch (Exception eee) {
- throw new TopiaException(_(
- "topia.persistence.error.on.backup",
- eee.getMessage()), eee);
+ throw new TopiaException(
+ "Unable to backup to file : " + eee.getMessage(), eee);
}
}
@@ -1492,8 +1408,7 @@
public void restore(File file) throws TopiaException {
// send event
getFiresSupport().firePreRestoreSchema(this);
- checkClosed(_("topia.persistence.error.unsupported.operation.on.closed.context",
- "restore"));
+ checkClosed("restore");
String sql = null;
String options = "";
@@ -1525,9 +1440,9 @@
// send event AFTER restore
getFiresSupport().firePostRestoreSchema(this);
} catch (Exception eee) {
- throw new TopiaException(_(
- "topia.persistence.error.on.restore",
- sql, eee.getMessage()), eee);
+ throw new TopiaException(
+ "Unable to restore from file : " + eee.getMessage() + ". " +
+ "SQL is " + sql, eee);
}
}
@@ -1552,7 +1467,7 @@
root.finalize();
} catch (Throwable eee) {
throw new TopiaException(
- _("topia.persistence.error.on.clear", eee.getMessage()), eee);
+ "Unable to perform clear operation : " + eee.getMessage(), eee);
}
}
@@ -1626,23 +1541,29 @@
return queries;
}
- protected void replicate0(TopiaContextImpl dstContextImpl,
- Object... entities) throws TopiaException {
+
+ protected void replicateOnDestinationContext(
+ TopiaContextImplementor destinationContext,
+ Object... entities) throws TopiaException {
try {
-// for (Object entity : entities) {
-// // dettach entity to source session, to make possible copy of
-// // collection without a hibernate exception (list opened in
-// // two session...)
-// getEntityManager().detach(entity);
-// dstContextImpl.getEntityManager().replicate(entity,
-// ReplicationMode.EXCEPTION);
-// }
+ for (Object entity : entities) {
+ // detach entity from the source session, to make possible copy
+ // of collection without a hibernate exception (list opened in
+ // two sessions...)
+ getEntityManager().detach(entity);
+ destinationContext.receiveReplicatedEntity(entity);
+ }
} catch (PersistenceException eee) {
- throw new TopiaException(_("topia.persistence.error.on.replicate",
- eee.getMessage()), eee);
+ throw new TopiaException(
+ "An error occurs while a replication operation : " + eee.getMessage(), eee);
}
}
+ @Override
+ public void receiveReplicatedEntity(Object entity) {
+ getSpecificUtil().receiveReplicatedEntity(this, entity);
+ }
+
} //TopiaContextImpl
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-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java 2012-05-15 14:47:30 UTC (rev 2484)
@@ -134,7 +134,7 @@
* @return the specificUtil instance registered
* @see TopiaSpecificUtil
*/
- TopiaSpecificUtil getSpecificUtil() throws TopiaException;
+ TopiaSpecificUtil getSpecificUtil();
/**
* Used to register the TopiaSpecificUtil. The registered instance will be
@@ -145,5 +145,11 @@
*/
void registerSpecificUtil(TopiaSpecificUtil specificUtil);
+ /**
+ * Method used to receive an entity to replicate
+ *
+ * @param entity the entity to replicate
+ */
+ void receiveReplicatedEntity(Object entity);
+
} //TopiaContextImplementor
-
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java 2012-05-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaSpecificUtil.java 2012-05-15 14:47:30 UTC (rev 2484)
@@ -2,6 +2,7 @@
import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.persistence.TopiaEntity;
/**
* Provides all non-JPA standard methods (specific to an implementation) needed
@@ -48,4 +49,14 @@
*/
void updateSchema(boolean showSchema);
+ /**
+ * Method used by the given TopiaContext when it receives a replicated
+ * entity
+ *
+ * @param context this receiver context
+ * @param entity the entity to replicate
+ * @see TopiaContext#replicateEntity(TopiaContext, TopiaEntity)
+ */
+ void receiveReplicatedEntity(TopiaContextImplementor context, Object entity);
+
}
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaEntityHelper.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaEntityHelper.java 2012-05-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaEntityHelper.java 2012-05-15 14:47:30 UTC (rev 2484)
@@ -1146,9 +1146,10 @@
String parameterName,
Object value) {
if (value == null) {
- throw new NullPointerException(
- _("topia.persistence.error.null.param",
- methodName, parameterName));
+ String message = String.format(
+ "The method '%s' requires a non null parameter '%s'.",
+ methodName, parameterName);
+ throw new NullPointerException(message);
}
}
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-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/resources/i18n/topia-persistence_en_GB.properties 2012-05-15 14:47:30 UTC (rev 2484)
@@ -1,29 +1 @@
-topia.persistence.error.context.already.closed=Context was alredy closed
-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.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
-topia.persistence.error.on.export=An error occurs while export operation \: %1$s
-topia.persistence.error.on.loding.xml.doc=Could not read xml document for following reason \: %1$s
-topia.persistence.error.on.query=An error occurs while query operation \: %1$s
-topia.persistence.error.on.replicate=An error occurs while a replication operation \: %s
-topia.persistence.error.on.rollback=An error occurs while rollback operation \: %1$s
-topia.persistence.error.open.transaction.failed=An error occurs while asking a new transaction \: %1$s
-topia.persistence.error.replicate.entity=Could not replicate entity '%1$s' pour following reason \: %2$s
-topia.persistence.error.replicate.on.same.context=Can not do a replication operation on same database.
-topia.persistence.error.rootContext.access=You are on root context, you MUST open a transaction to perform any database access.
-topia.persistence.error.service.not.found=The service %1$s was not found.
-topia.persistence.error.service.not.retreaved=Could not retrive service %1$s for following reason \: %2$s
-topia.persistence.error.service.unknown=The service %1$s of type %2$s was not found.
-topia.persistence.error.unsupported.class=The following entity type %1$s is not managed by this context, you probably forgot to declare it.
-topia.persistence.error.unsupported.operation.on.closed.context=This context is closed, it is not possible to release the operation '%1$s'
-topia.persistence.error.unsupported.operation.on.root.context=
-topia.persistence.error.update.schema=Schema could not be updated for following reason \: %1$s
-topia.persistence.service.loaded=Service '%1$s' loaded (implementation %2$s)
topia.persistence.supported.classes.for.context=List of supported persistence classes \: %1$s
-topia.persistence.warn.service.not.found=The service named '%1$s' could not be found for following reason \: \: %2$s
-topia.persistence.warn.service.not.loaded=The service with key '%1$s' has a different name '%2$s' \! (service not activated)
-topia.persistence.warn.service.not.postInit=The service named '%1$s' could not be pre-initialized (service not activated)
-topia.persistence.warn.service.not.preInit=The service named '%1$s' could not be post-initialized (service not activated)
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-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/resources/i18n/topia-persistence_es_ES.properties 2012-05-15 14:47:30 UTC (rev 2484)
@@ -1,29 +1 @@
-topia.persistence.error.context.already.closed=El contexto ya ha sido cerrado
-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.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
-topia.persistence.error.on.export=Se produjo un error durante la exportación \: %1$s
-topia.persistence.error.on.loding.xml.doc=No se puede leer el documento debido a \: %1$s
-topia.persistence.error.on.query=Se produjo un error duratne la busqueda (consulta %1$s) \: %2$s
-topia.persistence.error.on.replicate=Se produjo un error durante la vuelta a atrás (replication) \: %1$s
-topia.persistence.error.on.rollback=Se produjo un error durante la vuelta a atrás (rollback) \: %1$s
-topia.persistence.error.open.transaction.failed=
-topia.persistence.error.replicate.entity=Error de repliación de la entidad %1$s\ndebido a la siguiente razón \: %2$s
-topia.persistence.error.replicate.on.same.context=No se puede duplicar en la misma base
-topia.persistence.error.rootContext.access=Está usted en la raíz, debe abrir una transacción para acceder a los datos.
-topia.persistence.error.service.not.found=El servicio %1$s no está disponible
-topia.persistence.error.service.not.retreaved=El servicio %1$s debido a \: %2$s
-topia.persistence.error.service.unknown=El servicio '%1$s' de clase '%2$s' es desconocido
-topia.persistence.error.unsupported.class=La clase %1$n no está soportada por TopiaContext, puede que se halla olvidado de añadir su mapa
-topia.persistence.error.unsupported.operation.on.closed.context=El contexto está cerrado, no se puede realizar la operación %1$s
-topia.persistence.error.unsupported.operation.on.root.context=
-topia.persistence.error.update.schema=El esquema no se puede actualizar debido a \: %2$s
-topia.persistence.service.loaded=Servicio '%1$s' cargado por '%2$s'
-topia.persistence.supported.classes.for.context=Classes supportées par ce TopiaContext \: %1$s
-topia.persistence.warn.service.not.found=El nombre del servicio '%1$s' no ha sido encontrado debido a \: %2$s
-topia.persistence.warn.service.not.loaded=Le service de clé '%1$s' tiene un nombre de servicio '%2$s' diferente \! (servicio desactivado)
-topia.persistence.warn.service.not.postInit=El servicio '%1$s' no puede ser inicializado (servicio desactivado)
-topia.persistence.warn.service.not.preInit=El servicio '%1$s' no puede ser inicializado (servicio desactivado)
+topia.persistence.supported.classes.for.context=List of supported persistence classes \: %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-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence/src/main/resources/i18n/topia-persistence_fr_FR.properties 2012-05-15 14:47:30 UTC (rev 2484)
@@ -1,29 +1 @@
-topia.persistence.error.context.already.closed=Ce contexte a deja ete ferme
-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.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
-topia.persistence.error.on.export=Une erreur est apparue pendant l'export \: %1$s
-topia.persistence.error.on.loding.xml.doc=Lecture du document impossible pour la raison suivante \: %1$s
-topia.persistence.error.on.query=Une erreur est apparue pendant le recherche (requête %1$s) \: %2$s
-topia.persistence.error.on.replicate=Une erreur lors de la réplication est survenue \: %s
-topia.persistence.error.on.rollback=Une erreur est apparue pendant le rollback \: %1$s
-topia.persistence.error.open.transaction.failed=Une erreur est apparue pendant la demande de transaction \: %1$s
-topia.persistence.error.replicate.entity=Echec de replication de l'entite %1$s\npour la raison suivante \: %2$s
-topia.persistence.error.replicate.on.same.context=Impossible de dupliquer dans la même base
-topia.persistence.error.rootContext.access=Vous êtes sur le root context, vous devez ouvrir une transaction pour pouvoir accéder aux données.
-topia.persistence.error.service.not.found=Le service %1$s n'est pas disponible
-topia.persistence.error.service.not.retreaved=La service %1$s n'a pas pu être récupéré pour la raison suivante \: %2$s
-topia.persistence.error.service.unknown=Le service '%1$s' ayant pour classe '%2$s' n'est pas connu
-topia.persistence.error.unsupported.class=La classe %1$s n'est pas supportée par ce TopiaContext, vous avez sans doute oublié d'ajouter son mapping
-topia.persistence.error.unsupported.operation.on.closed.context=Ce contexte a été fermé, impossible de réaliser l'opération %1$s
-topia.persistence.error.unsupported.operation.on.root.context=
-topia.persistence.error.update.schema=Le schéma n'a pas pu être mis à jour pour la raison suivante \: %2$s
-topia.persistence.service.loaded=Service '%1$s' chargé par '%2$s'
topia.persistence.supported.classes.for.context=Classes supportées par ce TopiaContext \: %1$s
-topia.persistence.warn.service.not.found=Le nom du service '%1$s' n'a pas été trouvé pour la raison suivante \: %2$s
-topia.persistence.warn.service.not.loaded=Le service de clé '%1$s' a un nom de service '%2$s' différent \! (service désactivé)
-topia.persistence.warn.service.not.postInit=Le service '%1$s' n'a pas pu être initialisé (service désactivé)
-topia.persistence.warn.service.not.preInit=Le service '%1$s' n'a pas pu être finalisé (service désactivé)
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-15 10:10:32 UTC (rev 2483)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernateSpecificUtil.java 2012-05-15 14:47:30 UTC (rev 2484)
@@ -2,17 +2,24 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.ReplicationMode;
+import org.hibernate.Session;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.dialect.Dialect;
+import org.hibernate.ejb.EntityManagerImpl;
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.TopiaException;
+import org.nuiton.topia.TopiaRuntimeException;
+import org.nuiton.topia.framework.TopiaContextImplementor;
import org.nuiton.topia.framework.TopiaSpecificUtil;
+import javax.persistence.EntityManager;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
@@ -117,4 +124,17 @@
return result;
}
+
+ @Override
+ public void receiveReplicatedEntity(TopiaContextImplementor context, Object entity) {
+ try {
+ EntityManager entityManager = context.getEntityManager();
+ if (entityManager instanceof EntityManagerImpl) {
+ Session session = ((EntityManagerImpl) entityManager).getSession();
+ session.replicate(entity, ReplicationMode.EXCEPTION);
+ }
+ } catch (TopiaException te) {
+ throw new TopiaRuntimeException("Unable to receive replicated entity", te);
+ }
+ }
}
1
0
15 May '12
Author: athimel
Date: 2012-05-15 12:10:32 +0200 (Tue, 15 May 2012)
New Revision: 2483
Url: http://nuiton.org/repositories/revision/topia/2483
Log:
Hibernate implementation of Event propagation
Added:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateEntityListener.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java
Removed:
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-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckItTestSuite.java
Copied: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateEntityListener.java (from rev 2481, trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java)
===================================================================
--- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateEntityListener.java (rev 0)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateEntityListener.java 2012-05-15 10:10:32 UTC (rev 2483)
@@ -0,0 +1,248 @@
+package org.nuiton.topia.framework;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Session;
+import org.hibernate.ejb.AbstractEntityManagerImpl;
+import org.hibernate.event.spi.AbstractEvent;
+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;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.persistence.TopiaEntityAbstract;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @since 3.0
+ */
+public class TopiaHibernateEntityListener
+ implements PreLoadEventListener, PostLoadEventListener,
+ PreInsertEventListener, PostInsertEventListener,
+ PreUpdateEventListener, PostUpdateEventListener,
+ PreDeleteEventListener, PostDeleteEventListener {
+
+ private static final Log log = LogFactory.getLog(TopiaHibernateEntityListener.class);
+
+ private static final long serialVersionUID = 1L;
+
+// protected TopiaContextImplementor rootContext;
+
+// public TopiaHibernateEntityListener(TopiaContextImplementor rootContext) {
+// this.rootContext = rootContext;
+// }
+
+// /**
+// * Search for the context using the given hibernate session. Method will use
+// * the Session embedded within the TopiaContext's EntityManager.
+// *
+// * @param parentContext the parent context
+// * @param searchedSession the Hibernate Session to look for
+// * @return the TopiaContext which EntityManager uses the given hibernate
+// * Session or <code>null</code> if there is no TopiaContext using it
+// */
+// protected TopiaContextImplementor findContext(
+// TopiaContextImplementor parentContext, Session searchedSession) {
+// TopiaContextImplementor result = null;
+//
+// for (TopiaContextImplementor context : parentContext.getChildContexts()) {
+//
+// try {
+// EntityManager entityManager = context.getEntityManager();
+// if (entityManager instanceof AbstractEntityManagerImpl) {
+// AbstractEntityManagerImpl hibernateEntityManager = (AbstractEntityManagerImpl) entityManager;
+// Session entityManagerSession = hibernateEntityManager.getSession();
+// if (entityManagerSession == searchedSession) {
+// result = context;
+// }
+// }
+//
+// if (result == null) {
+// // TODO: poussin 20090706 on pourrait ameliorer en ne faisant pas un parcours recursif, en utilisant la liste children (sans doute a transformer en stack)
+// result = findContext(context, searchedSession);
+// }
+//
+// if (result != null) {
+// break;
+// }
+// } catch (TopiaException eee) {
+// if (log.isWarnEnabled()) {
+// log.warn("Error durant la recherche d'un context pour"
+// + " lancer un event", eee);
+// }
+// }
+// }
+// return result;
+// }
+
+ protected void attachContext(TopiaEntity entity,
+ TopiaContextImplementor context) {
+ // FIXME AThimel 14/05/2012 http://nuiton.org/issues/2078
+ if (entity instanceof TopiaEntityAbstract) {
+ TopiaEntityAbstract entityAbstract = (TopiaEntityAbstract) entity;
+ if (entityAbstract.getTopiaContext() == null) {
+ try {
+ entityAbstract.setTopiaContext(context);
+ } catch (TopiaException eee) {
+ if (log.isWarnEnabled()) {
+ log.warn("Impossible d'initialiser le TopiaContext"
+ + " sur cette entité : " + entityAbstract,
+ eee);
+ }
+ }
+ }
+ }
+ }
+
+// protected TopiaContextImplementor findContext(AbstractEvent event) {
+// Session eventSession = event.getSession();
+// TopiaContextImplementor result = findContext(rootContext, eventSession);
+// return result;
+// }
+
+ // FIXME AThimel 15/05/2012 I don't like it, but I haven't found a better way
+ protected TopiaContextImplementor findContext(TopiaEntity entity) {
+ TopiaContextImplementor result = null;
+ // FIXME AThimel 14/05/2012 http://nuiton.org/issues/2078
+ if (entity instanceof TopiaEntityAbstract) {
+ TopiaContext enitytContext =
+ ((TopiaEntityAbstract)entity).getTopiaContext();
+ if (enitytContext instanceof TopiaContextImplementor) {
+ result = (TopiaContextImplementor) enitytContext;
+ }
+ }
+ return result;
+ }
+
+ protected TopiaEntity castToTopiaEntityOrNull(Object entity) {
+ TopiaEntity result = null;
+ if (entity != null && entity instanceof TopiaEntity) {
+ result = (TopiaEntity) entity;
+ }
+ return result;
+ }
+
+ @Override
+ public void onPreLoad(PreLoadEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] entityState = event.getState();
+ entityContext.getFiresSupport().fireOnPreLoad(
+ entityContext, entity, entityState);
+ }
+ }
+
+ @Override
+ public void onPostLoad(PostLoadEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ attachContext(entity, entityContext);
+ Object[] entityState = new Object[]{};
+ entityContext.getFiresSupport().fireOnPostLoad(
+ entityContext, entity, entityState);
+ }
+ }
+
+ @Override
+ public boolean onPreInsert(PreInsertEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] entityState = event.getState();
+ entityContext.getFiresSupport().fireOnPreCreate(
+ entityContext, entity, entityState);
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostInsert(PostInsertEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] entityState = event.getState();
+ entityContext.getFiresSupport().fireOnPostCreate(
+ entityContext, entity, entityState);
+ }
+ }
+
+
+ @Override
+ public boolean onPreUpdate(PreUpdateEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] state = event.getOldState();
+ entityContext.getFiresSupport().fireOnPreUpdate(
+ entityContext, entity, state);
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostUpdate(PostUpdateEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] state = event.getState();
+ entityContext.getFiresSupport().fireOnPostUpdate(
+ entityContext, entity, state);
+ }
+ }
+
+ @Override
+ public boolean onPreDelete(PreDeleteEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] state = event.getDeletedState();
+ entityContext.getFiresSupport().fireOnPreDelete(
+ entityContext, entity, state);
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostDelete(PostDeleteEvent event) {
+// TopiaContextImplementor entityContext = findContext(event);
+ TopiaEntity entity = castToTopiaEntityOrNull(event.getEntity());
+ TopiaContextImplementor entityContext = findContext(entity);
+
+ if (entityContext != null && entity != null) {
+ Object[] state = event.getDeletedState();
+ entityContext.getFiresSupport().fireOnPostDelete(
+ entityContext, entity, state);
+ }
+ }
+
+}
Deleted: 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:40:26 UTC (rev 2482)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/framework/TopiaHibernateJPAEntityListener.java 2012-05-15 10:10:32 UTC (rev 2483)
@@ -1,76 +0,0 @@
-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>
- * @since 3.0
- */
-public class TopiaHibernateJPAEntityListener
- implements PreLoadEventListener, PostLoadEventListener,
- PreInsertEventListener, PostInsertEventListener,
- 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
- }
-
- @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 12:40:26 UTC (rev 2482)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-05-15 10:10:32 UTC (rev 2483)
@@ -6,15 +6,19 @@
import com.google.common.collect.Maps;
import org.apache.commons.lang3.tuple.Pair;
import org.hibernate.cfg.Configuration;
+import org.hibernate.ejb.AvailableSettings;
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.hibernate.event.spi.EventType;
+import org.nuiton.topia.framework.TopiaHibernateEntityListener;
import org.nuiton.topia.framework.TopiaPersistenceProvider;
import org.nuiton.topia.framework.TopiaSpecificUtil;
import javax.persistence.EntityManagerFactory;
import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -99,26 +103,8 @@
}
}
- String entityListenerFQN =
- TopiaHibernateJPAEntityListener.class.getName();
+ registerListener(hibernateProperties);
- 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));
@@ -153,6 +139,7 @@
EntityManagerFactory entityManagerFactory =
configured.buildEntityManagerFactory();
+ // And build the hibernate's specific util
Configuration hibernateConfiguration =
configured.getHibernateConfiguration();
TopiaSpecificUtil specificUtil =
@@ -163,6 +150,25 @@
return result;
}
+ private static final ArrayList<EventType<? extends Serializable>> EVENT_TYPES = Lists.newArrayList(
+ EventType.PRE_INSERT, EventType.POST_INSERT,
+ EventType.PRE_LOAD, EventType.POST_LOAD,
+ EventType.PRE_UPDATE, EventType.POST_UPDATE,
+ EventType.PRE_DELETE, EventType.POST_DELETE
+ );
+
+ private void registerListener(Map<String, Object> hibernateProperties) {
+
+ String entityListenerFQN =
+ TopiaHibernateEntityListener.class.getName();
+
+ for (EventType type : EVENT_TYPES) {
+ String key = AvailableSettings.EVENT_LISTENER_PREFIX + "." + type.eventName();
+ hibernateProperties.put(key, entityListenerFQN);
+ }
+
+ }
+
protected void loadHibernateMappingFiles(List<String> entitiesNames,
PersistenceMetadata metadata) {
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:40:26 UTC (rev 2482)
+++ trunk/topia-persistence-hibernate/src/test/java/org/nuiton/topia/tck/TopiaTckMappingHibernateTest.java 2012-05-15 10:10:32 UTC (rev 2483)
@@ -9,10 +9,10 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 3.0
*/
-(a)Suite.SuiteClasses(
- {
+//(a)Suite.SuiteClasses(
+// {
// // test1
- SimpleOneToManyRelationTest.class,
+// SimpleOneToManyRelationTest.class,
// SimpleOneToManyRelationWithRoleNamedTest.class,
// BiDirectionalOneToManyRelationTest.class,
// BiDirectionalOneToManyRelationWithRoleNamedTest.class,
@@ -31,10 +31,10 @@
// // test 5
// OneToManyCompositionTest.class,
// BiDirectionalOneToManyCompositionTest.class,
- // test 6
+// // test 6
// SimpleOneToManyIndexedTest.class,
// SimpleOneToManyWithRoleNamedIndexedTest.class
- }
-)
+// }
+//)
public class TopiaTckMappingHibernateTest extends TopiaTckMappingTestSuite {
}
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckItTestSuite.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckItTestSuite.java 2012-05-14 12:40:26 UTC (rev 2482)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckItTestSuite.java 2012-05-15 10:10:32 UTC (rev 2483)
@@ -3,6 +3,7 @@
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.nuiton.topia.TopiaContextFactoryTest;
+import org.nuiton.topia.tck.it.events.VetoableEventTest;
import org.nuiton.topia.tck.legacy.ano1882.DAOAbstractTransformerTest;
import org.nuiton.topia.tck.legacy.ano1991.TopiaQueryTest;
import org.nuiton.topia.tck.legacy.evo1912.EntityDTOTransformerTest;
@@ -29,7 +30,8 @@
EntityVisitorExportXmlTest.class,
NaturalIdTest.class,
TopiaContextFactoryTest.class,
- EnumTest.class})
+ EnumTest.class,
+ VetoableEventTest.class})
public abstract class TopiaTckItTestSuite {
}
Added: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java (rev 0)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/it/events/VetoableEventTest.java 2012-05-15 10:10:32 UTC (rev 2483)
@@ -0,0 +1,266 @@
+package org.nuiton.topia.tck.it.events;
+
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Rule;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.event.TopiaEntityEvent;
+import org.nuiton.topia.event.TopiaEntityVetoable;
+import org.nuiton.topia.tck.TopiaDatabase;
+import org.nuiton.topia.tck.it.Address;
+import org.nuiton.topia.tck.it.AddressDAO;
+import org.nuiton.topia.tck.it.Gender;
+import org.nuiton.topia.tck.it.Personne;
+import org.nuiton.topia.tck.it.PersonneDAO;
+import org.nuiton.topia.tck.it.TopiaDatabaseIt;
+import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
+
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class VetoableEventTest {
+
+ private static final Log log = LogFactory.getLog(VetoableEventTest.class);
+
+ @Rule
+ public final TopiaDatabase db = new TopiaDatabaseIt();
+
+ private class VetoableCounter implements TopiaEntityVetoable {
+ public int createCount = 0;
+ public int loadCount = 0;
+ public int updateCount = 0;
+ public int deleteCount = 0;
+ @Override
+ public void create(TopiaEntityEvent event) { createCount++; }
+
+ @Override
+ public void load(TopiaEntityEvent event) { loadCount++; }
+
+ @Override
+ public void update(TopiaEntityEvent event) { updateCount++; }
+
+ @Override
+ public void delete(TopiaEntityEvent event) { deleteCount++; }
+ }
+
+ /**
+ * Test the vetoable events firing on a specific entity
+ *
+ * @throws org.nuiton.topia.TopiaException if any exception while manipulating db
+ */
+ @Test
+ public void testVetoableFireOnSpecificEntity() throws TopiaException {
+ log.debug("START TEST : testVetoableFireOnSpecificEntity");
+
+ VetoableCounter counter = new VetoableCounter();
+
+ TopiaContext transaction = db.beginTransaction();
+
+ transaction.addTopiaEntityVetoable(Personne.class, counter);
+
+ log.debug("DAO : PersonneDAO");
+ PersonneDAO dao = TopiaTckItDAOHelper.getPersonneDAO(transaction);
+
+ log.debug("CREATE PERSONNE : Bob Marley");
+ Personne personne = dao.create(Personne.PROPERTY_NAME, "Bob Marley");
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, counter.createCount);
+ Assert.assertEquals(0, counter.loadCount);
+ Assert.assertEquals(0, counter.updateCount);
+ Assert.assertEquals(0, counter.deleteCount);
+
+ log.debug("UPDATE PERSONNE : Gender=MALE");
+ personne.setGender(Gender.MALE);
+ dao.update(personne);
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, counter.createCount);
+ Assert.assertEquals(0, counter.loadCount);
+ Assert.assertEquals(1, counter.updateCount);
+ Assert.assertEquals(0, counter.deleteCount);
+
+ log.debug("DELETE PERSONNE : Bob Marley");
+ dao.delete(personne);
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, counter.createCount);
+ Assert.assertEquals(0, counter.loadCount);
+ Assert.assertEquals(1, counter.updateCount);
+ Assert.assertEquals(1, counter.deleteCount);
+
+ }
+
+ /**
+ * Test the vetoable events firing on a any entity
+ *
+ * @throws org.nuiton.topia.TopiaException if any exception while manipulating db
+ */
+ @Test
+ public void testVetoableFireOnSameContext() throws TopiaException {
+ log.debug("START TEST : testVetoableFireOnSameContext");
+
+ VetoableCounter personneCounter = new VetoableCounter();
+ VetoableCounter allCounter = new VetoableCounter();
+
+ TopiaContext transaction = db.beginTransaction();
+
+ transaction.addTopiaEntityVetoable(Personne.class, personneCounter);
+ transaction.addTopiaEntityVetoable(allCounter);
+
+ log.debug("DAO : PersonneDAO");
+ PersonneDAO personneDAO = TopiaTckItDAOHelper.getPersonneDAO(transaction);
+
+ log.debug("DAO : AdresseDAO");
+ AddressDAO addressDAO = TopiaTckItDAOHelper.getAddressDAO(transaction);
+
+ log.debug("CREATE ADDRESS : Miami");
+ Address address = addressDAO.create(Address.PROPERTY_CITY, "Miami");
+ transaction.commitTransaction();
+
+ Assert.assertEquals(0, personneCounter.createCount);
+ Assert.assertEquals(0, personneCounter.loadCount);
+ Assert.assertEquals(0, personneCounter.updateCount);
+ Assert.assertEquals(0, personneCounter.deleteCount);
+
+ Assert.assertEquals(1, allCounter.createCount);
+ Assert.assertEquals(0, allCounter.loadCount);
+ Assert.assertEquals(0, allCounter.updateCount);
+ Assert.assertEquals(0, allCounter.deleteCount);
+
+ log.debug("CREATE PERSONNE : Bob Marley");
+ Personne personne = personneDAO.create(
+ Personne.PROPERTY_NAME, "Bob Marley",
+ Personne.PROPERTY_ADDRESS, address);
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, personneCounter.createCount);
+ Assert.assertEquals(0, personneCounter.loadCount);
+ Assert.assertEquals(0, personneCounter.updateCount);
+ Assert.assertEquals(0, personneCounter.deleteCount);
+
+ Assert.assertEquals(2, allCounter.createCount);
+ Assert.assertEquals(0, allCounter.loadCount);
+ Assert.assertEquals(0, allCounter.updateCount);
+ Assert.assertEquals(0, allCounter.deleteCount);
+
+ log.debug("UPDATE ADDRESS : Adress=Success street");
+ address.setAdress("Success street");
+ addressDAO.update(address);
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, personneCounter.createCount);
+ Assert.assertEquals(0, personneCounter.loadCount);
+ Assert.assertEquals(0, personneCounter.updateCount);
+ Assert.assertEquals(0, personneCounter.deleteCount);
+
+ Assert.assertEquals(2, allCounter.createCount);
+ Assert.assertEquals(0, allCounter.loadCount);
+ Assert.assertEquals(1, allCounter.updateCount);
+ Assert.assertEquals(0, allCounter.deleteCount);
+
+ log.debug("UPDATE PERSONNE : Gender=MALE");
+ personne.setGender(Gender.MALE);
+ personneDAO.update(personne);
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, personneCounter.createCount);
+ Assert.assertEquals(0, personneCounter.loadCount);
+ Assert.assertEquals(1, personneCounter.updateCount);
+ Assert.assertEquals(0, personneCounter.deleteCount);
+
+ Assert.assertEquals(2, allCounter.createCount);
+ Assert.assertEquals(0, allCounter.loadCount);
+ Assert.assertEquals(2, allCounter.updateCount);
+ Assert.assertEquals(0, allCounter.deleteCount);
+
+ log.debug("DELETE PERSONNE : Bob Marley");
+ personneDAO.delete(personne);
+ transaction.commitTransaction();
+
+ Assert.assertEquals(1, personneCounter.createCount);
+ Assert.assertEquals(0, personneCounter.loadCount);
+ Assert.assertEquals(1, personneCounter.updateCount);
+ Assert.assertEquals(1, personneCounter.deleteCount);
+
+ Assert.assertEquals(2, allCounter.createCount);
+ Assert.assertEquals(0, allCounter.loadCount);
+ Assert.assertEquals(2, allCounter.updateCount);
+ Assert.assertEquals(1, allCounter.deleteCount);
+
+ }
+
+ /**
+ * Test the vetoable events firing on a any entity
+ *
+ * @throws org.nuiton.topia.TopiaException if any exception while manipulating db
+ */
+ @Test
+ public void testVetoableHierarchy() throws TopiaException {
+ log.debug("START TEST : testVetoableHierarchy");
+
+ VetoableCounter counterRoot = new VetoableCounter();
+ VetoableCounter counterChild1 = new VetoableCounter();
+ VetoableCounter counterChild2 = new VetoableCounter();
+
+ TopiaContext rootContext = db.getRootCtxt();
+ TopiaContext childContext1 = db.beginTransaction();
+ TopiaContext childContext2 = db.beginTransaction();
+
+ rootContext.addTopiaEntityVetoable(Personne.class, counterRoot);
+ childContext1.addTopiaEntityVetoable(Personne.class, counterChild1);
+ childContext2.addTopiaEntityVetoable(Personne.class, counterChild2);
+
+ log.debug("DAO : PersonneDAO");
+ PersonneDAO dao1 = TopiaTckItDAOHelper.getPersonneDAO(childContext1);
+
+ log.debug("CREATE PERSONNE : Bob Marley");
+ Personne personne1 = dao1.create(Personne.PROPERTY_NAME, "Bob Marley");
+ childContext1.commitTransaction();
+
+// Assert.assertEquals(1, counterRoot.createCount); // FIXME AThimel 15/05/2012 Am I expecting the propagation in thr wrong direction ?
+ Assert.assertEquals(0, counterRoot.loadCount);
+ Assert.assertEquals(0, counterRoot.updateCount);
+ Assert.assertEquals(0, counterRoot.deleteCount);
+
+ Assert.assertEquals(1, counterChild1.createCount);
+ Assert.assertEquals(0, counterChild1.loadCount);
+ Assert.assertEquals(0, counterChild1.updateCount);
+ Assert.assertEquals(0, counterChild1.deleteCount);
+
+ Assert.assertEquals(0, counterChild2.createCount);
+ Assert.assertEquals(0, counterChild2.loadCount);
+ Assert.assertEquals(0, counterChild2.updateCount);
+ Assert.assertEquals(0, counterChild2.deleteCount);
+
+
+ log.debug("DAO : PersonneDAO");
+ PersonneDAO dao2 = TopiaTckItDAOHelper.getPersonneDAO(childContext2);
+
+ log.debug("CREATE PERSONNE : Bob Moran");
+ Personne personne2 = dao2.create(Personne.PROPERTY_NAME, "Bob Moran");
+ childContext2.commitTransaction();
+
+// Assert.assertEquals(2, counterRoot.createCount); // FIXME AThimel 15/05/2012 Am I expecting the propagation in thr wrong direction ?
+ Assert.assertEquals(0, counterRoot.loadCount);
+ Assert.assertEquals(0, counterRoot.updateCount);
+ Assert.assertEquals(0, counterRoot.deleteCount);
+
+ Assert.assertEquals(1, counterChild1.createCount);
+ Assert.assertEquals(0, counterChild1.loadCount);
+ Assert.assertEquals(0, counterChild1.updateCount);
+ Assert.assertEquals(0, counterChild1.deleteCount);
+
+ Assert.assertEquals(1, counterChild2.createCount);
+ Assert.assertEquals(0, counterChild2.loadCount);
+ Assert.assertEquals(0, counterChild2.updateCount);
+ Assert.assertEquals(0, counterChild2.deleteCount);
+
+ }
+
+}
\ No newline at end of file
1
0
r2482 - trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck
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:40:26 +0200 (Mon, 14 May 2012)
New Revision: 2482
Url: http://nuiton.org/repositories/revision/topia/2482
Log:
refs #2089: Use JPA (orm) mappings (tests)
Modified:
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckMappingTestSuite.java
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckMappingTestSuite.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckMappingTestSuite.java 2012-05-14 12:30:15 UTC (rev 2481)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/TopiaTckMappingTestSuite.java 2012-05-14 12:40:26 UTC (rev 2482)
@@ -17,37 +17,48 @@
import org.nuiton.topia.tck.mapping.test4.ElementCollectionTest;
import org.nuiton.topia.tck.mapping.test5.BiDirectionalOneToManyCompositionTest;
import org.nuiton.topia.tck.mapping.test5.OneToManyCompositionTest;
+import org.nuiton.topia.tck.mapping.test6.SimpleOneToManyIndexedTest;
+import org.nuiton.topia.tck.mapping.test6.SimpleOneToManyWithRoleNamedIndexedTest;
/**
* Test suite for {@code mapping} model.
* <p/>
- * Just implements this in dedicated module to have all this tests runned.
+ * To use this test suite in your jpa implementation of topia-persistence,
+ * just implements this class with nothing more, like this:
+ * <pre>
+ * public class TopiaTckMappingHibernateTest extends TopiaTckMappingTestSuite {
+ * }
+ * </pre>
*
* @author tchemit <chemit(a)codelutin.com>
* @since 3.0
*/
@RunWith(Suite.class)
@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
+ {
+ // 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 abstract class TopiaTckMappingTestSuite {
1
0
r2481 - in trunk/topia-persistence-tck/src/main: java/org/nuiton/topia/tck/mapping/test4 java/org/nuiton/topia/tck/mapping/test6 xmi
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:30:15 +0200 (Mon, 14 May 2012)
New Revision: 2481
Url: http://nuiton.org/repositories/revision/topia/2481
Log:
refs #2089: Use JPA (orm) mappings (tests)
Added:
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/E4.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyIndexedTest.java
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java
Modified:
trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/ElementCollectionTest.java
trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo
Added: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/E4.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/E4.java (rev 0)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/E4.java 2012-05-14 12:30:15 UTC (rev 2481)
@@ -0,0 +1,12 @@
+package org.nuiton.topia.tck.mapping.test4;
+
+/**
+ * TODO
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 3.0
+ */
+public enum E4 {
+ LITERAL1,
+ LITERAL2,
+}
Modified: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/ElementCollectionTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/ElementCollectionTest.java 2012-05-14 12:29:31 UTC (rev 2480)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test4/ElementCollectionTest.java 2012-05-14 12:30:15 UTC (rev 2481)
@@ -35,7 +35,8 @@
public void create() throws TopiaException {
A4 a = aDAO.create();
- a.setStringArray(Arrays.asList("a", "b", "c"));
+ a.setStrings(Arrays.asList("a", "b", "c"));
+ a.setEnumerations(Arrays.asList(E4.LITERAL1, E4.LITERAL2));
tx.commitTransaction();
@@ -43,9 +44,13 @@
Assert.assertNotNull(aBis);
Assert.assertEquals(a, aBis);
- Assert.assertNotNull(aBis.getStringArray());
- Assert.assertEquals(3, aBis.sizeStringArray());
- Assert.assertEquals(a.getStringArray(), aBis.getStringArray());
+ Assert.assertNotNull(aBis.getStrings());
+ Assert.assertEquals(3, aBis.sizeStrings());
+ Assert.assertEquals(a.getStrings(), aBis.getStrings());
+
+ Assert.assertNotNull(aBis.getEnumerations());
+ Assert.assertEquals(2, aBis.sizeEnumerations());
+ Assert.assertEquals(a.getEnumerations(), aBis.getEnumerations());
}
@Test
Added: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyIndexedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyIndexedTest.java (rev 0)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyIndexedTest.java 2012-05-14 12:30:15 UTC (rev 2481)
@@ -0,0 +1,99 @@
+package org.nuiton.topia.tck.mapping.test6;
+
+import com.google.common.collect.Lists;
+import junit.framework.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.tck.mapping.AbstractMappingTest;
+
+import java.util.List;
+
+/**
+ * To test a simple OneToMany indexed relation (usage of JPA order-colum)
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 3.0
+ */
+public class SimpleOneToManyIndexedTest extends AbstractMappingTest {
+
+ protected TopiaContext tx;
+
+ protected A6DAO aDAO;
+
+ protected B6DAO bDAO;
+
+ @Before
+ public void before() throws TopiaException {
+ tx = db.beginTransaction();
+ aDAO = getDAO(tx, A6.class);
+ bDAO = getDAO(tx, B6.class);
+ }
+
+ @Test
+ public void create() throws TopiaException {
+
+ long nbA = aDAO.count();
+ long nbB = bDAO.count();
+
+ Assert.assertEquals(0, nbA);
+ Assert.assertEquals(0, nbB);
+
+ A6 a = aDAO.create();
+ B6 b = bDAO.create();
+ B6 b2 = bDAO.create();
+ B6 b3 = bDAO.create();
+
+ a.addB6(b);
+ a.addB6(b2);
+
+ tx.commitTransaction();
+
+ nbA = aDAO.count();
+ nbB = bDAO.count();
+
+ Assert.assertEquals(1, nbA);
+ Assert.assertEquals(3, nbB);
+
+ A6 aBis = aDAO.findByTopiaId(a.getTopiaId());
+ Assert.assertEquals(a, aBis);
+ Assert.assertEquals(2, aBis.sizeB6());
+ List<B6> bs = aBis.getB6();
+ Assert.assertEquals(b, bs.get(0));
+ Assert.assertEquals(b2, bs.get(1));
+
+ // change order
+ List<B6> bsBis;
+
+ bsBis = Lists.newArrayList();
+ bsBis.add(b2);
+ bsBis.add(b);
+ a.setB6(bsBis);
+ tx.commitTransaction();
+
+ aBis = aDAO.findByTopiaId(a.getTopiaId());
+ Assert.assertEquals(a, aBis);
+ Assert.assertEquals(2, aBis.sizeB6());
+ bs = aBis.getB6();
+ Assert.assertEquals(b2, bs.get(0));
+ Assert.assertEquals(b, bs.get(1));
+
+ // rechange order
+
+ bsBis = Lists.newArrayList();
+ bsBis.add(b3);
+ bsBis.add(b2);
+ bsBis.add(b);
+ a.setB6(bsBis);
+ tx.commitTransaction();
+
+ aBis = aDAO.findByTopiaId(a.getTopiaId());
+ Assert.assertEquals(a, aBis);
+ Assert.assertEquals(3, aBis.sizeB6());
+ bs = aBis.getB6();
+ Assert.assertEquals(b3, bs.get(0));
+ Assert.assertEquals(b2, bs.get(1));
+ Assert.assertEquals(b, bs.get(2));
+ }
+}
\ No newline at end of file
Added: trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java
===================================================================
--- trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java (rev 0)
+++ trunk/topia-persistence-tck/src/main/java/org/nuiton/topia/tck/mapping/test6/SimpleOneToManyWithRoleNamedIndexedTest.java 2012-05-14 12:30:15 UTC (rev 2481)
@@ -0,0 +1,100 @@
+package org.nuiton.topia.tck.mapping.test6;
+
+import com.google.common.collect.Lists;
+import junit.framework.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.tck.mapping.AbstractMappingTest;
+
+import java.util.List;
+
+/**
+ * To test a simple OneToMany indexed relation (usage of JPA order-colum)
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 3.0
+ */
+public class SimpleOneToManyWithRoleNamedIndexedTest extends AbstractMappingTest {
+
+ protected TopiaContext tx;
+
+ protected A61DAO aDAO;
+
+ protected B61DAO bDAO;
+
+ @Before
+ public void before() throws TopiaException {
+ tx = db.beginTransaction();
+ aDAO = getDAO(tx, A61.class);
+ bDAO = getDAO(tx, B61.class);
+ }
+
+ @Test
+ public void create() throws TopiaException {
+
+ long nbA = aDAO.count();
+ long nbB = bDAO.count();
+
+ Assert.assertEquals(0, nbA);
+ Assert.assertEquals(0, nbB);
+
+ A61 a = aDAO.create();
+ B61 b = bDAO.create();
+ B61 b2 = bDAO.create();
+ B61 b3 = bDAO.create();
+
+ a.addRoleB(b);
+ a.addRoleB(b2);
+
+ tx.commitTransaction();
+
+ nbA = aDAO.count();
+ nbB = bDAO.count();
+
+ Assert.assertEquals(1, nbA);
+ Assert.assertEquals(3, nbB);
+
+ A61 aBis = aDAO.findByTopiaId(a.getTopiaId());
+ Assert.assertEquals(a, aBis);
+ Assert.assertEquals(2, aBis.sizeRoleB());
+ List<B61> bs = aBis.getRoleB();
+ Assert.assertEquals(b, bs.get(0));
+ Assert.assertEquals(b2, bs.get(1));
+
+ // change order
+ List<B61> bsBis;
+
+ bsBis = Lists.newArrayList();
+ bsBis.add(b2);
+ bsBis.add(b);
+ a.setRoleB(bsBis);
+ tx.commitTransaction();
+
+ aBis = aDAO.findByTopiaId(a.getTopiaId());
+ Assert.assertEquals(a, aBis);
+ Assert.assertEquals(2, aBis.sizeRoleB());
+ bs = aBis.getRoleB();
+ Assert.assertEquals(b2, bs.get(0));
+ Assert.assertEquals(b, bs.get(1));
+
+ // rechange order
+
+ bsBis = Lists.newArrayList();
+ bsBis.add(b3);
+ bsBis.add(b2);
+ bsBis.add(b);
+ a.setRoleB(bsBis);
+ tx.commitTransaction();
+
+ aBis = aDAO.findByTopiaId(a.getTopiaId());
+ Assert.assertEquals(a, aBis);
+ Assert.assertEquals(3, aBis.sizeRoleB());
+ bs = aBis.getRoleB();
+ Assert.assertEquals(b3, bs.get(0));
+ Assert.assertEquals(b2, bs.get(1));
+ Assert.assertEquals(b, bs.get(2));
+ }
+
+}
\ No newline at end of file
Modified: trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo
===================================================================
(Binary files differ)
1
0