You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2023/05/26 09:00:49 UTC

[causeway] branch CAUSEWAY-2485 updated: CAUSEWAY-2485: wip on action layout redirect policy

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch CAUSEWAY-2485
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/CAUSEWAY-2485 by this push:
     new e9ad1a5b82 CAUSEWAY-2485: wip on action layout redirect policy
e9ad1a5b82 is described below

commit e9ad1a5b82cbc61345322705717e5a21751b128e
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri May 26 10:00:43 2023 +0100

    CAUSEWAY-2485: wip on action layout redirect policy
---
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |  3 +
 ...tionLayoutRedirectPolicyEntity-description.adoc |  7 ++
 ....java => ActionLayoutRedirectPolicyEntity.java} | 70 ++++++++--------
 ...=> ActionLayoutRedirectPolicyEntity.layout.xml} | 53 ++++++++++---
 ...ctionLayoutRedirectPolicyEntityRepository.java} | 25 +-----
 ...> ActionLayoutRedirectPolicyEntitySeeding.java} | 29 +++----
 ...tPolicyEntity_incrementRedirectEvenIfSame.java} | 12 +--
 ...licyEntity_incrementRedirectOnlyIfDiffers.java} | 12 +--
 ...ActionLayoutRedirectPolicyPage-description.adoc | 92 +++++++++++-----------
 .../ActionLayoutRedirectPolicyPage.java            | 13 ---
 .../ActionLayoutRedirectPolicyPage.layout.xml      | 10 +--
 .../ActionLayoutRedirectPolicyPage_objects.java    | 29 +++++++
 ...ayoutRedirectPolicyEntityImpl-description.adoc} |  3 +-
 .../ActionLayoutRedirectPolicyEntityImpl.java}     | 82 +++++++++----------
 ...onLayoutRedirectPolicyEntityImplRepository.java | 41 ++++++++++
 .../veto/ActionVetoPage-vetoParamDescription.adoc  |  1 +
 16 files changed, 269 insertions(+), 213 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
index f8b12f1124..514e68b833 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
@@ -18,6 +18,8 @@
  */
 package demoapp.dom;
 
+import demoapp.dom.domain.actions.ActionLayout.redirectPolicy.jpa.ActionLayoutRedirectPolicyEntityImpl;
+
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -144,6 +146,7 @@ import demoapp.dom.types.primitive.shorts.jpa.PrimitiveShortJpa;
         BulkActionItemEntityImpl.class,
 
         ActionLayoutHiddenEntityImpl.class,
+        ActionLayoutRedirectPolicyEntityImpl.class,
 
         PropertyCommandPublishingEntityImpl.class,
         PropertyEditingEntityImpl.class,
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity-description.adoc
new file mode 100644
index 0000000000..942da34a35
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity-description.adoc
@@ -0,0 +1,7 @@
+:Notice: Licensed to the Apache 1Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or a [...]
+
+This domain class is used in the demo of `@ActionLayout#redirectPolicy`.
+
+== How this demo works
+
+TODO
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity.java
similarity index 62%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity.java
index c60fb4c4c9..f4440d76b5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity.java
@@ -18,49 +18,48 @@
  */
 package demoapp.dom.domain.actions.ActionLayout.redirectPolicy;
 
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.SneakyThrows;
 
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Nature;
-import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Redirect;
 import org.apache.causeway.applib.annotation.Repainting;
 import org.apache.causeway.applib.services.clock.ClockService;
 
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import javax.inject.Inject;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
 
-@DomainObject(nature=Nature.VIEW_MODEL)
-@Named("demo.ActionLayoutRedirectPolicyPage")
-@XmlRootElement(name = "root")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
 //tag::class[]
-// ...
-public class ActionLayoutRedirectPolicyPage
+public abstract class ActionLayoutRedirectPolicyEntity
 //end::class[]
-implements HasAsciiDocDescription
+        implements
+        HasAsciiDocDescription,
+        ValueHolder<String>
 //tag::class[]
 {
-    @Property(optionality = Optionality.OPTIONAL)
-    @XmlElement(required = false)
-    @Getter @Setter
-    private Integer count;
+    // ...
+//end::class[]
+
+    public String title() {
+        return value();
+    }
+
+    @Override
+    public String value() {
+        return getName();
+    }
+
+    public abstract String getName();
+    public abstract void setName(String value);
+
+    public abstract Integer getCount();
+    public abstract void setCount(Integer value);
 
     @SneakyThrows
     @Property
@@ -70,15 +69,8 @@ implements HasAsciiDocDescription
         return clockService.getClock().nowAsLocalDateTime().toString();
     }
 
