Author: sletellier Date: 2012-04-06 09:26:42 +0200 (Fri, 06 Apr 2012) New Revision: 2432 Url: http://nuiton.org/repositories/revision/topia/2432 Log: fixies #2050 : Natural id and not null attributes are not propagated on generalized entities Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java trunk/topia-persistence/src/test/xmi/topiatest.zargo Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java 2012-03-29 09:47:07 UTC (rev 2431) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOAbstractTransformer.java 2012-04-06 07:26:42 UTC (rev 2432) @@ -963,7 +963,7 @@ private void generateNaturalId(ObjectModelClass result, ObjectModelClass clazz) { - List<ObjectModelAttribute> props = + Set<ObjectModelAttribute> props = TopiaGeneratorUtil.getNaturalIdAttributes(clazz); if (!props.isEmpty()) { Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java 2012-03-29 09:47:07 UTC (rev 2431) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java 2012-04-06 07:26:42 UTC (rev 2432) @@ -25,6 +25,7 @@ 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; @@ -316,23 +317,21 @@ for (ObjectModelClass clazz : classes) { String clazzName = clazz.getName(); - Collection<ObjectModelAttribute> attributes = clazz.getAttributes(); boolean withNatural = false; boolean withNotNull = false; StringBuilder naturalIdsParams = new StringBuilder(); StringBuilder notNullParams = new StringBuilder(); - for (ObjectModelAttribute attr2 : attributes) { - if (TopiaGeneratorUtil.isNaturalId(attr2)) { - withNatural = true; - // attribut metier - naturalIdsParams.append(", \"").append(attr2.getName()).append("\""); - } - if (TopiaGeneratorUtil.isNotNull(attr2)) { + Set<ObjectModelAttribute> naturalIdsAttributes = TopiaGeneratorUtil.getNaturalIdAttributes(clazz); + for (ObjectModelAttribute naturalIdAttributes : naturalIdsAttributes) { + withNatural = true; + // attribut metier + naturalIdsParams.append(", \"").append(naturalIdAttributes.getName()).append("\""); + if (TopiaGeneratorUtil.isNotNull(naturalIdAttributes)) { withNotNull = true; // attribut not-null - notNullParams.append(", \"").append(attr2.getName()).append("\""); + notNullParams.append(", \"").append(naturalIdAttributes.getName()).append("\""); } } 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-03-29 09:47:07 UTC (rev 2431) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2012-04-06 07:26:42 UTC (rev 2432) @@ -1102,7 +1102,7 @@ private void generateNaturalId(ObjectModelClass result, ObjectModelClass clazz) { - List<ObjectModelAttribute> props = + Set<ObjectModelAttribute> props = TopiaGeneratorUtil.getNaturalIdAttributes(clazz); if (!props.isEmpty()) { 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-03-29 09:47:07 UTC (rev 2431) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2012-04-06 07:26:42 UTC (rev 2432) @@ -25,6 +25,7 @@ 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; @@ -352,15 +353,24 @@ * @param clazz la classe à tester * @return la liste des attributs de la clef métier */ - public static List<ObjectModelAttribute> getNaturalIdAttributes( + public static Set<ObjectModelAttribute> getNaturalIdAttributes( ObjectModelClass clazz) { - List<ObjectModelAttribute> results = - new ArrayList<ObjectModelAttribute>(); + + // use {@link LinkedHashSet} to keep order and prevent duplicate natural ids found + Set<ObjectModelAttribute> results = + new LinkedHashSet<ObjectModelAttribute>(); for (ObjectModelAttribute attr : clazz.getAttributes()) { if (isNaturalId(attr)) { results.add(attr); } } + + // sletellier : #2050 Natural id and not null attributes are not propagated on generalized entities (http://nuiton.org/issues/2050) + Collection<ObjectModelClass> superclasses = clazz.getSuperclasses(); + for (ObjectModelClass superClass : superclasses) { + Set<ObjectModelAttribute> naturalIdsOfSuperClass = getNaturalIdAttributes(superClass); + results.addAll(naturalIdsOfSuperClass); + } return results; } Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java 2012-03-29 09:47:07 UTC (rev 2431) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java 2012-04-06 07:26:42 UTC (rev 2432) @@ -65,8 +65,7 @@ TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); // No exception will be thrown with the two properties - dao.create(NaturalizedEntity.PROPERTY_NATURAL_ID_NOT_NULL, 5, - NaturalizedEntity.PROPERTY_NATURAL_ID_NULL, "str"); + dao.create(5, "str"); transaction.commitTransaction(); // No exception will only the need property @@ -104,8 +103,7 @@ TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); NaturalizedEntity entity = - dao.create(NaturalizedEntity.PROPERTY_NATURAL_ID_NOT_NULL, 5, - NaturalizedEntity.PROPERTY_NATURAL_ID_NULL, "str"); + dao.create(5, "str"); transaction.commitTransaction(); // Exception will be throw : not allowed to modify a naturalId property @@ -127,8 +125,7 @@ TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); NaturalizedEntity entity = - dao.create(NaturalizedEntity.PROPERTY_NATURAL_ID_NOT_NULL, 5, - NaturalizedEntity.PROPERTY_NATURAL_ID_NULL, "str"); + dao.create(5, "str"); transaction.commitTransaction(); NaturalizedEntity result = dao.findByNaturalId(5, "str"); @@ -144,8 +141,7 @@ NaturalizedEntityDAO dao = TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); - dao.create(NaturalizedEntity.PROPERTY_NATURAL_ID_NOT_NULL, 5, - NaturalizedEntity.PROPERTY_NATURAL_ID_NULL, "str"); + dao.create(5, "str"); transaction.commitTransaction(); boolean result = dao.existByNaturalId(5, "str"); @@ -157,4 +153,22 @@ Assert.assertFalse(result); } + + @Test + public void testNaturalIdAreGeneralized() throws Exception { + + // test that natural ids are generalized + String[] generalizedNaturalizedNaturalIds = TopiaTestDAOHelper.TopiaTestEntityEnum.GeneralizedNaturalizedEntity.getNaturalIds(); + String[] naturalizedNaturalIds = TopiaTestDAOHelper.TopiaTestEntityEnum.NaturalizedEntity.getNaturalIds(); + Assert.assertArrayEquals(generalizedNaturalizedNaturalIds, naturalizedNaturalIds); + } + + @Test + public void testNotNullsAreGeneralized() throws Exception { + + // test that not nulls are generalized + String[] generalizedNaturalizedNotNulls = TopiaTestDAOHelper.TopiaTestEntityEnum.GeneralizedNaturalizedEntity.getNotNulls(); + String[] naturalizedNotNulls = TopiaTestDAOHelper.TopiaTestEntityEnum.NaturalizedEntity.getNotNulls(); + Assert.assertArrayEquals(generalizedNaturalizedNotNulls, naturalizedNotNulls); + } } Modified: trunk/topia-persistence/src/test/xmi/topiatest.zargo =================================================================== (Binary files differ)