You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/01/23 06:38:20 UTC
[isis] 01/01: ISIS-2443: adding in TODOs for domain annot and
domain layout annot menus
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2443
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 49f6702821fd8e33fccb3b92172f6571b3c1db84
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Jan 23 06:37:38 2021 +0000
ISIS-2443: adding in TODOs for domain annot and domain layout annot menus
---
.../demoapp/dom/annotDomain/Action/ActionMenu.java | 7 +-
.../dom/annotDomain/Collection/CollectionMenu.java | 16 +-
.../annotDomain/DomainObject/DomainObjectMenu.java | 54 +-
.../dom/annotDomain/Property/PropertyMenu.java | 4 +-
.../annotLayout/ActionLayout/ActionLayoutMenu.java | 49 ++
.../annotLayout/ActionLayout/describedAs/.gitkeep | 0
.../CollectionLayout/CollectionLayoutMenu.java | 58 +-
.../DomainObjectLayout/DomainObjectLayoutMenu.java | 75 ++-
.../src/main/java/demoapp/dom/menubars.layout.xml | 53 +-
.../{TooltipMenu.java => DescribedAsMenu.java} | 7 +-
.../XmlSnapshotParentVm-description.adoc | 46 +-
.../XmlSnapshotParentVm-description.html | 592 +++++++++++++++++++++
.../core/xmlSnapshotService/class-diagram.svg | 37 ++
.../src/main/resources/static/css/application.css | 1 +
14 files changed, 932 insertions(+), 67 deletions(-)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
index 5005da6..1e89707 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
@@ -44,7 +44,6 @@ import demoapp.dom.annotDomain.Action.typeOf.ActionTypeOfVm;
import demoapp.dom.annotDomain.Action.typeOf.child.ActionTypeOfChildVm;
@DomainService(nature=NatureOfService.VIEW, objectType = "demo.ActionMenu")
-//@Log4j2
@RequiredArgsConstructor(onConstructor_ = {@Inject})
public class ActionMenu {
@@ -78,7 +77,7 @@ public class ActionMenu {
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples interaction of actions")
+ @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Class of the domain event emitted when interacting with the action")
public ActionDomainEventVm domainEvent(){
return new ActionDomainEventVm("value");
}
@@ -88,7 +87,7 @@ public class ActionMenu {
public ActionExecutionPublishingJdo executionPublishing(){
return actionPublishingJdoEntities.first();
}
-
+
@Action(semantics = SemanticsOf.SAFE)
@ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of actions")
public ActionHiddenVm hidden(){
@@ -108,7 +107,7 @@ public class ActionMenu {
}
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa="fa-square", describedAs = "Semantic relationship between actions and other properties or collections")
+ @ActionLayout(cssClassFa="fa-shapes", describedAs = "Semantic relationship between actions and other properties or collections")
public ActionTypeOfVm typeOf(){
val typeOfVm = new ActionTypeOfVm();
val children = typeOfVm.getChildren();
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java
index 2de4cda..59195c7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Collection/CollectionMenu.java
@@ -42,7 +42,7 @@ public class CollectionMenu {
final FactoryService factoryService;
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples interaction of collections")
+ @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Class of the domain event emitted when interacting with the collection")
public CollectionDomainEventVm domainEvent(){
val collectionDomainEventVm = new CollectionDomainEventVm();
@@ -53,6 +53,20 @@ public class CollectionMenu {
return collectionDomainEventVm;
}
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of collections"
+ , named = "Hidden (TODO)"
+ )
+ public void hidden(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-shapes", describedAs = "Element type of collections"
+ , named = "Type of (TODO)"
+ )
+ public void typeOf(){
+ }
+
private CollectionDomainEventVm_addChild addChild(CollectionDomainEventVm collectionDomainEventVm) {
return factoryService.mixin(CollectionDomainEventVm_addChild.class, collectionDomainEventVm);
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
index e4b9850..e91468d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
@@ -39,13 +39,41 @@ import demoapp.dom.annotDomain.DomainObject.nature.viewmodels.usingjaxb.Stateful
public class DomainObjectMenu {
@Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-question-circle", describedAs = "Search object in prompt"
+ , named = "Auto Complete (TODO)"
+ )
+ public void autoComplete(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-list-ul", describedAs = "Choose 'reference data' object (one of a bounded set) in prompt"
+ , named = "Bounded (TODO)"
+ )
+ public void bounded(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-pencil-alt", describedAs = "Default editability of properties"
+ , named = "Editing (TODO)"
+ )
+ public void editing() {
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
@ActionLayout(cssClassFa="fa-book", describedAs = "Entity changed events as XML")
public DomainObjectEntityChangePublishingVm entityChangePublishing(){
return new DomainObjectEntityChangePublishingVm();
}
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa = "gamepad")
+ @ActionLayout(cssClassFa="fa-tools", describedAs = "For mixins, override the default method name"
+ , named = "Mixin method (TODO)"
+ )
+ public void mixinMethod() {
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa = "fa-gamepad", describedAs = "@DomainObject(nature=VIEW_MODEL) for a Stateful View Model")
public StatefulVmUsingJaxb natureStateful(final String message) {
val viewModel = new StatefulVmUsingJaxb();
viewModel.setMessage(message);
@@ -56,12 +84,34 @@ public class DomainObjectMenu {
}
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa = "gamepad")
+ @ActionLayout(cssClassFa = "fa-gamepad", describedAs = "@DomainObject(nature=VIEW_MODEL) for a Stateful View Model referencing an entity")
public StatefulVmJaxbRefsEntity natureStatefulRefsEntity(final String message) {
val viewModel = new StatefulVmJaxbRefsEntity();
viewModel.setMessage(message);
return viewModel;
}
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-circle", describedAs = "Explicitly specify the object type alias"
+ , named = "Object type (TODO)"
+ )
+ public void objectType() {
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Default class of the domain event emitted when interacting with the domain object's actions, properties or collections"
+ , named = "??? Domain Event (TODO)"
+ )
+ public void xxxDomainEvent() {
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-redo", describedAs = "Class of the lifecycle event emitted when the domain entity transitions through its persistence lifecycle"
+ , named = "??? Lifecycle Event (TODO)"
+ )
+ public void xxxLifecycleEvent() {
+ }
+
public String default0NatureStatefulRefsEntity() {
return "Some initial state";
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
index 4e29579..83b55d6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
@@ -30,7 +30,6 @@ import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.value.Blob;
import org.apache.isis.applib.value.Clob;
-import demoapp.dom.annotDomain.Property.snapshot.PropertySnapshotVm;
import lombok.RequiredArgsConstructor;
import lombok.val;
@@ -50,6 +49,7 @@ import demoapp.dom.annotDomain.Property.projecting.PropertyProjectingVm;
import demoapp.dom.annotDomain.Property.projecting.child.PropertyProjectingChildVm;
import demoapp.dom.annotDomain.Property.projecting.jdo.PropertyProjectingChildJdoEntities;
import demoapp.dom.annotDomain.Property.regexPattern.PropertyRegexPatternVm;
+import demoapp.dom.annotDomain.Property.snapshot.PropertySnapshotVm;
import demoapp.dom.types.Samples;
@DomainService(nature=NatureOfService.VIEW, objectType = "demo.PropertyMenu")
@@ -70,7 +70,7 @@ public class PropertyMenu {
}
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples interaction of properties")
+ @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Class of the domain event emitted when interacting with the property")
public PropertyDomainEventVm domainEvent(){
return new PropertyDomainEventVm("change me");
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java
index 73c0282..7ff4af7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java
@@ -31,6 +31,48 @@ import lombok.extern.log4j.Log4j2;
public class ActionLayoutMenu {
@Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-bookmark", describedAs = "Xxx"
+ , named = "Bookmarking (TODO)"
+ )
+ public void bookmarking(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "CSS Class (TODO)"
+ )
+ public void cssClass(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "CSS Class FA (TODO)"
+ )
+ public void cssClassFa(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Described As (TODO)"
+ )
+ public void describedAs(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Hidden (TODO)"
+ )
+ public void hidden(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Named (TODO)"
+ )
+ public void named(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
@ActionLayout(cssClassFa="fa-map-pin", describedAs = "Position of action buttons")
public demoapp.dom.annotLayout.ActionLayout.position.ActionLayoutPositionVm position(){
return new demoapp.dom.annotLayout.ActionLayout.position.ActionLayoutPositionVm();
@@ -42,5 +84,12 @@ public class ActionLayoutMenu {
return new demoapp.dom.annotLayout.ActionLayout.promptStyle.ActionLayoutPromptStyleVm();
}
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Redirect Policy (TODO)"
+ )
+ public void redirectPolicy(){
+ }
+
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/describedAs/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/describedAs/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/CollectionLayout/CollectionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/CollectionLayout/CollectionLayoutMenu.java
index fe47576..8c8d89b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/CollectionLayout/CollectionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/CollectionLayout/CollectionLayoutMenu.java
@@ -18,20 +18,66 @@
*/
package demoapp.dom.annotLayout.CollectionLayout;
-import javax.inject.Inject;
-
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.annotation.SemanticsOf;
import lombok.extern.log4j.Log4j2;
-import demoapp.dom.types.Samples;
-
@DomainService(nature=NatureOfService.VIEW, objectType = "demo.CollectionLayoutMenu")
@Log4j2
public class CollectionLayoutMenu {
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "CSS Class (TODO)"
+ )
+ public void cssClass(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Default View (TODO)"
+ )
+ public void defaultView(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Described As (TODO)"
+ )
+ public void describedAs(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Hidden (TODO)"
+ )
+ public void hidden(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Named (TODO)"
+ )
+ public void named(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Paged (TODO)"
+ )
+ public void paged(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Sorted By (TODO)"
+ )
+ public void sortedBy(){
+ }
+
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/DomainObjectLayout/DomainObjectLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/DomainObjectLayout/DomainObjectLayoutMenu.java
index 1763dc4..34168d0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/DomainObjectLayout/DomainObjectLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/DomainObjectLayout/DomainObjectLayoutMenu.java
@@ -18,35 +18,74 @@
*/
package demoapp.dom.annotLayout.DomainObjectLayout;
-import javax.inject.Inject;
-
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.value.Blob;
-import lombok.val;
import lombok.extern.log4j.Log4j2;
-import demoapp.dom.annotLayout.PropertyLayout.cssClass.PropertyLayoutCssClassVm;
-import demoapp.dom.annotLayout.PropertyLayout.describedAs.PropertyLayoutDescribedAsVm;
-import demoapp.dom.annotLayout.PropertyLayout.hidden.PropertyLayoutHiddenVm;
-import demoapp.dom.annotLayout.PropertyLayout.hidden.child.PropertyLayoutHiddenChildVm;
-import demoapp.dom.annotLayout.PropertyLayout.labelPosition.PropertyLayoutLabelPositionVm;
-import demoapp.dom.annotLayout.PropertyLayout.multiLine.PropertyLayoutMultiLineVm;
-import demoapp.dom.annotLayout.PropertyLayout.named.PropertyLayoutNamedVm;
-import demoapp.dom.annotLayout.PropertyLayout.navigable.FileNodeVm;
-import demoapp.dom.annotLayout.PropertyLayout.renderDay.PropertyLayoutRenderDayVm;
-import demoapp.dom.annotLayout.PropertyLayout.repainting.PropertyLayoutRepaintingVm;
-import demoapp.dom.annotLayout.PropertyLayout.typicalLength.PropertyLayoutTypicalLengthVm;
-import demoapp.dom.types.Samples;
-
@DomainService(nature=NatureOfService.VIEW, objectType = "demo.DomainObjectLayoutMenu")
@Log4j2
public class DomainObjectLayoutMenu {
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-bookmark", describedAs = "Xxx"
+ , named = "Bookmarking (TODO)"
+ )
+ public void bookmarking(){
+ }
+
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "CSS Class (TODO)"
+ )
+ public void cssClass(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "CSS Class FA (TODO)"
+ )
+ public void cssClassFa(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Described As (TODO)"
+ )
+ public void describedAs(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Named (TODO)"
+ )
+ public void named(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Paged (TODO)"
+ )
+ public void paged(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "Plural (TODO)"
+ )
+ public void plural(){
+ }
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-xxx", describedAs = "Xxx"
+ , named = "??? UI Event (TODO)"
+ )
+ public void xxxUiEvent(){
+ }
+
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index ce0a40e..65a7581 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -121,13 +121,16 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
<mb3:named>Domain Annot</mb3:named>
<mb3:section>
<mb3:named>@DomainObject</mb3:named>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="autoComplete"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="bounded"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="editing"/>
<mb3:serviceAction objectType="demo.DomainObjectMenu" id="entityChangePublishing"/>
- <mb3:serviceAction objectType="demo.DomainObjectMenu" id="natureStateful">
- <cpt:describedAs>@DomainObject(nature=VIEW_MODEL) for a Stateful View Model</cpt:describedAs>
- </mb3:serviceAction>
- <mb3:serviceAction objectType="demo.DomainObjectMenu" id="natureStatefulRefsEntity">
- <cpt:describedAs>@DomainObject(nature=VIEW_MODEL) for a Stateful View Model referencing an entity</cpt:describedAs>
- </mb3:serviceAction>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="mixinMethod"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="natureStateful"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="natureStatefulRefsEntity"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="objectType"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="xxxDomainEvent"/>
+ <mb3:serviceAction objectType="demo.DomainObjectMenu" id="xxxLifecycleEvent"/>
</mb3:section>
<mb3:section>
<mb3:named>@Action</mb3:named>
@@ -141,10 +144,6 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
<mb3:serviceAction objectType="demo.ActionMenu" id="typeOf"/>
</mb3:section>
<mb3:section>
- <mb3:named>@Collection</mb3:named>
- <mb3:serviceAction objectType="demo.CollectionMenu" id="domainEvent"/>
- </mb3:section>
- <mb3:section>
<mb3:named>@Property</mb3:named>
<mb3:serviceAction objectType="demo.PropertyMenu" id="commandPublishing"/>
<mb3:serviceAction objectType="demo.PropertyMenu" id="domainEvent"/>
@@ -159,14 +158,38 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
<mb3:serviceAction objectType="demo.PropertyMenu" id="regexPattern"/>
<mb3:serviceAction objectType="demo.PropertyMenu" id="snapshot"/>
</mb3:section>
+ <mb3:section>
+ <mb3:named>@Collection</mb3:named>
+ <mb3:serviceAction objectType="demo.CollectionMenu" id="domainEvent"/>
+ <mb3:serviceAction objectType="demo.CollectionMenu" id="hidden"/>
+ <mb3:serviceAction objectType="demo.CollectionMenu" id="typeOf"/>
+ </mb3:section>
</mb3:menu>
<mb3:menu>
<mb3:named>Layout Annot</mb3:named>
<mb3:section>
+ <mb3:named>@DomainObjectLayout</mb3:named>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="bookmarking"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="cssClass"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="cssClassFa"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="describedAs"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="named"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="paged"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="plural"/>
+ <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="xxxUiEvent"/>
+ </mb3:section>
+ <mb3:section>
<mb3:named>@ActionLayout</mb3:named>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="bookmarking"/>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="cssClass"/>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="cssClassFa"/>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="describedAs"/>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="hidden"/>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="named"/>
<mb3:serviceAction objectType="demo.ActionLayoutMenu" id="position"/>
<mb3:serviceAction objectType="demo.ActionLayoutMenu" id="promptStyle"/>
+ <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="redirectPolicy"/>
</mb3:section>
<mb3:section>
<mb3:named>@PropertyLayout</mb3:named>
@@ -181,6 +204,16 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
<mb3:serviceAction objectType="demo.PropertyLayoutMenu" id="repainting"/>
<mb3:serviceAction objectType="demo.PropertyLayoutMenu" id="typicalLength"/>
</mb3:section>
+ <mb3:section>
+ <mb3:named>@CollectionLayout</mb3:named>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="cssClass"/>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="defaultView"/>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="describedAs"/>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="hidden"/>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="named"/>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="paged"/>
+ <mb3:serviceAction objectType="demo.CollectionLayoutMenu" id="sortedBy"/>
+ </mb3:section>
</mb3:menu>
<mb3:menu>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/misc/tooltip/TooltipMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/misc/tooltip/DescribedAsMenu.java
similarity index 94%
rename from examples/demo/domain/src/main/java/demoapp/dom/misc/tooltip/TooltipMenu.java
rename to examples/demo/domain/src/main/java/demoapp/dom/misc/tooltip/DescribedAsMenu.java
index eeb7fd0..f79ab36 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/misc/tooltip/TooltipMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/misc/tooltip/DescribedAsMenu.java
@@ -26,13 +26,14 @@ import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.services.factory.FactoryService;
-import demoapp.dom.progmodel.actions.assoc.DemoItem;
import lombok.RequiredArgsConstructor;
import lombok.val;
-@DomainService(nature=NatureOfService.VIEW, objectType = "demo.TooltipMenu")
+import demoapp.dom.progmodel.actions.assoc.DemoItem;
+
+@DomainService(nature=NatureOfService.VIEW, objectType = "demo.DescribedAsMenu")
@RequiredArgsConstructor(onConstructor_ = { @Inject })
-public class TooltipMenu {
+public class DescribedAsMenu {
final FactoryService factoryService;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.adoc
index 505f994..506951e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.adoc
@@ -26,28 +26,32 @@ The related `XmlService` domain service can be used to convert this into a strin
The `XmlSnapshotParentVm` is used as the root of snapshots.
It references a collection of objects as its children, and another single domain object as its peer.
-[plantuml]
.`XmlSnapshotVm` is the root of the snapshots
-----
-hide empty members
-
-class XmlSnapshotParentVm {
- text: String
-}
-class XmlSnapshotChildVm {
- value: String
-}
-class XmlSnapshotPeerVm {
- value: String
-}
-class XmlSnapshotPeerChildVm {
- value: String
-}
-
-XmlSnapshotParentVm -r-> XmlSnapshotPeerVm : peer
-XmlSnapshotParentVm -d-> "0..*" XmlSnapshotChildVm : " children"
-XmlSnapshotPeerVm -d-> "0..*" XmlSnapshotPeerChildVm : " children"
-----
+image::class-diagram.svg[]
+
+
+//[plantuml]
+//.`XmlSnapshotVm` is the root of the snapshots
+//----
+//hide empty members
+//
+//class XmlSnapshotParentVm {
+// text: String
+//}
+//class XmlSnapshotChildVm {
+// value: String
+//}
+//class XmlSnapshotPeerVm {
+// value: String
+//}
+//class XmlSnapshotPeerChildVm {
+// value: String
+//}
+//
+//XmlSnapshotParentVm -r-> XmlSnapshotPeerVm : peer
+//XmlSnapshotParentVm -d-> "0..*" XmlSnapshotChildVm : " children"
+//XmlSnapshotPeerVm -d-> "0..*" XmlSnapshotPeerChildVm : " children"
+//----
== XML Snapshot
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.html b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.html
new file mode 100644
index 0000000..9c440a2
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm-description.html
@@ -0,0 +1,592 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.12">
+<title>Example View model</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment @import statement to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre).nobreak{word-wrap:normal}
+:not(pre).nowrap{white-space:nowrap}
+:not(pre).pre-wrap{white-space:pre-wrap}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
+pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
+pre.pygments .lineno::before{content:"";margin-right:-.125em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>*>tr>*{border-width:1px}
+table.grid-cols>*>tr>*{border-width:0 1px}
+table.grid-rows>*>tr>*{border-width:1px 0}
+table.frame-all{border-width:1px}
+table.frame-ends{border-width:1px 0}
+table.frame-sides{border-width:0 1px}
+table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
+table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
+table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
+table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+td.hdlist2{word-wrap:anywhere}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#header,#content,#footnotes,#footer{max-width:none}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+</style>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+</head>
+<body class="article">
+<div id="header">
+</div>
+<div id="content">
+<div class="paragraph">
+<p>The <code>XmlSnapshotService</code> can be used to convert a domain object into XML .
+It can also be used to convert a <em>graph</em> of domain objects into XML, rooted at a starting domain object.</p>
+</div>
+<div class="paragraph">
+<p>One use case of the resultant XML, is for auditing, where there is a requirement to capture the state of a domain object or domain objects into a single artifact.
+This XML could for example be hashed and digitally signed, to form the basis of a legal decision.</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>It is possible to explicitly exclude properties from the snapshot using the <code>@Property(snapshot=…​)</code> element.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>In addition to generating XML, the service can also generate an XSD schema that the XML will be conformant with.
+The original use case here was in support of mapping tools used to generate PDF documents (mail merges).</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The XML is returned by <code>XmlSnapshotService</code> as an instance of <code>org.w3c.dom.Document</code>.</p>
+</div>
+<div class="paragraph">
+<p>The related <code>XmlService</code> domain service can be used to convert this into a string.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="sect1">
+<h2 id=""_"example"view"model">Example View model</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The <code>XmlSnapshotParentVm</code> is used as the root of snapshots.
+It references a collection of objects as its children, and another single domain object as its peer.</p>
+</div>
+<div class="imageblock kroki">
+<div class="content">
+<img src="https://kroki.io/plantuml/svg/eNqVjz0KAjEQhfs5xZBS2MU6hY0XWFgQ27gZTCCJYTKKIt7d2IiyccGpXvG9n3HeElLMcsNI8UBcAKZgSsF9DGMyubiTDIYpyS7iHbCe0FU0jsI-HeExx7fOB_umLyacaQkfiPg_erkAWss77jbYaNWYq2hbbLWodd-vVOs7jQqnl664gnnyD_vn_q-IJ7juhfM=" alt="Diagram">
+</div>
+<div class="title">Figure 1. <code>XmlSnapshotVm</code> is the root of the snapshots</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id=""_"xml"snapshot">XML Snapshot</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The <code>takeXmlSnapshot</code> service demonstrates how to create snapshots of different "depths":</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span style="color:#007">@Action</span>(
+ semantics = SemanticsOf.SAFE
+)
+<span style="color:#007">@RequiredArgsConstructor</span>
+<span style="color:#088;font-weight:bold">public</span> <span style="color:#339;font-weight:bold">class</span> <span style="color:#B06;font-weight:bold">XmlSnapshotParentVm_takeXmlSnapshot</span> {
+
+ <span style="color:#007">@Inject</span> XmlSnapshotService xmlSnapshotService;
+ <span style="color:#007">@Inject</span> XmlService xmlService;
+ <span style="color:#777">// ...</span>
+
+ <span style="color:#088;font-weight:bold">public</span> <span style="color:#0a8;font-weight:bold">Clob</span> act(
+ <span style="color:#088;font-weight:bold">final</span> PathsToInclude pathsToInclude,
+ <span style="color:#088;font-weight:bold">final</span> SnapshotType snapshotType) {
+ val builder = xmlSnapshotService.builderFor(xmlSnapshotParentVm);
+ <span style="color:#080;font-weight:bold">for</span> (<span style="color:#0a8;font-weight:bold">String</span> path : pathsToInclude.paths) {
+ builder.includePath(path);
+ }
+ val snapshot = builder.build();
+ val doc = snapshotType == SnapshotType.XML
+ ? snapshot.getXmlDocument() : snapshot.getXsdDocument();
+ val fileName = <span style="color:#0a8;font-weight:bold">String</span>.format(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">%s.%s</span><span style="color:#710">"</span></span>, pathsToInclude.name(), snapshotType.name().toLowerCase());
+ <span style="color:#080;font-weight:bold">return</span> asClob(fileName, xmlService.asString(doc));
+ }
+ <span style="color:#777">// ...</span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This uses two enums:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the <code>PathsToInclude</code> enum is used to indicate which members to include in the snapshot:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span style="color:#088;font-weight:bold">public</span> <span style="color:#339;font-weight:bold">enum</span> PathsToInclude {
+ NONE,
+ PEER(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">peer</span><span style="color:#710">"</span></span>),
+ CHILDREN(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">children</span><span style="color:#710">"</span></span>),
+ PEER_AND_CHILDREN(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">peer</span><span style="color:#710">"</span></span>, <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">children</span><span style="color:#710">"</span></span>),
+ PEER_AND_ITS_CHILDREN(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">peer/children</span><span style="color:#710">"</span></span>);
+
+ <span style="color:#088;font-weight:bold">final</span> <span style="color:#0a8;font-weight:bold">List</span><<span style="color:#0a8;font-weight:bold">String</span>> paths;
+ PathsToInclude(<span style="color:#0a8;font-weight:bold">String</span>... paths) {
+ <span style="color:#950">this</span>.paths = <span style="color:#0a8;font-weight:bold">Collections</span>.unmodifiableList(<span style="color:#0a8;font-weight:bold">Arrays</span>.asList(paths));
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that this is in fact a path.
+In particular, the <code>peer/children</code> path will include both the peer object <em>and</em> the peer object’s children in the resultant snapshot</p>
+</div>
+</li>
+<li>
+<p>The <code>SnapshotType</code> enum is simply:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span style="color:#088;font-weight:bold">public</span> <span style="color:#339;font-weight:bold">enum</span> SnapshotType {
+ XML,
+ XSD
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This is used in the action to determine whether to generate the XML snapshot (of the values of the domain object) or an XSD document (with which the XML document is conformant).</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2021-01-19 07:16:13 UTC
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/class-diagram.svg b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/class-diagram.svg
new file mode 100644
index 0000000..a5b780d
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/class-diagram.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="204px" preserveAspectRatio="none" style="width:395px;height:204px;" version="1.1" viewBox="0 0 395 204" width="395px" zoomAndPan="magnify"><defs><filter height="300%" id="f7fnutsw389h2" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMa [...]
+class XmlSnapshotParentVm--><rect codeLine="3" fill="#FEFECE" filter="url(#f7fnutsw389h2)" height="53.1999" id="XmlSnapshotParentVm" style="stroke:#A80036;stroke-width:1.5;" width="154" x="7" y="7"/><ellipse cx="22" cy="23" fill="#ADD1B2" rx="11" ry="11" style="stroke:#A80036;stroke-width:1.0;"/><path d="M21.3594,26.7813 Q22.1563,26.7813 22.7188,26.5938 Q23.2969,26.3906 23.5313,26.1719 Q23.7813,25.9375 24.0156,25.75 Q24.2656,25.5469 24.4844,25.5469 Q24.8281,25.5469 25.0781,25.8125 Q25.34 [...]
+class XmlSnapshotChildVm--><rect codeLine="6" fill="#FEFECE" filter="url(#f7fnutsw389h2)" height="53.1999" id="XmlSnapshotChildVm" style="stroke:#A80036;stroke-width:1.5;" width="148" x="10" y="137"/><ellipse cx="25" cy="153" fill="#ADD1B2" rx="11" ry="11" style="stroke:#A80036;stroke-width:1.0;"/><path d="M24.3594,156.7813 Q25.1563,156.7813 25.7188,156.5938 Q26.2969,156.3906 26.5313,156.1719 Q26.7813,155.9375 27.0156,155.75 Q27.2656,155.5469 27.4844,155.5469 Q27.8281,155.5469 28.0781,15 [...]
+class XmlSnapshotPeerVm--><rect codeLine="9" fill="#FEFECE" filter="url(#f7fnutsw389h2)" height="53.1999" id="XmlSnapshotPeerVm" style="stroke:#A80036;stroke-width:1.5;" width="144" x="223" y="7"/><ellipse cx="238" cy="23" fill="#ADD1B2" rx="11" ry="11" style="stroke:#A80036;stroke-width:1.0;"/><path d="M237.3594,26.7813 Q238.1563,26.7813 238.7188,26.5938 Q239.2969,26.3906 239.5313,26.1719 Q239.7813,25.9375 240.0156,25.75 Q240.2656,25.5469 240.4844,25.5469 Q240.8281,25.5469 241.0781,25.8 [...]
+class XmlSnapshotPeerChildVm--><rect codeLine="12" fill="#FEFECE" filter="url(#f7fnutsw389h2)" height="53.1999" id="XmlSnapshotPeerChildVm" style="stroke:#A80036;stroke-width:1.5;" width="172" x="209" y="137"/><ellipse cx="224" cy="153" fill="#ADD1B2" rx="11" ry="11" style="stroke:#A80036;stroke-width:1.0;"/><path d="M223.3594,156.7813 Q224.1563,156.7813 224.7188,156.5938 Q225.2969,156.3906 225.5313,156.1719 Q225.7813,155.9375 226.0156,155.75 Q226.2656,155.5469 226.4844,155.5469 Q226.828 [...]
+link XmlSnapshotParentVm to XmlSnapshotPeerVm--><path codeLine="16" d="M161.07,33.5 C179.47,33.5 199.12,33.5 217.54,33.5 " fill="none" id="XmlSnapshotParentVm-to-XmlSnapshotPeerVm" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="222.7,33.5,213.7,29.5,217.7,33.5,213.7,37.5,222.7,33.5" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="25" x="179.5" y="27.5">peer</text><!--MD5=[ [...]
+link XmlSnapshotParentVm to XmlSnapshotChildVm--><path codeLine="17" d="M84,60.1 C84,80.76 84,109.91 84,131.83 " fill="none" id="XmlSnapshotParentVm-to-XmlSnapshotChildVm" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="84,136.95,88,127.95,84,131.95,80,127.95,84,136.95" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="45" x="88" y="104">children</text><text fill="#000000" fo [...]
+link XmlSnapshotPeerVm to XmlSnapshotPeerChildVm--><path codeLine="18" d="M295,60.1 C295,80.76 295,109.91 295,131.83 " fill="none" id="XmlSnapshotPeerVm-to-XmlSnapshotPeerChildVm" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="295,136.95,299,127.95,295,131.95,291,127.95,295,136.95" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="45" x="299" y="104">children</text><text fil [...]
+@startuml
+hide empty members
+
+class XmlSnapshotParentVm {
+ text: String
+}
+class XmlSnapshotChildVm {
+ value: String
+}
+class XmlSnapshotPeerVm {
+ value: String
+}
+class XmlSnapshotPeerChildVm {
+ value: String
+}
+
+XmlSnapshotParentVm -r-> XmlSnapshotPeerVm : peer
+XmlSnapshotParentVm -d-> "0..*" XmlSnapshotChildVm : " children"
+XmlSnapshotPeerVm -d-> "0..*" XmlSnapshotPeerChildVm : " children"
+@enduml
+
+PlantUML version 1.2021.00(Sun Jan 10 10:25:05 GMT 2021)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Default Encoding: UTF-8
+Language: en
+Country: US
+--></g></svg>
\ No newline at end of file
diff --git a/examples/demo/domain/src/main/resources/static/css/application.css b/examples/demo/domain/src/main/resources/static/css/application.css
index c66f20f..9a85bfe 100644
--- a/examples/demo/domain/src/main/resources/static/css/application.css
+++ b/examples/demo/domain/src/main/resources/static/css/application.css
@@ -261,4 +261,5 @@ div.exceptionStackTracePanel div.errorInfo h2.mainMessage {
.dropdown-menu{
overflow-y:auto;
+ max-height: 600px;
}