Author: fdesbois Date: 2009-09-21 22:17:46 +0200 (Mon, 21 Sep 2009) New Revision: 628 Modified: trunk/eugene/changelog.txt trunk/eugene/src/main/xsl/xmi2.1ToObjectModel.xsl trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI21ToObjectModelTest.java trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.uml trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.umldi Log: [Evol] #58 and #59 : Support InnerClasses and static operations for XMI 2.1 Modified: trunk/eugene/changelog.txt =================================================================== --- trunk/eugene/changelog.txt 2009-09-21 16:56:15 UTC (rev 627) +++ trunk/eugene/changelog.txt 2009-09-21 20:17:46 UTC (rev 628) @@ -1,6 +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 + * 20090921 [desbois] [Evol #59] support innerClasses + * 20090921 [desbois] [Evol #58] support static on operations * 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/xsl/xmi2.1ToObjectModel.xsl =================================================================== --- trunk/eugene/src/main/xsl/xmi2.1ToObjectModel.xsl 2009-09-21 16:56:15 UTC (rev 627) +++ trunk/eugene/src/main/xsl/xmi2.1ToObjectModel.xsl 2009-09-21 20:17:46 UTC (rev 628) @@ -1,3 +1,4 @@ + <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt" xmlns:extensions="http://www.codelutin.com/XSLTExtensions" @@ -24,8 +25,8 @@ <xsl:template match="uml:Model"> <xsl:element name="objectModel"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:value-of select="@name" /> + </xsl:attribute> <xsl:apply-templates> <xsl:with-param name="parentLocalPackageName" /> @@ -57,10 +58,10 @@ <xsl:variable name="parentLocalPackageNameDot"> <xsl:if test="$parentLocalPackageName=''"> - <xsl:value-of select="$parentLocalPackageName" /> + <xsl:value-of select="$parentLocalPackageName" /> </xsl:if> <xsl:if test="$parentLocalPackageName!=''"> - <xsl:value-of select="concat($parentLocalPackageName,'.')" /> + <xsl:value-of select="concat($parentLocalPackageName,'.')" /> </xsl:if> </xsl:variable> @@ -80,29 +81,36 @@ <!-- uml:Class --> <xsl:template match="packagedElement[@xmi:type='uml:Class']"> <xsl:param name="parentLocalPackageName" /> + <xsl:call-template name="UMLClass"> + <xsl:with-param name="parentLocalPackageName" select="$parentLocalPackageName" /> + </xsl:call-template> + </xsl:template> + + <xsl:template name="UMLClass"> + <xsl:param name="parentLocalPackageName" /> <xsl:element name="class"> <!-- class properties --> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:value-of select="@name" /> + </xsl:attribute> <xsl:attribute name="package"> - <xsl:value-of select="$parentLocalPackageName" /> - </xsl:attribute> + <xsl:value-of select="$parentLocalPackageName" /> + </xsl:attribute> <xsl:if test="@isAbstract='true'"> <xsl:attribute name="abstract"> - <xsl:text>true</xsl:text> - </xsl:attribute> + <xsl:text>true</xsl:text> + </xsl:attribute> </xsl:if> <!-- stereotypes --> <xsl:for-each select="//child::*[@base_Class = current()/@xmi:id]"> <xsl:element name="stereotype"> <xsl:attribute name="name"> - <xsl:value-of select="local-name()" /> - </xsl:attribute> + <xsl:value-of select="local-name()" /> + </xsl:attribute> </xsl:element> </xsl:for-each> @@ -111,7 +119,6 @@ <xsl:with-param name="parent" select="current()" /> </xsl:call-template> - <!-- interfaces --> <xsl:apply-templates select="interfaceRealization" /> @@ -124,6 +131,13 @@ <!-- operations --> <xsl:apply-templates select="ownedOperation" /> + <!-- inner classes --> + <xsl:for-each select="nestedClassifier[@xmi:type='uml:Class']"> + <xsl:call-template name="UMLClass"> + <xsl:with-param name="parentLocalPackageName" select="$parentLocalPackageName" /> + </xsl:call-template> + </xsl:for-each> + <!-- associations , Association & AssociationClass --> <xsl:call-template name="UMLAssociations" /> @@ -193,17 +207,17 @@ <xsl:element name="interface"> <!-- interface properties --> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:value-of select="@name" /> + </xsl:attribute> <xsl:attribute name="package"> - <xsl:value-of select="$parentLocalPackageName" /> - </xsl:attribute> + <xsl:value-of select="$parentLocalPackageName" /> + </xsl:attribute> <xsl:if test="@isAbstract='true'"> <xsl:attribute name="abstract"> - <xsl:text>true</xsl:text> - </xsl:attribute> + <xsl:text>true</xsl:text> + </xsl:attribute> </xsl:if> <!-- stereotypes --> @@ -211,8 +225,8 @@ select="//child::*[@base_Interface = current()/@xmi:id]"> <xsl:element name="stereotype"> <xsl:attribute name="name"> - <xsl:value-of select="local-name()" /> - </xsl:attribute> + <xsl:value-of select="local-name()" /> + </xsl:attribute> </xsl:element> </xsl:for-each> @@ -238,9 +252,9 @@ <xsl:element name="interface"> <xsl:attribute name="name"> <xsl:call-template name="supplierName"> - <xsl:with-param name="parent" select="current()" /> + <xsl:with-param name="parent" select="current()" /> </xsl:call-template> - </xsl:attribute> + </xsl:attribute> </xsl:element> </xsl:template> @@ -249,22 +263,22 @@ <xsl:element name="superclass"> <xsl:attribute name="name"> - <xsl:choose> - <xsl:when test="general"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="general" /> - </xsl:call-template> - </xsl:when> + <xsl:choose> + <xsl:when test="general"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="general" /> + </xsl:call-template> + </xsl:when> - <xsl:when test="@general"> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" + <xsl:when test="@general"> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="//uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=current()/@general]" /> - </xsl:call-template> - </xsl:when> - </xsl:choose> + </xsl:call-template> + </xsl:when> + </xsl:choose> - </xsl:attribute> + </xsl:attribute> </xsl:element> </xsl:template> @@ -294,8 +308,8 @@ <xsl:template match="ownedLiteral"> <xsl:element name="literal"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:value-of select="@name" /> + </xsl:attribute> <!-- Documentation... Not yet supported by the memory representation--> <!-- @@ -317,8 +331,8 @@ <xsl:if test="@isStatic"> <xsl:attribute name="static"> - <xsl:value-of select="@isStatic" /> - </xsl:attribute> + <xsl:value-of select="@isStatic" /> + </xsl:attribute> </xsl:if> <xsl:choose> @@ -340,8 +354,8 @@ <xsl:element name="operation"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:value-of select="@name" /> + </xsl:attribute> <xsl:choose> <xsl:when test="@visibility"> @@ -356,10 +370,16 @@ <xsl:if test="@isAbstract='true'"> <xsl:attribute name="abstract"> - <xsl:text>true</xsl:text> - </xsl:attribute> + <xsl:text>true</xsl:text> + </xsl:attribute> </xsl:if> + <xsl:if test="@isStatic"> + <xsl:attribute name="static"> + <xsl:value-of select="@isStatic" /> + </xsl:attribute> + </xsl:if> + <!-- operation parameters --> <xsl:for-each select="ownedParameter"> <xsl:choose> @@ -371,8 +391,8 @@ <xsl:otherwise> <xsl:element name="parameter"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:value-of select="@name" /> + </xsl:attribute> <xsl:call-template name="UMLParameter" /> </xsl:element> </xsl:otherwise> @@ -385,10 +405,10 @@ <xsl:for-each select="raisedException"> <xsl:element name="exceptionParameter"> <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="." /> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="." /> + </xsl:call-template> + </xsl:attribute> </xsl:element> </xsl:for-each> </xsl:when> @@ -437,11 +457,11 @@ <xsl:when test="$value != ''"> <xsl:element name="exceptionParameter"> <xsl:attribute name="type"> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="//uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=$value]" /> - </xsl:call-template> - </xsl:attribute> + </xsl:call-template> + </xsl:attribute> </xsl:element> </xsl:when> </xsl:choose> @@ -491,20 +511,20 @@ <xsl:choose> <xsl:when test="type"> <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="type" /> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="type" /> + </xsl:call-template> + </xsl:attribute> </xsl:when> <xsl:when test="@type"> <xsl:attribute name="type"> - <xsl:variable name="typeref" + <xsl:variable name="typeref" select="//uml:Model/descendant::packagedElement[@xmi:type='uml:Enumeration' or @xmi:type='uml:DataType' or @xmi:type='uml:Class' or @xmi:type='uml:Interface' or @xmi:type='uml:PrimitiveType'][@xmi:id=current()/@type]" /> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" select="$typeref" /> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="$typeref" /> + </xsl:call-template> + </xsl:attribute> </xsl:when> </xsl:choose> @@ -573,30 +593,30 @@ <xsl:choose> <xsl:when test="$endnode/type"> <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="$endnode/type" /> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="$endnode/type" /> + </xsl:call-template> + </xsl:attribute> </xsl:when> <xsl:when test="$endnode/@type"> <xsl:attribute name="type"> - <xsl:variable name="typeref" + <xsl:variable name="typeref" select="//uml:Model/descendant::packagedElement[@xmi:type='uml:Enumeration' or @xmi:type='uml:DataType' or @xmi:type='uml:Class' or @xmi:type='uml:Interface'][@xmi:id=$endnode/@type]" /> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" select="$typeref" /> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="$typeref" /> + </xsl:call-template> + </xsl:attribute> </xsl:when> </xsl:choose> <xsl:attribute name="reverseAttributeName"> - <xsl:value-of select="$reversenode/@name" /> - </xsl:attribute> + <xsl:value-of select="$reversenode/@name" /> + </xsl:attribute> <xsl:attribute name="reverseMaxMultiplicity"> - <xsl:choose> - <xsl:when test="$reversenode/upperValue/@value"> + <xsl:choose> + <xsl:when test="$reversenode/upperValue/@value"> <xsl:choose> <xsl:when test="$reversenode/upperValue/@value='*'"> <xsl:text>-1</xsl:text> @@ -605,17 +625,17 @@ <xsl:value-of select="$reversenode/upperValue/@value" /> </xsl:otherwise> </xsl:choose> - </xsl:when> - <xsl:otherwise> - <xsl:text>-1</xsl:text> - </xsl:otherwise> - </xsl:choose> - </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:text>-1</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> <xsl:if test="$endnode/@aggregation"> <xsl:attribute name="associationType"> - <xsl:value-of select="$endnode/@aggregation" /> - </xsl:attribute> + <xsl:value-of select="$endnode/@aggregation" /> + </xsl:attribute> </xsl:if> <xsl:call-template name="multiplicities"> @@ -623,13 +643,13 @@ </xsl:call-template> <xsl:attribute name="navigable"> - <xsl:value-of select="contains(parent::packagedElement/@navigableOwnedEnd, $endnode/@xmi:id)"/> + <xsl:value-of select="contains(parent::packagedElement/@navigableOwnedEnd, $endnode/@xmi:id)"/> </xsl:attribute> <xsl:if test="$endnode/@isOrdered"> <xsl:attribute name="ordering"> - <xsl:text>ordered</xsl:text> - </xsl:attribute> + <xsl:text>ordered</xsl:text> + </xsl:attribute> </xsl:if> <!-- stereotypes --> @@ -820,16 +840,16 @@ </xsl:when> <xsl:otherwise> <!-- Dans les modeles externes, le cas est different, FQN seulement pour les types non primitifs --> - <xsl:choose> - <xsl:when test="$node/@xmi:type = 'uml:PrimitiveType'"> - <xsl:value-of select="document($external-url)/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]/@name" /> - </xsl:when> - <xsl:otherwise> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" select="document($external-url)/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]" /> - </xsl:call-template> - </xsl:otherwise> - </xsl:choose> + <xsl:choose> + <xsl:when test="$node/@xmi:type = 'uml:PrimitiveType'"> + <xsl:value-of select="document($external-url)/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]/@name" /> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="document($external-url)/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]" /> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> <!-- / fin du cas particulier --> </xsl:otherwise> </xsl:choose> Modified: trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI21ToObjectModelTest.java =================================================================== --- trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI21ToObjectModelTest.java 2009-09-21 16:56:15 UTC (rev 627) +++ trunk/eugene/src/test/java/org/nuiton/eugene/xmi/objectmodel/XMI21ToObjectModelTest.java 2009-09-21 20:17:46 UTC (rev 628) @@ -147,7 +147,7 @@ assertNotNull(model); assertEquals("XMITest21", model.getName()); - assertEquals(14, model.getClassifiers().size()); + assertEquals(15, model.getClassifiers().size()); // ClassB ObjectModelClass clazzB = model.getClass("org.nuiton.eugene.test21.ClassB"); @@ -453,6 +453,12 @@ assertTrue(strings.isStatic()); assertEquals("azerty",strings.getDefaultValue()); + // static operation + ObjectModelClass classD = model.getClass("org.nuiton.eugene.test21.ClassD"); + assertNotNull(classD); + List<ObjectModelOperation> operations = (List<ObjectModelOperation>)classD.getOperations("getInstance"); + assertEquals(operations.size(), 1); + assertTrue(operations.get(0).isStatic()); } /** @@ -483,6 +489,35 @@ } /** + * Apply XSL stylesheet on a topcased model. + * Test for InnerClasses + * + * @throws URISyntaxException + * @throws IOException + * @throws TransformerException + */ + @Test + public void testTestXMI21InnerClasses() throws URISyntaxException, IOException, + TransformerException { + + ObjectModel model = xmiToObjectModel("TestXMI21"); + + // OuterClass + ObjectModelClass outer = model.getClass("org.nuiton.eugene.test21.OuterClass"); + + List<ObjectModelClass> inners = (List<ObjectModelClass>)outer.getInnerClasses(); + assertNotNull(inners); + assertEquals(inners.size(), 1); + + // InnerClass + ObjectModelClass inner = inners.get(0); + assertNotNull(inner); + assertNotNull(inner.getDeclaringElement()); + assertEquals(inner.getDeclaringElement().getName(), "OuterClass"); + assertTrue(inner.isInner()); + } + + /** * Apply XSL stylesheet on TestXMI21 * Check documentation tags on model, class, attribute, operation and enumerations */ Modified: trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.uml =================================================================== --- trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.uml 2009-09-21 16:56:15 UTC (rev 627) +++ trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.uml 2009-09-21 20:17:46 UTC (rev 628) @@ -228,6 +228,9 @@ <ownedLiteral xmi:id="_BGl0IGWBEd64qsCRqbn5Bg" name="Literal1"/> <ownedLiteral xmi:id="_B75EcmWBEd64qsCRqbn5Bg" name="Literal2"/> </packagedElement> + <packagedElement xmi:type="uml:Class" xmi:id="_O-CukKbcEd6m3c2K_Ke8nQ" name="OuterClass"> + <nestedClassifier xmi:type="uml:Class" xmi:id="_uUWDEKbcEd6m3c2K_Ke8nQ" name="InnerClass"/> + </packagedElement> <profileApplication xmi:id="_7Jv4UP6gEd2zEeRO-8Et9Q"> <eAnnotations xmi:id="_7Jv4Uf6gEd2zEeRO-8Et9Q" source="http://www.eclipse.org/uml2/2.0.0/UML"> <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Standard.profile.uml#_yzU58YinEdqtvbnfB2L_5w"/> Modified: trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.umldi =================================================================== --- trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.umldi 2009-09-21 16:56:15 UTC (rev 627) +++ trunk/eugene/src/test/resources/xmi/2.1/TestXMI21.umldi 2009-09-21 20:17:46 UTC (rev 628) @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <diagrams:Diagrams xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.topcased.org/DI/1.0" xmlns:diagrams="http://www.topcased.org/Diagrams/1.0" xmi:id="__zkfAf3jEd2LebRc8diKJw" activeDiagram="__zpXgP3jEd2LebRc8diKJw"> <model href="TestXMI21.uml#_w8IxIM37EdqwVrslYOdUDA"/> - <diagrams xmi:id="__zpXgP3jEd2LebRc8diKJw" position="0,0" size="100,100" name="CDTest21" viewport="0,80"> + <diagrams xmi:id="__zpXgP3jEd2LebRc8diKJw" position="0,0" size="100,100" name="CDTest21" viewport="0,358"> <property xmi:id="__7azcP3jEd2LebRc8diKJw" key="pageFormatName" value="A4"/> <property xmi:id="__7azcf3jEd2LebRc8diKJw" key="diagramWidth" value="840"/> <property xmi:id="__7azcv3jEd2LebRc8diKJw" key="diagramHeight" value="1188"/> @@ -14,7 +14,7 @@ <semanticModel xsi:type="di:EMFSemanticModelBridge" xmi:id="__zqloP3jEd2LebRc8diKJw" presentation="org.topcased.modeler.uml.classdiagram"> <element href="TestXMI21.uml#_w8IxIM37EdqwVrslYOdUDA"/> </semanticModel> - <contained xsi:type="di:GraphNode" xmi:id="_NM0cAP58Ed2zEeRO-8Et9Q" position="237,149" size="253,-1"> + <contained xsi:type="di:GraphNode" xmi:id="_NM0cAP58Ed2zEeRO-8Et9Q" position="125,149" size="365,-1"> <anchorage xmi:id="_X7T_AP58Ed2zEeRO-8Et9Q" graphEdge="_X7Y3gP58Ed2zEeRO-8Et9Q _YbdesP58Ed2zEeRO-8Et9Q _eo4qQP58Ed2zEeRO-8Et9Q _hujasP58Ed2zEeRO-8Et9Q"/> <semanticModel xsi:type="di:EMFSemanticModelBridge" xmi:id="_NM0cAf58Ed2zEeRO-8Et9Q" presentation="default"> <element href="TestXMI21.uml#_NNUyUP58Ed2zEeRO-8Et9Q"/> @@ -523,5 +523,22 @@ </contained> </contained> </contained> + <contained xsi:type="di:GraphNode" xmi:id="_O992EKbcEd6m3c2K_Ke8nQ" position="190,604" size="100,-1"> + <semanticModel xsi:type="di:EMFSemanticModelBridge" xmi:id="_O992EabcEd6m3c2K_Ke8nQ" presentation="default"> + <element href="TestXMI21.uml#_O-CukKbcEd6m3c2K_Ke8nQ"/> + </semanticModel> + <contained xsi:type="di:GraphNode" xmi:id="_O992EqbcEd6m3c2K_Ke8nQ"> + <property xmi:id="_O992E6bcEd6m3c2K_Ke8nQ" key="eStructuralFeatureID" value="37"/> + <semanticModel xsi:type="di:EMFSemanticModelBridge" xmi:id="_O992FKbcEd6m3c2K_Ke8nQ" presentation="default"> + <element href="TestXMI21.uml#_O-CukKbcEd6m3c2K_Ke8nQ"/> + </semanticModel> + </contained> + <contained xsi:type="di:GraphNode" xmi:id="_O992FabcEd6m3c2K_Ke8nQ"> + <property xmi:id="_O992FqbcEd6m3c2K_Ke8nQ" key="eStructuralFeatureID" value="47"/> + <semanticModel xsi:type="di:EMFSemanticModelBridge" xmi:id="_O992F6bcEd6m3c2K_Ke8nQ" presentation="default"> + <element href="TestXMI21.uml#_O-CukKbcEd6m3c2K_Ke8nQ"/> + </semanticModel> + </contained> + </contained> </diagrams> </diagrams:Diagrams>