r2530 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/generator topia-persistence-tck/src/main/xmi
Author: tchemit Date: 2012-05-25 15:38:08 +0200 (Fri, 25 May 2012) New Revision: 2530 Url: http://nuiton.org/repositories/revision/topia/2530 Log: refs #2089: Use JPA (orm) mappings add new tests for unique and not-null improve TopiaGeneratorUtil (add missing methods for boolean tag-values) Modified: trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.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-25 12:40:12 UTC (rev 2529) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityJPAMappingGenerator.java 2012-05-25 13:38:08 UTC (rev 2530) @@ -1,8 +1,11 @@ package org.nuiton.topia.generator; +import com.google.common.base.Function; import com.google.common.base.Strings; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Iterables; import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import org.apache.commons.collections.CollectionUtils; @@ -184,7 +187,7 @@ splitAttributes(input, attributes); // get all unique constraints to add - Multimap<String, String> uniqueContraints = getUniqueConstraints( + List<String[]> uniqueContraints = getUniqueConstraints( input, attributes, embeddableAttributes); /*{<?xml version="1.0" encoding="UTF-8"?> @@ -240,17 +243,11 @@ /*{<%=flushTag(TAG_TABLE, uniqueContraints.isEmpty(), xmlAttributes)%> }*/ if (!uniqueContraints.isEmpty()) { - for (String uniqueContraintName : uniqueContraints.keySet()) { - addAttribute(xmlAttributes, ATTRIBUTE_NAME, uniqueContraintName); -/*{<%=flushTag(TAG_UNIQUE_CONTRAINT, xmlAttributes)%> + for (String uniqueContraint : uniqueContraints) { +/*{<%=flushTag(TAG_UNIQUE_CONTRAINT)%> +<%=flushTag(TAG_COLUMN_NAME, uniqueContraint)%><%=closeStrictTag(TAG_COLUMN_NAME)%> +<%=closeTag(TAG_UNIQUE_CONTRAINT)%> }*/ - for (String uniqueContraint : - uniqueContraints.get(uniqueContraintName)) { -/*{<%=flushTag(TAG_COLUMN_NAME, uniqueContraint)%> -}*/ - } -/*{<%=closeTag(TAG_UNIQUE_CONTRAINT)%> -}*/ } /*{<%=closeTag(TAG_TABLE)%> }*/ @@ -260,7 +257,7 @@ // TODO AThimel 22/05/2012 Is the strategy choosable ? // TODO AThimel 22/05/2012 May only be specified on parent entities ? - addAttribute(xmlAttributes, ATTRIBUTE_STRATEGY, InheritanceType.TABLE_PER_CLASS.name()); + addAttribute(xmlAttributes, ATTRIBUTE_STRATEGY, InheritanceType.TABLE_PER_CLASS); /*{<%=flushTag(TAG_INHERITANCE, true, xmlAttributes)%> }*/ @@ -627,6 +624,10 @@ }*/ // add join-column addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName); + // unique stereotype + if (TopiaGeneratorUtil.hasUniqueStereotype(attr)) { + addAttribute(columnAttributes, ATTRIBUTE_UNIQUE, true); + } /*{<%=flushTag(TAG_JOIN_COLUMN, true, columnAttributes)%> }*/ // add a reverse-join-column @@ -717,8 +718,8 @@ } private void generateOneToManyAttribute(Writer output, - ObjectModelClass input, - ObjectModelAttribute attr) throws IOException { + ObjectModelClass input, + ObjectModelAttribute attr) throws IOException { Map<String, String> xmlAttributes = Maps.newTreeMap(); boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr); @@ -745,6 +746,10 @@ addAttribute(columnAttributes, ATTRIBUTE_NAME, reverseAttrDBName); + // unique stereotype + if (TopiaGeneratorUtil.hasUniqueStereotype(attr)) { + addAttribute(columnAttributes, ATTRIBUTE_UNIQUE, true); + } /*{<%=flushTag(TAG_ONE_TO_MANY, xmlAttributes)%> }*/ @@ -945,7 +950,9 @@ return result; } - + /** + * Different types of relations. + */ public enum PROPERTY_TYPE { BASIC, MANY_TO_ONE, @@ -998,13 +1005,43 @@ return result; } - private Multimap<String, String> getUniqueConstraints(ObjectModelClass input, - List<ObjectModelAttribute> attributes, - Multimap<String, ObjectModelAttribute> embeddableAttributes) { - Multimap<String, String> result = ArrayListMultimap.create(); + private List<String[]> getUniqueConstraints(ObjectModelClass input, + List<ObjectModelAttribute> attributes, + Multimap<String, ObjectModelAttribute> embeddableAttributes) { + List< String[]> result = Lists.newArrayList(); + + // only generate unique constraints for embeddable entities since for + // other stuff this is already done with a unique attribute + +// Multimap<PROPERTY_TYPE, ObjectModelAttribute> attributesByType = +// splitAttributesByType(attributes); +// +// Collection<ObjectModelAttribute> basicAttributes = +// attributesByType.get(PROPERTY_TYPE.BASIC); +// for (ObjectModelAttribute attribute : basicAttributes) { +// +// if (TopiaGeneratorUtil.hasUniqueStereotype(attribute)) { +// String dbName = TopiaGeneratorUtil.getDbName(attribute); +// result.add(dbName); +// } +// } + + for (String s : embeddableAttributes.keySet()) { + Collection<ObjectModelAttribute> attrs = embeddableAttributes.get(s); + Iterable<String> dbNames = Iterables.transform(attrs, ATTRIBUTE_TO_DB_NAME); + String[] strings = Iterables.toArray(dbNames, String.class); + result.add(strings); + } return result; } + public static final Function<ObjectModelAttribute, String> ATTRIBUTE_TO_DB_NAME = new Function<ObjectModelAttribute, String>() { + @Override + public String apply(ObjectModelAttribute input) { + return TopiaGeneratorUtil.getDbName(input); + } + }; + protected String getName(ObjectModelAttribute attr) { return getName(attr, false); } 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-25 12:40:12 UTC (rev 2529) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2012-05-25 13:38:08 UTC (rev 2530) @@ -48,7 +48,6 @@ 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; @@ -58,7 +57,6 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -375,8 +373,8 @@ * Les naturalId {@link #isNaturalId} sont not null par défaut * * @param attribute l'attribut à tester - * @return {@code true} si l'attribut doit être non null, - * par défaut pour les naturalId, {@code false} sinon.. + * @return {@code true} si l'attribut doit être non null, {@code false} + * sinon. * @since 2.6.9 */ public static boolean isNotNull(ObjectModelAttribute attribute) { @@ -646,7 +644,7 @@ return Set.class.getName(); } if (JavaGeneratorUtil.hasIndexedStereotype(attr) || attr.isOrdered() || - StringUtils.isNotBlank(getOrderByTagValue(attr))) { + StringUtils.isNotBlank(getOrderByTagValue(attr))) { return List.class.getName(); } return Collection.class.getName(); @@ -1050,7 +1048,7 @@ public static boolean isSetNeeded(Collection<ObjectModelOperation> operations) { return isImportNeeded(operations, - Set.class.getSimpleName()); + Set.class.getSimpleName()); } /** @@ -1348,6 +1346,31 @@ } /** + * Detecte si un attribut est déclaré comme inverse d'une relation. + * <p/> + * + * @param attribute l'attribut à tester + * @return {@code true} si le tag value a ete positionne sur l'attribut + * via le tag {@link TopiaTagValues#TAG_INVERSE}, {@code false} + * sinon. + * @since 3.0 + */ + public static boolean isInverse(ObjectModelAttribute attribute) { + String value = getInverseTagValue(attribute); + if (StringUtils.isEmpty(value)) { + // valeur null, donc par default pas inverse + return false; + } + try { + return Boolean.valueOf(value.trim()); + } catch (Exception e) { + // on a pas reussi a convertir en boolean. + //todo peut-être declancher une exception ? + return false; + } + } + + /** * Obtain the value of the {@link TopiaTagValues#TAG_LAZY} * tag value on the given attribute. * <p/> @@ -1363,6 +1386,31 @@ } /** + * Detecte si un attribut est déclaré comme lazy d'une relation. + * <p/> + * + * @param attribute l'attribut à tester + * @return {@code true} si le tag value a ete positionne sur l'attribut + * via le tag {@link TopiaTagValues#TAG_LAZY}, {@code false} + * sinon. + * @since 3.0 + */ + public static boolean isLazy(ObjectModelAttribute attribute) { + String value = getLazyTagValue(attribute); + if (StringUtils.isEmpty(value)) { + // valeur null, donc par default pas de lazy + return false; + } + try { + return Boolean.valueOf(value.trim()); + } catch (Exception e) { + // on a pas reussi a convertir en boolean. + //todo peut-être declancher une exception ? + return false; + } + } + + /** * Obtain the value of the {@link TopiaTagValues#TAG_FETCH} * tag value on the given attribute. * <p/> @@ -1378,6 +1426,31 @@ } /** + * Detecte si un attribut est déclaré comme lazy d'une relation. + * <p/> + * + * @param attribute l'attribut à tester + * @return {@code true} si le tag value a ete positionne sur l'attribut + * via le tag {@link TopiaTagValues#TAG_FETCH}, {@code false} + * sinon. + * @since 3.0 + */ + public static boolean isFetch(ObjectModelAttribute attribute) { + String value = getFetchTagValue(attribute); + if (StringUtils.isEmpty(value)) { + // valeur null, donc par default pas de fetch + return false; + } + try { + return Boolean.valueOf(value.trim()); + } catch (Exception e) { + // on a pas reussi a convertir en boolean. + //todo peut-être declancher une exception ? + return false; + } + } + + /** * Obtain the value of the {@link TopiaTagValues#TAG_ORDER_BY} * tag value on the given attribute. * <p/> @@ -1686,7 +1759,7 @@ * given attribute. * * @param attribute attribute to test - * @param model model to test + * @param model model to test * @return none empty value of the found tag value or {@code null} if not found nor empty. * @see TopiaTagValues#TAG_INDEX_FOREIGN_KEYS * @since 2.6.5 @@ -1733,28 +1806,28 @@ public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_COMPOSITE = new Predicate<ObjectModelAttribute>() { @Override - public boolean apply( ObjectModelAttribute input) { + 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) { + public boolean apply(ObjectModelAttribute input) { return input.isAggregate(); } }; - public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_REFERENCE_CLASSIFIER= new Predicate<ObjectModelAttribute>() { + public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_REFERENCE_CLASSIFIER = new Predicate<ObjectModelAttribute>() { @Override - public boolean apply( ObjectModelAttribute input) { + public boolean apply(ObjectModelAttribute input) { return input.referenceClassifier(); } }; - public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_HAS_ASSOCIATION_CLASS= new Predicate<ObjectModelAttribute>() { + public static final Predicate<ObjectModelAttribute> IS_ATTRIBUTE_HAS_ASSOCIATION_CLASS = new Predicate<ObjectModelAttribute>() { @Override - public boolean apply( ObjectModelAttribute input) { + public boolean apply(ObjectModelAttribute input) { return input.hasAssociationClass(); } }; Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java 2012-05-25 12:40:12 UTC (rev 2529) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaTagValues.java 2012-05-25 13:38:08 UTC (rev 2530) @@ -35,6 +35,8 @@ import org.nuiton.topia.persistence.TopiaEntityContextable; import org.nuiton.topia.persistence.TopiaEntityEnum; +import java.util.Collection; + import static org.nuiton.eugene.ModelPropertiesUtil.TagValueDefinition; /** @@ -148,6 +150,7 @@ * l'ordre alphabétique. * * @see TopiaGeneratorUtil#getInverseTagValue(ObjectModelAttribute) + * @see TopiaGeneratorUtil#isInverse(ObjectModelAttribute) * @since 2.5 */ @TagValueDefinition(target = {ObjectModelAttribute.class}, @@ -158,6 +161,7 @@ * Tag pour spécifier la caractère lazy d'une association multiple. * * @see TopiaGeneratorUtil#getLazyTagValue(ObjectModelAttribute) + * @see TopiaGeneratorUtil#isLazy(ObjectModelAttribute) * @since 2.5 */ @TagValueDefinition(target = {ObjectModelAttribute.class}, @@ -168,6 +172,7 @@ * Tag pour spécifier la caractère fetch d'une association multiple. * * @see TopiaGeneratorUtil#getFetchTagValue(ObjectModelAttribute) + * @see TopiaGeneratorUtil#isFetch(ObjectModelAttribute) * @since 2.5 */ @TagValueDefinition(target = {ObjectModelAttribute.class}, @@ -188,6 +193,7 @@ * Tag pour spécifier la caractère not-null d'un attribut. * * @see TopiaGeneratorUtil#getNotNullTagValue(ObjectModelAttribute) + * @see TopiaGeneratorUtil#isNotNull(ObjectModelAttribute) * @since 2.5 */ @TagValueDefinition(target = {ObjectModelAttribute.class}, Modified: trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo =================================================================== (Binary files differ)
participants (1)
-
tchemit@users.nuiton.org