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 2013/11/14 08:48:12 UTC

svn commit: r1541841 - in /isis/site/trunk/content: ./ applib-guide/how-tos/ applib-guide/reference/recognized-annotations/ components/viewers/wicket/release-notes/ contributors/ getting-started/ getting-started/release-notes/ getting-started/resources/

Author: danhaywood
Date: Thu Nov 14 07:48:11 2013
New Revision: 1541841

URL: http://svn.apache.org/r1541841
Log:
release notes for 1.3.1, update archetype pages with new version, also added some howtos relating to using contributed actions and bulk actions

Added:
    isis/site/trunk/content/applib-guide/how-tos/how-to-01-062-How-to-decouple-dependencies-using-contributions.md
    isis/site/trunk/content/applib-guide/how-tos/how-to-01-065-How-to-add-an-action-to-be-called-on-every-object-in-a-list.md
    isis/site/trunk/content/components/viewers/wicket/release-notes/isis-viewer-wicket-1.3.1.md
    isis/site/trunk/content/getting-started/release-notes/quickstart_wrj-archetype-1.3.1.md
    isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.1.md
    isis/site/trunk/content/getting-started/resources/isis-templates2.xml
Modified:
    isis/site/trunk/content/applib-guide/how-tos/about.md
    isis/site/trunk/content/applib-guide/how-tos/how-to-01-060-How-to-add-an-action-to-a-domain-entity-or-service.md
    isis/site/trunk/content/applib-guide/reference/recognized-annotations/Bulk.md
    isis/site/trunk/content/components/viewers/wicket/release-notes/about.md
    isis/site/trunk/content/contributors/release-process.md
    isis/site/trunk/content/documentation.md
    isis/site/trunk/content/getting-started/quickstart-archetype.md
    isis/site/trunk/content/getting-started/release-notes/about.md
    isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.0.md
    isis/site/trunk/content/getting-started/simple-archetype.md
    isis/site/trunk/content/release-matrix.md

Modified: isis/site/trunk/content/applib-guide/how-tos/about.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/applib-guide/how-tos/about.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/applib-guide/how-tos/about.md (original)
+++ isis/site/trunk/content/applib-guide/how-tos/about.md Thu Nov 14 07:48:11 2013
@@ -25,6 +25,10 @@ and services have behaviour, in the form
 
 * [How to add an action to a domain entity or service](./how-to-01-060-How-to-add-an-action-to-a-domain-entity-or-service.html)
 
+* [How to decouple dependencies using contributions](how-to-01-062-How-to-decouple-dependencies-using-contributions.html)
+* 
+* [How to add an action to be called on every entity within a list](./how-to-01-065-How-to-add-an-action-to-be-called-on-every-entity-within-a-list.html)
+
 * [How to specify the icon for a domain entity](./how-to-01-070-How-to-specify-the-icon-for-a-domain-entity.html)
 
 * [How to specify the order in which properties or collections are displayed](./how-to-01-080-How-to-specify-the-order-in-which-properties-or-collections-are-displayed.html)

Modified: isis/site/trunk/content/applib-guide/how-tos/how-to-01-060-How-to-add-an-action-to-a-domain-entity-or-service.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/applib-guide/how-tos/how-to-01-060-How-to-add-an-action-to-a-domain-entity-or-service.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/applib-guide/how-tos/how-to-01-060-How-to-add-an-action-to-a-domain-entity-or-service.md (original)
+++ isis/site/trunk/content/applib-guide/how-tos/how-to-01-060-How-to-add-an-action-to-a-domain-entity-or-service.md Thu Nov 14 07:48:11 2013
@@ -1,5 +1,5 @@
-How to add an action (or bulk action) to a domain entity or service
----------------------------------------------------------
+How to add an action to a domain entity or service
+--------------------------------------------------
 
 An 'action' is a method that we expect the user to be able to invoke on
 a domain entity via the user interface, though it may also be invoked
@@ -30,31 +30,9 @@ user-action you can either:
 
 -   make it non-`public` (eg `protected` or `private`)
 
