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/01/06 18:40:32 UTC

[isis] branch master updated: ISIS-2882: fixes potential NPE when converting nulls

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 364973c  ISIS-2882: fixes potential NPE when converting nulls
364973c is described below

commit 364973c2775b6e5874a68cd47c09a7d4f00f4a9f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 6 19:36:11 2022 +0100

    ISIS-2882: fixes potential NPE when converting nulls
---
 .../interactions/managed/ManagedProperty.java        |  8 ++++----
 .../specimpl/OneToOneAssociationDefault.java         | 20 +++++++++++++-------
 .../command/CommandDtoFactoryDefault.java            |  4 ++--
 .../command/SchemaValueMarshallerDefault.java        |  6 ++++++
 4 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedProperty.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedProperty.java
index 90566e9..d517a09 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedProperty.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedProperty.java
@@ -114,17 +114,17 @@ extends ManagedMember {
 
 
     /**
-     * @param proposedNewValue
+     * @param newValue
      * @return non-empty if the interaction is not valid for given {@code proposedNewValue}
      */
-    public Optional<InteractionVeto> modifyProperty(final @Nullable ManagedObject proposedNewValue) {
+    public Optional<InteractionVeto> modifyProperty(final @Nullable ManagedObject newValue) {
 
-        val interactionVeto = checkValidity(proposedNewValue);
+        val interactionVeto = checkValidity(newValue);
         if(interactionVeto.isPresent()) {
             return interactionVeto;
         }
 
-        val updatedOwner = property.set(getOwner(), proposedNewValue, InteractionInitiatedBy.USER);
+        val updatedOwner = property.set(getOwner(), newValue, InteractionInitiatedBy.USER);
         setOwner(updatedOwner);
         observablePropValue.invalidate();
         return Optional.empty();
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 d99f9d4..c1ab3b3 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
@@ -51,6 +51,7 @@ import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -181,15 +182,20 @@ implements OneToOneAssociation {
     @Override
     public ManagedObject set(
             final ManagedObject ownerAdapter,
-            final ManagedObject newReferencedAdapter,
+            final ManagedObject _newValue,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        setupCommand(InteractionHead.regular(ownerAdapter), newReferencedAdapter);
+        // null to empty
+        val newValue = _newValue==null
+                ? ManagedObject.empty(getElementType())
+                : _newValue;
 
-        if (newReferencedAdapter != null) {
-            return setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-        } else {
+        setupCommand(InteractionHead.regular(ownerAdapter), newValue);
+
+        if (ManagedObjects.isNullOrUnspecifiedOrEmpty(newValue)) {
             return clearValue(ownerAdapter, interactionInitiatedBy);
+        } else {
+            return setValue(ownerAdapter, newValue, interactionInitiatedBy);
         }
     }
 
@@ -308,11 +314,11 @@ implements OneToOneAssociation {
      */
     public void setupCommand(
             final InteractionHead head,
-            final ManagedObject valueAdapterOrNull) {
+            final ManagedObject valueAdapter) {
 
         setupCommand(head, interactionId ->
             getCommandDtoFactory()
-                .asCommandDto(interactionId, Can.ofSingleton(head), this, valueAdapterOrNull));
+                .asCommandDto(interactionId, Can.ofSingleton(head), this, valueAdapter));
     }
 
     @Getter(lazy=true, onMethod_ = {@Override})
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
index 4844137..05bc8e4 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
@@ -92,7 +92,7 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
             final UUID interactionId,
             final Can<InteractionHead> targets,
             final OneToOneAssociation property,
-            final ManagedObject valueAdapterOrNull) {
+            final ManagedObject valueAdapter) {
 
         final CommandDto dto = asCommandDto(interactionId, targets);
 
@@ -100,7 +100,7 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
         propertyDto.setInteractionType(InteractionType.PROPERTY_EDIT);
         dto.setMember(propertyDto);
 
-        addPropertyValue(property, propertyDto, valueAdapterOrNull);
+        addPropertyValue(property, propertyDto, valueAdapter);
 
         return dto;
     }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/SchemaValueMarshallerDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/SchemaValueMarshallerDefault.java
index edad5fc..93d8949 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/SchemaValueMarshallerDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/SchemaValueMarshallerDefault.java
@@ -221,6 +221,9 @@ implements SchemaValueMarshaller {
         final @Nullable ValueSemanticsProvider<T> semantics;
 
         public T fromFundamentalValue(final Object fundamentalValue) {
+            if(fundamentalValue==null) {
+                return null;
+            }
             val valuePojo = supportsConversionViaEncoderDecoder()
                     ? encoderDecoder().fromEncodedString((String)fundamentalValue)
                     : converter()!=null
@@ -230,6 +233,9 @@ implements SchemaValueMarshaller {
         }
 
         public Object toFundamentalValue(final T valuePojo) {
+            if(valuePojo==null) {
+                return null;
+            }
             return supportsConversionViaEncoderDecoder()
                     ? encoderDecoder().toEncodedString(valuePojo)
                     : converter()!=null