Display XWikiClass UML Diagram

Version 9.5 by Vincent Massol on 2013/06/07 10:00

cogGenerates nice UML diagram for XWiki Classes of a specific space using plantuml macro
Typesnippet
Category
Developed by

Jeremie Bousquet

Rating
0 Votes
LicenseGNU Lesser General Public License 2.1

Table of contents

Description

  • Put the following code in a page:
    {{velocity wiki="true"}}
    #set($space = $request.space)

    #set($xwql = "select doc.fullName from Document doc where doc.space='$space'")
    #set($docs = $xwiki.wrapDocs($services.query.xwql($xwql).execute()))
    #if($request.code)
    {{code}}
    #end
    {{plantuml}}
    hide methods
    package $space
    #foreach($document in $docs)
      #set($deps = [])
      #set($static = [])
      #set($baseclazz = $!document.getxWikiClass().getXWikiClass())
      #if($!baseclazz)
        #set($props = $baseclazz.getEnabledProperties())
        #if($props.size() > 0)
    class $document.fullName {
          #foreach($prop in $baseclazz.getEnabledProperties())
    +$prop.getClassType() $prop.getName()
            #if($prop.class.name == "com.xpn.xwiki.objects.classes.DBListClass" && "$!prop.getClassname()" != "")
              #if($prop.isMultiSelect())
                #set($discard = $deps.add([$prop.getClassname(), true, $prop.name]))
              #else
                #set($discard = $deps.add([$prop.getClassname(), false, $prop.name]))
              #end
            #end
            #if($prop.class.name == "com.xpn.xwiki.objects.classes.StaticListClass")
              #set($discard = $static.add($prop))
            #end
          #end
    } ## end class

        #end
        #if($deps.size() > 0)
          #foreach($dep in $deps)
    $document.fullName "1" o-- #if($dep[1]) "0..n" #else "0..1" #end $dep[0] : $dep[2]

          #end
        #end
        #if($static.size() > 0 && $request.showLists)
          #foreach($prop in $static)
    enum "${document.name}.$prop.name" as ${document.name}$prop.name {
            #foreach($val in $prop.getList($xcontext.context))
     +$val
            #end
    }
    $document.fullName o-- ${document.name}$prop.name
          #end
        #end
        #if($request.showSheets)
          #set($sheets = $document.getObjects('XWiki.ClassSheetBinding'))
          #foreach($sheet in $sheets)
            #set($start = 0)
            #if($sheet.sheet.indexOf('.')>0)
              #set($start = 1 + ${sheet.sheet.indexOf('.')})
              #set($sheetname = $sheet.sheet.substring($start))
            #else
              #set($sheetname = $sheet.sheet)
            #end
    class $sheetname << (S,orchid) >> {
    }
    hide $sheetname members

    $document.fullName o-- $sheetname

          #end
        #end
      #end
    #end
    {{/plantuml}}
    #if($request.code)
    {{/code}}
    #end
    {{/velocity}}
  • Save that page
  • Append "?space=<space name>" to generate and display UML class diagram for classes found from that space
  • Append "&code=true" to previous url to only display generated plantuml macro code (and not generate image). This can be useful if you want to update the diagram "by hand".
  • Append "&showLists=true" to display the static lists fields values (as Enums)
  • Append "&showSheets=true" to display the bound sheets information (as fake "S" classes)

Current snippet can (should) be improved, but result is already nice. Associations are displayed (only for DBList properties having class name filled, so if you fill HQL query, please also specify class name for better display).

Sample result:

sample_uml.png

The same with options showLists and showSheets:

sample_uml_full.png

Get Connected