--   annotate it with @Ignore
+-   annotate it with `@Ignore`
 
--   annotate it with @Hidden (discussed further in ?)
+-   annotate it with `@Hidden`
 
 Note also that `static` methods are ignored: such functionality should
-reside in a service, such as a repository or factory (see ?).
-
-If the action is a bulk action - meaning that it should only be applied
-to a collection of instances of the entity - then annotate using @Bulk:
-
-    @Bulk
-    public void actionName() { ... }
-
-Note that bulk actions have a couple of important restrictions.
-
--   entity actions cannot take any arguments, while contributed actions
-    can take only a single parameter (the contributee)
-
-    This restriction might be lifted in the future;
-
--   any business rules for hiding, disabling or validating the action
-    are ignored.
-
-See ? for more details on writing business rules.
-
-At the time of writing, only the Wicket viewer recognizes bulk actions;
-other viewers treat the action as a regular action.
-
+reside instead as instance methods on a domain service, repository or factory.

Added: isis/site/trunk/content/applib-guide/how-tos/how-to-01-062-How-to-decouple-dependencies-using-contributions.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/applib-guide/how-tos/how-to-01-062-How-to-decouple-dependencies-using-contributions.md?rev=1541841&view=auto
==============================================================================
--- isis/site/trunk/content/applib-guide/how-tos/how-to-01-062-How-to-decouple-dependencies-using-contributions.md (added)
+++ isis/site/trunk/content/applib-guide/how-tos/how-to-01-062-How-to-decouple-dependencies-using-contributions.md Thu Nov 14 07:48:11 2013
@@ -0,0 +1,49 @@
+How to decouple dependencies using contributions
+------------------------------------------------
+
+In a small application (a dozen or less entities, say) there is little risk in having cyclic
+dependencies between entities, but as your application gets larger this coupling will cause problems - the inevitable [big ball of mud](***TODO).
+
+You should, therefore, use packages to group related entities together, and then make sure that the package dependencies are acyclic.  There are tools available that can help you visualize this and detect violations.  Some tools can even plug into your build so that your build can fail if the architectural layering defined between your packages is violated.  In DDD terms we are grouping our entities into [module](***TODO)s.
+
+On the other hand, although the dependencies between your modules should be well-defined and acyclic, you might want the UI to show the relationship as if it were bidirectional.
+
+For example, suppose we have an `communicationChannels` module that defines various subtypes of `CommunicationChannel` entity: `PostalAddress`, `PhoneNumber`, `EmailAddress` and so on.  Each such `CommunicationChannel` is associated with (owned by) a `CommunicationChannelOwner`, defined as an interface.
+
+In the `customers` module, we have the `Customer` entity that implements `CommunicationChannel`, while in the `assets` module we have `FixedAsset` that also implements this entity.  Thus, a given `Customer` and a given `FixedAsset` could both - logically, at least - have a collection of `CommunicationChannel`s.
+
+For both `Customer` and `FixedAsset` (and any other future implementation) we would want to have some means to add and remove `CommunicationChannel`s).  Rather than having very similar collections and actions in each, we can implement the requirement by defining the behaviour in the `communicationChannels` module, through a domain service.  It would look something like:
+
+    public class CommunicationChannelContributions {
+
+        @NotInServiceMenu
+        public CommunicationChannelOwner addPostalAddress(
+                        final CommunicationChannelOwner owner,
+                        final @Named("Address line 1") String addressLine1,
+                        ... 
+                        final @Named("Zipcode") String zipCode) {
+            ...
+        }
+
+        @NotInServiceMenu
+        @NotContributed(As.ACTION)
+        public Collection<CommunicationChannel> communicationChannels(
+                        final CommunicationOwner owner) {
+            ...
+        }
+
+        @NotInServiceMenu
+        @NotContributed(As.ACTION)
+        public CommunicationChannel preferredCommunicationChannels(
+                        final CommunicationOwner owner) {
+            ...
+        }
+
+    }
+
+The first action, `addPostalAddress` will be rendered seemingly as a regular action for all implementations of `CommunicationChannelOwner`, but with that parameter omitted.  This is a contributed action.
+
+The second action - whose implementation will be some repository query to search for all `CommunicationChannel`s for the given owner - will be rendered as a collection of the owner; this is a contributed collection.  The `@NotContributed(As.ACTION)` suppresses the action from being contributed as an action also.
+
+Finally, the third action - that again will be some sort of repository query - will be rendered as a property o fhte owner; this is a contributed property.  Again, the `@NotContributed(As.ACTION)` suppresses the action from being contributed as an action also.
+

