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 05:47:21 UTC

[isis] branch master updated (ebef502 -> 6c7e255)

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 ebef502  ISIS-2340: some model hierarchy cleanup
     new e6fd864  ISIS-2340: more cleanup
     new 6c7e255  ISIS-2340: moves pending model from Entity- to ScalarModel

The 2 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:
 .../viewer/wicket/model/models/EntityModel.java    | 112 +----------------
 .../wicket/model/models/ManagedObjectModel.java    |  26 ++--
 .../viewer/wicket/model/models/ScalarModel.java    | 136 +++++++++++++++++----
 3 files changed, 130 insertions(+), 144 deletions(-)


[isis] 02/02: ISIS-2340: moves pending model from Entity- to ScalarModel

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 6c7e255969e751103ea34fe541a47d360cfaad1a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 15 07:47:10 2020 +0200

    ISIS-2340: moves pending model from Entity- to ScalarModel
---
 .../viewer/wicket/model/models/EntityModel.java    | 112 +--------------------
 .../viewer/wicket/model/models/ScalarModel.java    | 111 +++++++++++++++++++-
 2 files changed, 111 insertions(+), 112 deletions(-)

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 20a0a09..a32d2b1 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
@@ -21,26 +21,18 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import java.io.Serializable;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.model.Model;
 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;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 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.OneToOneAssociation;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
@@ -53,10 +45,7 @@ import org.apache.isis.viewer.wicket.model.util.ComponentHintKey;
 
 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}.
@@ -65,7 +54,7 @@ import lombok.extern.log4j.Log4j2;
  * So that the model is {@link Serializable}, the {@link ManagedObject} is
  * stored as a {@link ObjectMemento}.
  */