-    // ...
-//end::class[]
-
-    @ObjectSupport public String title() {
-        return "@ActionLayout#redirectPolicy";
-    }
+    @Inject private ClockService clockService;
 
 //tag::class[]
-
-    @Inject @XmlTransient private ClockService clockService;
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity.layout.xml
similarity index 62%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity.layout.xml
index eefcc3123f..b29891343c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity.layout.xml
@@ -26,16 +26,44 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<cpt:fieldSet name="General" id="general">
-                <cpt:property id="count">
-                    <cpt:action id="incrementRedirectEvenIfSame"/>
-                    <cpt:action id="incrementRedirectOnlyIfDiffers"/>
-                </cpt:property>
-            </cpt:fieldSet>
-			<cpt:fieldSet name="Time" id="time">
-                <cpt:property id="currentTime"/>
-            </cpt:fieldSet>
-			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<bs3:tabGroup>
+				<bs3:tab name="General">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="General" id="general" >
+								<cpt:property id="name"/>
+								<cpt:property id="count">
+								    <cpt:action id="incrementRedirectEvenIfSame">
+                                        <cpt:describedAs>Increment counter and redirect even if same (with repaint of entire page)</cpt:describedAs>
+                                    </cpt:action>
+								    <cpt:action id="incrementRedirectOnlyIfDiffers">
+                                        <cpt:describedAs>Increment counter and redirect only if differs (no repaint of opted-out properties)</cpt:describedAs>
+                                    </cpt:action>
+                                </cpt:property>
+								<cpt:property id="currentTime"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Metadata">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Metadata" id="metadata" >
+								<cpt:property id="id"/>
+								<cpt:property id="logicalTypeName"/>
+								<cpt:property id="version"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Other">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+			</bs3:tabGroup>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
@@ -54,6 +82,11 @@
 			</cpt:fieldSet>
 		</bs3:col>
 	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12">
+			<cpt:collection id="publishedCommands"/>
+		</bs3:col>
+	</bs3:row>
 	<bs3:row>
 		<bs3:col span="12" unreferencedCollections="true"/>
 	</bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntityRepository.java
similarity index 58%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntityRepository.java
index 8c131b8286..55d770c632 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntityRepository.java
@@ -18,28 +18,9 @@
  */
 package demoapp.dom.domain.actions.ActionLayout.redirectPolicy;
 
-import lombok.RequiredArgsConstructor;
+import java.util.List;
 
-import org.apache.causeway.applib.annotation.*;
+public interface ActionLayoutRedirectPolicyEntityRepository {
 
-
-//tag::class[]
-@Action(semantics = SemanticsOf.IDEMPOTENT)
-@ActionLayout(
-        redirectPolicy = Redirect.EVEN_IF_SAME      // <.>
-)
-@RequiredArgsConstructor
-public class ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame {
-    // ...
-//end::class[]
-    private final ActionLayoutRedirectPolicyPage page;
-
-    @MemberSupport public ActionLayoutRedirectPolicyPage act() {
-        Integer count = page.getCount();
-        page.setCount(count == null ? 1 : count + 1);
-        return page;
-    }
-
-//tag::class[]
+    List<? extends ActionLayoutRedirectPolicyEntity> all();
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntitySeeding.java
similarity index 59%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntitySeeding.java
index 8c131b8286..ad73d243f5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntitySeeding.java
@@ -18,28 +18,21 @@
  */
 package demoapp.dom.domain.actions.ActionLayout.redirectPolicy;
 
-import lombok.RequiredArgsConstructor;
+import javax.inject.Inject;
 
-import org.apache.causeway.applib.annotation.*;
+import org.springframework.stereotype.Service;
 
+import demoapp.dom._infra.seed.SeedServiceAbstract;
+import demoapp.dom._infra.values.ValueHolderRepository;
 
-//tag::class[]
-@Action(semantics = SemanticsOf.IDEMPOTENT)
-@ActionLayout(
-        redirectPolicy = Redirect.EVEN_IF_SAME      // <.>
-)
-@RequiredArgsConstructor
-public class ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame {
-    // ...
-//end::class[]
-    private final ActionLayoutRedirectPolicyPage page;
+@Service
+public class ActionLayoutRedirectPolicyEntitySeeding
+extends SeedServiceAbstract {
 
-    @MemberSupport public ActionLayoutRedirectPolicyPage act() {
-        Integer count = page.getCount();
-        page.setCount(count == null ? 1 : count + 1);
-        return page;
+    @Inject
+    public ActionLayoutRedirectPolicyEntitySeeding(
+            ValueHolderRepository<String, ? extends ActionLayoutRedirectPolicyEntity> entities) {
+        super(entities);
     }
 
-//tag::class[]
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity_incrementRedirectEvenIfSame.java
similarity index 78%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity_incrementRedirectEvenIfSame.java
index 8c131b8286..6c48819ea5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity_incrementRedirectEvenIfSame.java
@@ -29,15 +29,15 @@ import org.apache.causeway.applib.annotation.*;
         redirectPolicy = Redirect.EVEN_IF_SAME      // <.>
 )
 @RequiredArgsConstructor
-public class ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame {
+public class ActionLayoutRedirectPolicyEntity_incrementRedirectEvenIfSame {
     // ...
 //end::class[]
-    private final ActionLayoutRedirectPolicyPage page;
+    private final ActionLayoutRedirectPolicyEntity entity;
 
-    @MemberSupport public ActionLayoutRedirectPolicyPage act() {
-        Integer count = page.getCount();
-        page.setCount(count == null ? 1 : count + 1);
-        return page;
+    @MemberSupport public ActionLayoutRedirectPolicyEntity act() {
+        Integer count = entity.getCount();
+        entity.setCount(count == null ? 1 : count + 1);
+        return entity;
     }
 
 //tag::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectOnlyIfDiffers.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity_incrementRedirectOnlyIfDiffers.java
similarity index 78%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectOnlyIfDiffers.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity_incrementRedirectOnlyIfDiffers.java
index a4c4e92058..319fbf464f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_incrementRedirectOnlyIfDiffers.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyEntity_incrementRedirectOnlyIfDiffers.java
@@ -29,15 +29,15 @@ import org.apache.causeway.applib.annotation.*;
         redirectPolicy = Redirect.ONLY_IF_DIFFERS       // <.>
 )
 @RequiredArgsConstructor
-public class ActionLayoutRedirectPolicyPage_incrementRedirectOnlyIfDiffers {
+public class ActionLayoutRedirectPolicyEntity_incrementRedirectOnlyIfDiffers {
     // ...
 //end::class[]
-    private final ActionLayoutRedirectPolicyPage page;
+    private final ActionLayoutRedirectPolicyEntity entity;
 
-    @MemberSupport public ActionLayoutRedirectPolicyPage act() {
-        Integer count = page.getCount();
-        page.setCount(count == null ? 1 : count + 1);
-        return page;
+    @MemberSupport public ActionLayoutRedirectPolicyEntity act() {
+        Integer count = entity.getCount();
+        entity.setCount(count == null ? 1 : count + 1);
+        return entity;
     }
 
 //tag::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage-description.adoc
index ff7664a88b..353c8bcb44 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage-description.adoc
@@ -12,48 +12,50 @@ Not re-rendering can provide a smoother UI experience.
 
 == How this demo works
 
-This page has a `count` property with two associated actions.
-These both increment the `count`, but use different redirect policies.
-
-The page also has a `currentTime` property, that displays the current time.
-This is a derived property that also has a built-in delay of 1 second.
-
-[source,java,indent=0]
-----
-include::ActionLayoutRedirectPolicyPage.java[tags=class]
-----
-<.> for demonstration purposes, this UI component opts out of being redrawn if there is no redirect.
-
-[NOTE]
-====
-In this demo we are somewhat misusing the `@PropertyLayout#repainting` attribute; normally this is used for components that are expensive to render _and_ which are generally unchanging.
-The most common example of such a property would be a PDF, rendered using the link:https://causeway.apache.org/vw/2.0.0-RC1/pdfjs/about.html[PDF.js] extension (the link:https://causeway.apache.org/refguide/2.0.0-RC1/extensions/index/pdfjs/applib/annotations/PdfJsViewer.html#section-top[@PdfJsViewer] annotation).
-====
-
-The behaviour observed therefore depends on which action is used:
-
-* if the "increment even if same" action is called:
-+
-[source,java,indent=0]
-----
-include::ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java[tags=class]
-----
-<.> always render the page.
-+
-This causes the entire page to be re-rendered.
-That means that the current time will be updated, but only after a 1 second delay
-
-* if the "increment redirect only if differs" action is called:
-+
-[source,java,indent=0]
-----
-include::ActionLayoutRedirectPolicyPage_incrementRedirectOnlyIfDiffers.java[tags=class]
-----
-<.> only re-render the updated property.
-+
-This _should_ cause only the updated property to re-render.
-+
-[WARNING]
-====
-Because this feature is currently *not* supported by the _Wicket Viewer_, in fact the `currentTime` property also re-renders; see link:https://issues.apache.org/jira/browse/CAUSEWAY-1659[CAUSEWAY-1659]
-====
+TODO
+
+// This page has a `count` property with two associated actions.
+// These both increment the `count`, but use different redirect policies.
+//
+// The page also has a `currentTime` property, that displays the current time.
+// This is a derived property that also has a built-in delay of 1 second.
+//
+// [source,java,indent=0]
+// ----
+// include::ActionLayoutRedirectPolicyPage.java[tags=class]
+// ----
+// <.> for demonstration purposes, this UI component opts out of being redrawn if there is no redirect.
+//
+// [NOTE]
+// ====
+// In this demo we are somewhat misusing the `@PropertyLayout#repainting` attribute; normally this is used for components that are expensive to render _and_ which are generally unchanging.
+// The most common example of such a property would be a PDF, rendered using the link:https://causeway.apache.org/vw/2.0.0-RC1/pdfjs/about.html[PDF.js] extension (the link:https://causeway.apache.org/refguide/2.0.0-RC1/extensions/index/pdfjs/applib/annotations/PdfJsViewer.html#section-top[@PdfJsViewer] annotation).
+// ====
+//
+// The behaviour observed therefore depends on which action is used:
+//
+// * if the "increment even if same" action is called:
+// +
+// [source,java,indent=0]
+// ----
+// include::ActionLayoutRedirectPolicyPage_incrementRedirectEvenIfSame.java[tags=class]
+// ----
+// <.> always render the page.
+// +
+// This causes the entire page to be re-rendered.
+// That means that the current time will be updated, but only after a 1 second delay
+//
+// * if the "increment redirect only if differs" action is called:
+// +
+// [source,java,indent=0]
+// ----
+// include::ActionLayoutRedirectPolicyPage_incrementRedirectOnlyIfDiffers.java[tags=class]
+// ----
+// <.> only re-render the updated property.
+// +
+// This _should_ cause only the updated property to re-render.
+// +
+// [WARNING]
+// ====
+// Because this feature is currently *not* supported by the _Wicket Viewer_, in fact the `currentTime` property also re-renders; see link:https://issues.apache.org/jira/browse/CAUSEWAY-1659[CAUSEWAY-1659]
+// ====
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
index c60fb4c4c9..791ddf5211 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
@@ -57,18 +57,6 @@ public class ActionLayoutRedirectPolicyPage
 implements HasAsciiDocDescription
 //tag::class[]
 {
-    @Property(optionality = Optionality.OPTIONAL)
-    @XmlElement(required = false)
-    @Getter @Setter
-    private Integer count;
-
-    @SneakyThrows
-    @Property
-    @PropertyLayout(repainting = Repainting.NO_REPAINT) // <.>
-    public String getCurrentTime() {
-        Thread.sleep(1000);
-        return clockService.getClock().nowAsLocalDateTime().toString();
-    }
 
     // ...
 //end::class[]
@@ -79,6 +67,5 @@ implements HasAsciiDocDescription
 
 //tag::class[]
 
-    @Inject @XmlTransient private ClockService clockService;
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml
index eefcc3123f..d3f19a9c14 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.layout.xml
@@ -26,16 +26,8 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<cpt:fieldSet name="General" id="general">
-                <cpt:property id="count">
-                    <cpt:action id="incrementRedirectEvenIfSame"/>
-                    <cpt:action id="incrementRedirectOnlyIfDiffers"/>
-                </cpt:property>
-            </cpt:fieldSet>
-			<cpt:fieldSet name="Time" id="time">
-                <cpt:property id="currentTime"/>
-            </cpt:fieldSet>
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<cpt:collection id="objects"/>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_objects.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_objects.java
new file mode 100644
index 0000000000..b33647a3d9
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage_objects.java
@@ -0,0 +1,29 @@
+package demoapp.dom.domain.actions.ActionLayout.redirectPolicy;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.annotation.Collection;
+import org.apache.causeway.applib.annotation.MemberSupport;
+
+import lombok.RequiredArgsConstructor;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.actions.ActionLayout.hidden.ActionLayoutHiddenPage;
+
+//tag::class[]
+@Collection()
+@RequiredArgsConstructor
+public class ActionLayoutRedirectPolicyPage_objects {
+
+    @SuppressWarnings("unused")
+    private final ActionLayoutRedirectPolicyPage page;
+
+    @MemberSupport public List<? extends ActionLayoutRedirectPolicyEntity> coll() {
+        return objectRepository.all();
+    }
+
+    @Inject ValueHolderRepository<String, ? extends ActionLayoutRedirectPolicyEntity> objectRepository;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImpl-description.adoc
similarity index 90%
copy from examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImpl-description.adoc
index 8e3b88aada..2fe08951a0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImpl-description.adoc
@@ -1,4 +1,3 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
-This action demonstrates how individual parameters can be hidden or disabled.
-
+include::../ActionLayoutRedirectPolicyEntity-description.adoc[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImpl.java
similarity index 58%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImpl.java
index c60fb4c4c9..110c9030cd 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/ActionLayoutRedirectPolicyPage.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImpl.java
@@ -16,69 +16,65 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.domain.actions.ActionLayout.redirectPolicy;
+package demoapp.dom.domain.actions.ActionLayout.redirectPolicy.jpa;
 
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
+import demoapp.dom.domain.actions.ActionLayout.redirectPolicy.ActionLayoutRedirectPolicyEntity;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import lombok.SneakyThrows;
 
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainObject;
 import org.apache.causeway.applib.annotation.Nature;
-import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Redirect;
 import org.apache.causeway.applib.annotation.Repainting;
 import org.apache.causeway.applib.services.clock.ClockService;
+import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import org.springframework.context.annotation.Profile;
 
-import lombok.Getter;
-import lombok.Setter;
-import lombok.SneakyThrows;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.*;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
 
-@DomainObject(nature=Nature.VIEW_MODEL)
-@Named("demo.ActionLayoutRedirectPolicyPage")
-@XmlRootElement(name = "root")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
+@Profile("demo-jpa")
+@Entity
+@Table(
+    schema = "demo",
+    name = "ActionLayoutRedirectPolicyEntity"
+)
+@EntityListeners(CausewayEntityListener.class)
+@Named("demo.ActionLayoutRedirectPolicyEntity")
+@NoArgsConstructor
 //tag::class[]
 // ...
-public class ActionLayoutRedirectPolicyPage
+@DomainObject(nature = Nature.ENTITY)
+public class ActionLayoutRedirectPolicyEntityImpl extends ActionLayoutRedirectPolicyEntity {
+    // ...
 //end::class[]
-implements HasAsciiDocDescription
-//tag::class[]
-{
-    @Property(optionality = Optionality.OPTIONAL)
-    @XmlElement(required = false)
-    @Getter @Setter
-    private Integer count;
 
-    @SneakyThrows
-    @Property
-    @PropertyLayout(repainting = Repainting.NO_REPAINT) // <.>
-    public String getCurrentTime() {
-        Thread.sleep(1000);
-        return clockService.getClock().nowAsLocalDateTime().toString();
+    public ActionLayoutRedirectPolicyEntityImpl(String value) {
+        setName(value);
     }
 
-    // ...
-//end::class[]
+    @Id
+    @GeneratedValue
+    private Long id;
 
-    @ObjectSupport public String title() {
-        return "@ActionLayout#redirectPolicy";
-    }
+    @Getter @Setter
+    private String name;
 
-//tag::class[]
+    @Property(optionality = Optionality.OPTIONAL)
+    @XmlElement(required = false)
+    @Getter @Setter
+    private Integer count;
 
-    @Inject @XmlTransient private ClockService clockService;
+//tag::class[]
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImplRepository.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImplRepository.java
new file mode 100644
index 0000000000..4e9deefc9a
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/redirectPolicy/jpa/ActionLayoutRedirectPolicyEntityImplRepository.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package demoapp.dom.domain.actions.ActionLayout.redirectPolicy.jpa;
+
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.actions.ActionLayout.redirectPolicy.ActionLayoutRedirectPolicyEntityRepository;
+
+@Profile("demo-jpa")
+@Service
+public class ActionLayoutRedirectPolicyEntityImplRepository
+extends ValueHolderRepository<String, ActionLayoutRedirectPolicyEntityImpl> implements ActionLayoutRedirectPolicyEntityRepository {
+
+    protected ActionLayoutRedirectPolicyEntityImplRepository() {
+        super(ActionLayoutRedirectPolicyEntityImpl.class);
+    }
+
+    @Override
+    protected ActionLayoutRedirectPolicyEntityImpl newDetachedEntity(String value) {
+        return new ActionLayoutRedirectPolicyEntityImpl(value);
+    }
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc b/examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc
index 8e3b88aada..4aae75e743 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/progmodel/actions/veto/ActionVetoPage-vetoParamDescription.adoc
@@ -2,3 +2,4 @@
 
 This action demonstrates how individual parameters can be hidden or disabled.
 
+WARNING: https://issues.apache.org/jira/browse/CAUSEWAY-3463[CAUSEWAY-3463] tracks a UI glitch that dependent parameter visibility is not always re-evaluated correctly.