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 2020/05/15 09:52:39 UTC

[isis] branch master updated: ISIS-2340: move PendingModel from ScalarModel to its own file

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 ef8c98b  ISIS-2340: move PendingModel from ScalarModel to its own file
ef8c98b is described below

commit ef8c98bfe788b6ccd5c450b1e6e8a0e98cf3b6c0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 15 11:26:27 2020 +0200

    ISIS-2340: move PendingModel from ScalarModel to its own file
    
    also a bit on slippery ground trying to simplify
---
 .../wicket/model/models/ManagedObjectModel.java    |   2 +
 .../viewer/wicket/model/models/PendingModel.java   | 115 +++++++++++++++++++++
 .../viewer/wicket/model/models/ScalarModel.java    | 114 +-------------------
 .../model/models/ScalarModelWithMultiPending.java  |   4 +-
 .../model/models/ScalarModelWithPending.java       |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   5 +-
 .../scalars/reference/ReferencePanel.java          |   5 +-
 7 files changed, 130 insertions(+), 119 deletions(-)

diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
index 66421fe..7c87fa1 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
@@ -77,6 +77,7 @@ extends ModelAbstract<ManagedObject> {
 
         if(ManagedObject.isNullOrUnspecifiedOrEmpty(adapter)) {
             super.setObject(null);
+            memento = null;
             return;
         }
 
@@ -93,6 +94,7 @@ extends ModelAbstract<ManagedObject> {
         
         if(ManagedObject.isNullOrUnspecifiedOrEmpty(adapter)) {
             super.setObject(null);
+            memento = null;
             return;
         }
 
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PendingModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PendingModel.java
new file mode 100644
index 0000000..c52e092
--- /dev/null
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PendingModel.java
@@ -0,0 +1,115 @@
+/*
+ *  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.viewer.wicket.model.models;
+
+import java.util.stream.Collectors;
+
+import org.apache.wicket.model.Model;
+
+import org.apache.isis.core.commons.internal.base._NullSafe;
+import org.apache.isis.core.commons.internal.collections._Collections;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.memento.ObjectMemento;
+import org.apache.isis.core.webapp.context.memento.ObjectMementoService;
+
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+@RequiredArgsConstructor
+@Log4j2
+final class PendingModel extends Model<ObjectMemento> {
+    private static final long serialVersionUID = 1L;
+
+    @NonNull private final ManagedObjectModel pendingValueModel;
+
+    /**
+     * Whether pending has been set (could have been set to null)
+     */
+    private boolean hasPending;
+    /**
+     * The new value (could be set to null; hasPending is used to distinguish).
+     */
+    private ObjectMemento pending;
+
+    @Override
+    public ObjectMemento getObject() {
+        if (hasPending) {
+            return pending;
+        }
+        
+        if(pendingValueModel.memento()!=null) {
+            return pendingValueModel.memento();
+        }
+        
+        //XXX [a.huber] as I don't understand the big picture here, given newly introduced branch above,
+        // there might be a slight chance, that this is dead code anyway ...
+        val adapter = pendingValueModel.getObject();
+        val pojo = adapter.getPojo();
+        if(pojo!=null && _Collections.isCollectionOrArrayOrCanType(pojo.getClass())) {
+            val specId = pendingValueModel.getTypeOfSpecification().getSpecId();
+            log.warn("potentially a bug, wild guess fix for non-scalar %s", specId);
+            val pojos = _NullSafe.streamAutodetect(pojo)
+                    .collect(Collectors.<Object>toList());
+            return getMementoService().mementoForPojos(pojos, specId);
+        }
+        return getMementoService().mementoForObject(adapter);
+    }
+
+    @Override
+    public void setObject(final ObjectMemento adapterMemento) {
+        pending = adapterMemento;
+        hasPending = true;
+    }
+
+    public void clearPending() {
+        this.hasPending = false;
+        this.pending = null;
+    }
+
+    public ManagedObject getPendingElseCurrentAdapter() {
+        return hasPending ? getPendingAdapter() : pendingValueModel.getObject();
+    }
+    
+    ManagedObject getPendingAdapter() {
+        val memento = getObject();
+        return getCommonContext().reconstructObject(memento);
+    }
+
+    ObjectMemento getPendingMemento() {
+        return pending;
+    }
+
+    void setPendingMemento(ObjectMemento selectedAdapterMemento) {
+        this.pending = selectedAdapterMemento;
+        hasPending=true;
+    }
+    
+    private IsisWebAppCommonContext getCommonContext() {
+        return pendingValueModel.getCommonContext();
+    }
+    
+    private ObjectMementoService getMementoService() {
+        return pendingValueModel.getMementoService();
+    }
+    
+    
+}
\ No newline at end of file
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 2a47171..49e4b41 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -21,16 +21,11 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
-
-import org.apache.wicket.model.Model;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.commons.internal.base._Casts;
 import org.apache.isis.core.commons.internal.base._NullSafe;
-import org.apache.isis.core.commons.internal.collections._Collections;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -40,7 +35,6 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.webapp.context.memento.ObjectMemento;
 import org.apache.isis.viewer.common.model.feature.ScalarUiModel;
 import org.apache.isis.viewer.common.model.object.ObjectUiModel;
 import org.apache.isis.viewer.common.model.object.ObjectUiModel.HasRenderingHints;
@@ -51,12 +45,10 @@ import org.apache.isis.viewer.wicket.model.links.LinksProvider;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
 import lombok.Setter;
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
 
 /**
  * Represents a scalar of an entity, either a {@link Kind#PROPERTY property} or
@@ -67,7 +59,7 @@ import lombok.extern.log4j.Log4j2;
  * or action dialogs).
  *
  */
-@Log4j2
+//@Log4j2
 public abstract class ScalarModel 
 extends ManagedObjectModel 
 implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext {
@@ -205,19 +197,6 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
         setObject(adapter);
     }
 
-    public void setPendingAdapter(final ManagedObject objectAdapter) {
-        if(isCollection()) {
-            val pojos = objectAdapter.getPojo();
-            val memento = super.getMementoService()
-                    .mementoForPojos(_Casts.uncheckedCast(pojos), getTypeOfSpecification().getSpecId());
-            setPendingMemento(memento);
-        } else {
-            val memento = super.getMementoService()
-                    .mementoForObject(objectAdapter);
-            setPendingMemento(memento);
-        }
-    }
-    
     public boolean whetherHidden() {
         final Where where = getRenderingHint().asWhere();
         return whetherHidden(where);
@@ -401,102 +380,19 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
         return getAssociatedActions().hasAssociatedActionWithInlineAsIfEdit();
     }
     
-    // //////////////////////////////////////////////////////////
-    // Pending
-    // //////////////////////////////////////////////////////////
+    // -- PENDING STUFF
     
+    @Getter(value = AccessLevel.PACKAGE)
     private final PendingModel pendingModel;
 
-    @RequiredArgsConstructor
-    private static final class PendingModel extends Model<ObjectMemento> {
-        private static final long serialVersionUID = 1L;
-
-        @NonNull private final ManagedObjectModel pendingValueModel;
-
-        /**
-         * Whether pending has been set (could have been set to null)
-         */
-        private boolean hasPending;
-        /**
-         * The new value (could be set to null; hasPending is used to distinguish).
-         */
-        private ObjectMemento pending;
-
-        @Override
-        public ObjectMemento getObject() {
-            if (hasPending) {
-                return pending;
-            }
-            
-            if(pendingValueModel.memento()!=null) {
-                return pendingValueModel.memento();
-            }
-            
-            //XXX [a.huber] as I don't understand the big picture here, given newly introduced branch above,
-            // there might be a slight chance, that this is dead code anyway ...
-            val adapter = pendingValueModel.getObject();
-            val pojo = adapter.getPojo();
-            if(pojo!=null && _Collections.isCollectionOrArrayOrCanType(pojo.getClass())) {
-                val specId = pendingValueModel.getTypeOfSpecification().getSpecId();
-                log.warn("potentially a bug, wild guess fix for non-scalar %s", specId);
-                val pojos = _NullSafe.streamAutodetect(pojo)
-                        .collect(Collectors.<Object>toList());
-                return pendingValueModel.getMementoService().mementoForPojos(pojos, specId);
-            }
-            return pendingValueModel.getMementoService().mementoForObject(adapter);
-        }
-
-        @Override
-        public void setObject(final ObjectMemento adapterMemento) {
-            pending = adapterMemento;
-            hasPending = true;
-        }
-
-        public void clearPending() {
-            this.hasPending = false;
-            this.pending = null;
-        }
-
-        private ManagedObject getPendingAdapter() {
-            val memento = getObject();
-            return pendingValueModel.getCommonContext().reconstructObject(memento);
-        }
-
-        public ManagedObject getPendingElseCurrentAdapter() {
-            return hasPending ? getPendingAdapter() : pendingValueModel.getObject();
-        }
-
-        public ObjectMemento getPendingMemento() {
-            return pending;
-        }
-
-        public void setPendingMemento(ObjectMemento selectedAdapterMemento) {
-            this.pending = selectedAdapterMemento;
-            hasPending=true;
-        }
-    }
-
-
     public ManagedObject getPendingElseCurrentAdapter() {
         return pendingModel.getPendingElseCurrentAdapter();
     }
 
-    public ManagedObject getPendingAdapter() {
-        return pendingModel.getPendingAdapter();
-    }
-
-    public ObjectMemento getPendingMemento() {
-        return pendingModel.getPendingMemento();
-    }
-
-    public void setPendingMemento(ObjectMemento selectedAdapterMemento) {
-        pendingModel.setPendingMemento(selectedAdapterMemento);
-    }
-
     public void clearPending() {
         pendingModel.clearPending();
     }
     
-    // //////////////////////////////////////////////////////////
+    // --
     
 }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
