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 2022/08/08 12:06:27 UTC

[isis] branch master updated: ISIS-3112: have ValueModel hold info about its origin

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


The following commit(s) were added to refs/heads/master by this push:
     new 343cc8c350 ISIS-3112: have ValueModel hold info about its origin
343cc8c350 is described below

commit 343cc8c350c72edb5be8a5fd1be02ef9b6faf560
Author: andi-huber <ah...@apache.org>
AuthorDate: Mon Aug 8 14:06:18 2022 +0200

    ISIS-3112: have ValueModel hold info about its origin
---
 .../interactions/managed/nonscalar/DataRow.java    |  2 +
 .../spec/feature/memento/ActionMemento.java        |  2 +-
 .../feature/memento/ActionParameterMemento.java    |  2 +-
 .../spec/feature/memento/CollectionMemento.java    |  2 +-
 .../spec/feature/memento/ObjectMemberMemento.java  | 83 ++++++++++++++++++++++
 .../spec/feature/memento/PropertyMemento.java      |  2 +-
 .../viewer/wicket/model/models/ValueModel.java     | 18 ++++-
 .../actionresponse/ActionResultResponseType.java   |  4 +-
 .../ajaxtable/columns/GenericTitleColumn.java      | 10 +--
 9 files changed, 114 insertions(+), 11 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
