>From a07fadba0bb986706558731b589d67a4644a93f8 Mon Sep 17 00:00:00 2001
From: fdesbois <fdesbois@garfield.(none)>
Date: Mon, 23 Apr 2012 12:39:02 +0200
Subject: [PATCH] - Add merge test - Add TopiaIdentifierGenerator to generate
 automatic topiaId on persist (dao still have the create
 TopiaId in create() methods)

---
 .../topia/generator/DAOHelperTransformer.java      |   56 +++++-
 .../generator/EntityHibernateMappingGenerator.java |   28 +++-
 .../nuiton/topia/generator/TopiaGeneratorUtil.java |    4 +-
 .../persistence/TopiaIdentifierGenerator.java      |   59 ++++++
 .../org/nuiton/topia/persistence/MergeTest.java    |  208 ++++++++++++++++++++
 topia-persistence/src/test/xmi/topiatest.zargo     |  Bin 25448 -> 25504 bytes
 6 files changed, 348 insertions(+), 7 deletions(-)
 create mode 100644 topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdentifierGenerator.java
 create mode 100644 topia-persistence/src/test/java/org/nuiton/topia/persistence/MergeTest.java

diff --git a/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java b/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java
index a16c258..81476c2 100644
--- a/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java
+++ b/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java
@@ -25,13 +25,17 @@
 
 package org.nuiton.topia.generator;
 
-import java.util.Set;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.nuiton.eugene.models.object.ObjectModelType;
 import org.nuiton.eugene.java.ObjectModelTransformerToJava;
-import org.nuiton.eugene.models.object.*;
+import org.nuiton.eugene.models.object.ObjectModel;
+import org.nuiton.eugene.models.object.ObjectModelAttribute;
+import org.nuiton.eugene.models.object.ObjectModelClass;
+import org.nuiton.eugene.models.object.ObjectModelEnumeration;
+import org.nuiton.eugene.models.object.ObjectModelModifier;
+import org.nuiton.eugene.models.object.ObjectModelOperation;
+import org.nuiton.eugene.models.object.ObjectModelType;
 import org.nuiton.eugene.models.object.xml.ObjectModelAttributeImpl;
 import org.nuiton.eugene.models.object.xml.ObjectModelEnumerationImpl;
 import org.nuiton.topia.TopiaContext;
@@ -41,13 +45,14 @@ import org.nuiton.topia.framework.TopiaContextImplementor;
 import org.nuiton.topia.persistence.TopiaDAO;
 import org.nuiton.topia.persistence.TopiaEntity;
 import org.nuiton.topia.persistence.TopiaEntityEnum;
+import org.nuiton.topia.persistence.TopiaIdentifierGenerator;
 import org.nuiton.topia.persistence.util.EntityOperator;
 import org.nuiton.topia.persistence.util.EntityOperatorStore;
 
 import java.lang.reflect.Array;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 
 /*{generator option: parentheses = false}*/
@@ -74,6 +79,7 @@ public class DAOHelperTransformer extends ObjectModelTransformerToJava {
         String modelName = model.getName();
         String daoHelperClazzName = modelName + "DAOHelper";
         String entityEnumName = modelName + "EntityEnum";
+        String identifierGeneratorName = modelName + "IdentifierGenerator";
 
         List<ObjectModelClass> classes =
                 TopiaGeneratorUtil.getEntityClasses(model, true);
@@ -131,6 +137,11 @@ public class DAOHelperTransformer extends ObjectModelTransformerToJava {
                          generateStandaloneEnum,
                          classes
         );
+
+        // generate IdentifierGenerator
+        createIdentifierGenerator(identifierGeneratorName,
+                                  packageName,
+                                  entityEnum);
     }
 
     protected void createDAOHelper(ObjectModel model,
@@ -509,4 +520,41 @@ public class DAOHelperTransformer extends ObjectModelTransformerToJava {
     }*/
         );
     }
