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/07/21 12:00:04 UTC

[isis] branch master updated: ISIS-3088: fixes enum dropdown value recovery from mementos

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 3576aebe9c ISIS-3088: fixes enum dropdown value recovery from mementos
3576aebe9c is described below

commit 3576aebe9c327da3ae369d96ecb5d5a4a978d24e
Author: andi-huber <ah...@apache.org>
AuthorDate: Thu Jul 21 13:59:55 2022 +0200

    ISIS-3088: fixes enum dropdown value recovery from mementos
---
 .../specimpl/OneToOneAssociationDefault.java       | 34 +++++++++-------------
 .../viewer/wicket/ui/components/scalars/_Util.java | 15 ++++++++--
 2 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 5506f56c29..1caa140ea8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -30,7 +30,6 @@ import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.core.metamodel.commons.ToString;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
@@ -104,32 +103,29 @@ implements OneToOneAssociation {
 
     private ValidityContext createValidateInteractionContext(
             final ManagedObject ownerAdapter,
-            final ManagedObject proposedToReferenceAdapter,
+            final ManagedObject proposedValue,
             final InteractionInitiatedBy interactionInitiatedBy) {
+
+        val head = headFor(ownerAdapter);
+
         return new PropertyModifyContext(
-                headFor(ownerAdapter),
+                head,
                 getFeatureIdentifier(),
-                proposedToReferenceAdapter,
-                ()->getFriendlyName(()->headFor(ownerAdapter).getTarget()),
+                proposedValue,
+                ()->getFriendlyName(head::getTarget),
                 interactionInitiatedBy);
     }
 
     @Override
     public Consent isAssociationValid(
             final ManagedObject ownerAdapter,
-            final ManagedObject proposedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isAssociationValidResult(ownerAdapter, proposedAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isAssociationValidResult(
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToReferenceAdapter,
+            final ManagedObject proposedValue,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext validityContext =
-                createValidateInteractionContext(
-                        ownerAdapter, proposedToReferenceAdapter, interactionInitiatedBy);
-        return InteractionUtils.isValidResult(this, validityContext);
+        return InteractionUtils.isValidResult(
+                    this,
+                    createValidateInteractionContext(
+                            ownerAdapter, proposedValue, interactionInitiatedBy))
+                .createConsent();
     }
 
     // -- INIT
@@ -168,9 +164,7 @@ implements OneToOneAssociation {
     @Override
     public boolean isEmpty(final ManagedObject ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
         final ManagedObject referencedObject = get(ownerAdapter, interactionInitiatedBy);
-        // TODO: perhaps this should instead check if it returns an empty ManagedObject.
-        //  however, that's a far-reaching change to make.
-        return referencedObject == null;
+        return ManagedObjects.isNullOrUnspecifiedOrEmpty(referencedObject);
     }
 
     // -- ACCESS (set)
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
index 69220c683d..0e538962ef 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/_Util.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Strings;
+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.util.Facets;
@@ -98,7 +99,7 @@ class _Util {
             private static final long serialVersionUID = 1L;
             @Override
             public void validate(final IValidatable<Object> validatable) {
-                recoverProposedValue(validatable, scalarModel)
+                recoverProposedValue(validatable.getValue(), scalarModel)
                 .ifPresent(proposedAdapter->{
                     _Strings.nonEmpty(scalarModel.validate(proposedAdapter))
                     .ifPresent(validationFeedback->
@@ -127,13 +128,21 @@ class _Util {
     }
 
     private Optional<ManagedObject> recoverProposedValue(
-            final IValidatable<Object> validatable,
+            final Object valueObject,
             final ScalarModel scalarModel){
 
+        if(valueObject instanceof ObjectMemento) {
+            // seeing this code-path particularly with enum choices
+            return Optional.ofNullable(
+                    scalarModel
+                        .getCommonContext()
+                        .reconstructObject((ObjectMemento)valueObject));
+        }
+
         return Optional.ofNullable(
                     scalarModel
                         .getObjectManager()
-                        .adapt(validatable.getValue()));
+                        .adapt(valueObject));
     }
 
     // -- HELPER