index 1b45034c7c..59e27f6ae7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
@@ -32,8 +32,10 @@ public class DataRow {
     @Getter private final UUID uuid = UUID.randomUUID(); // in support of client side sorting
     private final ManagedObject rowElement;
     @Getter private final BooleanBindable selectToggle;
+    @Getter private final DataTableModel parentTable;
 
     public DataRow(final DataTableModel parentTable, final ManagedObject rowElement) {
+        this.parentTable = parentTable;
         this.rowElement = rowElement;
 
         selectToggle = _Bindables.forBoolean(false);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java
index 60a2a88693..e4f0a9c36a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionMemento.java
@@ -33,7 +33,7 @@ import lombok.NonNull;
 import lombok.Synchronized;
 
 /**
- * {@link Serializable} representation of a {@link ObjectAction}
+ * {@link Serializable} representation of an {@link ObjectAction}
  *
  * @implNote thread-safe memoization
  *
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionParameterMemento.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionParameterMemento.java
index ee9ae88f60..17fc82627e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionParameterMemento.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ActionParameterMemento.java
@@ -33,7 +33,7 @@ import lombok.NonNull;
 import lombok.Synchronized;
 
 /**
- * {@link Serializable} representation of a {@link ObjectActionParameter parameter}
+ * {@link Serializable} representation of an {@link ObjectActionParameter parameter}
  * that belongs to an {@link ObjectAction}.
  *
  * @implNote thread-safe memoization
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/CollectionMemento.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/CollectionMemento.java
index 8ef68485f6..7e021af5e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/CollectionMemento.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/CollectionMemento.java
@@ -33,7 +33,7 @@ import lombok.NonNull;
 import lombok.Synchronized;
 
 /**
- * {@link Serializable} representation of a {@link OneToManyAssociation}
+ * {@link Serializable} representation of an {@link OneToManyAssociation}
  * (a parented collection of entities).
  *
  * @implNote thread-safe memoization
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ObjectMemberMemento.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ObjectMemberMemento.java
new file mode 100644
index 0000000000..c04daca968
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/ObjectMemberMemento.java
@@ -0,0 +1,83 @@
+/*
+ *  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 org.apache.isis.core.metamodel.spec.feature.memento;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+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.Synchronized;
+
+/**
+ * {@link Serializable} representation of an {@link ObjectMember}
+*
+* @implNote thread-safe memoization
+*
+* @since 2.0 {index}
+*/
+@EqualsAndHashCode
+@AllArgsConstructor(access = AccessLevel.PROTECTED)
+public class ObjectMemberMemento implements Serializable {
+
+   private static final long serialVersionUID = 1L;
+
+   @EqualsAndHashCode.Include
+   @Getter private final @NonNull Identifier identifier;
+
+   // -- FACTORY
+
+   public static ObjectMemberMemento forMember(final @NonNull ObjectMember objectMember) {
+       return new ObjectMemberMemento(
+               objectMember.getFeatureIdentifier(),
+               objectMember);
+   }
+
+   // -- LOAD/UNMARSHAL
+
+   @EqualsAndHashCode.Exclude
+   private transient ObjectMember objectMember;
+
+   @Synchronized
+   public ObjectMember getObjectMember(final @NonNull Supplier<SpecificationLoader> specLoader) {
+       if (objectMember == null) {
+           objectMember = specLoader.get()
+                   .specForLogicalTypeElseFail(getIdentifier().getLogicalType())
+                   .getMemberElseFail(
+                           getIdentifier().getMemberNameAndParameterClassNamesIdentityString());
+       }
+       return objectMember;
+   }
+
+   // -- OBJECT CONTRACT
+
+   @Override
+   public String toString() {
+       return getIdentifier().getLogicalTypeName() + "#"
+               + getIdentifier().getMemberNameAndParameterClassNamesIdentityString();
+   }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/PropertyMemento.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/PropertyMemento.java
index e6b9bea659..fd957caa10 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/PropertyMemento.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/memento/PropertyMemento.java
@@ -33,7 +33,7 @@ import lombok.NonNull;
 import lombok.Synchronized;
 
 /**
- * {@link Serializable} representation of a {@link OneToOneAssociation}
+ * {@link Serializable} representation of an {@link OneToOneAssociation}
  *
  * @implNote thread-safe memoization
  *
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index 409ded0e10..54da2ef25a 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -23,6 +23,8 @@ import org.springframework.lang.Nullable;
 import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemento;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.core.metamodel.spec.feature.memento.ObjectMemberMemento;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 
 import lombok.NonNull;
@@ -39,8 +41,9 @@ extends ModelAbstract<ManagedObject> {
 
     public static ValueModel of(
             final @NonNull  IsisAppCommonContext commonContext,
+            final @NonNull  ObjectMember objectMember,
             final @Nullable ManagedObject valueAdapter) {
-        return new ValueModel(commonContext, valueAdapter);
+        return new ValueModel(commonContext, objectMember, valueAdapter);
     }
 
     // --
@@ -49,8 +52,10 @@ extends ModelAbstract<ManagedObject> {
 
     private ValueModel(
             final IsisAppCommonContext commonContext,
+            final @NonNull  ObjectMember objectMember,
             final @Nullable ManagedObject valueAdapter) {
         super(commonContext);
+        this.objectMemberMemento = ObjectMemberMemento.forMember(objectMember);
         adapterMemento = super.getMementoService().mementoForObject(valueAdapter);
     }
 
@@ -59,6 +64,17 @@ extends ModelAbstract<ManagedObject> {
         return getCommonContext().reconstructObject(adapterMemento);
     }
 
+    // -- META MODEL
+
+    private final ObjectMemberMemento objectMemberMemento;
+
+    /**
+     * The originating {@link ObjectMember} this {@link ValueModel} is provided by.
+     */
+    public ObjectMember getObjectMember() {
+        return objectMemberMemento.getObjectMember(getCommonContext()::getSpecificationLoader);
+    }
+
     // -- HINTING SUPPORT
 
     private ActionModel actionModelHint;
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 fc8bf04485..5ff36dcde3 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
@@ -96,9 +96,9 @@ public enum ActionResultResponseType {
                 final ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             final var commonContext = actionModel.getCommonContext();
-            ValueModel valueModel = ValueModel.of(commonContext, resultAdapter);
+            final var valueModel = ValueModel.of(commonContext, actionModel.getAction(), resultAdapter);
             valueModel.setActionHint(actionModel);
-            final ValuePage valuePage = new ValuePage(valueModel);
+            final var valuePage = new ValuePage(valueModel);
             return ActionResultResponse.toPage(ValuePage.class, valuePage);
         }
     },
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/GenericTitleColumn.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/GenericTitleColumn.java
index c7cd2a77c9..b2b864b873 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/GenericTitleColumn.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/GenericTitleColumn.java
@@ -28,9 +28,9 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataRow;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
-import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel.Variant;
 import org.apache.isis.viewer.commons.model.components.ComponentType;
 import org.apache.isis.viewer.commons.model.object.ObjectUiModel.RenderingHint;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel.Variant;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ValueModel;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
@@ -77,11 +77,13 @@ extends GenericColumnAbstract {
     }
 
     private Component createComponent(final String id, final IModel<DataRow> rowModel) {
-        val adapter = rowModel.getObject().getRowElement();
+        val dataRow = rowModel.getObject();
 
-        if(ManagedObjects.isValue(adapter)) {
-            val valueModel = ValueModel.of(super.getCommonContext(), adapter);
+        val adapter = dataRow.getRowElement();
 
+        if(ManagedObjects.isValue(adapter)) {
+            val objectMember = dataRow.getParentTable().getMetaModel();
+            val valueModel = ValueModel.of(super.getCommonContext(), objectMember, adapter);
             val componentFactory = findComponentFactory(ComponentType.VALUE, valueModel);
             return componentFactory.createComponent(id, valueModel);
         }