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 <ahu...@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(); + } + + // ////////////////////////////////////////////////////////// + }