index 506b211..d220de3 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
@@ -56,7 +56,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
 
                 @Override
                 public ArrayList<ObjectMemento> getMultiPending() {
-                    ObjectMemento pendingMemento = scalarModel.getPendingMemento();
+                    ObjectMemento pendingMemento = scalarModel.getPendingModel().getPendingMemento();
                     return ObjectMemento.unwrapList(pendingMemento)
                             .orElse(null);
                 }
@@ -65,7 +65,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
                 public void setMultiPending(final ArrayList<ObjectMemento> pending) {
                     ObjectSpecId specId = getScalarModel().getTypeOfSpecification().getSpecId();
                     ObjectMemento adapterMemento = ObjectMemento.wrapMementoList(pending, specId);
-                    scalarModel.setPendingMemento(adapterMemento);
+                    scalarModel.getPendingModel().setPendingMemento(adapterMemento);
                 }
 
                 @Override
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index 6bf07a3..80a0d5b 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -52,12 +52,12 @@ public interface ScalarModelWithPending extends Serializable {
 
                 @Override
                 public ObjectMemento getPendingMemento() {
-                    return scalarModel.getPendingMemento();
+                    return scalarModel.getPendingModel().getPendingMemento();
                 }
 
                 @Override
                 public void setPendingMemento(ObjectMemento pending) {
-                    scalarModel.setPendingMemento(pending);
+                    scalarModel.getPendingModel().setPendingMemento(pending);
                 }
 
                 @Override
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 4341526..8e4f140 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -172,11 +172,10 @@ implements ScalarModelSubscriber2 {
         if(valueChanged) {
             if(ManagedObject.isNullOrUnspecifiedOrEmpty(paramValue)) {
                 scalarModel.setObject(null);
-                scalarModel.setPendingMemento(null);
             } else {
                 scalarModel.setObject(paramValue);
-                scalarModel.setPendingAdapter(paramValue);
-            }               
+            }
+            scalarModel.clearPending();
         }
         
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 8952396..2d761ff 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -392,17 +392,16 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
 
             // flush changes to pending
             ObjectMemento convertedInput = select2.getConvertedInput();
-
-            getModel().setPendingMemento(convertedInput);
             if(select2 != null) {
                 select2.getModel().setObject(convertedInput);
             }
 
             val adapter = super.getCommonContext().reconstructObject(convertedInput); 
             getModel().setObject(adapter);
+            getModel().clearPending();
         }
 
-        val pendingAdapter = getModel().getPendingAdapter();
+        val pendingAdapter = getModel().getPendingElseCurrentAdapter();
         entityLink.setConvertedInput(pendingAdapter);
     }