Display XWikiClass UML Diagram
Version 11.2 by Jeremie Bousquet on 2014/04/14 16:12
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($showSheets = $request.showSheets)
#set($showLists = $request.showLists)
#set($code = $request.code)
#set($xwql = "select doc.fullName from Document doc where doc.space='$space'")
#set($docs = $xwiki.wrapDocs($services.query.xwql($xwql).execute()))
#if($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.name {
#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 && $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($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($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:
The same with options showLists and showSheets: