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/10/05 05:30:54 UTC

[isis] branch master updated: ISIS-2297: fixes potential NPE (sonar)

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 91c24e212c ISIS-2297: fixes potential NPE (sonar)
91c24e212c is described below

commit 91c24e212c248d19d3d95077ddd28d16f64990de
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Oct 5 07:30:49 2022 +0200

    ISIS-2297: fixes potential NPE (sonar)
---
 .../interactions/managed/nonscalar/DataRow.java    |  7 +++--
 .../metamodel/object/_ManagedObjectSpecified.java  |  2 +-
 .../SpecificationLoaderTest_nonScalar.java         | 34 +++++++++++++---------
 .../viewer/wicket/model/models/ValueModel.java     |  6 ++--
 .../actionresponse/ActionResultResponseType.java   | 34 ++++++++++++----------
 5 files changed, 46 insertions(+), 37 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
index 18149bb1fa..642258ff87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataRow.java
@@ -25,6 +25,7 @@ import org.apache.isis.commons.internal.binding._Bindables.BooleanBindable;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 
 import lombok.Getter;
+import lombok.NonNull;
 
 public class DataRow {
 
@@ -33,7 +34,9 @@ public class DataRow {
     @Getter private final BooleanBindable selectToggle;
     @Getter private final DataTableModel parentTable;
 
-    public DataRow(final DataTableModel parentTable, final ManagedObject rowElement) {
+    public DataRow(
+            final @NonNull DataTableModel parentTable,
+            final @NonNull ManagedObject rowElement) {
         this.parentTable = parentTable;
         this.rowElement = rowElement;
 
@@ -56,7 +59,7 @@ public class DataRow {
         return rowElement;
     }
 
-    public ManagedObject getCellElement(final DataColumn column) {
+    public ManagedObject getCellElement(final @NonNull DataColumn column) {
         return column.getPropertyMetaModel().get(getRowElement());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java
index 00e11aaa64..1f3e9b23ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java
@@ -113,7 +113,7 @@ implements ManagedObject {
                         : null);
     }
 
-    private ObjectMemento mementoForPacked(@Nullable final PackedManagedObject packedAdapter) {
+    private ObjectMemento mementoForPacked(@NonNull final PackedManagedObject packedAdapter) {
         val listOfMementos = packedAdapter.unpack().stream()
                 .map(this::mementoForScalar)
                 .collect(Collectors.toCollection(ArrayList::new)); // ArrayList is serializable
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_nonScalar.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_nonScalar.java
index f07adfbff9..8fd8f1538a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_nonScalar.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_nonScalar.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.metamodel.specloader;
 import java.util.Optional;
 import java.util.Vector;
 
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -33,13 +35,16 @@ import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
+import lombok.val;
+
 class SpecificationLoaderTest_nonScalar {
 
-    class ArrayTest extends SpecificationLoaderTestAbstract {
+    @Nested @Disabled("reflection on plain array objects does not work") //FIXME
+    static class ArrayTest extends SpecificationLoaderTestAbstract {
 
         @Override
-        protected ObjectSpecification loadSpecification(final SpecificationLoader reflector) {
-            return reflector.loadSpecification(ReflectorTestPojo[].class);
+        protected ObjectSpecification loadSpecification(final SpecificationLoader specLoader) {
+            return specLoader.loadSpecification(ReflectorTestPojo[].class);
         }
 
         @Test void testType() throws Exception {
@@ -51,25 +56,25 @@ class SpecificationLoaderTest_nonScalar {
         }
 
         @Test @Override public void testCollectionFacet() throws Exception {
-            final Facet facet = specification.getFacet(CollectionFacet.class);
-            assertNotNull(facet);
+            val collectionFacet = specification.getFacet(CollectionFacet.class);
+            assertNotNull(collectionFacet);
         }
 
         @Test @Override public void testTypeOfFacet() throws Exception {
-            final TypeOfFacet facet = specification.getFacet(TypeOfFacet.class);
-            assertNotNull(facet);
-            assertEquals(Optional.of(ReflectorTestPojo[].class), facet.value().getContainerType());
-            assertEquals(ReflectorTestPojo.class, facet.value().getElementType());
+            val typeOfFacet = specification.getFacet(TypeOfFacet.class);
+            assertNotNull(typeOfFacet);
+            assertEquals(Optional.of(ReflectorTestPojo[].class), typeOfFacet.value().getContainerType());
+            assertEquals(ReflectorTestPojo.class, typeOfFacet.value().getElementType());
         }
 
     }
 
-
+    @Nested
     static class CanTest extends SpecificationLoaderTestAbstract {
 
         @Override
-        protected ObjectSpecification loadSpecification(final SpecificationLoader reflector) {
-            return reflector.loadSpecification(Can.class);
+        protected ObjectSpecification loadSpecification(final SpecificationLoader specLoader) {
+            return specLoader.loadSpecification(Can.class);
         }
 
         @Test void testType() throws Exception {
@@ -94,11 +99,12 @@ class SpecificationLoaderTest_nonScalar {
 
     }
 
+    @Nested
     static class VectorTest extends SpecificationLoaderTestAbstract {
 
         @Override
-        protected ObjectSpecification loadSpecification(final SpecificationLoader reflector) {
-            return reflector.loadSpecification(Vector.class);
+        protected ObjectSpecification loadSpecification(final SpecificationLoader specLoader) {
+            return specLoader.loadSpecification(Vector.class);
         }
 
         @Test void testType() throws Exception {
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index 37413b6e7f..e8a81965fe 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.model.models;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemento;
@@ -42,7 +40,7 @@ extends ModelAbstract<ManagedObject> {
     public static ValueModel of(
             final @NonNull  MetaModelContext commonContext,
             final @NonNull  ObjectMember objectMember,
-            final @Nullable ManagedObject valueAdapter) {
+            final @NonNull ManagedObject valueAdapter) {
         return new ValueModel(commonContext, objectMember, valueAdapter);
     }
 
@@ -53,7 +51,7 @@ extends ModelAbstract<ManagedObject> {
     private ValueModel(
             final MetaModelContext commonContext,
             final @NonNull  ObjectMember objectMember,
-            final @Nullable ManagedObject valueAdapter) {
+            final @NonNull ManagedObject valueAdapter) {
         super(commonContext);
         this.objectMemberMemento = ObjectMemberMemento.forMember(objectMember);
         adapterMemento = valueAdapter.getMemento().orElseThrow();
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index e03ee8ee97..de98b3f8f0 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -22,6 +22,7 @@ import java.net.URL;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.request.IRequestHandler;
+import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
@@ -47,6 +48,7 @@ import org.apache.isis.viewer.wicket.ui.pages.standalonecollection.StandaloneCol
 import org.apache.isis.viewer.wicket.ui.pages.value.ValuePage;
 import org.apache.isis.viewer.wicket.ui.pages.voidreturn.VoidReturnPage;
 
+import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.Value;
 import lombok.val;
@@ -57,7 +59,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             determineScalarAdapter(actionModel.getMetaModelContext(), resultAdapter); // intercepts collections
             return toEntityPage(resultAdapter);
@@ -75,7 +77,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             _Assert.assertTrue(resultAdapter instanceof PackedManagedObject);
 
@@ -93,7 +95,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             final var commonContext = actionModel.getMetaModelContext();
             final var valueModel = ValueModel.of(commonContext, actionModel.getAction(), resultAdapter);
@@ -107,7 +109,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             final Object value = resultAdapter.getPojo();
             IRequestHandler handler =
@@ -120,7 +122,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             final Object value = resultAdapter.getPojo();
             IRequestHandler handler =
@@ -133,7 +135,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             final LocalResourcePath localResPath = (LocalResourcePath)resultAdapter.getPojo();
             final var webAppContextPath = actionModel.getMetaModelContext().getWebAppContextPath();
@@ -146,7 +148,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             // open URL server-side redirect
             final LocalResourcePath localResPath = (LocalResourcePath)resultAdapter.getPojo();
@@ -160,7 +162,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             final URL url = (URL)resultAdapter.getPojo();
             return ActionResultResponse
@@ -172,7 +174,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @NonNull ManagedObject resultAdapter,
                 final Can<ManagedObject> args) {
             // open URL server-side redirect
             final Object value = resultAdapter.getPojo();
@@ -186,7 +188,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @Nullable ManagedObject resultAdapter, // arg is not used
                 final Can<ManagedObject> args) {
             final var commonContext = actionModel.getMetaModelContext();
             final VoidModel voidModel = new VoidModel(commonContext);
@@ -199,7 +201,7 @@ public enum ActionResultResponseType {
         public ActionResultResponse interpretResult(
                 final ActionModel actionModel,
                 final AjaxRequestTarget target,
-                final ManagedObject resultAdapter,
+                final @Nullable ManagedObject resultAdapter, // arg is not used
                 final Can<ManagedObject> args) {
             val signInPage = actionModel.getMetaModelContext()
                     .lookupServiceElseFail(PageClassRegistry.class)
@@ -224,15 +226,15 @@ public enum ActionResultResponseType {
     public static ActionResultResponse determineAndInterpretResult(
             final ActionModel model,
             final AjaxRequestTarget targetIfAny,
-            final ManagedObject resultAdapter,
+            final @Nullable ManagedObject resultAdapter,
             final Can<ManagedObject> args) {
 
         val typeAndAdapter = determineFor(resultAdapter, targetIfAny);
-        return typeAndAdapter.type
+        return typeAndAdapter.type // mapped to VOID if adapter is unspecified or null
                 .interpretResult(model, targetIfAny, typeAndAdapter.resultAdapter, args);
     }
 
-    public static ActionResultResponse toEntityPage(final ManagedObject entityOrViewmodel) {
+    public static ActionResultResponse toEntityPage(final @NonNull ManagedObject entityOrViewmodel) {
         entityOrViewmodel.invalidateBookmark();
         return ActionResultResponse.toPage(EntityPage.class, entityOrViewmodel.getBookmark().orElseThrow());
     }
@@ -240,8 +242,8 @@ public enum ActionResultResponseType {
     // -- HELPER
 
     private static ManagedObject determineScalarAdapter(
-            final MetaModelContext commonContext,
-            final ManagedObject resultAdapter) {
+            final @NonNull MetaModelContext commonContext,
+            final @NonNull ManagedObject resultAdapter) {
 
         if (resultAdapter.getSpecification().isSingular()) {
             return resultAdapter;