Author: fdesbois Date: 2009-09-21 18:56:15 +0200 (Mon, 21 Sep 2009) New Revision: 627 Modified: trunk/eugene/changelog.txt trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelClass.java trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/DigesterObjectModelRuleSet.java trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java trunk/eugene/src/main/xsl/xmi1.2ToObjectModel.xsl trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI12ToObjectModelTest.java trunk/eugene/src/test/resources/xmi/1.2/topiatest.xmi trunk/eugene/src/test/resources/xmi/1.2/topiatest.zargo Log: [Evol] #58 and #59 : static and innerClasses support for XMI 1.2 only (already support static on attributes) Modified: trunk/eugene/changelog.txt =================================================================== --- trunk/eugene/changelog.txt 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/changelog.txt 2009-09-21 16:56:15 UTC (rev 627) @@ -1,4 +1,6 @@ 1.0.1 + * 20090921 [desbois] [Evol #59] support innerClasses for XMI 1.2 + * 20090921 [desbois] [Evol #58] support static on operations from XMI 1.2 et 2.1 and static on classes only for XMI 1.2 * 20090903 [poussin] move attribute from class to classifier, interface can have static attribute * 20090903 [poussin] add JavaClassBuilder * 20090903 [poussin] add new generator type JavaClassGenerator Modified: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModel.java 2009-09-21 16:56:15 UTC (rev 627) @@ -39,7 +39,7 @@ public interface ObjectModel extends Model { /** - * Returns all classifiers defined in this model. + * Returns all classifiers defined in this model. (Except innerClasses) * @see ObjectModelClassifier * * @return a Collection containing all ObjectModelClassifier for this model. @@ -56,7 +56,7 @@ String qualifiedClassifierName); /** - * Returns all classes defined in this model. + * Returns all classes defined in this model. (Except innerClasses) * @see ObjectModelClass * * @return a Collection containing all ObjectModelClass for this model. Modified: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelClass.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelClass.java 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelClass.java 2009-09-21 16:56:15 UTC (rev 627) @@ -40,15 +40,23 @@ * * @return a Collection containing all parent ObjectModelClass for this class. */ - public Collection<ObjectModelClass> getSuperclasses(); + Collection<ObjectModelClass> getSuperclasses(); /** + * Returns all inner classes for this class. + * @see ObjectModelClass + * + * @return a Collection containing all inner ObjectModelClass for this class. + */ + Collection<ObjectModelClass> getInnerClasses(); + + /** * Returns the discriminator for the given superclass. * * @param superclass super class to get discriminator * @return the discriminator for the given superclass as a String if it exists, null otherwise. */ - public String getDiscriminator(ObjectModelClass superclass); + String getDiscriminator(ObjectModelClass superclass); /** * Returns all known direct specialized classes for this class. @@ -56,7 +64,7 @@ * * @return a Collection containing all known direct specialized ObjectModelClass for this class. */ - public Collection<ObjectModelClass> getSpecialisations(); + Collection<ObjectModelClass> getSpecialisations(); /** * Returns all known direct specialized classes for this class for the specified discriminator. @@ -65,17 +73,23 @@ * @param discriminator discriminator to get specialisations * @return a Collection containing all known direct specialized ObjectModelClass for this class for the specified discriminator. */ - public Collection<ObjectModelClass> getSpecialisations( - String discriminator); + Collection<ObjectModelClass> getSpecialisations(String discriminator); /** * Returns whether this class is abstract or not. * * @return a boolean indicating whether this class is abstract or not. */ - public boolean isAbstract(); + boolean isAbstract(); /** + * Returns whether this class is inner an other class or not. + * + * @return a boolean indicating whether this class is inner an other class or not. + */ + boolean isInner(); + + /** * Returns all operations defined on all Super class extended by this * classifier, directly or indirectly. and all interface implemented by the * super class. @@ -83,7 +97,6 @@ * are add to list. * @return a Collection of ObjectModelOperation */ - public Collection<ObjectModelOperation> getAllSuperclassOperations( - boolean distinct); + Collection<ObjectModelOperation> getAllSuperclassOperations(boolean distinct); } //ObjectModelClass Modified: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/DigesterObjectModelRuleSet.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/DigesterObjectModelRuleSet.java 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/DigesterObjectModelRuleSet.java 2009-09-21 16:56:15 UTC (rev 627) @@ -69,9 +69,9 @@ // root element must be present on stask d.addSetProperties("objectModel"); - d.addObjectCreate("objectModel/class", ObjectModelClassImpl.class); - d.addSetProperties("objectModel/class"); - d.addSetNext("objectModel/class", "addClass"); + d.addObjectCreate("*/class", ObjectModelClassImpl.class); + d.addSetProperties("*/class"); + d.addSetNext("*/class", "addClass"); d.addObjectCreate("objectModel/interface", ObjectModelInterfaceImpl.class); Modified: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java 2009-09-21 16:56:15 UTC (rev 627) @@ -51,7 +51,9 @@ protected Map<ObjectModelClass, String> superclassesDiscriminators = new HashMap<ObjectModelClass, String>(); protected List<ObjectModelImplRef> superclassesRefs = new ArrayList<ObjectModelImplRef>(); protected List<ObjectModelClass> specialisations = null; + protected List<ObjectModelClass> innerClasses = null; protected boolean abstractz = false; + protected boolean inner = false; public ObjectModelClassImpl() { super(); @@ -63,6 +65,23 @@ superclasses = null; } + /** + * Digester method to add innerClass to this ObjectModelClass. + * @param innerClass the ObjectModelClass to add + */ + public void addClass(ObjectModelClassImpl innerClass) { + innerClass.setDeclaringElement(this); + innerClass.setInner(true); + if (innerClasses == null) { + innerClasses = new ArrayList<ObjectModelClass>(); + } + innerClasses.add(innerClass); + } + + public void setInner(boolean inner) { + this.inner = inner; + } + public void setAbstract(boolean abstractz) { this.abstractz = abstractz; } @@ -85,6 +104,11 @@ return superclasses; } + @Override + public Collection<ObjectModelClass> getInnerClasses() { + return this.innerClasses; + } + /** * Returns the discriminator for the given superclass. * @@ -152,6 +176,11 @@ } @Override + public boolean isInner() { + return inner; + } + + @Override public Collection<ObjectModelOperation> getAllOtherOperations( boolean distinct) { Collection<ObjectModelOperation> result = getAllInterfaceOperations(distinct); Modified: trunk/eugene/src/main/xsl/xmi1.2ToObjectModel.xsl =================================================================== --- trunk/eugene/src/main/xsl/xmi1.2ToObjectModel.xsl 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/main/xsl/xmi1.2ToObjectModel.xsl 2009-09-21 16:56:15 UTC (rev 627) @@ -240,6 +240,15 @@ <xsl:call-template name="UMLOperation"/> </xsl:for-each> + <!-- inner classes --> + <xsl:for-each select="UML:Namespace.ownedElement/UML:Class"> + <xsl:call-template name="UMLClass"> + <xsl:with-param name="localPackageName"> + <xsl:value-of select="$localPackageName"/> + </xsl:with-param> + </xsl:call-template> + </xsl:for-each> + <xsl:call-template name="UMLAssociations"> <xsl:with-param name="classId"> <xsl:value-of select="$classId"/> @@ -652,6 +661,12 @@ <xsl:text>true</xsl:text> </xsl:attribute> </xsl:if> + + <xsl:if test="@ownerScope='classifier'"> + <xsl:attribute name="static"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> <xsl:for-each select="UML:ModelElement.taggedValue/UML:TaggedValue"> <xsl:call-template name="taggedValue"/> Modified: trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI12ToObjectModelTest.java =================================================================== --- trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI12ToObjectModelTest.java 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI12ToObjectModelTest.java 2009-09-21 16:56:15 UTC (rev 627) @@ -24,6 +24,7 @@ import java.net.URISyntaxException; import java.net.URL; +import java.util.List; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -157,7 +158,17 @@ Assert.assertNotNull(personneClass); ObjectModelAttribute addressAttr = personneClass.getAttribute("address"); Assert.assertNotNull(addressAttr); - Assert.assertTrue(addressAttr.isAggregate()); + Assert.assertTrue(addressAttr.isAggregate()); + + // Test for inner class + ObjectModelClass storeClass = model.getClass("org.nuiton.topiatest.Store"); + Assert.assertNotNull(storeClass); + List<ObjectModelClass> inners = (List<ObjectModelClass>) storeClass.getInnerClasses(); + Assert.assertNotNull(inners); + Assert.assertEquals(inners.size(), 1); + ObjectModelClass rowClass = inners.get(0); + Assert.assertNotNull(rowClass); + Assert.assertEquals(rowClass.getDeclaringElement().getName(), "Store"); } /** Modified: trunk/eugene/src/test/resources/xmi/1.2/topiatest.xmi =================================================================== --- trunk/eugene/src/test/resources/xmi/1.2/topiatest.xmi 2009-09-04 14:54:57 UTC (rev 626) +++ trunk/eugene/src/test/resources/xmi/1.2/topiatest.xmi 2009-09-21 16:56:15 UTC (rev 627) @@ -1,5 +1,5 @@ <?xml version = '1.0' encoding = 'UTF-8' ?> -<XMI xmi.version = '1.2' xmlns:UML = 'org.omg.xmi.namespace.UML' timestamp = 'Tue Jul 21 15:18:23 CEST 2009'> +<XMI xmi.version = '1.2' xmlns:UML = 'org.omg.xmi.namespace.UML' timestamp = 'Mon Sep 21 18:42:26 CEST 2009'> <XMI.header> <XMI.documentation> <XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter> <XMI.exporterVersion>0.28(6) revised on $Date: 2007-05-12 08:08:08 +0200 (Sat, 12 May 2007) $ </XMI.exporterVersion> @@ -312,6 +312,48 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref = '127-0-0-1-3f03561c:11667f969c5:-8000:00000000000008E7'/> </UML:ModelElement.stereotype> + <UML:Namespace.ownedElement> + <UML:Class xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000104C' + name = 'Row' visibility = 'public' isSpecification = 'false' isRoot = 'false' + isLeaf = 'false' isAbstract = 'false' isActive = 'false'> + <UML:Classifier.feature> + <UML:Attribute xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001051' + name = 'num' visibility = 'public' isSpecification = 'false' ownerScope = 'instance' + changeability = 'changeable' targetScope = 'instance'> + <UML:StructuralFeature.multiplicity> + <UML:Multiplicity xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001052'> + <UML:Multiplicity.range> + <UML:MultiplicityRange xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001053' + lower = '1' upper = '1'/> + </UML:Multiplicity.range> + </UML:Multiplicity> + </UML:StructuralFeature.multiplicity> + <UML:Attribute.initialValue> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001057' + language = '' body = ''/> + </UML:Attribute.initialValue> + <UML:StructuralFeature.type> + <UML:DataType href = 'http://argouml.org/profiles/uml14/default-java.xmi#.:000000000000086C'/> + </UML:StructuralFeature.type> + </UML:Attribute> + <UML:Attribute xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001054' + name = 'position' visibility = 'public' isSpecification = 'false' ownerScope = 'instance' + changeability = 'changeable' targetScope = 'instance'> + <UML:StructuralFeature.multiplicity> + <UML:Multiplicity xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001055'> + <UML:Multiplicity.range> + <UML:MultiplicityRange xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001056' + lower = '1' upper = '1'/> + </UML:Multiplicity.range> + </UML:Multiplicity> + </UML:StructuralFeature.multiplicity> + <UML:StructuralFeature.type> + <UML:Class href = 'http://argouml.org/profiles/uml14/default-java.xmi#.:0000000000000859'/> + </UML:StructuralFeature.type> + </UML:Attribute> + </UML:Classifier.feature> + </UML:Class> + </UML:Namespace.ownedElement> <UML:Classifier.feature> <UML:Attribute xmi.id = '127-0-0-1-3f03561c:11667f969c5:-8000:0000000000000D7D' name = 'name' visibility = 'public' isSpecification = 'false' ownerScope = 'instance' @@ -324,10 +366,65 @@ </UML:Multiplicity.range> </UML:Multiplicity> </UML:StructuralFeature.multiplicity> + <UML:Attribute.initialValue> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001046' + language = '' body = ''/> + </UML:Attribute.initialValue> <UML:StructuralFeature.type> <UML:Class href = 'http://argouml.org/profiles/uml14/default-java.xmi#.:0000000000000859'/> </UML:StructuralFeature.type> </UML:Attribute> + <UML:Attribute xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001034' + name = 'DEFAULT_NUM' visibility = 'public' isSpecification = 'false' ownerScope = 'classifier' + changeability = 'changeable' targetScope = 'instance'> + <UML:StructuralFeature.multiplicity> + <UML:Multiplicity xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001035'> + <UML:Multiplicity.range> + <UML:MultiplicityRange xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001036' + lower = '1' upper = '1'/> + </UML:Multiplicity.range> + </UML:Multiplicity> + </UML:StructuralFeature.multiplicity> + <UML:Attribute.initialValue> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001041' + language = '' body = 'B78947'/> + </UML:Attribute.initialValue> + <UML:StructuralFeature.type> + <UML:Class href = 'http://argouml.org/profiles/uml14/default-java.xmi#.:0000000000000859'/> + </UML:StructuralFeature.type> + </UML:Attribute> + <UML:Operation xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000103A' + name = 'getDefaultNum' visibility = 'public' isSpecification = 'false' ownerScope = 'classifier' + isQuery = 'false' concurrency = 'sequential' isRoot = 'false' isLeaf = 'false' + isAbstract = 'false'> + <UML:BehavioralFeature.parameter> + <UML:Parameter xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000103B' + name = 'return' isSpecification = 'false' kind = 'return'> + <UML:Parameter.type> + <UML:Class href = 'http://argouml.org/profiles/uml14/default-java.xmi#.:0000000000000859'/> + </UML:Parameter.type> + </UML:Parameter> + </UML:BehavioralFeature.parameter> + </UML:Operation> + <UML:Attribute xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001042' + name = 'numStore' visibility = 'public' isSpecification = 'false' ownerScope = 'instance' + changeability = 'changeable' targetScope = 'instance'> + <UML:StructuralFeature.multiplicity> + <UML:Multiplicity xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001043'> + <UML:Multiplicity.range> + <UML:MultiplicityRange xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001044' + lower = '1' upper = '1'/> + </UML:Multiplicity.range> + </UML:Multiplicity> + </UML:StructuralFeature.multiplicity> + <UML:Attribute.initialValue> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001045' + language = '' body = ''/> + </UML:Attribute.initialValue> + <UML:StructuralFeature.type> + <UML:Class href = 'http://argouml.org/profiles/uml14/default-java.xmi#.:0000000000000859'/> + </UML:StructuralFeature.type> + </UML:Attribute> </UML:Classifier.feature> </UML:Class> <UML:Class xmi.id = '127-0-0-1-3f03561c:11667f969c5:-8000:0000000000000D40' @@ -1318,6 +1415,16 @@ </UML:Stereotype> </UML:Namespace.ownedElement> </UML:Model> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000103C' + language = '' body = 'B'/> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000103D' + language = '' body = 'B7'/> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000103E' + language = '' body = 'B78'/> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:000000000000103F' + language = '' body = 'B789'/> + <UML:Expression xmi.id = '-64--88-99-15--68a124bf:123dcd43ccb:-8000:0000000000001040' + language = '' body = 'B7894'/> <UML:Multiplicity xmi.id = '127-0-0-1-13652238:1219c622604:-8000:0000000000001233'> <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = '127-0-0-1-13652238:1219c622604:-8000:0000000000001234' Modified: trunk/eugene/src/test/resources/xmi/1.2/topiatest.zargo =================================================================== (Binary files differ)