Display XWikiClass UML Diagram
Version 6.1 by Jeremie Bousquet on 2013/05/29 08:23
Generates nice UML diagram for XWiki Classes of a specific space using plantuml macro |
Type | snippet |
Category | |
Developed by | |
Rating | |
License | GNU 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}}
package $space
#foreach($document in $docs)
#set($deps = [])
#set($multi = [])
#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
#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
#end
#end
{{/plantuml}}
#if($request.code)
{{/code}}
#end
{{/velocity}}
#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}}
package $space
#foreach($document in $docs)
#set($deps = [])
#set($multi = [])
#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
#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
#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".
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 feel HQL query, please also specify class name for better display).
Sample result: