You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/12/07 07:27:44 UTC

[isis] branch master updated (889ac002 -> fb62f80)

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

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 889ac002 ISIS-2911: remove hacky re-attach workaround, instead fail
     new 2f45c2b  ISIS-2911: make ManagedObject.pojo non-final
     new 00967d1  ISIS-2911: cleaning up IsisWicketApplication a bit
     new fb62f80  ISIS-2911: some simplifications around Form execution and ActionLinks

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../interactions/managed/ManagedMember.java        |   5 +-
 .../isis/core/metamodel/spec/ManagedObject.java    |  29 +++-
 .../isis/core/metamodel/spec/ManagedObjects.java   |  31 +++-
 .../models/EntityCollectionModelAbstract.java      |   5 +
 .../viewer/wicket/model/models/FormExecutor.java   |   2 -
 .../models/interaction/BookmarkedObjectWkt.java    |  21 ++-
 .../actionresponse/ActionResultResponseType.java   |   4 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |  14 +-
 .../widgets/linkandlabel/ActionLink.java           |   9 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   2 -
 .../wicket/ui/panels/PromptFormAbstract.java       |   2 +-
 .../viewer/wicketapp/IsisWicketApplication.java    |  33 ++--
 .../IsisWicketApplication_experimental.java        | 183 +++++++++++++++++++++
 13 files changed, 292 insertions(+), 48 deletions(-)

[isis] 03/03: ISIS-2911: some simplifications around Form execution and ActionLinks

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit fb62f800b6e653bf6ea94b4e83fffc3f9c1dfcef
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Dec 7 08:27:31 2021 +0100

    ISIS-2911: some simplifications around Form execution and ActionLinks
    
    - also adding more entity-attached checks (WIP)
---
 .../model/models/EntityCollectionModelAbstract.java |  5 +++++
 .../viewer/wicket/model/models/FormExecutor.java    |  2 --
 .../models/interaction/BookmarkedObjectWkt.java     | 21 ++++++++++++++++++++-
 .../ui/actionresponse/ActionResultResponseType.java |  4 ++--
 .../entity/icontitle/EntityIconAndTitlePanel.java   | 14 ++++++++------
 .../components/widgets/linkandlabel/ActionLink.java |  9 +++++----
 .../wicket/ui/panels/FormExecutorDefault.java       |  2 --
 .../viewer/wicket/ui/panels/PromptFormAbstract.java |  2 +-
 .../IsisWicketApplication_experimental.java         | 10 +---------
 9 files changed, 42 insertions(+), 27 deletions(-)

diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelAbstract.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelAbstract.java
index 9a1f067..8b96e50 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelAbstract.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelAbstract.java
@@ -82,6 +82,11 @@ implements EntityCollectionModel {
         return getObject();
     }
 