Added: isis/site/trunk/content/applib-guide/how-tos/how-to-01-065-How-to-add-an-action-to-be-called-on-every-object-in-a-list.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/applib-guide/how-tos/how-to-01-065-How-to-add-an-action-to-be-called-on-every-object-in-a-list.md?rev=1541841&view=auto
==============================================================================
--- isis/site/trunk/content/applib-guide/how-tos/how-to-01-065-How-to-add-an-action-to-be-called-on-every-object-in-a-list.md (added)
+++ isis/site/trunk/content/applib-guide/how-tos/how-to-01-065-How-to-add-an-action-to-be-called-on-every-object-in-a-list.md Thu Nov 14 07:48:11 2013
@@ -0,0 +1,35 @@
+How to add an action to be called on every entity within a list
+---------------------------------------------------------------
+
+Usually an action is performed on a single instance of an entity (or domain service).  To indicate that a given action should be called for every instance of a list (eg as returned by a domain service finder), add the `@Bulk` annotation:
+
+    public class SomeDomainService {
+
+        @Bulk
+        public void actionName() { ... }
+
+    }
+
+Note however that bulk actions have a couple of important restrictions.
+
+-   such actions on an entity cannot take any arguments
+
+    This restriction might be lifted in the future;
+
+-   any business rules for hiding, disabling or validating the action
+    are ignored.
+
+
+Contributed actions (as described [here](./how-to-01-062-How-to-decouple-dependencies-using-contributions.html) can also be annotated as `@Bulk` actions, however they must accept a single argument (the contributee).  For example:
+
+    public class SomeDomainService {
+
+        @Bulk
+        public void actionName(SomeEntity someEntity) { ... }
+
+    }
+
+
+At the time of writing, only the Wicket viewer recognizes bulk actions;
+other viewers treat the action as a regular action.
+

Modified: isis/site/trunk/content/applib-guide/reference/recognized-annotations/Bulk.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/applib-guide/reference/recognized-annotations/Bulk.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/applib-guide/reference/recognized-annotations/Bulk.md (original)
+++ isis/site/trunk/content/applib-guide/reference/recognized-annotations/Bulk.md Thu Nov 14 07:48:11 2013
@@ -18,5 +18,26 @@ For example:
         }
     }
 
-Bulk actions cannot take arguments, nor can they be hidden, disabled or
-have validation rules.
+Bulk actions cannot (currently) take arguments, nor can they be hidden, disabled or
+have validation rules.  What this means is that they perform appropriate checks and guards within the action.
+
+The example given above is probably ok, because `setCompleted()` is most likely idempotent.  However, if the action also called some other method, then we should add a guard.
+
+For example, rather than:
+
+        @Bulk
+        public void markAsCompleted() {
+            setCompleted(true);
+            todoTotalizer.incrementNumberCompleted();
+        }
+
+the action should instead be written:
+ 
+        @Bulk
+        public void markAsCompleted() {
+            if(isCompleted()) {
+                return;
+            }
+            setCompleted(true);
+            todoTotalizer.incrementNumberCompleted();
+        }

Modified: isis/site/trunk/content/components/viewers/wicket/release-notes/about.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/components/viewers/wicket/release-notes/about.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/components/viewers/wicket/release-notes/about.md (original)
+++ isis/site/trunk/content/components/viewers/wicket/release-notes/about.md Thu Nov 14 07:48:11 2013
@@ -1,5 +1,6 @@
 Title: Release Notes
 
