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 2015/11/25 19:23:48 UTC

[1/5] isis-site git commit: ISIS-803 custom lifecycle events; live templates

Repository: isis-site
Updated Branches:
  refs/heads/asf-site c8287a03f -> 2d3a7aabe


http://git-wip-us.apache.org/repos/asf/isis-site/blob/2d3a7aab/content/resources/templates/isis-templates2.xml
----------------------------------------------------------------------
diff --git a/content/resources/templates/isis-templates2.xml b/content/resources/templates/isis-templates2.xml
deleted file mode 100644
index fa7d4a6..0000000
--- a/content/resources/templates/isis-templates2.xml
+++ /dev/null
@@ -1,479 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="java-members" deleted="false" description="Action" enabled="true" name="isa">// //////////////////////////////////////&#13;
-// ${actionName} (action)&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(org.apache.isis.applib.annotation.MemberOrder)}@MemberOrder(sequence="1")&#13;
-public ${ReturnType} ${actionName}(final ${ParameterType} ${parameterType}) {&#13;
-	return ${cursor}null; // TODO: business logic here&#13;
-}&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Action argument N choices" enabled="true" name="isacho">${:import(java.util.Collections,java.util.List)}public List&lt;${ParameterType}&gt; choices${ParameterNumThenCapitalizedActionName}() {&#13;
-	return ${cursor}Collections.emptyList(); // TODO: return list of choices for argument N&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Action argument defaults" enabled="true" name="isadef">public ${ParameterType} default${ParameterNumThenCapitalizedActionName}() {&#13;
-	return ${cursor}null; // TODO: return default for argument N&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Action disabling" enabled="true" name="isadis">public String disable${ActionName}() {&#13;
-	return ${cursor}null; // TODO: return reason why action disabled, null if enabled&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Action hiding" enabled="true" name="isahid">public boolean hide${ActionName}() {&#13;
-	return ${cursor}false; // TODO: return true if action is hidden, false if visible&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Action validation" enabled="true" name="isaval">public String validate${ActionName}(final ${ParameterType} ${parameterType}) {&#13;
-	return ${cursor}null; // TODO: return reason why action arguments are invalid, null if ok&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Collection (1:m bidir parent)" enabled="true" name="isc-1m">public void addTo${ChildCollectionName}(final ${ChildElementType} ${childElementName}) {&#13;
-	// check for no-op&#13;
-	if (${childElementName} == null || &#13;
-		get${ChildCollectionName}().contains(${childElementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate arg from its current parent (if any).&#13;
-	${childElementName}.clear${ParentPropertyNameInChild}();&#13;
-	// associate arg&#13;
-	${childElementName}.set${ParentPropertyNameInChild}(this);&#13;
-	get${ChildCollectionName}().add(${childElementName});&#13;
-	// additional business logic&#13;
-	onAddTo${ChildCollectionName}(${childElementName});&#13;
-}&#13;
-public void removeFrom${ChildCollectionName}(final ${ChildElementType} ${childElementName}) {&#13;
-	// check for no-op&#13;
-	if (${childElementName} == null || &#13;
-		!get${ChildCollectionName}().contains(${childElementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate arg&#13;
-	${childElementName}.set${ParentPropertyNameInChild}(null);&#13;
-	get${ChildCollectionName}().remove(${childElementName});&#13;
-	// additional business logic&#13;
-	onRemoveFrom${ChildCollectionName}(${childElementName});&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="JDO Collection (set - 1:n bidir, foreign key)" enabled="true" name="isc-jdo-1n-b-fk">// //////////////////////////////////////
-// ${collectionName} (collection)
-// //////////////////////////////////////
-
-${:import(java.util.SortedSet,java.util.TreeSet,org.apache.isis.applib.annotation.MemberOrder,javax.jdo.annotations.Persistent)}@Persistent(mappedBy="${elementNameInChild}", dependentElement="${trueOrFalse}")
-private SortedSet&lt;${ElementType}&gt; ${collectionName} = new TreeSet&lt;${ElementType}&gt;();
-@MemberOrder(sequence="1")
-public SortedSet&lt;${ElementType}&gt; get${CollectionName}() {
-return ${collectionName};
-}
-public void set${CollectionName}(final SortedSet&lt;${ElementType}&gt; ${collectionName}) {
-this.${collectionName} = ${collectionName};
-}
-
-
-</template><template autoinsert="true" context="java-members" deleted="false" description="JDO Collection (set - 1:n bidir, join table)" enabled="true" name="isc-jdo-1n-b-jt">// //////////////////////////////////////
-// ${collectionName} (collection)
-// //////////////////////////////////////
-
-${:import(java.util.SortedSet,java.util.TreeSet,org.apache.isis.applib.annotation.MemberOrder,javax.jdo.annotations.Persitent,javax.jdo.annotations.Join)}@Persistent(mappedBy="${elementNameInChild}", dependentElement="${trueOrFalse}")
-@Join
-private SortedSet&lt;${ElementType}&gt; ${collectionName} = new TreeSet&lt;${ElementType}&gt;();
-@MemberOrder(sequence="1")
-public SortedSet&lt;${ElementType}&gt; get${CollectionName}() {
-return ${collectionName};
-}
-public void set${CollectionName}(final SortedSet&lt;${ElementType}&gt; ${collectionName}) {
-this.${collectionName} = ${collectionName};
-}
-
-
-</template><template autoinsert="true" context="java-members" deleted="false" description="JDO Collection (set - 1:n unidir, foreign key)" enabled="true" name="isc-jdo-1n-u-fk">// //////////////////////////////////////
-// ${collectionName} (collection)
-// //////////////////////////////////////
-
-${:import(java.util.SortedSet,java.util.TreeSet,org.apache.isis.applib.annotation.MemberOrder,javax.jdo.annotations.Element)}
-@Element(column="${ColumnName}", dependent="${trueOrFalse}")
-private SortedSet&lt;${ElementType}&gt; ${collectionName} = new TreeSet&lt;${ElementType}&gt;();
-@MemberOrder(sequence="1")
-public SortedSet&lt;${ElementType}&gt; get${CollectionName}() {
-return ${collectionName};
-}
-public void set${CollectionName}(final SortedSet&lt;${ElementType}&gt; ${collectionName}) {
-this.${collectionName} = ${collectionName};
-}
-
-
-</template><template autoinsert="true" context="java-members" deleted="false" description="JDO Collection (set - 1:n unidir, join table)" enabled="true" name="isc-jdo-1n-u-jt">// //////////////////////////////////////
-// ${collectionName} (collection)
-// //////////////////////////////////////
-
-${:import(java.util.SortedSet,java.util.TreeSet,org.apache.isis.applib.annotation.MemberOrder,javax.jdo.annotations.Join,javax.jdo.annotations.Element)}@Join
-@Element(dependent="${trueOrFalse}")
-private SortedSet&lt;${ElementType}&gt; ${collectionName} = new TreeSet&lt;${ElementType}&gt;();
-@MemberOrder(sequence="1")
-public SortedSet&lt;${ElementType}&gt; get${CollectionName}() {
-return ${collectionName};
-}
-public void set${CollectionName}(final SortedSet&lt;${ElementType}&gt; ${collectionName}) {
-this.${collectionName} = ${collectionName};
-}
-
-
-</template><template autoinsert="true" context="java-members" deleted="false" description="JDO Collection (set - m:n bidir - child)" enabled="true" name="isc-jdo-mn-ub-c">// //////////////////////////////////////
-// ${collectionName} (collection)
-// //////////////////////////////////////
-
-${:import(java.util.SortedSet,java.util.TreeSet,org.apache.isis.applib.annotation.MemberOrder,javax.jdo.annotations.Persistent)}@Persistent(mappedBy="${ChildCollectionNameInParent}")
-private SortedSet&lt;${ElementType}&gt; ${collectionName} = new TreeSet&lt;${ElementType}&gt;();
-public SortedSet&lt;${ElementType}&gt; get${CollectionName}() {
-return ${collectionName};
-}
-public void set${CollectionName}(final SortedSet&lt;${ElementType}&gt; ${collectionName}) {
-this.${collectionName} = ${collectionName};
-}
-
-
-</template><template autoinsert="true" context="java-members" deleted="false" description="JDO Collection (set - m:n unidir &amp; bidir - parent)" enabled="true" name="isc-jdo-mn-ub-p">// //////////////////////////////////////
-// ${collectionName} (collection)
-// //////////////////////////////////////
-
-${:import(java.util.SortedSet,java.util.TreeSet,org.apache.isis.applib.annotation.MemberOrder,javax.jdo.annotations.Persistent,javax.jdo.annotations.Join,javax.jdo.annotations.Element)}@Persistent(table="${TableName}")
-@Join(column="${ThisEntityFieldName}")
-@Element(column="${RelatedEntityFieldName}")
-private SortedSet&lt;${ElementType}&gt; ${collectionName} = new TreeSet&lt;${ElementType}&gt;();@MemberOrder(sequence="1")
-
-public SortedSet&lt;${ElementType}&gt; get${CollectionName}() {
-	return ${collectionName};
-}
-public void set${CollectionName}(final SortedSet&lt;${ElementType}&gt; ${collectionName}) {
-	this.${collectionName} = ${collectionName};
-}
-
-
-</template><template autoinsert="true" context="java-members" deleted="false" description="Collection (m:m bidir child)" enabled="true" name="isc-mmc">public void addTo${ParentCollectionName}(final ${ParentElementType} ${parentElementName}) {&#13;
-	// check for no-op&#13;
-	if (${parentElementName} == null || &#13;
-		get${ParentCollectionName}().contains(${parentElementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// delegate to parent to add&#13;
-	${parentElementName}.addTo${ChildCollectionNameInParent}(this);&#13;
-	// additional business logic&#13;
-	onAddTo${ParentCollectionName}(${parentElementName});&#13;
-}&#13;
-public void removeFrom${ParentCollectionName}(final ${ParentElementType} ${parentElementName}) {&#13;
-	// check for no-op&#13;
-	if (${parentElementName} == null || &#13;
-		!get${ParentCollectionName}().contains(${parentElementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// delegate to parent to remove&#13;
-	${parentElementName}.removeFrom${ChildCollectionNameInParent}(this);&#13;
-	// additional business logic&#13;
-	onRemoveFrom${ParentCollectionName}(${parentElementName});&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Collection (m:m bidir parent)" enabled="true" name="isc-mmp">public void addTo${ChildCollectionName}(final ${ChildElementType} ${childElementName}) {&#13;
-	// check for no-op&#13;
-	if (${childElementName} == null || &#13;
-		get${ChildCollectionName}().contains(${childElementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate arg from its current parent (if any).&#13;
-	${childElementName}.removeFrom${ParentCollectionNameInChild}(this);&#13;
-	// associate arg&#13;
-	${childElementName}.get${ParentCollectionNameInChild}().add(this);&#13;
-	get${ChildCollectionName}().add(${childElementName});&#13;
-	// additional business logic&#13;
-	onAddTo${ChildCollectionName}(${childElementName});&#13;
-}&#13;
-public void removeFrom${ChildCollectionName}(final ${ChildElementType} ${childElementName}) {&#13;
-	// check for no-op&#13;
-	if (${childElementName} == null || &#13;
-		!get${ChildCollectionName}().contains(${childElementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate arg&#13;
-	${childElementName}.get${ParentCollectionNameInChild}().remove(this);&#13;
-	get${ChildCollectionName}().remove(${childElementName});&#13;
-	// additional business logic&#13;
-	onRemoveFrom${ChildCollectionName}(${childElementName});&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Collection disabling" enabled="true" name="iscdis">public String disable${CollectionName}() {&#13;
-	return ${cursor}null; // TODO: return reason why collection read-only, null if editable&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Collection hiding" enabled="true" name="ischid">public boolean hide${CollectionName}() {&#13;
-	return ${cursor}false; // TODO: return true if hidden, false otherwise&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Collection (list)" enabled="true" name="iscl">// //////////////////////////////////////&#13;
-// ${collectionName} (collection)&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(java.util.List,java.util.ArrayList,org.apache.isis.applib.annotation.MemberOrder)}private List&lt;${ElementType}&gt; ${collectionName} = new ArrayList&lt;${ElementType}&gt;();&#13;
-@MemberOrder(sequence="1")&#13;
-public List&lt;${ElementType}&gt; get${CollectionName}() {&#13;
-	return ${collectionName};&#13;
-}&#13;
-public void set${CollectionName}(final List&lt;${ElementType}&gt; ${collectionName}) {&#13;
-	this.${collectionName} = ${collectionName};&#13;
-}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Collection modify" enabled="true" name="iscmod">public void addTo${CollectionName}(final ${ElementType} ${elementName}) {&#13;
-	// check for no-op&#13;
-	if (${elementName} == null || &#13;
-		get${CollectionName}().contains(${elementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// associate new&#13;
-	get${CollectionName}().add(${elementName});&#13;
-    // additional business logic&#13;
-    onAddTo${CollectionName}(${elementName});&#13;
-}&#13;
-public void removeFrom${CollectionName}(final ${ElementType} ${elementName}) {&#13;
-	// check for no-op&#13;
-	if (${elementName} == null || &#13;
-		!get${CollectionName}().contains(${elementName})) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate existing&#13;
-	get${CollectionName}().remove(${elementName});&#13;
-    // additional business logic&#13;
-    onRemoveFrom${CollectionName}(${elementName});&#13;
-}&#13;
-protected void onAddTo${CollectionName}(final ${ElementType} ${elementName}) {&#13;
-}&#13;
-protected void onRemoveFrom${CollectionName}(final ${ElementType} ${elementName}) {&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Collection (set)" enabled="true" name="iscs">// //////////////////////////////////////&#13;
-// ${collectionName} (collection)&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(java.util.Set,java.util.LinkedHashSet,org.apache.isis.applib.annotation.MemberOrder)}private Set&lt;${ElementType}&gt; ${collectionName} = new LinkedHashSet&lt;${ElementType}&gt;();&#13;
-@MemberOrder(sequence="1")&#13;
-public Set&lt;${ElementType}&gt; get${CollectionName}() {&#13;
-	return ${collectionName};&#13;
-}&#13;
-public void set${CollectionName}(final Set&lt;${ElementType}&gt; ${collectionName}) {&#13;
-	this.${collectionName} = ${collectionName};&#13;
-}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Collection validation" enabled="true" name="iscval">public String validateAddTo${CollectionName}(final ${ElementType} ${elementName}) {&#13;
-	return ${cursor}null; // TODO: return reason why argument cannot be added, null if ok to add&#13;
-}&#13;
-public String validateRemoveFrom${CollectionName}(final ${ElementType} ${elementName}) {&#13;
-	return null; // TODO: return reason why argument cannot be removed, null if ok to remove&#13;
-}&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Dependencies region" enabled="true" name="isd">// //////////////////////////////////////&#13;
-// injected dependencies&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${cursor}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Dependencies - injected service" enabled="true" name="isds">private ${ServiceType} ${serviceType};&#13;
-public final void inject${ServiceType}(final ${ServiceType} ${serviceType}) {&#13;
-	this.${serviceType} = ${serviceType};&#13;
-}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Factory - new instance (persistent)" enabled="true" name="isfp">public ${Type} new${Type}() {&#13;
-	${Type} ${type} = newTransientInstance(${Type}.class);&#13;
-	${cursor}// TODO: set up any properties&#13;
-&#13;
-	persistIfNotAlready(${type});&#13;
-	return ${type};&#13;
-}&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Factory - new instance (transient)" enabled="true" name="isft">public ${Type} new${InstanceOfType}() {&#13;
-	${Type} ${type} = newTransientInstance(${Type}.class);&#13;
-	${cursor}// TODO: set up any properties&#13;
-&#13;
-	return ${type};&#13;
-}&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Identification region" enabled="true" name="isid">// //////////////////////////////////////&#13;
-// Identification&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${cursor}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Identification - icon" enabled="true" name="isidicon">public String iconName() {&#13;
-	return ${cursor}null; // TODO: return name of image file (without suffix)&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Identification - title" enabled="true" name="isidtitle">public String title() {&#13;
-    ${:import(org.apache.isis.applib.util.TitleBuffer)}final TitleBuffer buf = new TitleBuffer();&#13;
-    ${cursor}// TODO: append to TitleBuffer, typically value properties&#13;
-	return buf.toString();&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Lifecycle region" enabled="true" name="isl">// //////////////////////////////////////&#13;
-// Lifecycle methods&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${cursor}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Lifecycle - create" enabled="true" name="islc">public void created() {&#13;
-    ${cursor}// TODO: post-create&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Lifecycle - load" enabled="true" name="isll">public void loading() {&#13;
-    ${cursor}// TODO: pre-load&#13;
-}&#13;
-public void loaded() {&#13;
-    // TODO: post-load&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Lifecycle - persist" enabled="true" name="islp">public void persisting() {&#13;
-    ${cursor}// TODO: pre-persist&#13;
-}&#13;
-public void persisted() {&#13;
-    // TODO: post-persist&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Lifecycle - remove" enabled="true" name="islr">public void removing() {&#13;
-    ${cursor}// TODO: pre-remove&#13;
-}&#13;
-public void removed() {&#13;
-    // TODO: post-remove&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Lifecycle - update" enabled="true" name="islu">public void updating() {&#13;
-    ${cursor}// TODO: pre-update&#13;
-}&#13;
-public void updated() {&#13;
-    // TODO: post-update&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property" enabled="true" name="isp">// //////////////////////////////////////&#13;
-// ${propertyName} (property)&#13;
-// //////////////////////////////////////&#13;
-&#13;
-private ${PropertyType} ${propertyName};&#13;
-${:import(org.apache.isis.applib.annotation.MemberOrder)}@MemberOrder(sequence="1")&#13;
-public ${PropertyType} get${PropertyName}() {&#13;
-	return ${propertyName};&#13;
-}&#13;
-public void set${PropertyName}(final ${PropertyType} ${propertyName}) {&#13;
-	this.${propertyName} = ${propertyName};&#13;
-}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Property (1:1 bidir child)" enabled="true" name="isp-11c">public void modify${ParentPropertyName}(final ${ParentPropertyType} ${parentPropertyName}) {&#13;
-    ${ParentPropertyType} current${ParentPropertyName} = get${ParentPropertyName}();&#13;
-	// check for no-op&#13;
-	if (${parentPropertyName} == null || &#13;
-		${parentPropertyName}.equals(current${ParentPropertyName})) {&#13;
-		return;&#13;
-	}&#13;
-	// delegate to parent to associate&#13;
-	${parentPropertyName}.modify${ChildPropertyNameInParent}(this);&#13;
-	// additional business logic&#13;
-	onModify${ParentPropertyName}(current${ParentPropertyName}, ${parentPropertyName});&#13;
-}&#13;
-public void clear${PropertyName}() {&#13;
-    ${ParentPropertyType} current${ParentPropertyName} = get${ParentPropertyName}();&#13;
-	// check for no-op&#13;
-	if (current${ParentPropertyName} == null) {&#13;
-		return;&#13;
-	}&#13;
-	// delegate to parent to dissociate&#13;
-	current${ParentPropertyName}.clear${ChildPropertyNameInParent}();&#13;
-	// additional business logic&#13;
-	onClear${ParentPropertyName}(current${ParentPropertyName});&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property (1:1 bidir parent)" enabled="true" name="isp-11p">public void modify${ChildPropertyName}(final ${ChildPropertyType} ${childPropertyName}) {&#13;
-    ${ChildPropertyType} current${ChildPropertyName} = get${ChildPropertyName}();&#13;
-	// check for no-op&#13;
-	if (${childPropertyName} == null || &#13;
-		${childPropertyName}.equals(current${ChildPropertyName})) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate existing&#13;
-	clear${ChildPropertyName}();&#13;
-	// associate new&#13;
-	${childPropertyName}.set${ParentPropertyNameInChild}(this);&#13;
-	set${ChildPropertyName}(${childPropertyName});&#13;
-	// additional business logic&#13;
-	onModify${ChildPropertyName}(current${ChildPropertyName}, ${childPropertyName});&#13;
-}&#13;
-public void clear${ChildPropertyName}() {&#13;
-    ${ChildPropertyType} current${ChildPropertyName} = get${ChildPropertyName}();&#13;
-	// check for no-op&#13;
-	if (current${ChildPropertyName} == null) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate existing&#13;
-	current${ChildPropertyName}.set${ParentPropertyNameInChild}(null);&#13;
-	set${ChildPropertyName}(null);&#13;
-	// additional business logic&#13;
-	onClear${ChildPropertyName}(current${ChildPropertyName});&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property (m:1 bidir child)" enabled="true" name="isp-m1">public void modify${ParentPropertyName}(final ${ParentPropertyType} ${parentPropertyName}) {&#13;
-    ${ParentPropertyType} current${ParentPropertyName} = get${ParentPropertyName}();&#13;
-	// check for no-op&#13;
-	if (${parentPropertyName} == null || &#13;
-		${parentPropertyName}.equals(current${ParentPropertyName})) {&#13;
-		return;&#13;
-	}&#13;
-	// delegate to parent to associate&#13;
-	${parentPropertyName}.addTo${ChildCollectionNameInParent}(this);&#13;
-	// additional business logic&#13;
-	onModify${ParentPropertyName}(current${ParentPropertyName}, ${parentPropertyName});&#13;
-}&#13;
-public void clear${ParentPropertyName}() {&#13;
-    ${ParentPropertyType} current${ParentPropertyName} = get${ParentPropertyName}();&#13;
-	// check for no-op&#13;
-	if (current${ParentPropertyName} == null) {&#13;
-		return;&#13;
-	}&#13;
-	// delegate to parent to dissociate&#13;
-	current${ParentPropertyName}.removeFrom${ChildCollectionNameInParent}(this);&#13;
-	// additional business logic&#13;
-	onClear${ParentPropertyName}(current${ParentPropertyName});&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property choices" enabled="true" name="ispcho">${:import(java.util.List)}public List&lt;${PropertyType}&gt; choices${PropertyName}() {&#13;
-	return ${cursor}null; // TODO: return list of choices for property&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property defaults" enabled="true" name="ispdef">public ${PropertyType} default${PropertyName}() {&#13;
-	return ${cursor}null; // TODO: return default for property when first created&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property disabling" enabled="true" name="ispdis">public String disable${PropertyName}() {&#13;
-	return ${cursor}null; // TODO: return reason why property is disabled, null if editable&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property hiding" enabled="true" name="isphid">public boolean hide${PropertyName}() {&#13;
-	return ${cursor}false; // TODO: return true if hidden, false if visible&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property modify" enabled="true" name="ispmod">public void modify${PropertyName}(final ${PropertyType} ${propertyName}) {&#13;
-    ${PropertyType} current${PropertyName} = get${PropertyName}();&#13;
-	// check for no-op&#13;
-	if (${propertyName} == null || &#13;
-		${propertyName}.equals(current${PropertyName})) {&#13;
-		return;&#13;
-	}&#13;
-	// associate new&#13;
-	set${PropertyName}(${propertyName});&#13;
-	// additional business logic&#13;
-	onModify${PropertyName}(current${PropertyName}, ${propertyName});&#13;
-}&#13;
-public void clear${PropertyName}() {&#13;
-    ${PropertyType} current${PropertyName} = get${PropertyName}();&#13;
-	// check for no-op&#13;
-	if (current${PropertyName} == null) {&#13;
-		return;&#13;
-	}&#13;
-	// dissociate existing&#13;
-	set${PropertyName}(null);&#13;
-	// additional business logic&#13;
-	onClear${PropertyName}(current${PropertyName});&#13;
-}&#13;
-protected void onModify${PropertyName}(final ${PropertyType} old${PropertyName}, final ${PropertyType} new${PropertyName}) {&#13;
-}&#13;
-protected void onClear${PropertyName}(final ${PropertyType} old${PropertyName}) {&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Property validation" enabled="true" name="ispval">public String validate${PropertyName}(final ${PropertyType} ${propertyName}) {&#13;
-	if (${propertyName} == null) return null;&#13;
-	return ${cursor}null; // TODO: return reason why proposed value is invalid, null if valid&#13;
-}</template><template autoinsert="true" context="java-members" deleted="false" description="Search for all" enabled="true" name="issa">// //////////////////////////////////////&#13;
-// all ${TypePlural}&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(org.apache.isis.applib.annotation.Prototype,java.util.List)}@Prototype&#13;
-public List&lt;${Type}&gt; all${TypePlural}() {&#13;
-	return allInstances(${Type}.class);&#13;
-}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Search for all matching" enabled="true" name="issafil">// //////////////////////////////////////&#13;
-// all ${TypePlural} that ${filterDescription}&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(org.apache.isis.applib.annotation.Prototype,org.apache.isis.applib.Filter,java.util.List)}@Prototype&#13;
-public List&lt;${Type}&gt; all${TypePlural}Matching(final Filter&lt;${Type}&gt; filter) {&#13;
-	return allMatches(${Type}.class, filter);&#13;
-}&#13;
-&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Search for first matching" enabled="true" name="issffil">// //////////////////////////////////////&#13;
-// first ${Type} that ${filterDescription}&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(org.apache.isis.applib.annotation.Prototype,org.apache.isis.applib.Filter,java.util.List)}@Prototype&#13;
-public ${Type} first${Type}Matching(final Filter&lt;${Type}&gt; filter) {&#13;
-	return firstMatch(${Type}.class, filter);&#13;
-}&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Search for unique matching" enabled="true" name="issufil">// //////////////////////////////////////&#13;
-// unique ${Type} that ${filterDescription}&#13;
-// //////////////////////////////////////&#13;
-&#13;
-${:import(org.apache.isis.applib.annotation.Exploration,org.apache.isis.applib.Filter,java.util.List)}@Exploration&#13;
-public ${Type} unique${Type}Matching(final Filter&lt;${Type}&gt; filter) {&#13;
-	return uniqueMatch(${Type}.class, filter);&#13;
-}&#13;
-&#13;
-</template><template autoinsert="true" context="java-members" deleted="false" description="Object-level validation" enabled="true" name="isval">public String validate() {&#13;
-    ${cursor}// TODO: return reason why object is in invalid state (and so cannot be saved/updated), or null if ok&#13;
-}</template></templates>
\ No newline at end of file


[4/5] isis-site git commit: ISIS-803 custom lifecycle events; live templates

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis-site/blob/2d3a7aab/content/guides/rg.html
----------------------------------------------------------------------
diff --git a/content/guides/rg.html b/content/guides/rg.html
index 7e254c4..6d2ff81 100644
--- a/content/guides/rg.html
+++ b/content/guides/rg.html
@@ -5015,6 +5015,16 @@ can be used instead, eg:</p>
 </div></div></td>
 </tr>
 <tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_createdLifecycleEvent"><code>created-</code><br>
+<code>LifecycleEvent()</code></a><br>
+(<code>1.11.0-SNAPSHOT</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtype of <code>ObjectCreatedEvent</code><br>
+(<code>ObjectCreatedEvent.Default</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>the event type to be posted to the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> whenever an instance is created</p>
+</div></div></td>
+</tr>
+<tr>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_editing"><code>editing()</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><code>AS_CONFIGURED</code>, <code>ENABLED</code>, <code>DISABLED</code><br>
 (<code>AS_CONFIGURED</code>)</p></td>
@@ -5037,6 +5047,26 @@ can be used instead, eg:</p>
 </div></div></td>
 </tr>
 <tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_persistedLifecycleEvent"><code>persisted-</code><br>
+<code>LifecycleEvent()</code></a><br>
+(<code>1.11.0-SNAPSHOT</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtype of <code>ObjectPersistedEvent</code><br>
+(<code>ObjectPersistedEvent.Default</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>the event type to be posted (<code>1.11.0-SNAPSHOT</code>) to the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> whenever an instance has just been persisted</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_persistingLifecycleEvent"><code>persisting-</code><br>
+<code>LifecycleEvent()</code></a><br>
+(<code>1.11.0-SNAPSHOT</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtype of <code>ObjectPersistingEvent</code><br>
+(<code>ObjectPersistingEvent.Default</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>the event type to be posted (<code>1.11.0-SNAPSHOT</code>) to the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> whenever an instance is about to be persisted</p>
+</div></div></td>
+</tr>
+<tr>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_publishing"><code>publishing()</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><code>AS_CONFIGURED</code>, <code>ENABLED</code>, <code>DISABLED</code><br>
 (<code>AS_CONFIGURED</code>)</p></td>
@@ -5052,6 +5082,36 @@ can be used instead, eg:</p>
 <p>specifies that a custom implementation of <code>PublishingPayloadFactoryForObject</code> be used to create the (payload of the) published event representing the change to the object</p>
 </div></div></td>
 </tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_removingLifecycleEvent"><code>removing-</code><br>
+<code>LifecycleEvent()</code></a><br>
+(<code>1.11.0-SNAPSHOT</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtype of <code>ObjectRemovingEvent</code><br>
+(<code>ObjectRemovingEvent.Default</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>the event type to be posted (<code>1.11.0-SNAPSHOT</code>) to the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> whenever an instance is about to be deleted</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_updatedLifecycleEvent"><code>updated-</code><br>
+<code>LifecycleEvent()</code></a><br>
+(<code>1.11.0-SNAPSHOT</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtype of <code>ObjectUpdatedEvent</code><br>
+(<code>ObjectUpdatedEvent.Default</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>the event type to be posted (<code>1.11.0-SNAPSHOT</code>) to the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> whenever an instance has just been updated</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_rg_annotations_manpage-DomainObject_updatingLifecycleEvent"><code>updating-</code><br>
+<code>LifecycleEvent()</code></a><br>
+(<code>1.11.0-SNAPSHOT</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtype of <code>ObjectUpdatingEvent</code><br>
+(<code>ObjectUpdatingEvent.Default</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>the event type to be posted (<code>1.11.0-SNAPSHOT</code>) to the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> whenever an instance is about to be updated</p>
+</div></div></td>
+</tr>
 </tbody>
 </table>
 <div class="paragraph">
@@ -5062,8 +5122,9 @@ can be used instead, eg:</p>
 <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>(
     auditing=Auditing.ENABLED,
     autoCompleteRepository=CustomerRepository.class
-    editing=Editing.ENABLED,               <i class="conum" data-value="1"></i><b>(1)</b>
-    publishing=Publishing.ENABLED
+    editing=Editing.ENABLED,                            <i class="conum" data-value="1"></i><b>(1)</b>
+    updatedLifecycleEvent=Customer.UpdatedEvent.class
+
 )
 <span class="directive">public</span> <span class="type">class</span> <span class="class">Customer</span> {
     ...
@@ -5282,7 +5343,123 @@ can be used instead, eg:</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_rg_annotations_manpage-DomainObject_editing">2.9.4. <code>editing()</code></h4>
+<h4 id="_rg_annotations_manpage-DomainObject_createdLifecycleEvent">2.9.4. createdLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
+<div class="paragraph">
+<p>Whenever a domain object is instantiated or otherwise becomes known to the framework, a "created" lifecycle event is fired.  This is typically when the <a href="#_rg_services-api_manpage-DomainObjectContainer"><code>DomainObjectContainer</code></a>'s <a href="#_rg_services-api_manpage-DomainObjectContainer_object-creation-api"><code>newTransientInstance()</code></a> is called;
+it will also happen if the object is simply instantiated with <code>new(&#8230;&#8203;)</code>, and then the container&#8217;s
+<a href="#_rg_services-api_manpage-DomainObjectContainer_services-api"><code>injectServicesInto(&#8230;&#8203;)</code></a> method is called.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the object just created.  The subscriber could then, for example, update the
+object, eg looking up state from some external datastore.</p>
+</div>
+<div class="paragraph">
+<p>By default the event raised is <code>ObjectCreatedEvent.Default</code>. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The purpose of the <code>createdLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    createdLifecycleEvent=ToDoItem.CreatedEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">CreatedEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectCreatedEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
+</div>
+<div class="sect4">
+<h5 id="_subscribers_3">Subscribers</h5>
+<div class="paragraph">
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectCreatedEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectCreatedEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</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>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_default_doop_and_noop_events">Default, Doop and Noop events</h5>
+<div class="paragraph">
+<p>If the <code>createdLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectCreatedEvent.Default</code>),
+then the framework will, by default, post an event.</p>
+</div>
+<div class="paragraph">
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.createdLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>createdLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectCreatedEvent.Doop</code> as such a subclass, so setting the <code>createdLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectCreatedEvent.Noop</code>; if <code>createdLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_editing">2.9.5. <code>editing()</code></h4>
 <div class="paragraph">
 <p>The <code>editing()</code> attribute determines whether a domain object&#8217;s properties and collections are not editable (are read-only).</p>
 </div>
@@ -5366,7 +5543,121 @@ can be used instead, eg:</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_rg_annotations_manpage-DomainObject_nature">2.9.5. <code>nature()</code></h4>
+<h4 id="_rg_annotations_manpage-DomainObject_loadedLifecycleEvent">2.9.6. loadedLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
+<div class="paragraph">
+<p>Whenever a persistent domain object is loaded from the database, a "loaded" lifecycle event is fired.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the domain object just loaded.  The subscriber could then, for example, update
+or default values on the object (eg to support on-the-fly migration scenarios).</p>
+</div>
+<div class="paragraph">
+<p>By default the event raised is <code>ObjectLoadedEvent.Default</code>. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The purpose of the <code>loadedLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    loadedLifecycleEvent=ToDoItem.LoadedEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">LoadedEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectLoadedEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
+</div>
+<div class="sect4">
+<h5 id="_subscribers_4">Subscribers</h5>
+<div class="paragraph">
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectLoadedEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectLoadedEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</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>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_default_doop_and_noop_events_2">Default, Doop and Noop events</h5>
+<div class="paragraph">
+<p>If the <code>loadedLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectLoadedEvent.Default</code>),
+then the framework will, by default, post an event.</p>
+</div>
+<div class="paragraph">
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.loadedLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>loadedLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectLoadedEvent.Doop</code> as such a subclass, so setting the <code>loadedLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectLoadedEvent.Noop</code>; if <code>loadedLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_nature">2.9.7. <code>nature()</code></h4>
 <div class="paragraph">
 <p>The <code>nature()</code> attribute is used to characterize the domain object as either an entity (part of the domain layer) or as a view model (part of the application layer).  If the domain object should be thought of as an entity, it also captures how the persistence of that entity is managed.</p>
 </div>
@@ -5465,49 +5756,310 @@ can be used instead, eg:</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_rg_annotations_manpage-DomainObject_objectType">2.9.6. <code>objectType()</code></h4>
+<h4 id="_rg_annotations_manpage-DomainObject_persistedLifecycleEvent">2.9.8. persistedLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
 <div class="paragraph">
-<p>The <code>objectType()</code> attribute is used to provide a unique alias for the object&#8217;s class name.</p>
+<p>Whenever a (just created, still transient) domain object has been saved (INSERTed in)to the database, a "persisted" lifecycle
+event is fired.</p>
 </div>
 <div class="paragraph">
-<p>This value is used internally to generate a string representation of an objects identity (the <code>Oid</code>).  This can appear in several contexts, including:</p>
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, maintain an
+external datastore.</p>
 </div>
-<div class="ulist">
-<ul>
-<li>
-<p>as the value of <code>o.a.i.applib.services.bookmark.Bookmark#getObjectType()</code></p>
-</li>
-<li>
-<p>in the <code>toString()</code> value of <code>Bookmark</code></p>
-</li>
-<li>
-<p>in the URLs of the <a href="ug.html#_ug_restfulobjects-viewer">RestfulObjects viewer</a></p>
-</li>
-<li>
-<p>in the URLs of the <a href="ug.html#_ug_wicket-viewer">Wicket viewer</a> (in general and in particular if <a href="ug.html#_ug_wicket-viewer_features_hints-and-copy-url">copying URLs</a>)</p>
-</li>
-<li>
-<p>in XML snapshots generated by the <a href="#_rg_services-api_manpage-XmlSnapshotService"><code>XmlSnapshotService</code></a></p>
-</li>
-</ul>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The object should <em>not</em> be modified during the persisted callback.</p>
+</div>
+</td>
+</tr>
+</table>
 </div>
 <div class="paragraph">
-<p>For example:</p>
+<p>By default the event raised is <code>ObjectPersistedEvent.Default</code>. For example:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>(
-    objectType=<span class="string"><span class="delimiter">&quot;</span><span class="content">ORD</span><span class="delimiter">&quot;</span></span>
-)
-<span class="directive">public</span> <span class="type">class</span> <span class="class">Order</span> {
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
     ...
 }</code></pre>
 </div>
 </div>
 <div class="paragraph">
-<p>If the object type has not been specified, then Apache Isis will use the fully qualified class name of the entity.</p>
+<p>The purpose of the <code>persistedLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
 </div>
-<div class="admonitionblock tip">
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    persistedLifecycleEvent=ToDoItem.PersistedEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">PersistedEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectPersistedEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
+</div>
+<div class="sect4">
+<h5 id="_subscribers_5">Subscribers</h5>
+<div class="paragraph">
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectPersistedEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectPersistedEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</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>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_default_doop_and_noop_events_3">Default, Doop and Noop events</h5>
+<div class="paragraph">
+<p>If the <code>persistedLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectPersistedEvent.Default</code>),
+then the framework will, by default, post an event.</p>
+</div>
+<div class="paragraph">
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.persistedLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>persistedLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectPersistedEvent.Doop</code> as such a subclass, so setting the <code>persistedLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectPersistedEvent.Noop</code>; if <code>persistedLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_persistingLifecycleEvent">2.9.9. persistingLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
+<div class="paragraph">
+<p>Whenever a (just created, still transient) domain object is about to be saved (INSERTed in)to the database, a "persisting" lifecycle
+event is fired.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, update the object,
+or it could use it maintain an external datastore.  One possible application is to maintain a full-text search database using
+<a href="https://lucene.apache.org/">Apache Lucene</a> or similar.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Another use case is to maintain "last updated by"/"last updated at" properties.  While you can roll your own, note that
+the framework provides built-in support for this use case through the
+<a href="#_rg_classes_roles_manpage-Timestampable"><code>Timestampable</code></a> role interface.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>By default the event raised is <code>ObjectPersistingEvent.Default</code>. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The purpose of the <code>persistingLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    persistingLifecycleEvent=ToDoItem.PersistingEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">PersistingEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectPersistingEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
+</div>
+<div class="sect4">
+<h5 id="_subscribers_6">Subscribers</h5>
+<div class="paragraph">
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectPersistingEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectPersistingEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</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>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_default_doop_and_noop_events_4">Default, Doop and Noop events</h5>
+<div class="paragraph">
+<p>If the <code>persistingLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectPersistingEvent.Default</code>),
+then the framework will, by default, post an event.</p>
+</div>
+<div class="paragraph">
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.persistingLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>persistingLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectPersistingEvent.Doop</code> as such a subclass, so setting the <code>persistingLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectPersistingEvent.Noop</code>; if <code>persistingLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_objectType">2.9.10. <code>objectType()</code></h4>
+<div class="paragraph">
+<p>The <code>objectType()</code> attribute is used to provide a unique alias for the object&#8217;s class name.</p>
+</div>
+<div class="paragraph">
+<p>This value is used internally to generate a string representation of an objects identity (the <code>Oid</code>).  This can appear in several contexts, including:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>as the value of <code>o.a.i.applib.services.bookmark.Bookmark#getObjectType()</code></p>
+</li>
+<li>
+<p>in the <code>toString()</code> value of <code>Bookmark</code></p>
+</li>
+<li>
+<p>in the URLs of the <a href="ug.html#_ug_restfulobjects-viewer">RestfulObjects viewer</a></p>
+</li>
+<li>
+<p>in the URLs of the <a href="ug.html#_ug_wicket-viewer">Wicket viewer</a> (in general and in particular if <a href="ug.html#_ug_wicket-viewer_features_hints-and-copy-url">copying URLs</a>)</p>
+</li>
+<li>
+<p>in XML snapshots generated by the <a href="#_rg_services-api_manpage-XmlSnapshotService"><code>XmlSnapshotService</code></a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>(
+    objectType=<span class="string"><span class="delimiter">&quot;</span><span class="content">ORD</span><span class="delimiter">&quot;</span></span>
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">Order</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If the object type has not been specified, then Apache Isis will use the fully qualified class name of the entity.</p>
+</div>
+<div class="admonitionblock tip">
 <table>
 <tr>
 <td class="icon">
@@ -5521,88 +6073,480 @@ can be used instead, eg:</p>
 <p>As noted above, if the object type has not been specified, then Apache Isis will use the fully qualified class name of the entity.  However, this is liable to change over time, for example if the code is refactored or (more fundamentally) if your company/organization reorganizes/renames itself/is acquired.</p>
 </div>
 <div class="paragraph">
-<p>We therefore strongly recommend that you specify an object type for all entities, either using <code>objectType()</code> or using the JDO <a href="#_rg_annotations_manpage-PersistenceCapable"><code>@PersistenceCapable</code></a> (with a <code>schema()</code> attribute) or <a href="#_rg_annotations_manpage-Discriminator"><code>@Discriminator</code></a> annotations.  Specifying <code>@Discriminator</code> will override <code>@PersistenceCapable</code>, which in turn overrides <code>objectType()</code>.  Using <code>@PersistenceCapable#schema()</code> is probably the best choice in most cases.</p>
+<p>We therefore strongly recommend that you specify an object type for all entities, either using <code>objectType()</code> or using the JDO <a href="#_rg_annotations_manpage-PersistenceCapable"><code>@PersistenceCapable</code></a> (with a <code>schema()</code> attribute) or <a href="#_rg_annotations_manpage-Discriminator"><code>@Discriminator</code></a> annotations.  Specifying <code>@Discriminator</code> will override <code>@PersistenceCapable</code>, which in turn overrides <code>objectType()</code>.  Using <code>@PersistenceCapable#schema()</code> is probably the best choice in most cases.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>If the object type is not unique across all domain classes then the framework will fail-fast and fail to boot.  An error message will be printed in the log to help you determine which classes have duplicate object tyoes.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_publishing">2.9.11. <code>publishing()</code></h4>
+<div class="paragraph">
+<p>The <code>publishing()</code> attribute determines whether and how a modified object instance is published via the registered implementation of a <a href="#_rg_services-spi_manpage-PublishingService"><code>PublishingService</code></a>).  This attribute is also supported for <a href="#_rg_annotations_manpage-Action_publishing">actions</a>, where it controls whether action invocations are published as events.</p>
+</div>
+<div class="paragraph">
+<p>A common use case is to notify external "downstream" systems of changes in the state of the Isis application.</p>
+</div>
+<div class="paragraph">
+<p>The default value for the attribute is <code>AS_CONFIGURED</code>, meaning that the <a href="#_rg_runtime_configuring-core">configuration property</a> <code>isis.services.publish.objects</code> is used to determine the whether the action is published:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>all</code><br></p>
+<div class="paragraph">
+<p>all changed objects are published</p>
+</div>
+</li>
+<li>
+<p><code>none</code><br></p>
+<div class="paragraph">
+<p>no changed objects are published</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If there is no configuration property in <code>isis.properties</code> then publishing is automatically enabled for domain objects.</p>
+</div>
+<div class="paragraph">
+<p>This default can be overridden on an object-by-object basis; if <code>publishing()</code> is set to <code>ENABLED</code> then changed instances of the domain class are published irrespective of the configured value; if set to <code>DISABLED</code> then the changed instances are <em>not</em> published, again irrespective of the configured value.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>(
+    publishing=Publishing.ENABLED  <i class="conum" data-value="1"></i><b>(1)</b>
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">InterestRate</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>because set to enabled, will be published irrespective of the configured value.</td>
+</tr>
+</table>
+</div>
+<div class="sect4">
+<h5 id="__code_publishingpayloadfactory_code_2"><code>publishingPayloadFactory()</code></h5>
+<div class="paragraph">
+<p>The (optional) related <code>publishingPayloadFactory()</code> specifies the class to use to create the (payload of the) event to be published by the publishing factory.</p>
+</div>
+<div class="paragraph">
+<p>Rather than simply broadcast that the object was changed, the payload factory allows a "fatter" payload to be instantiated that can eagerly push commonly-required information to all subscribers. For at least some subscribers this should avoid the necessity to query back for additional information.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_removingLifecycleEvent">2.9.12. removingLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
+<div class="paragraph">
+<p>Whenever a (persistent) domain object is about to be removed (DELETEd) from the database, a "removing"
+lifecycle event is fired.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, could use it
+maintain an external datastore.  One possible application is to maintain a full-text search database
+using <a href="https://lucene.apache.org/">Apache Lucene</a> or similar.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Another use case is to maintain "last updated by"/"last updated at" properties.  While you can roll your own, note that
+the framework provides built-in support for this use case through the
+<a href="#_rg_classes_roles_manpage-Timestampable"><code>Timestampable</code></a> role interface.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>By default the event raised is <code>ObjectRemovingEvent.Default</code>. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The purpose of the <code>removingLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    removingLifecycleEvent=ToDoItem.RemovingEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">RemovingEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectRemovingEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
+</div>
+<div class="sect4">
+<h5 id="_subscribers_7">Subscribers</h5>
+<div class="paragraph">
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectRemovingEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectRemovingEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</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>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_default_doop_and_noop_events_5">Default, Doop and Noop events</h5>
+<div class="paragraph">
+<p>If the <code>removingLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectRemovingEvent.Default</code>),
+then the framework will, by default, post an event.</p>
+</div>
+<div class="paragraph">
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>removingLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectRemovingEvent.Doop</code> as such a subclass, so setting the <code>removingLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectRemovingEvent.Noop</code>; if <code>removingLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_updatingLifecycleEvent">2.9.13. updatingLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
+<div class="paragraph">
+<p>Whenever a (persistent) domain object has been modified and is about to be updated to the database, an "updating"
+lifecycle event is fired.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, update the object,
+or it could use it maintain an external datastore.  One possible application is to maintain a full-text search database
+using <a href="https://lucene.apache.org/">Apache Lucene</a> or similar.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Another use case is to maintain "last updated by"/"last updated at" properties.  While you can roll your own, note that
+the framework provides built-in support for this use case through the
+<a href="#_rg_classes_roles_manpage-Timestampable"><code>Timestampable</code></a> role interface.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>By default the event raised is <code>ObjectUpdatingEvent.Default</code>. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The purpose of the <code>updatingLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    updatingLifecycleEvent=ToDoItem.UpdatingEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">UpdatingEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectUpdatingEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
+</div>
+<div class="sect4">
+<h5 id="_subscribers_8">Subscribers</h5>
+<div class="paragraph">
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
+</div>
+<div class="paragraph">
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectUpdatingEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectUpdatingEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</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>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_default_doop_and_noop_events_6">Default, Doop and Noop events</h5>
+<div class="paragraph">
+<p>If the <code>updatingLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectUpdatingEvent.Default</code>),
+then the framework will, by default, post an event.</p>
+</div>
+<div class="paragraph">
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.updatingLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>updatingLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectUpdatingEvent.Doop</code> as such a subclass, so setting the <code>updatingLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectUpdatingEvent.Noop</code>; if <code>updatingLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_rg_annotations_manpage-DomainObject_updatedLifecycleEvent">2.9.14. updatedLifecycleEvent() (<code>1.11.0-SNAPSHOT</code>)</h4>
+<div class="paragraph">
+<p>Whenever a (persistent) domain object has been modified and has been updated in the database, an "updated" lifecycle
+event is fired.</p>
 </div>
-</td>
-</tr>
-</table>
+<div class="paragraph">
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use the event to obtain a reference to the domain object.</p>
 </div>
-<div class="admonitionblock note">
+<div class="admonitionblock warning">
 <table>
 <tr>
 <td class="icon">
-<i class="fa icon-note" title="Note"></i>
+<i class="fa icon-warning" title="Warning"></i>
 </td>
 <td class="content">
 <div class="paragraph">
-<p>If the object type is not unique across all domain classes then the framework will fail-fast and fail to boot.  An error message will be printed in the log to help you determine which classes have duplicate object tyoes.</p>
+<p>The object should <em>not</em> be modified during the updated callback.</p>
 </div>
 </td>
 </tr>
 </table>
 </div>
-</div>
-<div class="sect3">
-<h4 id="_rg_annotations_manpage-DomainObject_publishing">2.9.7. <code>publishing()</code></h4>
 <div class="paragraph">
-<p>The <code>publishing()</code> attribute determines whether and how a modified object instance is published via the registered implementation of a <a href="#_rg_services-spi_manpage-PublishingService"><code>PublishingService</code></a>).  This attribute is also supported for <a href="#_rg_annotations_manpage-Action_publishing">actions</a>, where it controls whether action invocations are published as events.</p>
+<p>By default the event raised is <code>ObjectUpdatedEvent.Default</code>. For example:</p>
 </div>
-<div class="paragraph">
-<p>A common use case is to notify external "downstream" systems of changes in the state of the Isis application.</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItemDto</span> {
+    ...
+}</code></pre>
 </div>
-<div class="paragraph">
-<p>The default value for the attribute is <code>AS_CONFIGURED</code>, meaning that the <a href="#_rg_runtime_configuring-core">configuration property</a> <code>isis.services.publish.objects</code> is used to determine the whether the action is published:</p>
 </div>
-<div class="ulist">
-<ul>
-<li>
-<p><code>all</code><br></p>
 <div class="paragraph">
-<p>all changed objects are published</p>
+<p>The purpose of the <code>updatedLifecycleEvent()</code> attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.</p>
 </div>
-</li>
-<li>
-<p><code>none</code><br></p>
 <div class="paragraph">
-<p>no changed objects are published</p>
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObjectLayout</span>(
+    updatedLifecycleEvent=ToDoItem.UpdatedEvent.class
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">ToDoItem</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">UpdatedEvent</span>
+        <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.ObjectUpdatedEvent&lt;ToDoItem&gt; { }
+    ...
+}</code></pre>
 </div>
-</li>
-</ul>
 </div>
 <div class="paragraph">
-<p>If there is no configuration property in <code>isis.properties</code> then publishing is automatically enabled for domain objects.</p>
+<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
 </div>
+<div class="sect4">
+<h5 id="_subscribers_9">Subscribers</h5>
 <div class="paragraph">
-<p>This default can be overridden on an object-by-object basis; if <code>publishing()</code> is set to <code>ENABLED</code> then changed instances of the domain class are published irrespective of the configured value; if set to <code>DISABLED</code> then the changed instances are <em>not</em> published, again irrespective of the configured value.</p>
+<p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
+or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
+using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
 </div>
 <div class="paragraph">
-<p>For example:</p>
+<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span>(
-    publishing=Publishing.ENABLED  <i class="conum" data-value="1"></i><b>(1)</b>
-)
-<span class="directive">public</span> <span class="type">class</span> <span class="class">InterestRate</span> {
-    ...
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ObjectUpdatedEvent ev) {
+        <span class="keyword">if</span>(ev.getSource() <span class="keyword">instanceof</span> ToDoItem) { ... }
+    }
 }</code></pre>
 </div>
 </div>
-<div class="colist arabic">
+<div class="paragraph">
+<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeSubscriber</span> <span class="directive">extends</span> AbstractSubscriber {
+    <span class="annotation">@com</span>.google.common.eventbus.Subscribe
+    <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.ObjectUpdatedEvent ev) {
+        ...
+    }
+}</code></pre>
+</div>
+</div>
+<div class="admonitionblock tip">
 <table>
 <tr>
-<td><i class="conum" data-value="1"></i><b>1</b></td>
-<td>because set to enabled, will be published irrespective of the configured value.</td>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>If the AxonFramework is being used, replace <code>@com.google.common.eventbus.Subscribe</code> with <code>@org.axonframework.eventhandling.annotation.EventHandler</code>.</p>
+</div>
+</td>
 </tr>
 </table>
 </div>
+</div>
 <div class="sect4">
-<h5 id="__code_publishingpayloadfactory_code_2"><code>publishingPayloadFactory()</code></h5>
+<h5 id="_default_doop_and_noop_events_7">Default, Doop and Noop events</h5>
 <div class="paragraph">
-<p>The (optional) related <code>publishingPayloadFactory()</code> specifies the class to use to create the (payload of the) event to be published by the publishing factory.</p>
+<p>If the <code>updatedLifecycleEvent</code> attribute is not explicitly specified (is left as its default value, <code>ObjectUpdatedEvent.Default</code>),
+then the framework will, by default, post an event.</p>
 </div>
 <div class="paragraph">
-<p>Rather than simply broadcast that the object was changed, the payload factory allows a "fatter" payload to be instantiated that can eagerly push commonly-required information to all subscribers. For at least some subscribers this should avoid the necessity to query back for additional information.</p>
+<p>If this is not required, then the <code>isis.reflector.facet.domainObjectAnnotation.updatedLifecycleEvent.postForDefault</code>
+configuration property can be set to "false"; this will disable posting.</p>
+</div>
+<div class="paragraph">
+<p>On the other hand, if the <code>updatedLifecycleEvent</code> has been explicitly specified to some subclass, then an event will be posted.
+The framework provides <code>ObjectUpdatedEvent.Doop</code> as such a subclass, so setting the <code>updatedLifecycleEvent</code> attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.</p>
+</div>
+<div class="paragraph">
+<p>And, conversely, the framework also provides <code>ObjectUpdatedEvent.Noop</code>; if <code>updatedLifecycleEvent</code> attribute is set to this class,
+then no event will be posted.</p>
 </div>
 </div>
 </div>
@@ -5940,8 +6884,9 @@ in any wrapping <code>&lt;div&gt;</code>s and <code>&lt;span&gt;</code>s that re
 it will take precedence).</p>
 </div>
 <div class="paragraph">
-<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> using either <a href="https://github.com/google/guava">Guava</a> or <a href="http://www.axonframework.org/">Axon Framework</a> annotations and can
-optionally specify a title.</p>
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use obtain a reference to the domain object from the event.  From this they can, if they wish, specify a CSS class for
+the domain object using the event&#8217;s API.</p>
 </div>
 <div class="admonitionblock note">
 <table>
@@ -5993,7 +6938,7 @@ attribute is available for titles and icons.</p>
 <p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
 </div>
 <div class="sect4">
-<h5 id="_subscribers_3">Subscribers</h5>
+<h5 id="_subscribers_10">Subscribers</h5>
 <div class="paragraph">
 <p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
 or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
@@ -6046,7 +6991,7 @@ using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The e
 </div>
 </div>
 <div class="sect4">
-<h5 id="_default_doop_and_noop_events">Default, Doop and Noop events</h5>
+<h5 id="_default_doop_and_noop_events_8">Default, Doop and Noop events</h5>
 <div class="paragraph">
 <p>If the <code>cssClassUiEvent</code> attribute is not explicitly specified (is left as its default value, <code>CssClassUiEvent.Default</code>),
 then the framework will, by default, post an event.</p>
@@ -6062,7 +7007,7 @@ will ensure that the event to be posted, irrespective of the configuration prope
 </div>
 <div class="paragraph">
 <p>And, conversely, the framework also provides <code>CssClassUiEvent.Noop</code>; if <code>cssClassUiEvent</code> attribute is set to this class,
-thn no event will be posted.</p>
+then no event will be posted.</p>
 </div>
 </div>
 <div class="sect4">
@@ -6102,8 +7047,9 @@ object (if possible). This is as an alternative to implementing
 it will take precedence).</p>
 </div>
 <div class="paragraph">
-<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> using either <a href="https://github.com/google/guava">Guava</a> or <a href="http://www.axonframework.org/">Axon Framework</a> annotations and can
-optionally specify a title.</p>
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use obtain a reference to the domain object from the event.  From this they can, if they wish, specify an icon name for
+the domain object using the event&#8217;s API.</p>
 </div>
 <div class="admonitionblock note">
 <table>
@@ -6155,7 +7101,7 @@ attribute is available for titles and CSS classes.</p>
 <p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
 </div>
 <div class="sect4">
-<h5 id="_subscribers_4">Subscribers</h5>
+<h5 id="_subscribers_11">Subscribers</h5>
 <div class="paragraph">
 <p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
 or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
@@ -6208,7 +7154,7 @@ using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The e
 </div>
 </div>
 <div class="sect4">
-<h5 id="_default_doop_and_noop_events_2">Default, Doop and Noop events</h5>
+<h5 id="_default_doop_and_noop_events_9">Default, Doop and Noop events</h5>
 <div class="paragraph">
 <p>If the <code>iconUiEvent</code> attribute is not explicitly specified (is left as its default value, <code>IconUiEvent.Default</code>),
 then the framework will, by default, post an event.</p>
@@ -6356,8 +7302,9 @@ using the <a href="#_rg_annotations_manpage-Title"><code>@Title</code></a> annot
 <code>title()</code> or <code>@Title</code> are present, then they will take precedence).</p>
 </div>
 <div class="paragraph">
-<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> using either <a href="https://github.com/google/guava">Guava</a> or <a href="http://www.axonframework.org/">Axon Framework</a> annotations and can
-optionally specify a title.</p>
+<p>Subscribers subscribe through the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> and can
+use obtain a reference to the domain object from the event.  From this they can, if they wish, specify a title for
+the domain object using the event&#8217;s API.</p>
 </div>
 <div class="admonitionblock note">
 <table>
@@ -6409,7 +7356,7 @@ attribute is available for icon names and CSS classes.</p>
 <p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
 </div>
 <div class="sect4">
-<h5 id="_subscribers_5">Subscribers</h5>
+<h5 id="_subscribers_12">Subscribers</h5>
 <div class="paragraph">
 <p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API
 or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured)
@@ -6463,7 +7410,7 @@ actually specify the title to be used.</p>
 </div>
 </div>
 <div class="sect4">
-<h5 id="_default_doop_and_noop_events_3">Default, Doop and Noop events</h5>
+<h5 id="_default_doop_and_noop_events_10">Default, Doop and Noop events</h5>
 <div class="paragraph">
 <p>If the <code>titleUiEvent</code> attribute is not explicitly specified (is left as its default value, <code>TitleUiEvent.Default</code>),
 then the framework will, by default, post an event.</p>
@@ -8729,7 +9676,7 @@ rather than through the constructor.  This substantially reduces the boilerplate
 </table>
 </div>
 <div class="sect4">
-<h5 id="_subscribers_6">Subscribers</h5>
+<h5 id="_subscribers_13">Subscribers</h5>
 <div class="paragraph">
 <p>Subscribers (which must be domain services) subscribe using either the <a href="https://github.com/google/guava">Guava</a> API or (if the <a href="#_rg_services-api_manpage-EventBusService"><code>EventBusService</code></a> has been appropriately configured) using the <a href="http://www.axonframework.org/">Axon Framework</a> API.  The examples below use the Guava API.</p>
 </div>
@@ -10011,17 +10958,25 @@ can be used instead, eg:</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> Customer {
     <span class="annotation">@Title</span>(sequence=<span class="string"><span class="delimiter">&quot;</span><span class="content">1.0</span><span class="delimiter">&quot;</span></span>)
-    <span class="directive">public</span> <span class="predefined-type">String</span> lastName() { ... }
+    <span class="directive">public</span> <span class="predefined-type">String</span> getLastName() { ... }     <i class="conum" data-value="1"></i><b>(1)</b>
     ...
     <span class="annotation">@Title</span>(sequence=<span class="string"><span class="delimiter">&quot;</span><span class="content">1.5</span><span class="delimiter">&quot;</span></span>, prepend=<span class="string"><span class="delimiter">&quot;</span><span class="content">, </span><span class="delimiter">&quot;</span></span>)
-    <span class="directive">public</span> <span class="predefined-type">String</span> firstName() { ... }
+    <span class="directive">public</span> <span class="predefined-type">String</span> getFirstName() { ... }
     ...
     <span class="annotation">@Title</span>(sequence=<span class="string"><span class="delimiter">&quot;</span><span class="content">1.7</span><span class="delimiter">&quot;</span></span>, append=<span class="string"><span class="delimiter">&quot;</span><span class="content">.</span><span class="delimiter">&quot;</span></span>)
-    <span class="directive">public</span> <span class="predefined-type">String</span> midInitial() { ... }
+    <span class="directive">public</span> <span class="predefined-type">String</span> getMidInitial() { ... }
     ...
 }</code></pre>
 </div>
 </div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>backing field and setters omitted</td>
+</tr>
+</table>
+</div>
 <div class="paragraph">
 <p>could be used to create names of the style "Bloggs, Joe K."</p>
 </div>
@@ -10038,6 +10993,32 @@ viewer), this convention excludes any properties whose value is already
 present in the title column. This convention can be overridden using
 <code>@Hidden(where=Where.NOWHERE)</code>.</p>
 </div>
+<div class="sect3">
+<h4 id="_lombok_support">2.30.1. Lombok support</h4>
+<div class="paragraph">
+<p>If <a href="cg.html#_cg_ide_project-lombok">Project Lombok</a> is being used, then <code>@Title</code> can be specified on the backing field.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> Customer {
+    <span class="annotation">@Title</span>(sequence=<span class="string"><span class="delimiter">&quot;</span><span class="content">1.0</span><span class="delimiter">&quot;</span></span>)
+    <span class="annotation">@Getter</span> <span class="annotation">@Setter</span>
+    <span class="directive">private</span> <span class="predefined-type">String</span> name;
+
+    <span class="annotation">@Title</span>(sequence=<span class="string"><span class="delimiter">&quot;</span><span class="content">1.5</span><span class="delimiter">&quot;</span></span>, prepend=<span class="string"><span class="delimiter">&quot;</span><span class="content">, </span><span class="delimiter">&quot;</span></span>)
+    <span class="annotation">@Getter</span> <span class="annotation">@Setter</span>
+    <span class="directive">private</span> <span class="predefined-type">String</span> firstName;
+
+    <span class="annotation">@Title</span>(sequence=<span class="string"><span class="delimiter">&quot;</span><span class="content">1.7</span><span class="delimiter">&quot;</span></span>, append=<span class="string"><span class="delimiter">&quot;</span><span class="content">.</span><span class="delimiter">&quot;</span></span>)
+    <span class="annotation">@Getter</span> <span class="annotation">@Setter</span>
+    <span class="directive">private</span> <span class="predefined-type">String</span> midInitial;
+}</code></pre>
+</div>
+</div>
+</div>
 </div>
 <div class="sect2">
 <h3 id="_rg_annotations_manpage-ViewModel">2.31. <code>@ViewModel</code></h3>
@@ -23392,7 +24373,8 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <p><code>isis.object.</code><br>
 <code>editing</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether objects' properties and collections can be edited directly (for objects annotated with <a href="#_rg_annotations_manpage-DomainObject_editing"><code>@DomainObject#editing()</code></a>); see <a href="#_rg_runtime_configuring-core_isis-objects-editing">below</a> for further discussion.</p>
 </div></div></td>
@@ -23402,7 +24384,8 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <p><code>isis.persistor.</code><br>
 <code>disableConcurrencyChecking</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>false</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>false</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Disables concurrency checking globally. <br></p>
 </div>
@@ -23416,7 +24399,8 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <code>actionAnnotation.</code><br>
 <code>domainEvent.postForDefault</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether an event should be posted if <a href="#_rg_annotations_manpage-Action_domainEvent"><code>@Action#domainEvent()</code></a> is not specified (is set to <code>ActionDomainEvent.Default</code>).</p>
 </div></div></td>
@@ -23427,7 +24411,8 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <code>collectionAnnotation.</code><br>
 <code>domainEvent.postForDefault</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether an event should be posted if <a href="#_rg_annotations_manpage-Collection_domainEvent"><code>@Collection#domainEvent()</code></a> is not specified (is set to <code>CollectionDomainEvent.Default</code>).</p>
 </div></div></td>
@@ -23437,7 +24422,7 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <p><code>isis.reflector.facet.</code><br>
 <code>cssClass.patterns</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">regex:css1,regex2:css2,&#8230;&#8203;</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">regex:css1, regex2:css2,&#8230;&#8203;</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Comma separated list of key:value pairs, where the key is a regex matching action names (eg <code>delete.*</code>) and the value is a <a href="http://getbootstrap.com/css/">Bootstrap</a> CSS button class (eg <code>btn-warning) to be applied (as per `@CssClass()</code>) to all action members matching the regex.<br></p>
 </div>
@@ -23461,10 +24446,110 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>createdLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_createdLifecycleEvent"><code>@DomainObject#createdLifecycleEvent()</code></a> is not specified (is set to <code>ObjectCreatedEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>loadedLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_loadedLifecycleEvent"><code>@DomainObject#loadedLifecycleEvent()</code></a> is not specified (is set to <code>ObjectLoadedEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>persistingLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_persistingLifecycleEvent"><code>@DomainObject#persistingLifecycleEvent()</code></a> is not specified (is set to <code>ObjectPersistingEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>persistedLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_persistedLifecycleEvent"><code>@DomainObject#persistedLifecycleEvent()</code></a> is not specified (is set to <code>ObjectPersistedEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>removingLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_removingLifecycleEvent"><code>@DomainObject#removingLifecycleEvent()</code></a> is not specified (is set to <code>ObjectRemovingEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>updatingLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_updatingLifecycleEvent"><code>@DomainObject#updatingLifecycleEvent()</code></a> is not specified (is set to <code>ObjectUpdatingEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
+<code>domainObjectAnnotation.</code><br>
+<code>updatedLifecycleEvent.</code><br>
+<code>postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObject_updatedLifecycleEvent"><code>@DomainObject#updatedLifecycleEvent()</code></a> is not specified (is set to <code>ObjectUpdatedEvent.Default</code>).</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>isis.reflector.facet.</code><br>
 <code>domainObjectLayoutAnnotation.</code><br>
-<code>cssClassUiEvent.postForDefault</code></p>
+<code>cssClassUiEvent.postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent"><code>@DomainObjectLayout#cssClassUiEvent()</code></a> is not specified (is set to <code>CssClassUiEvent.Default</code>).</p>
 </div></div></td>
@@ -23473,9 +24558,11 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><code>isis.reflector.facet.</code><br>
 <code>domainObjectLayoutAnnotation.</code><br>
-<code>iconUiEvent.postForDefault</code></p>
+<code>iconUiEvent.postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObjectLayout_iconUiEvent"><code>@DomainObjectLayout#iconUiEvent()</code></a> is not specified (is set to <code>IconUiEvent.Default</code>).</p>
 </div></div></td>
@@ -23484,9 +24571,11 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><code>isis.reflector.facet.</code><br>
 <code>domainObjectLayoutAnnotation.</code><br>
-<code>titleUiEvent.postForDefault</code></p>
+<code>titleUiEvent.postForDefault</code><br>
+(<code>1.11.0-SNAPSHOT</code>)</p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether an event should be posted if <a href="#_rg_annotations_manpage-DomainObjectLayout_titleUiEvent"><code>@DomainObjectLayout#titleUiEvent()</code></a> is not specified (is set to <code>TitleUiEvent.Default</code>).</p>
 </div></div></td>
@@ -23496,7 +24585,8 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <p><code>isis.reflector.facet.</code><br>
 <code>filterVisibility</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether objects should be filtered for visibility.<br></p>
 </div>
@@ -23510,7 +24600,8 @@ using security or using a <a href="ug.html#_ug_more-advanced_decoupling_vetoing-
 <code>propertyAnnotation.</code><br>
 <code>domainEvent.postForDefault</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether an event should be posted if <a href="#_rg_annotations_manpage-Property_domainEvent"><code>@Property#domainEvent()</code></a> is not specified (is set to <code>PropertyDomainEvent.Default</code>).</p>
 </div></div></td>
@@ -23581,7 +24672,8 @@ See <a href="ug.html#_ug_extending_programming-model_finetuning">finetuning the
 <p><code>isis.reflector.validator.</code><br>
 <code>allowDeprecated</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code> (<code>true</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code>,<code>false</code><br>
+(<code>true</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Whether deprecated annotations or naming conventions are tolerated or not.  If not, then a metamodel validation error will be triggered, meaning the app won&#8217;t boot (fail-fast).</p>
 </div></div></td>
@@ -23606,7 +24698,8 @@ See <a href="ug.html#_ug_extending_programming-model_finetuning">finetuning the
 <p><code>isis.services.</code><br>
 <code>audit.objects</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>all</code>, <code>none</code> (<code>all</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>all</code>, <code>none</code><br>
+(<code>all</code>)</p></td>
 <td class="tableblock halign-left valign-top"><div><div cl

<TRUNCATED>

[5/5] isis-site git commit: ISIS-803 custom lifecycle events; live templates

Posted by da...@apache.org.
ISIS-803 custom lifecycle events; live templates


Project: http://git-wip-us.apache.org/repos/asf/isis-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis-site/commit/2d3a7aab
Tree: http://git-wip-us.apache.org/repos/asf/isis-site/tree/2d3a7aab
Diff: http://git-wip-us.apache.org/repos/asf/isis-site/diff/2d3a7aab

Branch: refs/heads/asf-site
Commit: 2d3a7aabe20e5d006f13698a4b35e3868ebb899a
Parents: c8287a0
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Nov 25 18:23:33 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Nov 25 18:23:33 2015 +0000

----------------------------------------------------------------------
 content/guides/cg.html                          |  109 +-
 content/guides/rg.html                          | 1398 ++++++++++++++++--
 ...-settings-file-templates-for-apache-isis.jar |  Bin 0 -> 9104 bytes
 .../resources/templates/isis-template-idea.xml  |  522 +++++++
 .../resources/templates/isis-templates-idea.xml |  804 ----------
 content/resources/templates/isis-templates2.xml |  479 ------
 6 files changed, 1869 insertions(+), 1443 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis-site/blob/2d3a7aab/content/guides/cg.html
----------------------------------------------------------------------
diff --git a/content/guides/cg.html b/content/guides/cg.html
index 05fb71f..1bf8214 100644
--- a/content/guides/cg.html
+++ b/content/guides/cg.html
@@ -1653,10 +1653,19 @@ rather than Lombok&#8217;s own <code>@Getter</code> and `@Setter.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_cg_ide-templates">3. IDE Templates</h2>
+<h2 id="_cg_ide-templates">3. Code and File Templates</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p>We provide IDE templates (for IntelliJ and Eclipse) for writing Apache Isis domain objects, and also for unit tests (JUnit and JMock).  We also provide them for IntelliJ for writing Asciidoc documentation (see also the <a href="#_cg_asciidoc-templates">appendix</a>).</p>
+<p>We provide parameterized templates, for both IntelliJ and Eclipse, to help you write your domain applications.</p>
+</div>
+<div class="paragraph">
+<p>On IntelliJ we provide both file templates (<code>File &gt; Settings &gt; Editor &gt; File and Code Templates</code>) and also live templates (<code>File &gt; Settings &gt; Editor &gt; Live Templates</code>).  The former are used to create new classes or files (eg a new domain entity), while the latter are intended to modify an existing file (eg create a new property or add a <code>toString()</code> method etc).</p>
+</div>
+<div class="paragraph">
+<p>On Eclipse we provide only the latter sort of template (Windows &gt; Preferences &gt; Java &gt; Editor &gt; Templates).</p>
+</div>
+<div class="paragraph">
+<p>There are templates for writing Apache Isis domain objects, for writing unit tests (JUnit and JMock), and also for writing Asciidoc documentation (see also the <a href="#_cg_asciidoc-templates">appendix</a>).</p>
 </div>
 <div class="sect2">
 <h3 id="_download">3.1. Download</h3>
@@ -1665,25 +1674,34 @@ rather than Lombok&#8217;s own <code>@Getter</code> and `@Setter.</p>
 </div>
 <table class="tableblock frame-all grid-all spread">
 <colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 20%;">
+<col style="width: 22%;">
+<col style="width: 22%;">
+<col style="width: 11%;">
+<col style="width: 22%;">
+<col style="width: 22%;">
 </colgroup>
 <thead>
 <tr>
-<th class="tableblock halign-left valign-top">Template</th>
+<th class="tableblock halign-left valign-top">Purpose</th>
+<th class="tableblock halign-left valign-top">IntelliJ<br>
+file template</th>
 <th class="tableblock halign-left valign-top">Prefix</th>
-<th class="tableblock halign-left valign-top">IntelliJ</th>
-<th class="tableblock halign-left valign-top">Eclipse</th>
-<th class="tableblock halign-left valign-top">Apache Isis Domain Objects</th>
+<th class="tableblock halign-left valign-top">IntelliJ<br>
+live template</th>
+<th class="tableblock halign-left valign-top">Eclipse<br>
+template</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
-<p>is</p>
+<p>Domain Objects</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><a href="../resources/templates/intellij-settings-file-templates-for-apache-isis.jar">Download</a></p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>is</code></p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/isis-templates-idea.xml">Download</a></p>
@@ -1691,51 +1709,62 @@ rather than Lombok&#8217;s own <code>@Getter</code> and `@Setter.</p>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/isis-templates.xml">Download</a></p>
 </div></div></td>
+</tr>
+<tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>JUnit tests</p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
-<p>ju</p>
+<p>(none)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>ju</code></p>
 </div></div></td>
-</tr>
-<tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/junit4-templates-idea.xml">Download</a></p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/junit4-templates.xml">Download</a></p>
 </div></div></td>
+</tr>
+<tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>JMock tests</p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
-<p>jm</p>
+<p>(none)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>jm</code></p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/jmock2-templates-idea.xml">Download</a></p>
 </div></div></td>
-</tr>
-<tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/jmock2-templates.xml">Download</a></p>
 </div></div></td>
+</tr>
+<tr>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p>Asciidoc</p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
-<p>ad</p>
+<p>(none)</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><div><div class="paragraph">
+<p><code>ad</code></p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
 <p><a href="../resources/templates/isis-asciidoc-templates-idea.xml">Download</a></p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div><div class="paragraph">
-<p>(none )</p>
+<p>(none)</p>
 </div></div></td>
 </tr>
 </tbody>
 </table>
 <div class="paragraph">
-<p>The most commonly used Apache Isis domain objects templates are also listed on the <a href="../cheat-sheet.html">Apache Isis cheat sheet</a>.</p>
+<p>The most commonly used domain objects (live) templates are also listed on the <a href="../cheat-sheet.html">Apache Isis cheat sheet</a>.</p>
 </div>
 </div>
 <div class="sect2">
@@ -1743,24 +1772,27 @@ rather than Lombok&#8217;s own <code>@Getter</code> and `@Setter.</p>
 <div class="sect3">
 <h4 id="_intellij">3.2.1. IntelliJ</h4>
 <div class="paragraph">
-<p>To install in IntelliJ (Community edition 15), copy to the relevant <code>config/templates</code> directory, eg:</p>
+<p>To install in the live templates IntelliJ (Community edition 15), copy to the relevant <code>config/templates</code> directory, eg:</p>
 </div>
 <div class="ulist">
 <ul>
 <li>
-<p>Windows <code>&lt;User home&gt;\.IdeaIC14\config\templates</code></p>
+<p>Windows <code>&lt;User home&gt;\.IdeaIC15\config\templates</code></p>
 </li>
 <li>
 <p>Linux <code>~/.IdeaIC14/config/templates</code></p>
 </li>
 <li>
-<p>Mac OS <code>~/Library/Preferences/IdeaIC14/templates</code></p>
+<p>Mac OS <code>~/Library/Preferences/IdeaIC15/templates</code></p>
 </li>
 </ul>
 </div>
 <div class="paragraph">
 <p>If using the Ultimate edition, the directory is <code>.IntelliJIdea15</code> rather than <code>IdeaIC15</code>.</p>
 </div>
+<div class="paragraph">
+<p>To install the file templates, use <code>File &gt; Import Settings</code>.</p>
+</div>
 </div>
 <div class="sect3">
 <h4 id="_eclipse">3.2.2. Eclipse</h4>
@@ -1772,7 +1804,11 @@ rather than Lombok&#8217;s own <code>@Getter</code> and `@Setter.</p>
 <div class="sect2">
 <h3 id="_usage">3.3. Usage</h3>
 <div class="paragraph">
-<p>Enter the prefix (<code>is</code>, <code>ju</code>, <code>jm</code>) and the IDE will list all available templates in that category.</p>
+<p>For the live templates, enter the prefix in the editor (<code>is</code>, <code>ju</code>, <code>jm</code>) and the IDE will list all available templates
+in that category.</p>
+</div>
+<div class="paragraph">
+<p>For the file templates (IntelliJ only), these are available from <code>File &gt; New</code>.</p>
 </div>
 </div>
 </div>
@@ -2215,15 +2251,9 @@ within the Isis application (they may reference underlying domain entities) wher
 XSDs can be used standalone, eg by a Java subscriber running on an ESB such as Apache Camel.</p>
 </div>
 <div class="paragraph">
-<p>The diagram below shows how these different plugins fit together:</p>
-</div>
-<div class="imageblock">
-<div class="content">
-<a class="image" href="images/maven-plugin/xsd-goal.png"><img src="images/maven-plugin/xsd-goal.png" alt="xsd goal" width="800px"></a>
-</div>
-</div>
-<div class="paragraph">
-<p>The sections below explain in more detail how to configure the <code>xsd</code> plugin (and other plugins).</p>
+<p>The rest of this section explains how to configure a new <code>xsd</code> submodule that uses the <code>isis-maven-plugin</code> along with
+other standard plugins in order to generate both XSDs and DTOs.  The <code>pom.xml</code> described below uses Maven profiles
+to separate out these two responsibilities.</p>
 </div>
 <div class="sect3">
 <h4 id="_cg_isis-maven-plugin_xsd">5.3.1. <code>xsd</code> submodule</h4>
@@ -2248,6 +2278,15 @@ generated XSD files into a zip file.</p>
 </ul>
 </div>
 <div class="paragraph">
+<p>These two main responsibilities can then be placed into separate Maven profiles, for better modularity.  The diagram
+below shows the overall design:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images/maven-plugin/xsd-goal.png"><img src="images/maven-plugin/xsd-goal.png" alt="xsd goal" width="800px"></a>
+</div>
+</div>
+<div class="paragraph">
 <p>For example, here is the <code>pom.xml</code> file for the (non-ASF)
 <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a> example app&#8217;s <code>todoapp-xsd</code> submodule.</p>
 </div>
@@ -8251,7 +8290,7 @@ xxx<br>
 </li>
 </ul>
 </li>
-<li><a href="#_cg_ide-templates">3. IDE Templates</a>
+<li><a href="#_cg_ide-templates">3. Code and File Templates</a>
 <ul class="sectlevel2">
 <li><a href="#_download">3.1. Download</a></li>
 <li><a href="#_installation">3.2. Installation</a>


[2/5] isis-site git commit: ISIS-803 custom lifecycle events; live templates

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis-site/blob/2d3a7aab/content/resources/templates/isis-templates-idea.xml
----------------------------------------------------------------------
diff --git a/content/resources/templates/isis-templates-idea.xml b/content/resources/templates/isis-templates-idea.xml
deleted file mode 100644
index bc490fd..0000000
--- a/content/resources/templates/isis-templates-idea.xml
+++ /dev/null
@@ -1,804 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<templateSet group="isis-templates">
-  <template name="isa" value="//region &gt; $actionName$ (action)&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public $ReturnType$ $actionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: business logic here&#10;}&#10;//endregion" description="Isis Action" toReformat="true" toShortenFQNames="true">
-    <variable name="actionName" expression="&quot;actionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ReturnType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isaauto" value="public java.util.Collection&lt;$ParameterType$&gt; autoComplete$ParameterNum$$ActionName$(final String search) {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for argument N&#10;}" description="Isis Action auto-complete" toReformat="true" toShortenFQNames="true">
-    <variable name="ParameterNum" expression="&quot;Num&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isacho" value="public java.util.List&lt;$ParameterType$&gt; choices$ParameterNum$$ActionName$() {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for argument N&#10;}" description="Isis Action choices" toReformat="true" toShortenFQNames="true">
-    <variable name="ParameterNum" expression="&quot;Num&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isadef" value="public $ParameterType$ default$ParameterNum$$ActionName$() {&#10;    return $END$null; // TODO: return default for argument N&#10;}" description="Isis Action defaults" toReformat="true" toShortenFQNames="true">
-    <variable name="ParameterNum" expression="&quot;Num&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isadis" value="public String disable$ActionName$() {&#10;    return $END$null; // TODO: return reason why action disabled, null if enabled&#10;}" description="Isis Action disablement" toReformat="true" toShortenFQNames="true">
-    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isahid" value="public boolean hide$ActionName$() {&#10;    return $END$false; // TODO: return true if action is hidden, false if visible&#10;}" description="Isis Action visibility" toReformat="true" toShortenFQNames="true">
-    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isaval" value="public String validate$ActionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: return reason why action arguments are invalid, null if ok&#10;}" description="Isis Action validation" toReformat="true" toShortenFQNames="true">
-    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscmod.1m" value="public void addTo$ChildCollectionName$(final $ChildElementType$ $childElementName$) {&#10;    // check for no-op&#10;    if ($childElementName$ == null || &#10;        get$ChildCollectionName$().contains($childElementName$)) {&#10;        return;&#10;    }&#10;    // dissociate arg from its current parent (if any).&#10;    $childElementName$.clear$ParentPropertyNameInChild$();&#10;    // associate arg&#10;    $childElementName$.set$ParentPropertyNameInChild$(this);&#10;    get$ChildCollectionName$().add($childElementName$);&#10;}&#10;public void removeFrom$ChildCollectionName$(final $ChildElementType$ $childElementName$) {&#10;    // check for no-op&#10;    if ($childElementName$ == null || &#10;        !get$ChildCollectionName$().contains($childElementName$)) {&#10;        return;&#10;    }&#10;    // dissociate arg&#10;    $childElementName$.set$ParentPropertyNameInChild$(null);&#10;    get$ChildCollectionName$().remove($childElementName$);&#10;
 }" description="Isis Collection modification" toReformat="true" toShortenFQNames="true">
-    <variable name="ChildCollectionName" expression="&quot;ChildCollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="childElementName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParentPropertyNameInChild" expression="&quot;ParentPropertyNameInChild&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscmod.mmc" value="public void addTo$ParentCollectionName$(final $ParentElementType$ $parentElementName$) {&#10;    // check for no-op&#10;    if ($parentElementName$ == null || &#10;        get$ParentCollectionName$().contains($parentElementName$)) {&#10;        return;&#10;    }&#10;    // delegate to parent to add&#10;    $parentElementName$.addTo$ChildCollectionNameInParent$(this);&#10;}&#10;public void removeFrom$ParentCollectionName$(final $ParentElementType$ $parentElementName$) {&#10;    // check for no-op&#10;    if ($parentElementName$ == null || &#10;       !get$ParentCollectionName$().contains($parentElementName$)) {&#10;       return;&#10;    }&#10;    // delegate to parent to remove&#10;    $parentElementName$.removeFrom$ChildCollectionNameInParent$(this);&#10;}" description="Isis Collection modification (m:m child)" toReformat="true" toShortenFQNames="true">
-    <variable name="ParentCollectionName" expression="&quot;ParentCollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParentElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="parentElementName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildCollectionNameInParent" expression="&quot;ChildCollectionNameInParent&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscmod.mmp" value="public void addTo$ChildCollectionName$(final $ChildElementType$ $childElementName$) {&#10;    // check for no-op&#10;    if ($childElementName$ == null || &#10;        get$ChildCollectionName$().contains($childElementName$)) {&#10;        return;&#10;    }&#10;    // dissociate arg from its current parent (if any).&#10;    $childElementName$.removeFrom$ParentCollectionNameInChild$(this);&#10;    // associate arg&#10;    $childElementName$.get$ParentCollectionNameInChild$().add(this);&#10;    get$ChildCollectionName$().add($childElementName$);&#10;}&#10;public void removeFrom$ChildCollectionName$(final $ChildElementType$ $childElementName$) {&#10;    // check for no-op&#10;    if ($childElementName$ == null || &#10;       !get$ChildCollectionName$().contains($childElementName$)) {&#10;       return;&#10;    }&#10;    // dissociate arg&#10;    $childElementName$.get$ParentCollectionNameInChild$().remove(this);&#10;    get$ChildCollectionName$().rem
 ove($childElementName$);&#10;}" description="Isis Collection modification (m:m parent)" toReformat="true" toShortenFQNames="true">
-    <variable name="ChildCollectionName" expression="&quot;ChildCollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="childElementName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParentCollectionNameInChild" expression="&quot;ParentCollectionNameInChild&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscdis" value="public String disable$CollectionName$() {&#10;    return $END$null; // TODO: return reason why collection read-only, null if editable&#10;}" description="Isis Collection disablement" toReformat="true" toShortenFQNames="true">
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ischid" value="public boolean hide$CollectionName$() {&#10;    return $END$false; // TODO: return true if hidden, false otherwise&#10;}" description="Isis Collection visibility" toReformat="true" toShortenFQNames="false">
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscl" value="//region &gt; $collectionName$ (collection)&#10;private java.util.List&lt;$ElementType$&gt; $collectionName$ = com.google.common.collect.Lists.newArrayList();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public java.util.List&lt;$ElementType$&gt; get$CollectionName$() {&#10;    return $collectionName$;&#10;}&#10;public void set$CollectionName$(final java.util.List&lt;$ElementType$&gt; $collectionName$) {&#10;    this.$collectionName$ = $collectionName$;&#10;}&#10;//endregion" description="Isis Collection (List)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs" value="//region &gt; $collectionName$ (collection)&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = com.google.common.collect.Sets.newTreeSet();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public java.util.Set&lt;$ElementType$&gt; get$CollectionName$() {&#10;    return $collectionName$;&#10;}&#10;public void set$CollectionName$(final java.util.Set&lt;$ElementType$&gt; $collectionName$) {&#10;    this.$collectionName$ = $collectionName$;&#10;}&#10;//endregion" description="Isis Collection (Set)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscval" value="public String validateAddTo$CollectionName$(final $ElementType$ $elementName$) {&#10;    return $END$null; // TODO: return reason why argument cannot be added, null if ok to add&#10;}&#10;public String validateRemoveFrom$CollectionName$(final $ElementType$ $elementName$) {&#10;    return null; // TODO: return reason why argument cannot be removed, null if ok to remove&#10;}" description="Isis Collection validation" toReformat="true" toShortenFQNames="true">
-    <variable name="elementName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isds" value="//region  &gt; $serviceType$ (injected)&#10;private $ServiceType$ $serviceType$;&#10;    public final void inject$ServiceType$(final $ServiceType$ $serviceType$) {&#10;    this.$serviceType$ = $serviceType$;&#10;}&#10;//endregion" description="Isis Injected Dependency Service" toReformat="true" toShortenFQNames="true">
-    <variable name="ServiceType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="serviceType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ism.fp" value="/**&#10; * Create new (already persisted) $Type$&#10; */&#10;@org.apache.isis.applib.annotation.Programmatic&#10;public $Type$ new$Type$() {&#10;    $Type$ $type$ = newTransientInstance($Type$.class);&#10;    $END$// TODO: set up any properties&#10; &#10;    persist($type$);&#10;    return $type$;&#10;}&#10;" description="Isis Commonly used method (factory for persistent)" toReformat="true" toShortenFQNames="true">
-    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="type" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ism.ft" value="/**&#10; * Create new (still transient) $Type$&#10; */&#10;@org.apache.isis.applib.annotation.Programmatic&#10;public $Type$ new$Type$() {&#10;    $Type$ $type$ = newTransientInstance($Type$.class);&#10;    $END$// TODO: set up any properties&#10;&#10;    return $type$;&#10;}&#10;" description="Isis Commonly used method (factory for transient)" toReformat="true" toShortenFQNames="true">
-    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="type" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isid" value="//region &gt; identificatio&#10; $END$&#10;//endregion" description="Isis Identification region" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isidicon" value="public String iconName() {&#10;    return $END$null; // TODO: return name of image file (without suffix)&#10; }" description="Isis Identification (icon)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isidtitle" value="public String title() {&#10;    final org.apache.isis.applib.util.TitleBuffer buf = new org.apache.isis.applib.util.TitleBuffer();&#10;    $END$// TODO: append to org.apache.isis.applib.util.TitleBuffer, typically value properties&#10;    return buf.toString();&#10;}" description="Isis Identification (title)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs.jdo.1m.b.fk" value="//region &gt; $collectionName$ (collection)&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$elementNameInChild$&quot;, dependentElement=&quot;$trueOrFalse$&quot;)&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public java.util.SortedSet&lt;$ElementType$&gt; get$CollectionName$() {&#10;    return $collectionName$;&#10;}&#10;public void set$CollectionName$(final java.util.SortedSet&lt;$ElementType$&gt; $collectionName$) {&#10;    this.$collectionName$ = $collectionName$;&#10;}&#10;//endregion" description="Isis JDO Collection (1:m parent bidirectional to foreign key)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="elementNameInChild" expression="&quot;elementNameInChild&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs.jdo.1m.b.jt" value="//region &gt; $collectionName$ (collection)&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$elementNameInChild$&quot;, dependentElement=&quot;$trueOrFalse$&quot;)&#10;@javax.jdo.annotations.Join&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public java.util.SortedSet&lt;$ElementType$&gt; get$CollectionName$() {&#10;    return $collectionName$;&#10;}&#10;public void set$CollectionName$(final java.util.SortedSet&lt;$ElementType$&gt; $collectionName$) {&#10;    this.$collectionName$ = $collectionName$;&#10;}&#10;//endregion" description="Isis JDO Collection (1:m parent bidirectional to join table)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="elementNameInChild" expression="&quot;elementNameInChild&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs.jdo.1m.u.fk" value="//region &gt; $collectionName$ (collection)&#10;@javax.jdo.annotations.Element(column=&quot;$ColumnName$&quot;, dependent=&quot;$trueOrFalse$&quot;)&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public java.util.SortedSet&lt;$ElementType$&gt; get$CollectionName$() {&#10;    return $collectionName$; &#10;}&#10;public void set$CollectionName$(final java.util.SortedSet&lt;$ElementType$&gt; $collectionName$) { &#10;    this.$collectionName$ = $collectionName$;&#10;}&#10;//endregion" description="Isis JDO Collection (1:m parent unidirectional)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ColumnName" expression="&quot;ColumnName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs.jdo.1m.u.jt" value="//region &gt; $collectionName$ (collection)&#10;@javax.jdo.annotations.Join&#10;@javax.jdo.annotations.Element(dependent=&quot;$trueOrFalse$&quot;)&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public java.util.SortedSet&lt;$ElementType$&gt; get$CollectionName$() {&#10;    return $collectionName$;&#10;} &#10;public void set$CollectionName$(final java.util.SortedSet&lt;$ElementType$&gt; $collectionName$) {&#10;    this.$collectionName$ = $collectionName$;&#10;}&#10;//endregion" description="Isis JDO Collection (1:m parent unidirectional to join table)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs.jdo.mn.ub.c" value="//region &gt; $collectionName$ (collection)&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$ChildCollectionNameInParent$&quot;)&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;(); &#10;public java.util.SortedSet&lt;$ElementType$&gt; get$CollectionName$() { &#10;    return $collectionName$; &#10;} &#10;public void set$CollectionName$(final java.util.SortedSet&lt;$ElementType$&gt; $collectionName$) { &#10;    this.$collectionName$ = $collectionName$; &#10;} &#10;//endregion" description="Isis JDO Collection (m:n child)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildCollectionNameInParent" expression="&quot;ChildCollectionNameInParent&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="iscs.jdo.mn.ub.p" value="//region &gt; $collectionName$ (collection)&#10;@javax.jdo.annotations.Persistent(table=&quot;$TableName$&quot;) &#10;@javax.jdo.annotations.Join(column=&quot;$ThisEntityFieldName$&quot;) &#10;@javax.jdo.annotations.Element(column=&quot;$RelatedEntityFieldName$&quot;) &#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)  &#10;public java.util.SortedSet&lt;$ElementType$&gt; get$CollectionName$() {  &#10;    return $collectionName$; &#10;} &#10;public void set$CollectionName$(final java.util.SortedSet&lt;$ElementType$&gt; $collectionName$) {  &#10;    this.$collectionName$ = $collectionName$; &#10;} &#10;//endregion" description="Isis JDO Collection (m:n parent)" toReformat="true" toShortenFQNames="true">
-    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ElementType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="TableName" expression="&quot;TableName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ThisEntityFieldName" expression="&quot;ThisEntityFieldName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="RelatedEntityFieldName" expression="&quot;RelatedEntityFieldName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isp.jdo" value="//region &gt; $propertyName$ (property)&#10;private $PropertyType$ $propertyName$;&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;@javax.jdo.annotations.Column(allowsNull=&quot;$trueOrFalse$&quot;)&#10;public $PropertyType$ get$PropertyName$() {&#10;    return $propertyName$;&#10;}&#10;public void set$PropertyName$(final $PropertyType$ $propertyName$) {&#10;    this.$propertyName$ = $propertyName$;&#10;}&#10;//endregion" description="Isis JDO Property" toReformat="true" toShortenFQNames="true">
-    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isp.jdo.11c" value="//region &gt; $propertyName$ (property)&#10;private $PropertyType$ $propertyName$;&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;@javax.jdo.annotations.Column(allowsNull=&quot;$trueOrFalse$&quot;)&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$fieldOnChild$&quot;)&#10;public $PropertyType$ get$PropertyName$() { &#10;    return $propertyName$; &#10;}&#10;public void set$PropertyName$(final $PropertyType$ $propertyName$) {&#10;    this.$propertyName$ = $propertyName$;&#10;}&#10;//endregion" description="Isis JDO Property (1:1 bidirectional parent to foreign key)" toReformat="true" toShortenFQNames="true">
-    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="fieldOnChild" expression="&quot;fieldOnChild&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isl" value="//region &gt; Lifecycle callbacks&#10;$END$&#10;//endregion" description="Isis Lifecycle callbacks region" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="islc" value="public void created() {&#10;    $END$// TODO: post-create&#10;}" description="Isis Lifecycle callback (created)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isll" value="public void loading() {&#10;    $END$// TODO: pre-load&#10;}&#10;public void loaded() {&#10;    // TODO: post-load&#10;}" description="Isis Lifecycle callback (loading/loaded)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="islp" value="public void persisting() {&#10;    $END$// TODO: pre-persist&#10;}&#10;public void persisted() {&#10;    // TODO: post-persist&#10;}" description="Isis Lifecycle callback (persisting/persisted)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="islr" value="public void removing() {&#10;    $END$// TODO: pre-remove&#10;}&#10;public void removed() {&#10;    // TODO: post-remove&#10;}" description="Isis Lifecycle callback (removing/removed)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="islu" value="public void updating() {&#10;    $END$// TODO: pre-update&#10;}&#10;public void updated() {&#10;    // TODO: post-update&#10;}" description="Isis Lifecycle callback (updating/updated)" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isp" value="//region &gt; $propertyName$ (property)&#10;private $PropertyType$ $propertyName$;&#10;@org.apache.isis.applib.annotation.MemberOrder(sequence=&quot;1&quot;)&#10;public $PropertyType$ get$PropertyName$() {&#10;    return $propertyName$;&#10;}&#10;public void set$PropertyName$(final $PropertyType$ $propertyName$) {&#10;    this.$propertyName$ = $propertyName$;&#10;}&#10;//endregion" description="Isis Property" toReformat="true" toShortenFQNames="true">
-    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispmod.11c" value="public void modify$ParentPropertyName$(final $ParentPropertyType$ $parentPropertyName$) {&#10;    $ParentPropertyType$ current$ParentPropertyName$ = get$ParentPropertyName$();&#10;    // check for no-op&#10;    if ($parentPropertyName$ == null || &#10;       $parentPropertyName$.equals(current$ParentPropertyName$)) {&#10;       return;&#10;    }&#10;    // delegate to parent to associate&#10;    $parentPropertyName$.modify$ChildPropertyNameInParent$(this);&#10;}&#10;public void clear$ParentPropertyName$() {&#10;    $ParentPropertyType$ current$ParentPropertyName$ = get$ParentPropertyName$();&#10;    // check for no-op&#10;    if (current$ParentPropertyName$ == null) {&#10;        return;&#10;    }&#10;    // delegate to parent to dissociate&#10;    current$ParentPropertyName$.clear$ChildPropertyNameInParent$();&#10;}" description="Isis Property modification (1:1 bidirectional parent)" toReformat="true" toShortenFQNames="true">
-    <variable name="ParentPropertyName" expression="&quot;ParentPropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParentPropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="parentPropertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildPropertyNameInParent" expression="&quot;ChildPropertyNameInParent&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispmod.11p" value="public void modify$ChildPropertyName$(final $ChildPropertyType$ $childPropertyName$) {&#10;    $ChildPropertyType$ current$ChildPropertyName$ = get$ChildPropertyName$();&#10;    // check for no-op&#10;    if ($childPropertyName$ == null || &#10;        $childPropertyName$.equals(current$ChildPropertyName$)) {&#10;        return;&#10;    }&#10;    // dissociate existing&#10;    clear$ChildPropertyName$();&#10;    // associate new&#10;    $childPropertyName$.set$ParentPropertyNameInChild$(this);&#10;    set$ChildPropertyName$($childPropertyName$);&#10;}&#10;public void clear$ChildPropertyName$() {&#10;    $ChildPropertyType$ current$ChildPropertyName$ = get$ChildPropertyName$();&#10;    // check for no-op&#10;    if (current$ChildPropertyName$ == null) {&#10;        return;&#10;    }&#10;    // dissociate existing&#10;    current$ChildPropertyName$.set$ParentPropertyNameInChild$(null);&#10;    set$ChildPropertyName$(null);&#10;}" description="Isis 
 Property modification (1:1 bidirectional child)" toReformat="true" toShortenFQNames="true">
-    <variable name="ChildPropertyName" expression="&quot;ChildPropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildPropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="childPropertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParentPropertyNameInChild" expression="&quot;ParentPropertyNameInChild&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isp.m1" value="public void modify$ParentPropertyName$(final $ParentPropertyType$ $parentPropertyName$) {&#10;    $ParentPropertyType$ current$ParentPropertyName$ = get$ParentPropertyName$();&#10;    // check for no-op&#10;    if ($parentPropertyName$ == null || &#10;        $parentPropertyName$.equals(current$ParentPropertyName$)) {&#10;       return;&#10;    }&#10;    // delegate to parent to associate&#10;    $parentPropertyName$.addTo$ChildCollectionNameInParent$(this);&#10;}&#10;public void clear$ParentPropertyName$() {&#10;    $ParentPropertyType$ current$ParentPropertyName$ = get$ParentPropertyName$();&#10;    // check for no-op&#10;    if (current$ParentPropertyName$ == null) {&#10;        return;&#10;    }&#10;    // delegate to parent to dissociate&#10;    current$ParentPropertyName$.removeFrom$ChildCollectionNameInParent$(this);&#10;}" description="Isis Property modification (m:1 child)" toReformat="true" toShortenFQNames="true">
-    <variable name="ParentPropertyName" expression="&quot;ParentPropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="parentPropertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ParentPropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="ChildCollectionNameInParent" expression="&quot;ChildCollectionNameInParent&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispcho" value="public java.util.Collection&lt;$PropertyType$&gt; choices$PropertyName$() {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for property&#10;}" description="Isis Property choices" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispdef" value="public $PropertyType$ default$PropertyName$() {&#10;    return $END$null; // TODO: return default for property when first created&#10;}" description="Isis Property default" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispdis" value="public String disable$PropertyName$() {&#10;    return $END$null; // TODO: return reason why property is disabled, null if editable&#10;}" description="Isis Property disablement" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isphid" value="public boolean hide$PropertyName$() {&#10;  return $END$false; // TODO: return true if hidden, false if visible&#10; }" description="Isis Property visibility" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispmod" value="public void modify$PropertyName$(final $PropertyType$ $propertyName$) {&#10;     $PropertyType$ current$PropertyName$ = get$PropertyName$();&#10;    // check for no-op&#10;    if ($propertyName$ == null || &#10;        $propertyName$.equals(current$PropertyName$)) {&#10;        return;&#10;    }&#10;    // associate new&#10;    set$PropertyName$($propertyName$);&#10;}&#10;public void clear$PropertyName$() {&#10;    $PropertyType$ current$PropertyName$ = get$PropertyName$();&#10;    // check for no-op&#10;    if (current$PropertyName$ == null) {&#10;        return;&#10;    }&#10;    // dissociate existing&#10;    set$PropertyName$(null);&#10;}" description="Isis Property modification" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispval" value="public String validate$PropertyName$(final $PropertyType$ $propertyName$) {&#10;  if ($propertyName$ == null) return null;&#10;  return $END$null; // TODO: return reason why proposed value is invalid, null if valid&#10; }" description="Isis Property validation" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isr" value="//region &gt; $Region$ &#10;$END$ &#10;//endregion" description="Isis Region" toReformat="true" toShortenFQNames="true">
-    <variable name="Region" expression="&quot;Region&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ism.p.all" value="//region &gt; all $TypePlural$&#10;@org.apache.isis.applib.annotation.Prototype&#10;public java.util.List&lt;$Type$&gt; all$TypePlural$() {&#10;    return allInstances($Type$.class);&#10;}&#10;//endregion" description="Isis Commonly used prototyping method (all instances)" toReformat="true" toShortenFQNames="true">
-    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="TypePlural" expression="&quot;TypePlural&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ism.p.afil" value="//region &gt; all $TypePlural$ that $filterDescription$&#10;@org.apache.isis.applib.annotation.Exploration&#10;public java.util.List&lt;$Type$&gt; all$TypePlural$Matching(final org.apache.isis.applib.Filter&lt;$Type$&gt; filter) {&#10;    return allMatches($Type$.class, filter);&#10;}&#10;//endregion" description="Isis Commonly used prototyping method (all instances matching filter)" toReformat="true" toShortenFQNames="true">
-    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="TypePlural" expression="&quot;TypePlural&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="filterDescription" expression="&quot;filterDescription&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ism.p.ffil" value="//region &gt; first $Type$ that $filterDescription$&#10;@org.apache.isis.applib.annotation.Exploration&#10;public $Type$ first$Type$Matching(final org.apache.isis.applib.Filter&lt;$Type$&gt; filter) {&#10;    return firstMatch($Type$.class, filter);&#10;}&#10;//endregion" description="Isis Commonly used prototyping method (first instance matching filter)" toReformat="true" toShortenFQNames="true">
-    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="filterDescription" expression="&quot;filterDescription&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ism.p.ufil" value="//region &gt; unique $Type$ that $filterDescription$&#10;@org.apache.isis.applib.annotation.Exploration&#10;public $Type$ unique$Type$Matching(final org.apache.isis.applib.Filter&lt;$Type$&gt; filter) {&#10;    return uniqueMatch($Type$.class, filter);&#10;}&#10;//endregion" description="Isis Commonly used prototyping method (unique instance matching filter)" toReformat="true" toShortenFQNames="true">
-    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <variable name="filterDescription" expression="&quot;filterDescription&quot;" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="isval" value="public String validate() {&#10;    $END$// TODO: return reason why object is in invalid state (and so cannot be saved/updated), or null if ok&#10;}" description="Isis Validate method" toReformat="true" toShortenFQNames="true">
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-  <template name="ispauto" value="public java.util.Collection&lt;$PropertyType$&gt; autoComplete$PropertyName$(final String search) {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for property&#10;}" description="Isis Property auto-complete" toReformat="true" toShortenFQNames="true">
-    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
-    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
-    <context>
-      <option name="HTML" value="false" />
-      <option name="XML" value="false" />
-      <option name="JAVA_CODE" value="false" />
-      <option name="JAVA_DECLARATION" value="true" />
-      <option name="JAVA_COMMENT" value="false" />
-      <option name="JAVA_STRING" value="false" />
-      <option name="COMPLETION" value="false" />
-      <option name="JAVA_SCRIPT" value="false" />
-      <option name="OTHER" value="false" />
-    </context>
-  </template>
-</templateSet>
-


[3/5] isis-site git commit: ISIS-803 custom lifecycle events; live templates

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis-site/blob/2d3a7aab/content/resources/templates/intellij-settings-file-templates-for-apache-isis.jar
----------------------------------------------------------------------
diff --git a/content/resources/templates/intellij-settings-file-templates-for-apache-isis.jar b/content/resources/templates/intellij-settings-file-templates-for-apache-isis.jar
new file mode 100644
index 0000000..93d1345
Binary files /dev/null and b/content/resources/templates/intellij-settings-file-templates-for-apache-isis.jar differ

http://git-wip-us.apache.org/repos/asf/isis-site/blob/2d3a7aab/content/resources/templates/isis-template-idea.xml
----------------------------------------------------------------------
diff --git a/content/resources/templates/isis-template-idea.xml b/content/resources/templates/isis-template-idea.xml
new file mode 100644
index 0000000..2a3cc5f
--- /dev/null
+++ b/content/resources/templates/isis-template-idea.xml
@@ -0,0 +1,522 @@
+<templateSet group="Apache Isis">
+  <template name="isa" value="@org.apache.isis.applib.annotation.Action()&#10;public $ReturnType$ $actionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: business logic here&#10;}&#10;" description="Apache Isis Action" toReformat="true" toShortenFQNames="true">
+    <variable name="actionName" expression="&quot;actionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ParameterType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="ReturnType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-p-auto" value="public java.util.Collection&lt;$ParameterType$&gt; autoComplete$ParameterNum$$ActionName$(final String search) {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for argument N&#10;}" description="Apache Isis Action parameter auto-complete" toReformat="true" toShortenFQNames="true">
+    <variable name="ParameterNum" expression="&quot;Num&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-p-cho" value="public java.util.List&lt;$ParameterType$&gt; choices$ParameterNum$$ActionName$() {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for argument N&#10;}" description="Apache Isis Action parameter choices" toReformat="true" toShortenFQNames="true">
+    <variable name="ParameterNum" expression="&quot;Num&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-p-def" value="public $ParameterType$ default$ParameterNum$$ActionName$() {&#10;    return $END$null; // TODO: return default for argument N&#10;}" description="Apache Isis Action parameter defaults" toReformat="true" toShortenFQNames="true">
+    <variable name="ParameterNum" expression="&quot;Num&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-p-val" value="public String validate$ParamNum}$ActionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: return reason why action argument are invalid, null if ok&#10;}" description="Apache Isis Action parameter validation" toReformat="true" toShortenFQNames="true">
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-dis" value="public String disable$ActionName$() {&#10;    return $END$null; // TODO: return reason why action disabled, null if enabled&#10;}" description="Apache Isis Action disablement" toReformat="true" toShortenFQNames="true">
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-event" value="public static class $ActionName$DomainEvent extends ActionDomainEvent{}&#10;@org.apache.isis.applib.annotation.Action(&#10;        domainEvent = $ActionName$DomainEvent.class&#10;)&#10;public $ReturnType$ $actionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: business logic here&#10;}&#10;" description="Apache Isis Action (with domain event)" toReformat="true" toShortenFQNames="true">
+    <variable name="actionName" expression="&quot;actionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ActionName" expression="capitalize(actionName)" defaultValue="" alwaysStopAt="false" />
+    <variable name="ParameterType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="ReturnType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-event-decl" value="public static class $ActionName$DomainEvent extends ActionDomainEvent{}&#10;@org.apache.isis.applib.annotation.Action(&#10;        domainEvent = $ActionName$DomainEvent.class&#10;)&#10;" description="Apache Isis Action (domain event declaration only)" toReformat="true" toShortenFQNames="true">
+    <variable name="ActionName" expression="" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-hid" value="public boolean hide$ActionName$() {&#10;    return $END$false; // TODO: return true if action is hidden, false if visible&#10;}" description="Apache Isis Action visibility" toReformat="true" toShortenFQNames="true">
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isa-val" value="public String validate$ActionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: return reason why action arguments are invalid, null if ok&#10;}" description="Apache Isis Action validation" toReformat="true" toShortenFQNames="true">
+    <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-dis" value="public String disable$CollectionName$() {&#10;    return $END$null; // TODO: return reason why collection read-only, null if editable&#10;}" description="Apache Isis Collection disablement" toReformat="true" toShortenFQNames="true">
+    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-hid" value="public boolean hide$CollectionName$() {&#10;    return $END$false; // TODO: return true if hidden, false otherwise&#10;}" description="Apache Isis Collection visibility" toReformat="true" toShortenFQNames="false">
+    <variable name="CollectionName" expression="&quot;CollectionName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-jdo-1m-b-fk" value="@org.apache.isis.applib.annotation.Collection()&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$elementNameInChild$&quot;, dependentElement=&quot;$trueOrFalse$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;" description="Apache Isis Collection (JDO, 1:m parent bidirectional to foreign key)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="elementNameInChild" expression="decapitalize(EntityName)" defaultValue="" alwaysStopAt="false" />
+    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-jdo-1m-b-jt" value="@org.apache.isis.applib.annotation.Collection()&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$elementNameInChild$&quot;, dependentElement=&quot;$trueOrFalse$&quot;)&#10;@javax.jdo.annotations.Join&#10;@lombok.Getter @lombok.Setter&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;" description="Apache Isis Collection (JDO, 1:m parent bidirectional to join table)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="elementNameInChild" expression="decapitalize(EntityName)" defaultValue="" alwaysStopAt="false" />
+    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-jdo-1m-u-fk" value="@org.apache.isis.applib.annotation.Collection()&#10;@javax.jdo.annotations.Element(column=&quot;$ColumnName$&quot;, dependent=&quot;$trueOrFalse$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;" description="Apache Isis JDO Collection (1:m parent unidirectional)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="ColumnName" expression="&quot;ColumnName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-jdo-1m-u-jt" value="@org.apache.isis.applib.annotation.Collection()&#10;@javax.jdo.annotations.Join&#10;@javax.jdo.annotations.Element(dependent=&quot;$trueOrFalse$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;" description="Apache Isis Collection (JDO, 1:m parent unidirectional to join table)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="trueOrFalse" expression="&quot;trueOrFalse&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-jdo-mn-ub-c" value="@org.apache.isis.applib.annotation.Collection()&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$ChildCollectionNameInParent$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;(); &#10;" description="Apache Isis Collection (JDO, m:n child)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="ChildCollectionNameInParent" expression="&quot;ChildCollectionNameInParent&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-jdo-mn-ub-p" value="@org.apache.isis.applib.annotation.Collection()&#10;@javax.jdo.annotations.Persistent(table=&quot;$TableName$&quot;) &#10;@javax.jdo.annotations.Join(column=&quot;$ThisEntityFieldName$&quot;) &#10;@javax.jdo.annotations.Element(column=&quot;$RelatedEntityFieldName$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private java.util.SortedSet&lt;$ElementType$&gt; $collectionName$ = new java.util.TreeSet&lt;$ElementType$&gt;();&#10;" description="Apache Isis Collection (JDO, m:n parent)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="collectionName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="TableName" expression="&quot;TableName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="ThisEntityFieldName" expression="&quot;ThisEntityFieldName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="RelatedEntityFieldName" expression="&quot;RelatedEntityFieldName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isds-subscriber-on" value="@com.google.common.eventbus.Subscribe&#10;public void on(final $EventType$ ev) {&#10;    // TODO&#10;}&#10;" description="Apache Isis Domain Service Subscriber &quot;on&quot; event" toReformat="false" toShortenFQNames="true">
+    <variable name="EventType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="JAVA_DECLARATION" value="true" />
+    </context>
+  </template>
+  <template name="isjaxb-package.info" value="@javax.xml.bind.annotation.XmlSchema(&#10;        namespace = &quot;http://$namespaceBase$/$namespaceSuffix$/v$versionMajor$_$versionMinor$/$namespaceSuffix$.xsd&quot;,&#10;        xmlns = {&#10;                @javax.xml.bind.annotation.XmlNs(&#10;                        namespaceURI = &quot;http://isis.apache.org/schema/common&quot;,&#10;                        prefix = &quot;common&quot;&#10;                ),&#10;        },&#10;        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED&#10;)" toReformat="false" toShortenFQNames="true">
+    <variable name="namespaceBase" expression="        groovyScript(&quot;def str = _1; def list = str.split(\&quot;\\\\.\&quot;); def revlist = list.reverse(); def ret = revlist.iterator().join(\&quot;.\&quot;); return ret&quot;, currentPackage())" defaultValue="" alwaysStopAt="true" />
+    <variable name="namespaceSuffix" expression="groovyScript(&quot;def str = _1; def list = str.split(\&quot;\\\\.\&quot;); def revlist = list.reverse(); def ret = revlist[0]; return ret&quot;, currentPackage())" defaultValue="" alwaysStopAt="true" />
+    <variable name="versionMajor" expression="" defaultValue="1" alwaysStopAt="true" />
+    <variable name="versionMinor" expression="" defaultValue="0" alwaysStopAt="true" />
+    <context>
+      <option name="JAVA_DECLARATION" value="true" />
+    </context>
+  </template>
+  <template name="isinject" value="@javax.inject.Inject&#10;$ServiceType$ $serviceType$;&#10;" description="Apache Isis Injected Dependency Service" toReformat="true" toShortenFQNames="true">
+    <variable name="ServiceType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <variable name="serviceType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isid" value="//region &gt; title, icon etc&#10;public String title() {&#10;    final org.apache.isis.applib.util.TitleBuffer buf = new org.apache.isis.applib.util.TitleBuffer();&#10;    $END$// TODO: append to org.apache.isis.applib.util.TitleBuffer, typically value properties&#10;    return buf.toString();&#10;}&#10;public String iconName() {&#10;    return null; // TODO: return icon name (suffix)&#10;}&#10;public String cssClass() {&#10;    return null; // TODO: return CSS class name&#10;}&#10;//endregion" description="Apache Isis Identification region" toReformat="true" toShortenFQNames="true">
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isnew" value="$Type$ $type$ = $container$.newTransientInstance($Type$.class);&#10;$END$// TODO: set up any properties&#10;&#10;$container$.persist($type$);&#10;" description="Apache Isis Commonly used method (factory for persistent)" toReformat="true" toShortenFQNames="true">
+    <variable name="Type" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <variable name="type" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="container" expression="&quot;container&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_STATEMENT" value="true" />
+      <option name="JAVA_EXPRESSION" value="false" />
+      <option name="JAVA_DECLARATION" value="false" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-jdo" value="@org.apache.isis.applib.annotation.Property()&#10;@javax.jdo.annotations.Column(allowsNull=&quot;$trueOrFalse$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private $PropertyType$ $propertyName$;&#10;" description="Apache Isis Property (JDO)" toReformat="true" toShortenFQNames="false">
+    <variable name="PropertyType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="trueOrFalse" expression="" defaultValue="false" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-auto" value="public java.util.Collection&lt;$PropertyType$&gt; autoComplete$PropertyName$(final String search) {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for property&#10;}" description="Apache Isis Property auto-complete" toReformat="true" toShortenFQNames="true">
+    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-cho" value="public java.util.Collection&lt;$PropertyType$&gt; choices$PropertyName$() {&#10;    return $END$com.google.common.collect.Lists.newArrayList(); // TODO: return list of choices for property&#10;}" description="Apache Isis Property choices" toReformat="true" toShortenFQNames="true">
+    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-def" value="public $PropertyType$ default$PropertyName$() {&#10;    return $END$null; // TODO: return default for property when first created&#10;}" description="Apache Isis Property default" toReformat="true" toShortenFQNames="true">
+    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
+    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-dis" value="public String disable$PropertyName$() {&#10;    return $END$null; // TODO: return reason why property is disabled, null if editable&#10;}" description="Apache Isis Property disablement" toReformat="true" toShortenFQNames="true">
+    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-hid" value="public boolean hide$PropertyName$() {&#10;  return $END$false; // TODO: return true if hidden, false if visible&#10; }" description="Apache Isis Property visibility" toReformat="true" toShortenFQNames="true">
+    <variable name="PropertyName" expression="&quot;PropertyName&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-val" value="public String validate$PropertyName$(final $PropertyType$ $propertyName$) {&#10;  if ($propertyName$ == null) return null;&#10;  return $END$null; // TODO: return reason why proposed value is invalid, null if valid&#10; }" description="Apache Isis Property validation" toReformat="true" toShortenFQNames="true">
+    <variable name="PropertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="PropertyType" expression="className()" defaultValue="" alwaysStopAt="true" />
+    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isobj-events" value="//region &gt; domain events&#10;public static abstract class PropertyDomainEvent&lt;T&gt;&#10;        extends org.apache.isis.applib.services.eventbus.PropertyDomainEvent&lt;$EntityName$,T&gt; {&#10;}&#10;public static abstract class CollectionDomainEvent&lt;T&gt;&#10;        extends org.apache.isis.applib.services.eventbus.CollectionDomainEvent&lt;$EntityName$,T&gt; {&#10;}&#10;public static abstract class ActionDomainEvent&#10;        extends org.apache.isis.applib.services.eventbus.ActionDomainEvent&lt;$EntityName$&gt; {&#10;}&#10;//endregion&#10;" description="Apache Isis Object: abstract domain events declarations" toReformat="true" toShortenFQNames="true">
+    <variable name="EntityName" expression="className()" defaultValue="" alwaysStopAt="false" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isobj-region" value="//region &gt; $Region$ &#10;$END$ &#10;//endregion" description="Apache Isis Region" toReformat="true" toShortenFQNames="true">
+    <variable name="Region" expression="&quot;Region&quot;" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isobj-standard" value="//region &gt; compareTo, toString&#10;@Override&#10;public int compareTo(final $EntityName$ other) {&#10;    return org.apache.isis.applib.util.ObjectContracts.compare(this, other, &quot;$property$&quot;);&#10;}&#10;@Override&#10;public String toString() {&#10;    return org.apache.isis.applib.util.ObjectContracts.toString(this, &quot;$property$&quot;);&#10;}&#10;//endregion&#10;" description="Apache Isis Object: standard methods (compareTo, toString)" toReformat="true" toShortenFQNames="true">
+    <variable name="EntityName" expression="className()" defaultValue="" alwaysStopAt="false" />
+    <variable name="property" expression="" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isobj-validate" value="public String validate() {&#10;    $END$// TODO: return reason why object is in invalid state (and so cannot be saved/updated), or null if ok&#10;}" description="Apache Isis Object: validate method" toReformat="true" toShortenFQNames="true">
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-jdo-11c" value="@javax.jdo.annotations.Column(allowsNull=&quot;$trueOrFalse$&quot;)&#10;@javax.jdo.annotations.Persistent(mappedBy=&quot;$fieldOnChild$&quot;)&#10;@lombok.Getter @lombok.Setter&#10;private $PropertyType$ $propertyName$;&#10;" description="Apache Isis Property (JDO, 1:1 bidirectional parent to foreign key)" toReformat="true" toShortenFQNames="false">
+    <variable name="PropertyType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="propertyName" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />
+    <variable name="fieldOnChild" expression="" defaultValue="" alwaysStopAt="true" />
+    <variable name="trueOrFalse" expression="" defaultValue="false" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isc-event-decl" value="public static class $CollectionName$DomainEvent extends CollectionDomainEvent&lt;$ElementType$&gt;{}&#10;@org.apache.isis.applib.annotation.Collection(&#10;        domainEvent = $CollectionName$DomainEvent.class&#10;)&#10;" description="Apache Isis Collection (domain event declaration only)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="CollectionName" expression="capitalize(collectionName)" defaultValue="" alwaysStopAt="false" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+  <template name="isp-event-decl" value="public static class $PropertyName$DomainEvent extends PropertyDomainEvent&lt;$ElementType$&gt;{}&#10;@org.apache.isis.applib.annotation.Property(&#10;        domainEvent = $PropertyName$DomainEvent.class&#10;)&#10;" description="Apache Isis Property (domain event declaration only)" toReformat="true" toShortenFQNames="true">
+    <variable name="ElementType" expression="classNameComplete()" defaultValue="" alwaysStopAt="true" />
+    <variable name="PropertyName" expression="" defaultValue="" alwaysStopAt="true" />
+    <context>
+      <option name="HTML" value="false" />
+      <option name="XML" value="false" />
+      <option name="JAVA_CODE" value="false" />
+      <option name="JAVA_DECLARATION" value="true" />
+      <option name="JAVA_COMMENT" value="false" />
+      <option name="JAVA_STRING" value="false" />
+      <option name="COMPLETION" value="false" />
+      <option name="OTHER" value="false" />
+    </context>
+  </template>
+</templateSet>
\ No newline at end of file