-@Log4j2
+//@Log4j2
 public class EntityModel 
 extends ManagedObjectModel 
 implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel<ManagedObject> {
@@ -100,8 +89,6 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
 
     private Mode mode;
     private RenderingHint renderingHint;
-    private final PendingModel pendingModel;
-
 
     // -- FACTORIES
 
@@ -165,7 +152,7 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
             RenderingHint renderingHint) {
         
         super(requires(commonContext, "commonContext"), adapterMemento);
-        this.pendingModel = new PendingModel(this);
+        
         this.propertyScalarModels = propertyScalarModels!=null ? propertyScalarModels : _Maps.<PropertyMemento, ScalarModel>newHashMap();
         this.mode = mode;
         this.renderingHint = renderingHint;
@@ -353,101 +340,6 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
 
 
     // //////////////////////////////////////////////////////////
-    // Pending
-    // //////////////////////////////////////////////////////////
-
-    @RequiredArgsConstructor
-    private static final class PendingModel extends Model<ObjectMemento> {
-        private static final long serialVersionUID = 1L;
-
-        @NonNull private final EntityModel entityModel;
-
-        /**
-         * 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(entityModel.memento()!=null) {
-                return entityModel.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 = 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);
-        }
-
-        @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 entityModel.getCommonContext().reconstructObject(memento);
-        }
-
-        public ManagedObject getPendingElseCurrentAdapter() {
-            return hasPending ? getPendingAdapter() : entityModel.getObject();
-        }
-
-        public ObjectMemento getPending() {
-            return pending;
-        }
-
-        public void setPending(ObjectMemento selectedAdapterMemento) {
-            this.pending = selectedAdapterMemento;
-            hasPending=true;
-        }
-    }
-
-
-    public ManagedObject getPendingElseCurrentAdapter() {
-        return pendingModel.getPendingElseCurrentAdapter();
-    }
-
-    public ManagedObject getPendingAdapter() {
-        return pendingModel.getPendingAdapter();
-    }
-
-    public ObjectMemento getPending() {
-        return pendingModel.getPending();
-    }
-
-    public void setPending(ObjectMemento selectedAdapterMemento) {
-        pendingModel.setPending(selectedAdapterMemento);
-    }
-
-    public void clearPending() {
-        pendingModel.clearPending();
-    }
-
-
-    // //////////////////////////////////////////////////////////
     // tab and column metadata (if any)
     // //////////////////////////////////////////////////////////
 
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 3781359..d29cee2 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
@@ -22,12 +22,16 @@ import java.util.ArrayList;
 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;
@@ -45,7 +49,9 @@ import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
 
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Represents a scalar of an entity, either a {@link Kind#PROPERTY property} or
@@ -59,12 +65,13 @@ import lombok.val;
  *     NOTE: although this inherits from {@link EntityModel}, this is wrong I think; what is being shared
  *     is just some of the implementation - both objects have to wrap some arbitrary memento holding some state
  *     (a value or entity reference in a ScalarModel's case, an entity reference in an EntityModel's), they have
- *     a view mode, they have a rendering hint, and scalar models have a pending value (not sure if Entity Model really
- *     requires this).
+ *     a view mode, they have a rendering hint, and scalar models have a pending value.
+ *     
  *     Fundamentally though a ScalarModel is NOT really an EntityModel, so this hierarchy should be broken out with a
  *     common superclass for both EntityModel and ScalarModel.
  * </p>
  */
+@Log4j2
 public abstract class ScalarModel extends EntityModel 
 implements ScalarUiModel, LinksProvider, FormExecutorContext {
 
@@ -94,6 +101,7 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
         
         this.kind = Kind.PARAMETER;
         this.parentEntityModel = parentEntityModel;
+        this.pendingModel = new PendingModel(this);
     }
 
     /**
@@ -110,6 +118,7 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
         super(parentEntityModel.getCommonContext(), mode, renderingHint);
         this.kind = Kind.PROPERTY;
         this.parentEntityModel = parentEntityModel;
+        this.pendingModel = new PendingModel(this);
     }
 
     protected ManagedObject loadFromSuper() {
@@ -438,4 +447,102 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
         return getAssociatedActions().hasAssociatedActionWithInlineAsIfEdit();
     }
     
+    // //////////////////////////////////////////////////////////
+    // Pending
+    // //////////////////////////////////////////////////////////
+    
+    private final PendingModel pendingModel;
+
+    @RequiredArgsConstructor
+    private static final class PendingModel extends Model<ObjectMemento> {
+        private static final long serialVersionUID = 1L;
+
+        @NonNull private final EntityModel entityModel;
+
+        /**
+         * 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(entityModel.memento()!=null) {
+                return entityModel.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 = 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);
+        }
+
+        @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 entityModel.getCommonContext().reconstructObject(memento);
+        }
+
+        public ManagedObject getPendingElseCurrentAdapter() {
+            return hasPending ? getPendingAdapter() : entityModel.getObject();
+        }
+
+        public ObjectMemento getPending() {
+            return pending;
+        }
+
+        public void setPending(ObjectMemento selectedAdapterMemento) {
+            this.pending = selectedAdapterMemento;
+            hasPending=true;
+        }
+    }
+
+
+    public ManagedObject getPendingElseCurrentAdapter() {
+        return pendingModel.getPendingElseCurrentAdapter();
+    }
+
+    public ManagedObject getPendingAdapter() {
+        return pendingModel.getPendingAdapter();
+    }
+
+    public ObjectMemento getPending() {
+        return pendingModel.getPending();
+    }
+
+    public void setPending(ObjectMemento selectedAdapterMemento) {
+        pendingModel.setPending(selectedAdapterMemento);
+    }
+
+    public void clearPending() {
+        pendingModel.clearPending();
+    }
+    
+    // //////////////////////////////////////////////////////////
+    
 }


[isis] 01/02: ISIS-2340: more cleanup

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 e6fd864a9d4ace2739df64f9d3c639d94d8bef31
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 15 07:41:48 2020 +0200

    ISIS-2340: more cleanup
---
 .../wicket/model/models/ManagedObjectModel.java    | 26 ++++++++++++++++------
 .../viewer/wicket/model/models/ScalarModel.java    | 25 ---------------------
 2 files changed, 19 insertions(+), 32 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 6926687..3fed95f 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
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.commons.internal.collections._Collections;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -81,17 +82,28 @@ extends ModelAbstract<ManagedObject> {
 
         super.setObject(adapter);
 
-        if(adapter.getSpecification().isParentedOrFreeCollection()) {
-            val pojo = adapter.getPojo();
-            memento = super.getMementoService()
-                    .mementoForPojos(_Casts.uncheckedCast(pojo), getTypeOfSpecificationId()
-                            .orElseGet(()->adapter.getElementSpecification().get().getSpecId()));
+        if(_Collections.isCollectionOrArrayOrCanType(adapter.getPojo().getClass())) {
+            setObjectCollection(adapter);
         } else {
-
             memento = super.getMementoService().mementoForObject(adapter);
         }
     }
     
+    public void setObjectCollection(final ManagedObject adapter) {
+        
+        if(ManagedObject.isNullOrUnspecifiedOrEmpty(adapter)) {
+            super.setObject(null);
+            return;
+        }
+
+        super.setObject(adapter);
+        
+        val pojos = adapter.getPojo();
+        memento = super.getMementoService()
+                .mementoForPojos(_Casts.uncheckedCast(pojos), getTypeOfSpecificationId()
+                        .orElseGet(()->adapter.getElementSpecification().get().getSpecId()));
+    }
+    
     public final Bookmark asHintingBookmarkIfSupported() {
         return memento!=null
                 ? memento.asHintingBookmarkIfSupported()
@@ -112,7 +124,7 @@ extends ModelAbstract<ManagedObject> {
     
     /**
      * free of side-effects, used for serialization
-     * @implNote overriding this must be consistent with {@link #getTypeOfSpecificationId()}
+     * @implNote overriding this must be consistent with {@link #getTypeOfSpecification()}
      */
     public Optional<ObjectSpecId> getTypeOfSpecificationId() {
         return Optional.ofNullable(memento)
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 6d0274e..3781359 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
@@ -176,29 +176,6 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
         return adapter.titleString(null);
     }
 
-    @Override
-    public void setObject(ManagedObject adapter) {
-        if(adapter == null) {
-            super.setObject(null);
-            return;
-        }
-
-        final Object pojo = adapter.getPojo();
-        if(pojo == null) {
-            super.setObject(null);
-            return;
-        }
-
-        if(isCollection()) {
-            val memento = super.getMementoService()
-                    .mementoForPojos(_Casts.uncheckedCast(pojo), getTypeOfSpecification().getSpecId());
-                    
-            super.memento(memento); // associated value
-        } else {
-            super.setObject(adapter); // associated value
-        }
-    }
-
     public void setObjectAsString(final String enteredText) {
         // parse text to get adapter
         ParseableFacet parseableFacet = getTypeOfSpecification().getFacet(ParseableFacet.class);
@@ -223,8 +200,6 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
             setPending(memento);
         }
     }
-
-
     
     public boolean whetherHidden() {
         final Where where = getRenderingHint().asWhere();