+- [isis-viewer-wicket-1.3.1](isis-viewer-wicket-1.3.1.html)
 - [isis-viewer-wicket-1.3.0](isis-viewer-wicket-1.3.0.html)
 - [isis-viewer-wicket-1.2.0](isis-viewer-wicket-1.2.0.html)
 - [isis-viewer-wicket-1.1.0](isis-viewer-wicket-1.1.0.html)

Added: isis/site/trunk/content/components/viewers/wicket/release-notes/isis-viewer-wicket-1.3.1.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/components/viewers/wicket/release-notes/isis-viewer-wicket-1.3.1.md?rev=1541841&view=auto
==============================================================================
--- isis/site/trunk/content/components/viewers/wicket/release-notes/isis-viewer-wicket-1.3.1.md (added)
+++ isis/site/trunk/content/components/viewers/wicket/release-notes/isis-viewer-wicket-1.3.1.md Thu Nov 14 07:48:11 2013
@@ -0,0 +1,29 @@
+Title: isis-viewer-wicket-1.3.1
+                           
+<h2>        New Feature
+</h2>
+<ul>
+<li>[<a href='https://issues.apache.org/jira/browse/ISIS-575'>ISIS-575</a>] -         Tiny new feature... add a tooltip to icons/titles so can see what type it represents.
+</li>
+</ul>
+
+
+<h2>        Bug
+</h2>
+<ul>
+<li>[<a href='https://issues.apache.org/jira/browse/ISIS-560'>ISIS-560</a>] -         When invoking an action, drop downs get cleared (in the UI) if there is a validation error, but the underlying model is set.  
+</li>
+<li>[<a href='https://issues.apache.org/jira/browse/ISIS-570'>ISIS-570</a>] -         Drop downs for action parameters don&#39;t repaint themselves correctly when a validation error occurs for other parameters on the form.
+</li>
+<li>[<a href='https://issues.apache.org/jira/browse/ISIS-580'>ISIS-580</a>] -         Date fields are cleared  when tabbing through other fields.
+</li>
+</ul>
+                    
+                            
+<h2>        Task
+</h2>
+<ul>
+<li>[<a href='https://issues.apache.org/jira/browse/ISIS-581'>ISIS-581</a>] -         Release tasks for Isis wicket viewer v1.3.1
+</li>
+</ul>
+                     
\ No newline at end of file