+
+    protected void createIdentifierGenerator(String identifierGeneratorName,
+                                             String packageName,
+                                             ObjectModelEnumeration entityEnum) {
+
+        ObjectModelClass identifierGenerator =
+                createClass(identifierGeneratorName, packageName);
+
+        addImport(identifierGenerator, TopiaEntityEnum.class);
+        addImport(identifierGenerator, TopiaEntity.class);
+        addImport(identifierGenerator, TopiaIdentifierGenerator.class);
+        addImport(identifierGenerator, entityEnum.getQualifiedName());
+
+        setSuperClass(identifierGenerator, TopiaIdentifierGenerator.class);
+
+        // Implement abstract method from TopiaIdentifierGenerator :
+        // protected TopiaEntityEnum getTopiaEntityEnum(TopiaEntity entity)
+        ObjectModelOperation getTopiaEntityEnumOp =
+                addOperation(identifierGenerator,
+                             "getTopiaEntityEnum",
+                             TopiaEntityEnum.class,
+                             ObjectModelModifier.PROTECTED);
+
+        addAnnotation(identifierGenerator,
+                      getTopiaEntityEnumOp,
+                      Override.class.getSimpleName());
+
+        addParameter(getTopiaEntityEnumOp, TopiaEntity.class, "entity");
+
+        String entityEnumClassName = entityEnum.getName();
+
+        setOperationBody(getTopiaEntityEnumOp, ""
+/*{
+        return <%=entityEnumClassName%>.valueOf(entity);
+    }*/
+        );
+    }
 }
diff --git a/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java b/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java
index 964ec4e..4ec53f5 100644
--- a/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java
+++ b/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java
@@ -42,6 +42,7 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.nuiton.eugene.models.object.ObjectModel;
 import org.nuiton.eugene.models.object.ObjectModelAssociationClass;
 import org.nuiton.eugene.models.object.ObjectModelAttribute;
 import org.nuiton.eugene.models.object.ObjectModelClass;
