Author: schorlet Date: 2009-02-06 09:49:12 +0000 (Fri, 06 Feb 2009) New Revision: 416 Modified: lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl Log: ajout de templates pour interfaceRealization et generalization Modified: lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl =================================================================== --- lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl 2009-02-05 14:43:52 UTC (rev 415) +++ lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl 2009-02-06 09:49:12 UTC (rev 416) @@ -74,6 +74,12 @@ <xsl:value-of select="@xmi.id" /> </xsl:variable> + <xsl:if test="@isAbstract='true'"> + <xsl:attribute name="abstract"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> + <xsl:element name="class"> <!-- class properties --> <xsl:attribute name="name"> @@ -94,15 +100,43 @@ </xsl:element> </xsl:for-each> - <!-- class attributes --> + <!-- interfaces --> + <xsl:apply-templates select="interfaceRealization" /> + + <!-- extends --> + <xsl:apply-templates select="generalization" /> + + <!-- attributes --> <xsl:apply-templates select="ownedAttribute" /> - <!-- class operations --> + <!-- operations --> <xsl:apply-templates select="ownedOperation" /> </xsl:element> </xsl:template> + <xsl:template match="interfaceRealization"> + + <xsl:element name="interface"> + <xsl:attribute name="name"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="childpath">supplier</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:element> + </xsl:template> + + <xsl:template match="generalization"> + + <xsl:element name="superclass"> + <xsl:attribute name="name"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="childpath">general</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:element> + </xsl:template> + <xsl:template match="ownedAttribute"> <xsl:element name="attribute"> @@ -110,11 +144,7 @@ <xsl:value-of select="@name" /> </xsl:attribute> - <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="childpath">type</xsl:with-param> - </xsl:call-template> - </xsl:attribute> + <xsl:call-template name="UMLParameter" /> </xsl:element> </xsl:template> @@ -129,10 +159,17 @@ <xsl:for-each select="ownedParameter"> <xsl:choose> <xsl:when test="@direction = 'return'"> - <xsl:call-template name="UMLReturnParameter" /> + <xsl:element name="returnParameter"> + <xsl:call-template name="UMLParameter" /> + </xsl:element> </xsl:when> <xsl:otherwise> - <xsl:call-template name="UMLParameter" /> + <xsl:element name="parameter"> + <xsl:attribute name="name"> + <xsl:value-of select="@name" /> + </xsl:attribute> + <xsl:call-template name="UMLParameter" /> + </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:for-each> @@ -140,73 +177,57 @@ </xsl:element> </xsl:template> - + <!-- . Named templates --> + + <!-- + called by ownedAttribute and ownedOperation + --> <xsl:template name="UMLParameter"> + + <xsl:choose> + <xsl:when test="type"> + <xsl:attribute name="type"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="childpath">type</xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:when> - <xsl:element name="parameter"> - <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> + <xsl:when test="@type"> + <xsl:attribute name="type"> + <xsl:variable name="typeref" + select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class' or @xmi:type='uml:DataType' or @xmi:type='uml:Enumeration'][@xmi:id=current()/@type]" /> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" + select="$typeref" /> + </xsl:call-template> + </xsl:attribute> + </xsl:when> - <xsl:choose> - <xsl:when test="type"> - <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="childpath">type</xsl:with-param> - </xsl:call-template> - </xsl:attribute> - </xsl:when> - - <xsl:when test="@type"> - <xsl:attribute name="type"> - <xsl:variable name="typeref" - select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=current()/@type]" /> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" - select="$typeref" /> - </xsl:call-template> - </xsl:attribute> - </xsl:when> - - </xsl:choose> - </xsl:element> + </xsl:choose> </xsl:template> - <xsl:template name="UMLReturnParameter"> - <xsl:element name="returnParameter"> - - <xsl:choose> - <xsl:when test="type"> - <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="childpath">type</xsl:with-param> - </xsl:call-template> - </xsl:attribute> - </xsl:when> - - <xsl:when test="@type"> - <xsl:attribute name="type"> - <xsl:variable name="typeref" - select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=current()/@type]" /> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" - select="$typeref" /> - </xsl:call-template> - </xsl:attribute> - </xsl:when> - - </xsl:choose> - - </xsl:element> - </xsl:template> - + <!-- + node param must be a Xpath node. + the node designed by node param must have @xmi:type. + walks thru the model in order to print super package names. + print fullClassName of type designed by node param. + --> <xsl:template name="fullClassName2"> <xsl:param name="node" /> <xsl:choose> + <xsl:when test="$node[@xmi:type='uml:DataType']"> + <xsl:value-of select="$node/@name" /> + </xsl:when> + + <xsl:when test="$node[@xmi:type='uml:Enumeration']"> + <xsl:value-of select="$node/@name" /> + </xsl:when> + <xsl:when test="$node[@xmi:type = 'uml:Class']"> <xsl:call-template name="fullClassName2"> <xsl:with-param name="node" @@ -215,6 +236,14 @@ <xsl:value-of select="$node/@name" /> </xsl:when> + <xsl:when test="$node[@xmi:type = 'uml:Interface']"> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" + select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']" /> + </xsl:call-template> + <xsl:value-of select="$node/@name" /> + </xsl:when> + <xsl:when test="$node[@xmi:type='uml:Package']"> <xsl:choose> <xsl:when @@ -240,6 +269,11 @@ </xsl:choose> </xsl:template> + <!-- + childpath param must be a Xpath relative path. + the node designed by childpath param must have @xmi:type and @href attributes. + print fullClassName of type designed by childpath param (helped by fullClassName2 template). + --> <xsl:template name="fullClassName"> <xsl:param name="childpath" /> <xsl:variable name="child" @@ -247,12 +281,28 @@ <xsl:if test="$child"> <xsl:variable name="typeref" select="$child/@href" /> + <xsl:choose> <xsl:when test="$child/@xmi:type = 'uml:PrimitiveType'"> <xsl:value-of select="substring-after($typeref, '#')" /> </xsl:when> + + <xsl:when + test="$child/@xmi:type = 'uml:Enumeration'"> + <xsl:variable name="external-url" + select="substring-before($typeref, '#')" /> + <xsl:variable name="external-id" + select="substring-after($typeref, '#')" /> + <xsl:call-template name="fullClassName2"> + <!-- TODO: create resolver for external resources --> + <!-- WARING: specific code --> + <xsl:with-param name="node" + select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Enumeration'][@xmi:id=$external-id]" /> + </xsl:call-template> + </xsl:when> + <xsl:when test="$child/@xmi:type = 'uml:Class'"> <xsl:variable name="external-url" select="substring-before($typeref, '#')" /> @@ -260,10 +310,24 @@ select="substring-after($typeref, '#')" /> <xsl:call-template name="fullClassName2"> <!-- TODO: create resolver for external resources --> + <!-- WARING: specific code --> <xsl:with-param name="node" - select="document(concat('file:///home/sch/tmp/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=$external-id]" /> + select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=$external-id]" /> </xsl:call-template> </xsl:when> + + <xsl:when test="$child/@xmi:type = 'uml:Interface'"> + <xsl:variable name="external-url" + select="substring-before($typeref, '#')" /> + <xsl:variable name="external-id" + select="substring-after($typeref, '#')" /> + <xsl:call-template name="fullClassName2"> + <!-- TODO: create resolver for external resources --> + <!-- WARING: specific code --> + <xsl:with-param name="node" + select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Interface'][@xmi:id=$external-id]" /> + </xsl:call-template> + </xsl:when> </xsl:choose> </xsl:if> </xsl:template>