Modified: isis/site/trunk/content/contributors/release-process.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/contributors/release-process.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/contributors/release-process.md (original)
+++ isis/site/trunk/content/contributors/release-process.md Thu Nov 14 07:48:11 2013
@@ -175,6 +175,17 @@ vi `/bin/find . -name pom.xml | grep -v 
 
 > Obviously, don't update Isis' `SNAPSHOT` references; these get updated by the `mvn release:prepare` command we run later.
 
+### Update plugin versions
+
+The `maven-versions-plugin` should be used to determine if there are newer versions of any of the plugins used to build Isis.  Since this goes off to the internet, it may take a minute or two to run:
+
+<pre>
+mvn versions:display-plugin-updates > /tmp/foo
+cat /tmp/foo
+</pre>
+
+Review the generated output and make updates as you see fit.  (However, if updating, please check by searching for known issues with newer versions).
+
 ### Update dependency versions
 
 The `maven-versions-plugin` should be used to determine if there are newer versions of any of Isis' dependencies.  Since this goes off to the internet, it may take a minute or two to run:

Modified: isis/site/trunk/content/documentation.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/documentation.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/documentation.md (original)
+++ isis/site/trunk/content/documentation.md Thu Nov 14 07:48:11 2013
@@ -9,8 +9,8 @@ Title: Documentation
 
   - [Screenshot tutorial](getting-started/screenshots.html)
   - [Screencasts](getting-started/screencasts.html)
-  - **[Simple Archetype](getting-started/simple-archetype.html) ([1.3.0](getting-started/release-notes/about.html))**
-  - [ToDo App (Quickstart) Archetype](getting-started/quickstart-archetype.html) ([1.3.0](getting-started/release-notes/about.html))
+  - **[Simple Archetype](getting-started/simple-archetype.html) ([1.3.1](getting-started/release-notes/about.html))**
+  - [ToDo App (Quickstart) Archetype](getting-started/quickstart-archetype.html) ([1.3.1](getting-started/release-notes/about.html))
   - **[Programming Model and How-tos](applib-guide/about.html)**
   - [Applib utility classes](applib-guide/reference/Utility.html)
   - [Static and dynamic layouts](core/dynamic-layouts.html)
@@ -123,7 +123,7 @@ Guidance for committers is at the bottom
 }
 
 {col-md-4
-###  Wicket [1.3.0](components/viewers/wicket/release-notes/about.html)
+###  Wicket [1.3.1](components/viewers/wicket/release-notes/about.html)
 
   - [About](components/viewers/wicket/about.html)
   - [Titles in tables](components/viewers/wicket/titles-in-tables.html)

Modified: isis/site/trunk/content/getting-started/quickstart-archetype.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/quickstart-archetype.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/getting-started/quickstart-archetype.md (original)
+++ isis/site/trunk/content/getting-started/quickstart-archetype.md Thu Nov 14 07:48:11 2013
@@ -16,7 +16,7 @@ Then run the following command:
 mvn archetype:generate  \
     -D archetypeGroupId=org.apache.isis.archetype \
     -D archetypeArtifactId=quickstart_wicket_restful_jdo-archetype \
-    -D archetypeVersion=1.3.0 \
+    -D archetypeVersion=1.3.1 \
     -D groupId=com.mycompany \
     -D artifactId=myapp \
     -D version=1.0-SNAPSHOT \

Modified: isis/site/trunk/content/getting-started/release-notes/about.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/release-notes/about.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/getting-started/release-notes/about.md (original)
+++ isis/site/trunk/content/getting-started/release-notes/about.md Thu Nov 14 07:48:11 2013
@@ -2,10 +2,12 @@ Title: Release Notes
 
 Simple archetype:
 
+* [simple_wrj-archetype-1.3.1](simple_wrj-archetype-1.3.1.html)
 * [simple_wrj-archetype-1.3.0](simple_wrj-archetype-1.3.0.html)
 
 Quickstart (ToDo app) archetype:
 
+* [quickstart_wrj-archetype-1.3.1](quickstart_wrj-archetype-1.3.1.html)
 * [quickstart_wrj-archetype-1.3.0](quickstart_wrj-archetype-1.3.0.html)
 * [quickstart_wrj-archetype-1.0.3](quickstart_wrj-archetype-1.0.3.html)
 * [quickstart_wrj-archetype-1.0.2](quickstart_wrj-archetype-1.0.2.html)

Added: isis/site/trunk/content/getting-started/release-notes/quickstart_wrj-archetype-1.3.1.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/release-notes/quickstart_wrj-archetype-1.3.1.md?rev=1541841&view=auto
==============================================================================
--- isis/site/trunk/content/getting-started/release-notes/quickstart_wrj-archetype-1.3.1.md (added)
+++ isis/site/trunk/content/getting-started/release-notes/quickstart_wrj-archetype-1.3.1.md Thu Nov 14 07:48:11 2013
@@ -0,0 +1,11 @@
+Title: quickstart-wrj-archetype-1.3.1
+
+Uses:
+
+* Isis Core 1.3.0
+* Wicket 1.3.1   (upgraded dependency)
+* JDO 1.3.0
+* Restful 2.1.0
+* Shiro 1.3.0
+
+                    
\ No newline at end of file

Modified: isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.0.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.0.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.0.md (original)
+++ isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.0.md Thu Nov 14 07:48:11 2013
@@ -1,4 +1,4 @@
-Title: simple-wrj-archetype-1.0.3
+Title: simple-wrj-archetype-1.3.0
 
 Uses:
 

Added: isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.1.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.1.md?rev=1541841&view=auto
==============================================================================
--- isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.1.md (added)
+++ isis/site/trunk/content/getting-started/release-notes/simple_wrj-archetype-1.3.1.md Thu Nov 14 07:48:11 2013
@@ -0,0 +1,15 @@
+Title: simple-wrj-archetype-1.3.1
+
+Uses:
+
+* Isis Core 1.3.0
+* Wicket 1.3.1     (upgraded dependency)
+* JDO 1.3.0
+* Restful 2.1.0
+* Shiro 1.3.0
+
+
+
+                                                            
+                    
+                

Added: isis/site/trunk/content/getting-started/resources/isis-templates2.xml
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/resources/isis-templates2.xml?rev=1541841&view=auto
==============================================================================
--- isis/site/trunk/content/getting-started/resources/isis-templates2.xml (added)
+++ isis/site/trunk/content/getting-started/resources/isis-templates2.xml Thu Nov 14 07:48:11 2013
@@ -0,0 +1,479 @@
+<?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

Modified: isis/site/trunk/content/getting-started/simple-archetype.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/getting-started/simple-archetype.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/getting-started/simple-archetype.md (original)
+++ isis/site/trunk/content/getting-started/simple-archetype.md Thu Nov 14 07:48:11 2013
@@ -14,7 +14,7 @@ Then run the following command:
 mvn archetype:generate  \
     -D archetypeGroupId=org.apache.isis.archetype \
     -D archetypeArtifactId=simple_wicket_restful_jdo-archetype \
-    -D archetypeVersion=1.3.0 \
+    -D archetypeVersion=1.3.1 \
     -D groupId=com.mycompany \
     -D artifactId=myapp \
     -D version=1.0-SNAPSHOT \

Modified: isis/site/trunk/content/release-matrix.md
URL: http://svn.apache.org/viewvc/isis/site/trunk/content/release-matrix.md?rev=1541841&r1=1541840&r2=1541841&view=diff
==============================================================================
--- isis/site/trunk/content/release-matrix.md (original)
+++ isis/site/trunk/content/release-matrix.md Thu Nov 14 07:48:11 2013
@@ -162,6 +162,17 @@ The table below lists dependencies betwe
 <tr>
     <th class="heading">Viewer</th>
     <th class="heading"><a href="components/viewers/wicket/about.html">Wicket</a></th>
+    <th class="heading">1.3.1</th>
+    <td>1.3.0</td>
+    <td>-</td>
+    <td>-</td>
+    <td>-</td>
+    <td>-</td>
+    <td>-</td>
+</tr>
+<tr>
+    <th class="heading"></th>
+    <th class="heading"></th>
     <th class="heading">1.3.0</th>
     <td>1.3.0</td>
     <td>-</td>
@@ -239,6 +250,17 @@ The table below lists dependencies betwe
 <tr>
     <th class="heading">Archetype</th>
     <th class="heading"><a href="getting-started/quickstart-archetype.html">Simple</a></th>
+    <th class="heading">1.3.1</th>
+    <td>1.3.0</td>
+    <td>1.3.0</td>
+    <td>-</td>
+    <td>1.3.0</td>
+    <td>1.3.1</b></td>
+    <td>2.1.0</td>
+</tr>
+<tr>
+    <th class="heading"></th>
+    <th class="heading"></th>
     <th class="heading">1.3.0</th>
     <td>1.3.0</td>
     <td>1.3.0</td>
@@ -250,6 +272,17 @@ The table below lists dependencies betwe
 <tr>
     <th class="heading">Archetype</th>
     <th class="heading"><a href="getting-started/quickstart-archetype.html">Quickstart</a></th>
+    <th class="heading">1.3.1</th>
+    <td>1.3.0</td>
+    <td>1.3.0</td>
+    <td>-</td>
+    <td>1.3.0</td>
+    <td>1.3.1</b></td>
+    <td>2.1.0</td>
+</tr>
+<tr>
+    <th class="heading"></th>
+    <th class="heading"></th>
     <th class="heading">1.3.0</th>
     <td>1.3.0</td>
     <td>1.3.0</td>