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/13 16:36:15 UTC

[isis] branch master updated: ISIS-2365: EntityModel: proposed fix for pending ObjectMemento creation when non-scalar

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 1278eb8  ISIS-2365: EntityModel: proposed fix for pending ObjectMemento creation when non-scalar
1278eb8 is described below

commit 1278eb85da3e8bbb15356ace562a35187f852f60
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed May 13 18:36:03 2020 +0200

    ISIS-2365: EntityModel: proposed fix for pending ObjectMemento creation
    when non-scalar
---
 .../commons/internal/collections/_Collections.java   | 11 +++++++++++
 .../isis/viewer/wicket/model/models/EntityModel.java | 20 ++++++++++++++++++++
 .../components/scalars/reference/ReferencePanel.java |  6 ++++--
 .../widgets/select2/Select2MultiChoiceExt.java       |  4 ++++
 .../services/mementos/ObjectMementoLegacy.java       |  6 +-----
 .../mementos/ObjectMementoServiceWicket.java         |  2 ++
 6 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java
index bfec124..d0865af 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/collections/_Collections.java
@@ -83,6 +83,17 @@ public final class _Collections {
         return _Collections.isCollectionType(cls) || _Arrays.isArrayType(cls);
     }
 
+    /**
+     * @param cls
+     * @return whether {@code cls} implements the java.util.Collection interface
+     * or represents an array or is of type {@link Can}
+     */
+    public static boolean isCollectionOrArrayOrCanType(final Class<?> cls) {
+        return _Collections.isCollectionType(cls) 
+                || _Arrays.isArrayType(cls)
+                || Can.class.isAssignableFrom(cls);
+    }
+    
     // -- COLLECTION UNMODIFIABLE ADAPTERS (FOR LIST)
 
     /**
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 6d3e24c..013df02 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
@@ -31,6 +32,8 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
+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._Maps;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -54,6 +57,7 @@ import static org.apache.isis.core.commons.internal.base._With.requires;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Backing model to represent a {@link ManagedObject}.
@@ -62,6 +66,7 @@ import lombok.val;
  * So that the model is {@link Serializable}, the {@link ManagedObject} is
  * stored as a {@link ObjectMemento}.
  */
+@Log4j2
 public class EntityModel 
 extends BookmarkableModel<ManagedObject> 
 implements ObjectAdapterModel, UiHintContainer, ObjectUiModel {
@@ -455,7 +460,22 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel {
             if (hasPending) {
                 return pending;
             }
+            
+            if(entityModel.getObjectAdapterMemento()!=null) {
+                return entityModel.getObjectAdapterMemento();
+            }
+            
+            //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 = entityModel.getObject();
+            val pojo = adapter.getPojo();
+            if(pojo!=null && _Collections.isCollectionOrArrayOrCanType(pojo.getClass())) {
+                val specId = entityModel.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 entityModel.getMementoService().mementoForPojos(pojos, specId);
+            }
             return entityModel.getMementoService().mementoForObject(adapter);
         }
 
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 eadec6a..e96d3bb 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
@@ -256,8 +256,10 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
             entityModelForLink.setRenderingHint(getModel().getRenderingHint());
 
             final ComponentFactory componentFactory =
-                    getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-            final Component component = componentFactory.createComponent(ComponentType.ENTITY_ICON_AND_TITLE.getWicketId(), entityModelForLink);
+                    getComponentFactoryRegistry()
+                    .findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
+            final Component component = componentFactory
+                    .createComponent(ComponentType.ENTITY_ICON_AND_TITLE.getWicketId(), entityModelForLink);
 
             componentForRegular.addOrReplace(component);
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
index ecbd58b..dcd4a0b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
@@ -25,6 +25,7 @@ import org.apache.wicket.model.IModel;
 import org.wicketstuff.select2.Select2MultiChoice;
 
 import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.commons.internal.debug._Probe;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
@@ -60,6 +61,8 @@ implements ChoiceExt {
         getSettings().setCloseOnSelect(true);
 
         setOutputMarkupPlaceholderTag(true);
+        
+        _Probe.sysOut("Select2MultiChoiceExt %s", id);
     }
 
     @Override
@@ -74,6 +77,7 @@ implements ChoiceExt {
     @Override
     public void updateModel() {
         workaround = true;
+        _Probe.sysOut("about to update %s", getId());
         super.updateModel();
         workaround = false;
     }
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java
index d052ca7..1de452e 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java
@@ -54,11 +54,7 @@ final class ObjectMementoLegacy implements Serializable {
      * Factory method
      */
     public static ObjectMementoLegacy createOrNull(ManagedObject adapter) {
-        if (adapter == null) {
-            return null;
-        }
-        val pojo = adapter.getPojo();
-        if(pojo == null) {
+        if(ManagedObject.isNullOrUnspecifiedOrEmpty(adapter)) {
             return null;
         }
         return new ObjectMementoLegacy(adapter);
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
index cff7572..c3d9d61 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoServiceWicket.java
@@ -74,9 +74,11 @@ public class ObjectMementoServiceWicket implements ObjectMementoService {
     public ObjectMemento mementoForObject(@Nullable ManagedObject adapter) {
         val mementoAdapter = ObjectMementoLegacy.createOrNull(adapter);
         if(mementoAdapter==null) {
+            // sonar-ignore-on (fails to detect this as null guard) 
             return ManagedObject.isSpecified(adapter)
                     ? new ObjectMementoForEmpty(adapter.getSpecification().getSpecId())
                     : null;
+            // sonar-ignore-on
         }
         return ObjectMementoAdapter.of(mementoAdapter);
     }