@@ -98,6 +99,13 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator {
     public static final String HIBERNATE_ATTRIBUTE_LENGTH = "length";
 
     public static final String HIBERNATE_ATTRIBUTE_ORDER_BY = "order-by";
+    
+    protected String modelName;
+
+    @Override
+    public void generateFromModel(Writer output, ObjectModel input) throws IOException {
+        modelName = model.getName();
+    }
 
     @Override
     public String getFilenameForClass(ObjectModelClass clazz) {
@@ -154,8 +162,26 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator {
             // FIXME mieux gerer le cas haveSuper
             noneNaturalAttributes.addAll(input.getAttributes());
         } else {
+
+            // use generated IdentifierGenerator (in DAOHelperTransformer)
+            // that inherits from TopiaIdentifierGenerator
+            String defaultPackage = getProperty(PROP_DEFAULT_PACKAGE);
+            String identifierGeneratorClass =
+                    defaultPackage + "." + modelName + "IdentifierGenerator";
+
+            // NOTE for "unsaved-value" attribute :
+            // To check transient instance in context, hibernate check the
+            // nullValue of the identifier
+            // see org.hibernate.persister.entity.AbstractEntityPersister#isTransient(Object, SessionImplementor)
+            // nullValue is set as "undefined" when using default org.hibernate.id.Assigned IdentifierGenerator
+            // see org.hibernate.cfg.HbmBinder#makeIdentifier(Element, SimpleValue, Mappings)
+            // if we don't use "undefined" value, the replicate method doesn't
+            // work as before (you can test this case with TopiaContextReplicateTest)
+            
 /*{    <class name="<%=clazzDOType%>" table="<%=tableName%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>" <%=optionalAttributes%>>
-        <id name="topiaId" type="string" length="255" node="@topiaId"/>
+        <id name="topiaId" type="string" length="255" node="@topiaId" unsaved-value="undefined">
+          <generator class="<%=identifierGeneratorClass%>"/>
+        </id>
 }*/
             // on detecte les attributs des clef metiers            
             for (ObjectModelAttribute attr : input.getAttributes()) {
diff --git a/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java b/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
index 8c01abc..f702f7b 100644
--- a/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
+++ b/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java
@@ -25,7 +25,6 @@
 
 package org.nuiton.topia.generator;
 
-import java.util.LinkedHashSet;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
@@ -54,6 +53,7 @@ import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -331,7 +331,7 @@ public class TopiaGeneratorUtil extends JavaGeneratorUtil {
     }
 
     /**
-     * Cherche si le tagvalue {@link TopiaTagValues#TAG_GENERATE_OPERATOR_FOR_DAO_HELPER} a ��t��
+     * Cherche si le tagvalue {@link TopiaTagValues#TAG_GENERATE_STANDALONE_ENUM_FOR_DAO_HELPER} a ��t��
      * activ�� dans le model.
      *
      * @param model le modele utilis��
diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdentifierGenerator.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdentifierGenerator.java
new file mode 100644
index 0000000..9d40cab
--- /dev/null
+++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdentifierGenerator.java
@@ -0,0 +1,59 @@
+package org.nuiton.topia.persistence;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.IdentifierGenerator;
+import org.nuiton.topia.generator.DAOHelperTransformer;
+import org.nuiton.topia.generator.EntityHibernateMappingGenerator;
+
+import java.io.Serializable;
+
+/**
+ * Automatic generation of topiaId directly in hibernate using {@link 
+ * IdentifierGenerator} API. You have to set this generator in {@code id} tag
+ * for each generated entity XML mapping. The {@link EntityHibernateMappingGenerator}
+ * will do this job automatically.
+ * <p/>
+ * Note that with JPA, the @PrePersist solution may be better (not working on
+ * merge with current hibernate PrePersistListener)
+ * <p/> 
+ * Created: 19/04/12
+ *
+ * @author fdesbois <desbois@codelutin.com>
+ * @since 2.7
+ * @see IdentifierGenerator
+ * @see TopiaId
+ */
+public abstract class TopiaIdentifierGenerator implements IdentifierGenerator {
+
+    @Override
+    public Serializable generate(SessionImplementor session,
+                                 Object object)
+            throws HibernateException {
+
+        TopiaEntity entity = (TopiaEntity) object;
+
+        Serializable result;
+        if (entity.getTopiaId() == null) {
+            Class<?> clazz = getTopiaEntityEnum(entity).getContract();
+            result = TopiaId.create(clazz);
+
+        } else {
+            result = entity.getTopiaId();
+        }
+        return result;
+    }
+
+    /**
+     * Override this method to provide the {@link TopiaEntityEnum} for the
+     * generated model depends on given {@code entity}. The implementation
+     * class will be generated in DAOHelper with {@link DAOHelperTransformer}.
+     * 
+     * @param entity The entity that match the resulting TopiaEntityEnum
+     * @return the TopiaEntityEnum found
+     * @throws IllegalArgumentException if not TopiaEntityEnum match the given
+     * {@code entity}
+     */
+    protected abstract TopiaEntityEnum getTopiaEntityEnum(TopiaEntity entity)
+            throws IllegalArgumentException;
+}
diff --git a/topia-persistence/src/test/java/org/nuiton/topia/persistence/MergeTest.java b/topia-persistence/src/test/java/org/nuiton/topia/persistence/MergeTest.java
new file mode 100644
index 0000000..d797791
--- /dev/null
+++ b/topia-persistence/src/test/java/org/nuiton/topia/persistence/MergeTest.java
@@ -0,0 +1,208 @@
+package org.nuiton.topia.persistence;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Session;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaDatabase;
+import org.nuiton.topia.framework.TopiaContextImplementor;
+import org.nuiton.topiatest.Bill;
+import org.nuiton.topiatest.Company;
+import org.nuiton.topiatest.CompanyDAO;
+import org.nuiton.topiatest.Department;
+import org.nuiton.topiatest.DepartmentDAO;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static org.nuiton.topia.TopiaTestDAOHelper.getCompanyDAO;
+import static org.nuiton.topia.TopiaTestDAOHelper.getDepartmentDAO;
+
+/**
+ * Created: 09/04/12
+ *
+ * @author fdesbois <desbois@codelutin.com>
+ */
+public class MergeTest {
+
+    private static final Log log = LogFactory.getLog(MergeTest.class);
+
+    @Rule
+    public final TopiaDatabase db = new TopiaDatabase();
+
+    @Test
+    public void testFromUnloadedObject() throws Exception {
+
+        // -- PREPARE -- //
+        TopiaContext transaction = db.beginTransaction();
+
+        CompanyDAO companyDAO = getCompanyDAO(transaction);
+        DepartmentDAO departmentDAO = getDepartmentDAO(transaction);
+
+        Company company = companyDAO.create();
+        company.setName("MyCompany");
+
+        Department department1 = departmentDAO.create();
+        department1.setName("Department1");
+        company.addDepartment(department1);
+
+        Department department2 = departmentDAO.create();
+        department2.setName("Department2");
+        company.addDepartment(department2);
+        Assert.assertNotNull(department2.getTopiaId());
+
+        // Save the company with two departments
+        transaction.commitTransaction();
+        transaction.closeContext();
+
+        // -- EXECUTE -- //
+        transaction = db.beginTransaction();
+
+        companyDAO = getCompanyDAO(transaction);
+        departmentDAO = getDepartmentDAO(transaction);
+
+        Company companyUpdate = companyDAO.newInstance();
+        companyUpdate.setTopiaId(company.getTopiaId());
+        companyUpdate.setTopiaVersion(company.getTopiaVersion());
+        companyUpdate.setName("MyCompanyUpdate");
+
+        // Must initialize all other composite relations, could be a bad idea. It's not necessary with update
+        companyUpdate.setStoreBill(new ArrayList<Bill>());
+
+        companyUpdate.clearDepartment();
+
+        Department department2Update = departmentDAO.newInstance();
+        department2Update.setTopiaId(department2.getTopiaId());
+        department2Update.setTopiaVersion(department2.getTopiaVersion());
+        department2Update.setName("Department2");
+        companyUpdate.addDepartment(department2Update);
+
+        Department department3Create = departmentDAO.newInstance();
+        department3Create.setName("Department3");
+        companyUpdate.addDepartment(department3Create);
+
+        log.debug("Execute merge");
+        merge(transaction, companyUpdate);
+        // The update will properly add department3 but not remove the department1
+//        companyDAO.update(companyUpdate);
+
+        transaction.commitTransaction();
+        transaction.closeContext();
+
+        // -- CHECK -- //
+        transaction = db.beginTransaction();
+
+        companyDAO = getCompanyDAO(transaction);
+        departmentDAO = getDepartmentDAO(transaction);
+
+        long companiesCount = companyDAO.count();
+        Assert.assertEquals(1, companiesCount);
+
+        Company companyLoaded = companyDAO.findByTopiaId(company.getTopiaId());
+        Assert.assertNotNull(companyLoaded);
+        Assert.assertEquals("MyCompanyUpdate", companyLoaded.getName());
+        Assert.assertEquals(2, companyLoaded.sizeDepartment());
+        Assert.assertNull(departmentDAO.findByTopiaId(department1.getTopiaId()));
+        Map<String, Department> departmentsLoaded =
+                getDepartmentByNames(companyLoaded.getDepartment());
+        Assert.assertNotNull(departmentsLoaded.get("Department2"));
+        Assert.assertEquals(department2.getTopiaId(), departmentsLoaded.get("Department2").getTopiaId());
+        Assert.assertNotNull(departmentsLoaded.get("Department3"));
+        transaction.closeContext();
+    }
+
+    @Test
+    public void testFromLoadedObject() throws Exception {
+
+        // -- PREPARE -- //
+        TopiaContext transaction = db.beginTransaction();
+
+        CompanyDAO companyDAO = getCompanyDAO(transaction);
+        DepartmentDAO departmentDAO = getDepartmentDAO(transaction);
+
+        Company company = companyDAO.create();
+        company.setName("MyCompany");
+
+        Department department1 = departmentDAO.create();
+        department1.setName("Department1");
+        company.addDepartment(department1);
+
+        Department department2 = departmentDAO.create();
+        department2.setName("Department2");
+        company.addDepartment(department2);
+
+        // Save the company with two departments
+        transaction.commitTransaction();
+        transaction.closeContext();
+
+        // -- EXECUTE -- //
+        transaction = db.beginTransaction();
+
+        companyDAO = getCompanyDAO(transaction);
+        departmentDAO = getDepartmentDAO(transaction);
+
+        Company companyUpdate = companyDAO.findByTopiaId(company.getTopiaId());
+        companyUpdate.setName("MyCompanyUpdate");
+
+        companyUpdate.clearDepartment();
+
+        Department department2Update = departmentDAO.newInstance();
+        department2Update.setTopiaId(department2.getTopiaId());
+        department2Update.setTopiaVersion(department2.getTopiaVersion());
+        department2Update.setName("Department2");
+        companyUpdate.addDepartment(department2Update);
+
+        Department department3Create = departmentDAO.newInstance();
+        department3Create.setName("Department3");
+        companyUpdate.addDepartment(department3Create);
+
+        merge(transaction, companyUpdate);
+//        companyDAO.update(companyUpdate);
+
+        transaction.commitTransaction();
+        transaction.closeContext();
+
+        // -- CHECK -- //
+        transaction = db.beginTransaction();
+
+        companyDAO = getCompanyDAO(transaction);
+        departmentDAO = getDepartmentDAO(transaction);
+
+        long companiesCount = companyDAO.count();
+        Assert.assertEquals(1, companiesCount);
+
+        Company companyLoaded = companyDAO.findByTopiaId(company.getTopiaId());
+        Assert.assertNotNull(companyLoaded);
+        Assert.assertEquals("MyCompanyUpdate", companyLoaded.getName());
+        Assert.assertEquals(2, companyLoaded.sizeDepartment());
+        Assert.assertNull(departmentDAO.findByTopiaId(department1.getTopiaId()));
+//        List<Department> departmentsLoaded = new ArrayList<Department>(companyLoaded.getDepartment());
+//        Assert.assertEquals("Department2", departmentsLoaded.get(0).getName());
+//        Assert.assertEquals("Department3", departmentsLoaded.get(1).getName());
+        Map<String, Department> departmentsLoaded =
+                getDepartmentByNames(companyLoaded.getDepartment());
+        Assert.assertNotNull(departmentsLoaded.get("Department2"));
+        Assert.assertEquals(department2.getTopiaId(), departmentsLoaded.get("Department2").getTopiaId());
+        Assert.assertNotNull(departmentsLoaded.get("Department3"));
+        transaction.closeContext();
+    }
+    
+    protected Map<String, Department> getDepartmentByNames(Iterable<Department> departments) {
+        Map<String, Department> result = new LinkedHashMap<String, Department>();
+        for (Department department : departments) {
+            result.put(department.getName(), department);
+        }
+        return result;
+    }
+    
+    protected <T extends TopiaEntity> T merge(TopiaContext transaction, T entity) throws Exception {
+        Session session = ((TopiaContextImplementor) transaction).getHibernate();
+        T result = (T) session.merge(entity);
+        return result;
+    }
+
+}
diff --git a/topia-persistence/src/test/xmi/topiatest.zargo b/topia-persistence/src/test/xmi/topiatest.zargo
index 3d815e20265272ac155ee342abb01e68604752d5..b560e5e32a8f02a5b9f0f3c1ad682554aaa6320c 100644
GIT binary patch
delta 12556
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

delta 12394
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
MCWcBg_>c4d0Pa%7M*si-

-- 
1.7.5.4