+//XXX experiments from IsisWicketApplication_experimental
+//    public final void setDataTableModel(final DataTableModel dataTableModel) {
+//        delegate().setObject(dataTableModel);
+//    }
+
     @Override
     public ObjectMember getMetaModel() {
         return getDataTableModel()
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
index df8632b..42a98a6 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import java.io.Serializable;
 
-import org.apache.wicket.Page;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 
@@ -54,7 +53,6 @@ public interface FormExecutor extends Serializable {
     }
 
     FormExecutionOutcome executeAndProcessResults(
-            Page page,
             AjaxRequestTarget targetIfAny,
             Form<?> feedbackFormIfAny,
             FormExecutorContext formExecutorContext);
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
index 490143d..357528a 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
@@ -133,10 +133,29 @@ extends ModelAbstract<ManagedObject> {
         throw _Exceptions.unsupportedOperation("MangedObjectWkt is immuatable");
     }
 
+    /**
+     * Every request-cycle ends with a transaction commit,
+     * where JDO will automatically detach entities.
+     * For any inline <i>Property</i> edits a new AJAX requests gets created,
+     * which results in a new request-cycle, where an EntityPage instance
+     * is reused, that was already populated in the previous request-cycle.
+     * However, this time, all the contained entities are detached
+     * from the persistence layer and need to be re-attached
+     * (or re-loaded from their bookmarks).
+     */
     public final ManagedObject getObjectAndReAttach() {
         //EntityUtil.assertAttachedWhenEntity()//guard
         val entityOrViewmodel = super.getObject();
-        // even though initial loading seems attached, we need to check again
+
+        val spec = entityOrViewmodel.getSpecification();
+
+//XXX experimental
+//        if(spec.getCorrespondingClass()
+//        .getSimpleName().contains("InventoryJaxb")) {
+//            return _JaxbViewmodel.computeIfDetached(entityOrViewmodel, this::reload);
+//        };
+
+
         return EntityUtil.computeIfDetached(entityOrViewmodel, this::reload);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index d55a8e6..63ce77e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -227,8 +227,8 @@ public enum ActionResultResponseType {
                 .interpretResult(model, targetIfAny, typeAndAdapter.resultAdapter, args);
     }
 
-    public static ActionResultResponse toEntityPage(final ManagedObject actualAdapter) {
-        return ActionResultResponse.toPage(EntityPage.class, actualAdapter.getBookmarkRefreshed().orElseThrow());
+    public static ActionResultResponse toEntityPage(final ManagedObject entityOrViewmodel) {
+        return ActionResultResponse.toPage(EntityPage.class, entityOrViewmodel.getBookmarkRefreshed().orElseThrow());
     }
 
     // -- HELPER
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
index 3f58cd4..4d85427 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFactor
 import org.apache.isis.core.metamodel.facets.object.projection.ProjectionFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ObjectAdapterModel;
 import org.apache.isis.viewer.wicket.model.models.PageType;
@@ -59,6 +60,7 @@ extends PanelAbstract<ManagedObject, ObjectAdapterModel> {
     private static final String ID_ENTITY_TITLE = "entityTitle";
     private static final String ID_ENTITY_ICON = "entityImage";
 
+    @SuppressWarnings("unused")
     private Label label;
     @SuppressWarnings("unused")
     private Image image;
@@ -149,14 +151,14 @@ extends PanelAbstract<ManagedObject, ObjectAdapterModel> {
         final ObjectAdapterModel redirectToModel;
 
         if(targetAdapter != null) {
-            val projectionFacet = entityModel.getTypeOfSpecification().getFacet(ProjectionFacet.class);
 
-            val redirectToAdapter =
-                    projectionFacet != null
-                        ? projectionFacet.projected(targetAdapter)
-                        : targetAdapter;
+            EntityUtil.reattach(targetAdapter);
+
+            val redirectToAdapter = entityModel.getTypeOfSpecification().lookupFacet(ProjectionFacet.class)
+                    .map(projectionFacet->projectionFacet.projected(targetAdapter))
+                    .orElse(targetAdapter);
 
-                    redirectToModel = EntityModel.ofAdapter(super.getCommonContext(), redirectToAdapter);
+            redirectToModel = EntityModel.ofAdapter(super.getCommonContext(), redirectToAdapter);
 
         } else {
             redirectToModel = entityModel;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
index 29fb7c3..0b75633 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
@@ -40,6 +40,7 @@ import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptWithExtraContent;
 import org.apache.isis.viewer.wicket.model.util.CommonContextUtils;
+import org.apache.isis.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersPanel;
@@ -214,12 +215,11 @@ extends IndicatingAjaxLink<ManagedObject> {
 
     private void executeWithoutParams() {
         val actionModel = this.getActionModel();
-        val page = this.getPage();
 
         // on non-recoverable exception throws
         val outcome = FormExecutorDefault
                 .forAction(actionModel)
-                .executeAndProcessResults(page, null, null, actionModel);
+                .executeAndProcessResults(null, null, actionModel);
 
         // on recoverable exception stay on page (eg. validation failure)
         if(outcome.isFailure()) {
@@ -234,11 +234,12 @@ extends IndicatingAjaxLink<ManagedObject> {
             // the EventBus' exception handler will automatically veto.  This results in a growl message rather than
             // an error page, but is probably 'good enough').
             val targetAdapter = actionModel.getParentObject();
-            val entityPage = EntityPage.ofAdapter(getCommonContext(), targetAdapter);
+            val bookmark = targetAdapter.getBookmarkRefreshed().orElseThrow();
             getCommonContext().getTransactionService().flushTransaction();
 
             // "redirect-after-post"
-            RequestCycle.get().setResponsePage(entityPage);
+            RequestCycle.get().setResponsePage(EntityPage.class,
+                    PageParameterUtils.createPageParametersForBookmark(bookmark));
         }
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index 7aa17f8..f40772a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.ui.panels;
 
 import java.util.Optional;
 
-import org.apache.wicket.Page;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 import org.springframework.lang.Nullable;
@@ -84,7 +83,6 @@ implements FormExecutor {
      */
     @Override
     public FormExecutionOutcome executeAndProcessResults(
-            final Page page,
             final AjaxRequestTarget ajaxTarget,
             final Form<?> feedbackFormIfAny,
             final FormExecutorContext formExecutorContext) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index 6916482..49a3271 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -118,7 +118,7 @@ implements ScalarModelSubscriber {
         val formExecutor = FormExecutorDefault.forMember(getMemberModel());
 
         val outcome = formExecutor
-                .executeAndProcessResults(target.getPage(), target, form, formExecutorContext());
+                .executeAndProcessResults(target, form, formExecutorContext());
 
         if (outcome.isSuccess()) {
             completePrompt(target);
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java
index 5140d19..afea73b 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java
@@ -298,18 +298,10 @@ final class IsisWicketApplication_experimental {
                         val collectionModel = ((CollectionPanel)component).getModel();
                         val dataTableModel = dataTableByPath.get(keyFor(component));
 
-                        collectionModel.setDataTableModel(dataTableModel);
+                        //XXX removed collectionModel.setDataTableModel(dataTableModel);
 
                         System.err.printf("BBB-coll@ %s%n", keyFor(component));
                         System.err.printf("BBB-coll %s%n", collectionModel.getDataTableModel());
-//                        System.err.printf("path %s%n", keyFor(component));
-
-//                        collectionModel.getDataTableModel().getDataElements().getValue().forEach(mo->{
-//                            System.err.printf("element %s%n", mo);
-//
-//                            mo.getPojo();
-//                        });
-
 
                         dataTableModel.getDataElements().getValue().forEach(mo->{
                             System.err.printf("element %s%n", mo.getBookmark());

[isis] 01/03: ISIS-2911: make ManagedObject.pojo non-final

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 2f45c2b5e17737c17d9306cf1e7e24291bfb0a11
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Dec 7 08:17:13 2021 +0100

    ISIS-2911: make ManagedObject.pojo non-final
    
    - for the sole purpose of allowing in-place pojo replacement for
    re-attaching entity pojos
---
 .../interactions/managed/ManagedMember.java        |  5 ++--
 .../isis/core/metamodel/spec/ManagedObject.java    | 29 +++++++++++++++-----
 .../isis/core/metamodel/spec/ManagedObjects.java   | 31 +++++++++++++++++-----
 3 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
index e69e381..a49995e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
@@ -96,9 +96,10 @@ implements ManagedFeature {
 
     @NonNull private ManagedObject owner;
     public ManagedObject getOwner() {
-        //XXX this is a hack,
+        //XXX this is a safeguard
         // see also org.apache.isis.core.metamodel.interactions.managed.ManagedProperty.ManagedProperty(ManagedObject, OneToOneAssociation, Where)
-        return owner = EntityUtil.reattach(owner);
+        EntityUtil.reattach(owner);
+        return owner;
     }
 
     @Getter @NonNull private final Where where;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index 26b627f..e0f8bbb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -35,12 +35,11 @@ import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
 import lombok.ToString;
-import lombok.Value;
 import lombok.val;
 
 /**
@@ -62,6 +61,13 @@ public interface ManagedObject {
     Object getPojo();
 
     /**
+     * Introduced, so we can re-attach detached entity pojos in place.
+     * @apiNote should be package private, and not publicly exposed
+     * (but the <i>Java</i> language is not there yet)
+     */
+    void replacePojo(UnaryOperator<Object> replacer);
+
+    /**
      * Returns the object's bookmark as identified by the ObjectManager.
      * Bookmarks are considered immutable, hence will be memoized once fetched.
      */
@@ -220,10 +226,12 @@ public interface ManagedObject {
 
     // -- SIMPLE
 
-    @Value
-    @RequiredArgsConstructor(staticName="of", access = AccessLevel.PRIVATE)
+    //@Value
+    //@RequiredArgsConstructor(staticName="of", access = AccessLevel.PRIVATE)
+    @AllArgsConstructor(staticName="of", access = AccessLevel.PRIVATE)
     @EqualsAndHashCode(of = "pojo")
     @ToString(of = {"specification", "pojo"}) //ISIS-2317 make sure toString() is without side-effects
+    @Getter
     static final class SimpleManagedObject implements ManagedObject {
 
         public static ManagedObject identified(
@@ -236,7 +244,7 @@ public interface ManagedObject {
         }
 
         @NonNull private final ObjectSpecification specification;
-        @Nullable private final Object pojo;
+        @Nullable private /*final*/ Object pojo;
 
         @Override
         public Optional<Bookmark> getBookmark() {
@@ -261,6 +269,11 @@ public interface ManagedObject {
             return bookmarkLazy.isMemoized();
         }
 
+        @Override
+        public void replacePojo(final UnaryOperator<Object> replacer) {
+            pojo = replacer.apply(pojo);
+        }
+
     }
 
     // -- LAZY
@@ -270,7 +283,7 @@ public interface ManagedObject {
 
         @NonNull private final Function<Class<?>, ObjectSpecification> specLoader;
 
-        @Getter @NonNull private final Object pojo;
+        @Getter @NonNull private /*final*/ Object pojo;
 
         @Override
         public Optional<Bookmark> getBookmark() {
@@ -323,6 +336,10 @@ public interface ManagedObject {
             return specLoader.apply(pojo.getClass());
         }
 
+        @Override
+        public void replacePojo(final UnaryOperator<Object> replacer) {
+            pojo = replacer.apply(pojo);
+        }
 
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index e6cf411..6773ca5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -337,7 +337,7 @@ public final class ManagedObjects {
 
         return _NullSafe.streamAutodetect(collectionOrArray)
         .map(pojo->ManagedObject.of(elementSpec, pojo)) // pojo is nullable here
-        .map(ManagedObjects.EntityUtil::reattach)
+        .peek(ManagedObjects.EntityUtil::reattach)
         .filter(ManagedObjects.VisibilityUtil.filterOn(interactionInitiatedBy))
         .collect(Can.toCan());
     }
@@ -424,6 +424,10 @@ public final class ManagedObjects {
             return false;
         }
 
+        @Override
+        public void replacePojo(final UnaryOperator<Object> replacer) {
+        }
+
     };
 
     // -- TITLE UTILITIES
@@ -614,28 +618,41 @@ public final class ManagedObjects {
             return managedObject;
         }
 
-        @Nullable
-        public static ManagedObject reattach(final @Nullable ManagedObject managedObject) {
+        //@Nullable
+        public static void reattach(final @Nullable ManagedObject managedObject) {
             if(isNullOrUnspecifiedOrEmpty(managedObject)) {
-                return managedObject;
+                //return managedObject;
+                return;
             }
             val entityState = EntityUtil.getEntityState(managedObject);
             if(!entityState.isPersistable()) {
-                return managedObject;
+                //return managedObject;
+                return;
             }
             if(!entityState.isDetached()) {
-                return managedObject;
+                //return managedObject;
+                return;
             }
 
             val spec = managedObject.getSpecification();
             val objectManager = managedObject.getObjectManager();
 
-            return bookmark(managedObject)
+            val reattached = bookmark(managedObject)
             .map(bookmark->objectManager.loadObject(
                     ObjectLoader.Request.of(
                                     spec,
                                     bookmark)))
             .orElse(managedObject);
+
+
+            val state = EntityUtil.getEntityState(reattached);
+            if(state.isPersistable()) {
+                _Assert.assertTrue(state.isAttached());
+            }
+
+            managedObject.replacePojo(old->reattached.getPojo());
+
+            //return reattached;
         }
 
         public static void requiresWhenFirstIsBookmarkableSecondIsAttached(

[isis] 02/03: ISIS-2911: cleaning up IsisWicketApplication a bit

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 00967d1c4207178aa6b3463ea8701f107ff1a422
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Dec 7 08:18:08 2021 +0100

    ISIS-2911: cleaning up IsisWicketApplication a bit
    
    - also keeping some of the recent experiments for future reference
---
 .../viewer/wicketapp/IsisWicketApplication.java    |  33 ++--
 .../IsisWicketApplication_experimental.java        | 191 +++++++++++++++++++++
 2 files changed, 209 insertions(+), 15 deletions(-)

diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication.java
index 901c076..876a1f5 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication.java
@@ -170,6 +170,7 @@ implements
         newPageFactoryMixin = new IsisWicketApplication_newPageFactory(this);
     }
 
+
     /**
      * Although there are warnings about not overriding this method, it doesn't seem possible
      * to call {@link #setResourceSettings(org.apache.wicket.settings.ResourceSettings)} in the
@@ -187,6 +188,9 @@ implements
 
         super.internalInit();
 
+        // entity page experiments, kept for reference or future experiments
+        //IsisWicketApplication_experimental.setRootRequestMapper(this);
+
     }
 
     private AjaxRequestTarget decorate(final AjaxRequestTarget ajaxRequestTarget) {
@@ -280,26 +284,25 @@ implements
             //  side-effects?
             //  SharedResources sharedResources = getSharedResources();
 
-            if(systemEnvironment.isPrototyping()) {
+            if(systemEnvironment.isPrototyping()
+                    && configuration.getViewer().getWicket().getDevelopmentUtilities().isEnable()) {
+
                 DebugDiskDataStore.register(this);
                 log.debug("DebugDiskDataStore registered; access via ~/wicket/internal/debug/diskDataStore");
                 log.debug("DebugDiskDataStore: eg, http://localhost:8080/wicket/wicket/internal/debug/diskDataStore");
 
                 if(!getDebugSettings().isDevelopmentUtilitiesEnabled()) {
-                    boolean enableDevUtils = configuration.getViewer().getWicket().getDevelopmentUtilities().isEnable();
-                    if(enableDevUtils) {
-                        getDebugSettings().setDevelopmentUtilitiesEnabled(true);
-
-                        // copied from DebugBarInitializer
-                        // this is hacky, but need to do this because IInitializer#init() called before
-                        // the Application's #init() is called.
-                        // an alternative, better, design might be to move Isis' own initialization into an
-                        // implementation of IInitializer?
-                        DebugBar.registerContributor(VersionDebugContributor.DEBUG_BAR_CONTRIB, this);
-                        DebugBar.registerContributor(InspectorDebugPanel.DEBUG_BAR_CONTRIB, this);
-                        DebugBar.registerContributor(SessionSizeDebugPanel.DEBUG_BAR_CONTRIB, this);
-                        DebugBar.registerContributor(PageSizeDebugPanel.DEBUG_BAR_CONTRIB, this);
-                    }
+                    getDebugSettings().setDevelopmentUtilitiesEnabled(true);
+
+                    // copied from DebugBarInitializer
+                    // this is hacky, but need to do this because IInitializer#init() called before
+                    // the Application's #init() is called.
+                    // an alternative, better, design might be to move Isis' own initialization into an
+                    // implementation of IInitializer?
+                    DebugBar.registerContributor(VersionDebugContributor.DEBUG_BAR_CONTRIB, this);
+                    DebugBar.registerContributor(InspectorDebugPanel.DEBUG_BAR_CONTRIB, this);
+                    DebugBar.registerContributor(SessionSizeDebugPanel.DEBUG_BAR_CONTRIB, this);
+                    DebugBar.registerContributor(PageSizeDebugPanel.DEBUG_BAR_CONTRIB, this);
                 }
             }
 
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java
index 0fdc9ec..5140d19 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/IsisWicketApplication_experimental.java
@@ -24,19 +24,36 @@ import java.util.Set;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
+import org.apache.wicket.SystemMapper;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.AjaxRequestTarget.IListener;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.attributes.IAjaxCallListener;
+import org.apache.wicket.core.request.handler.ListenerRequestHandler;
+import org.apache.wicket.core.request.mapper.PageInstanceMapper;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestMapper;
+import org.apache.wicket.request.Request;
 import org.apache.wicket.request.resource.CssResourceReference;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import org.apache.isis.commons.internal._Constants;
+import org.apache.isis.commons.internal.base._Refs;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataTableModel;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 
 import lombok.NonNull;
 import lombok.val;
@@ -166,6 +183,180 @@ final class IsisWicketApplication_experimental {
                 references.toArray(new CssResourceReference[]{}));
     }
 
+    // -- ENTITY PAGE EXPERIMENTS
+
+    static void setRootRequestMapper(final IsisWicketApplication app) {
+        app.setRootRequestMapper(new SystemMapper(app) {
+            @Override
+            protected IRequestMapper newPageInstanceMapper() {
+                return new PageInstanceMapper() {
+                    @Override
+                    public IRequestHandler mapRequest(final Request request) {
+                        var handler = super.mapRequest(request);
+                        return reattachingHandler(app.getCommonContext(), handler);
+                    }
+                };
+            }
+        });
+
+    }
+
+    private static String keyFor(final Component component) {
+        val ref = _Refs.stringRef(component.getPath());
+        ref.cutAtIndexOfAndDrop(":theme:");
+        return ref.getValue();
+    }
+
+    private static IRequestHandler reattachingHandler(
+            final IsisAppCommonContext commonContext, final IRequestHandler handler) {
+        if(handler!=null) {
+            return handler;
+        }
+        if(handler instanceof ListenerRequestHandler) {
+            val lirqh = (ListenerRequestHandler)handler;
+            val page = lirqh.getPage();
+            if(!(page instanceof EntityPage)) {
+                return lirqh;
+            }
+
+            val entityPage = (EntityPage) page;
+            val entityModel = (EntityModel)entityPage.getUiHintContainerIfAny();
+            val spec = entityModel.getObject().getSpecification();
+
+            if(!spec.getCorrespondingClass()
+            .getSimpleName().contains("InventoryJaxb")) {
+                return lirqh;
+            };
+
+            val pageParams = entityPage.getPageParameters();
+            val pageWithAttachedEntities = EntityPage.ofPageParameters(commonContext, pageParams);
+            pageWithAttachedEntities.internalInitialize();
+
+            final Map<String, ManagedObject> entityByPath = _Maps.newHashMap();
+            final Map<String, DataTableModel> dataTableByPath = _Maps.newHashMap();
+
+            System.err.println("===================================================");
+
+            pageWithAttachedEntities.visitChildren(new IVisitor<Component, Void>() {
+
+                @Override
+                public void component(final Component component, final IVisit<Void> visit) {
+
+                    //System.err.printf("+ %s%n", component);
+
+                    if(component.getClass().equals(ReferencePanel.class)) {
+                        val scalarModel = ((ReferencePanel)component).getModel();
+                        val value = scalarModel.getObject();
+                        entityByPath.put(keyFor(component), value);
+
+                        System.err.printf("AAA-value %s%n", value.getPojo());
+                        System.err.printf("AAA-value@ %s%n", keyFor(component));
+                        return;
+                    }
+                    if(component.getClass().equals(CollectionPanel.class)) {
+                        val collectionModel = ((CollectionPanel)component).getModel();
+                        val dataTableModel = collectionModel.getDataTableModel();
+                        dataTableByPath.put(keyFor(component), dataTableModel);
+                        System.err.printf("AAA-coll %s%n", dataTableModel);
+                        System.err.printf("AAA-coll@ %s%n", keyFor(component));
+                    }
+
+//                    if(component.getClass().equals(EntityCollectionPanel.class)) {
+//                        val entityModel = ((EntityCollectionPanel)component).getModel();
+//                        val dataTableModel = EntityCollectionModelParented
+//                                .forParentObjectModel(entityModel)
+//                                .getDataTableModel();
+//                        dataTableByPath.put(keyFor(component), dataTableModel);
+//
+//                        System.err.printf("AAA-coll %s%n", dataTableModel);
+//                        System.err.printf("AAA-coll@ %s%n", keyFor(component));
+//                    }
+
+                }
+            });
+
+
+            //TODO re-attach all entities in the object graph
+
+            if(entityModel.getCommonContext().getInteractionProvider().isInInteraction()) {
+
+                System.err.println("===================================================");
+
+                entityPage.visitChildren((component, visit) -> {
+                    //System.err.printf("+ %s%n", component);
+                    if(component.getClass().getSimpleName().equals("ReferencePanel")) {
+                        var scalarModel = ((ReferencePanel)component).getModel();
+                        scalarModel.setObject(entityByPath.get(keyFor(component)));
+                        var value = scalarModel.getObject();
+                        //getObjectManager().attachObject(value);
+                        System.err.printf("BBB-value@ %s%n", keyFor(component));
+                        System.err.printf("BBB-value %s%n", value.getPojo());
+                        return;
+                    }
+
+                    if(component.getClass().equals(CollectionPanel.class)) {
+                        val collectionModel = ((CollectionPanel)component).getModel();
+                        val dataTableModel = dataTableByPath.get(keyFor(component));
+
+                        collectionModel.setDataTableModel(dataTableModel);
+
+                        System.err.printf("BBB-coll@ %s%n", keyFor(component));
+                        System.err.printf("BBB-coll %s%n", collectionModel.getDataTableModel());
+//                        System.err.printf("path %s%n", keyFor(component));
+
+//                        collectionModel.getDataTableModel().getDataElements().getValue().forEach(mo->{
+//                            System.err.printf("element %s%n", mo);
+//
+//                            mo.getPojo();
+//                        });
+
+
+                        dataTableModel.getDataElements().getValue().forEach(mo->{
+                            System.err.printf("element %s%n", mo.getBookmark());
+                        });
+
+                    }
+
+                });
+            }
+
+//            if(false) {
+//                Url url = request.getUrl();
+//                PageComponentInfo info = getPageComponentInfo(url);
+////                            Integer renderCount = info.getComponentInfo() != null ? info.getComponentInfo()
+////                                    .getRenderCount() : null;
+//                ComponentInfo componentInfo = info.getComponentInfo();
+////                            PageAndComponentProvider provider = new PageAndComponentProvider(
+////                                    info.getPageInfo().getPageId(), renderCount,
+////                                    componentInfo.getComponentPath());
+////                            provider.setPageSource(getContext());
+//
+//                val pageParams = entityPage.getPageParameters();
+//
+//                PageAndComponentProvider provider2 = new PageAndComponentProvider(
+//                        EntityPage.class, pageParams,
+//                        componentInfo.getComponentPath());
+//
+//                System.err.printf("***ComponentPath %s%n", componentInfo.getComponentPath());
+//
+//                provider2.setPageSource(getContext());
+//
+//                return new ListenerRequestHandler(provider2, componentInfo.getBehaviorId()) {
+//                    @Override
+//                    public IRequestableComponent getComponent() {
+//                        dumpComponentTree((EntityPage)getPage(), _Predicates.alwaysTrue());
+//                        return super.getComponent();
+//                    }
+//                };
+//            }
+
+            return lirqh;
+
+        }
+        return handler;
+    }
+
+
 
 
 }