Index: lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImpl.java diff -u lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImpl.java:1.15 lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImpl.java:1.16 --- lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImpl.java:1.15 Tue May 17 19:48:30 2005 +++ lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImpl.java Thu May 19 09:18:23 2005 @@ -23,16 +23,17 @@ * * @author C�dric Pineau * Copyright Code Lutin -* @version $Revision: 1.15 $ +* @version $Revision: 1.16 $ * -* Last update : $Date: 2005/05/17 19:48:30 $ -* by : $Author: pineau $ +* Last update : $Date: 2005/05/19 09:18:23 $ +* by : $Author: thimel $ */ package org.codelutin.generator.models.object.xml; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import org.codelutin.generator.GeneratorException; @@ -63,22 +64,42 @@ return new ObjectModelClassImpl(this, null); clazz.postInit(); if (! clazz.isExtern()) { - // TODO Arnaud reprendre la classe si elle existe déja et y mettre le contenu de la nouvelle classe - classes.put(clazz.getQualifiedName(), clazz); -// TODO Arnaud itou (pas refaire le traitement deux fois - classifiers.put(clazz.getQualifiedName(), clazz); + ObjectModelElementImpl initialElement = (ObjectModelElementImpl)classes.get(clazz.getQualifiedName()); + if (initialElement == null) { + classes.put(clazz.getQualifiedName(), clazz); + classifiers.put(clazz.getQualifiedName(), clazz); + } else { + if (!(initialElement instanceof ObjectModelClassImpl)) + throw new IllegalArgumentException("\"" + clazz + "\" is incompatible with already defined element \"" + initialElement + "\""); + ObjectModelClassImpl initialClazz = (ObjectModelClassImpl)initialElement; + + //La classe existe déjà. On va prendre tout ce que contient la + //nouvelle classe et l'ajouter à la précédente si nécessaire. + + mergeClasses(initialClazz, clazz); + clazz = initialClazz; + } } -// TODO Arnaud retourner la bonne classe (id est pas forcement la nouvelle) return clazz; } - + public ObjectModelClassImpl parsetAssociationClass(ObjectModelAssociationClassImpl clazz) { if (clazz == null) return new ObjectModelAssociationClassImpl(this, null); clazz.postInit(); if (! clazz.isExtern()) { - classes.put(clazz.getQualifiedName(), clazz); - classifiers.put(clazz.getQualifiedName(), clazz); + ObjectModelElementImpl initialElement = (ObjectModelElementImpl)classes.get(clazz.getQualifiedName()); + if (initialElement == null) { + classes.put(clazz.getQualifiedName(), clazz); + classifiers.put(clazz.getQualifiedName(), clazz); + } else { + if (!(initialElement instanceof ObjectModelAssociationClassImpl)) + throw new IllegalArgumentException("\"" + clazz + "\" is incompatible with already defined element \"" + initialElement + "\""); + ObjectModelAssociationClassImpl initialClazz = (ObjectModelAssociationClassImpl)initialElement; + + mergeAssociationClasses(initialClazz, clazz); + clazz = initialClazz; + } } return clazz; } @@ -147,8 +168,18 @@ return new ObjectModelInterfaceImpl(this, null); interfacez.postInit(); if (! interfacez.isExtern()) { - interfaces.put(interfacez.getQualifiedName(), interfacez); - classifiers.put(interfacez.getQualifiedName(), interfacez); + ObjectModelElementImpl initialElement = (ObjectModelElementImpl)interfaces.get(interfacez.getQualifiedName()); + if (initialElement == null) { + interfaces.put(interfacez.getQualifiedName(), interfacez); + classifiers.put(interfacez.getQualifiedName(), interfacez); + } else { + if (!(initialElement instanceof ObjectModelInterfaceImpl)) + throw new IllegalArgumentException("\"" + interfacez + "\" is incompatible with already defined element \"" + initialElement + "\""); + ObjectModelInterfaceImpl initialInterfacez = (ObjectModelInterfaceImpl)initialElement; + + mergeClassifiers(initialInterfacez, interfacez); + interfacez = initialInterfacez; + } } return interfacez; } @@ -188,4 +219,117 @@ return comments; } + private void mergeClassifiers(ObjectModelClassifierImpl initialClazzifier, ObjectModelClassifierImpl additionalClazzifier) { + Iterator it; + + //On n'utilise pas les parsetXXX puisque les post-init sont censés être déjà faits... + + //System.out.println("Doc initial : " + initialClazzifier.documentation); + //System.out.println("Doc additional : " + additionalClazzifier.documentation); + String description = ""; + String sourceDoc = ""; + if (initialClazzifier.documentation != null) { + description += initialClazzifier.getDescription(); + if (initialClazzifier.documentation.contains("--")) + sourceDoc += initialClazzifier.getSourceDocumentation(); + } + if (additionalClazzifier.documentation != null) { + if (!description.equals("")) + description += " - "; + description += additionalClazzifier.getDescription(); + if (additionalClazzifier.documentation.contains("--")) { + if (!sourceDoc.equals("")) + sourceDoc += " - "; + sourceDoc += additionalClazzifier.getSourceDocumentation(); + } + } + if (!description.equals("") || !sourceDoc.equals("")) + initialClazzifier.documentation = description + "--" + sourceDoc; + + //System.out.println("Doc after : " + initialClazzifier.documentation); + + for (it = additionalClazzifier.interfacesRefs.iterator(); it.hasNext(); ) { + ObjectModelImplRef interfaceRef = (ObjectModelImplRef)it.next(); + if (!contains(initialClazzifier.interfacesRefs, interfaceRef)) + initialClazzifier.interfacesRefs.add(interfaceRef); + initialClazzifier.interfaces = null; //On force ainsi à regénérer l'objet + } + for (it = additionalClazzifier.getOperations().iterator(); it.hasNext(); ) { + ObjectModelOperationImpl operation = (ObjectModelOperationImpl)it.next(); + if (!contains(initialClazzifier.getOperations(),operation)) + initialClazzifier.operations.add(operation); + } + for (it = additionalClazzifier.getComments().iterator(); it.hasNext(); ) { + String comment = (String)it.next(); + if (!initialClazzifier.comments.contains(comment)) + initialClazzifier.comments.add(comment); + } + for (it = additionalClazzifier.getStereotypes().iterator(); it.hasNext(); ) { + String stereotype = (String)it.next(); + if (!initialClazzifier.getStereotypes().contains(stereotype)) + initialClazzifier.stereotypes.add(stereotype); + } + + for (it = additionalClazzifier.getTagValues().keySet().iterator(); it.hasNext(); ) { + String tagName = (String)it.next(); + if (!initialClazzifier.getTagValues().containsKey(tagName)) + initialClazzifier.tagValues.put(tagName, additionalClazzifier.getTagValue(tagName)); + } + } + + + /** + * This method takes two ObjectModelClassImpl and merges both of them in the first one + * @param initialClazz the instance of ObjectModelClassImpl to be modified + * @param additionalClazz the instance of ObjectModelClassImpl tu be used for merging + */ + private void mergeClasses(ObjectModelClassImpl initialClazz, ObjectModelClassImpl additionalClazz) { + Iterator it; + mergeClassifiers(initialClazz, additionalClazz); + + for (it = additionalClazz.getAttributes().iterator(); it.hasNext();) { + ObjectModelAttributeImpl attribute = (ObjectModelAttributeImpl)it.next(); + if (!contains(initialClazz.getAttributes(), attribute)) { + initialClazz.attributes.put(attribute.getName(), attribute); + initialClazz.orderedAttributes.add(attribute); + } + } + for (it = additionalClazz.superclassesRefs.iterator(); it.hasNext(); ) { + ObjectModelImplRef superclassRef = (ObjectModelImplRef)it.next(); + if (!contains(initialClazz.superclassesRefs, superclassRef)) + initialClazz.superclassesRefs.add(superclassRef); + initialClazz.superclasses = null; //On force ainsi à regénérer l'objet + } + } + + private void mergeAssociationClasses(ObjectModelAssociationClassImpl initialAssocClazz, ObjectModelAssociationClassImpl additionalAssocClazz) { + mergeClasses(initialAssocClazz, additionalAssocClazz); + Iterator it; + for (it = additionalAssocClazz.participantsRefs.iterator(); it.hasNext(); ) { + ObjectModeImplAssociationClassParticipant participant = + (ObjectModeImplAssociationClassParticipant)it.next(); + if (!contains(initialAssocClazz.participantsRefs, participant)) + initialAssocClazz.participantsRefs.add(participant); + initialAssocClazz.participantsAttributes = null; //On force ainsi à regénérer l'objet + initialAssocClazz.participantsClassifiers = null; //On force ainsi à regénérer l'objet + } + } + + private boolean contains(Collection coll, ObjectModelAttributeImpl toFind) { + for (Iterator it = coll.iterator(); it.hasNext(); ) { + ObjectModelAttributeImpl attribute = (ObjectModelAttributeImpl)it.next(); + if (attribute.getName().equals(toFind.getName())) //Seul le nom de l'attribut compte + return true; + } + return false; + } + + private boolean contains(Collection coll, ObjectModelOperationImpl toFind) { + return coll.contains(toFind); //Le equals(...) de ObjectModelOperationImpl convient + } + + private boolean contains(Collection coll, ObjectModelImplRef toFind) { + return coll.contains(toFind); //Le equals(...) de ObjectModelImplRef convient + } + } Index: lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImplRef.java diff -u lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImplRef.java:1.5 lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImplRef.java:1.6 --- lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImplRef.java:1.5 Mon May 17 17:26:06 2004 +++ lutingenerator/src/java/org/codelutin/generator/models/object/xml/ObjectModelImplRef.java Thu May 19 09:18:23 2005 @@ -23,10 +23,10 @@ * * @author Cédric Pineau * Copyright Code Lutin -* @version $Revision: 1.5 $ +* @version $Revision: 1.6 $ * -* Last update : $Date: 2004/05/17 17:26:06 $ -* by : $Author: pineau $ +* Last update : $Date: 2005/05/19 09:18:23 $ +* by : $Author: thimel $ */ package org.codelutin.generator.models.object.xml; @@ -42,6 +42,15 @@ public String getName() { return name; + } + + public boolean equals(Object o) { + if (!(o instanceof ObjectModelImplRef)) + return false; + ObjectModelImplRef oRef = (ObjectModelImplRef)o; + if (name == null) + return (oRef.getName() == null); + return name.equals(oRef.getName()); } }