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