You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2021/12/04 13:30:20 UTC

[sling-org-apache-sling-models-impl] branch master updated: SLING-8079 throw PostConstructException for createModel in case (#28)

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git


The following commit(s) were added to refs/heads/master by this push:
     new 2e20404  SLING-8079 throw PostConstructException for createModel in case (#28)
2e20404 is described below

commit 2e20404f9d31d9393d059ab69adbfcdfe40159ea
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Sat Dec 4 14:30:16 2021 +0100

    SLING-8079 throw PostConstructException for createModel in case (#28)
    
    Prevent creation of exception object for simple adaptations
    
    Co-authored-by: Stefan Seifert <st...@users.noreply.github.com>
---
 .../sling/models/impl/ModelAdapterFactory.java     | 11 +++++++--
 .../java/org/apache/sling/models/impl/Result.java  |  9 ++++++++
 .../sling/models/impl/PostConstructTest.java       | 27 +++++++++++++---------
 ...ctModel.java => FailingPostConstructModel.java} |  2 +-
 ...tuctModel.java => FalsePostConstructModel.java} |  2 +-
 ...stuctModel.java => TruePostConstructModel.java} |  2 +-
 6 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
index 569671c..67a4a21 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
@@ -265,7 +265,11 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable, ModelFacto
     public <AdapterType> AdapterType getAdapter(Object adaptable, Class<AdapterType> type) {
         Result<AdapterType> result = internalCreateModel(adaptable, type);
         if (!result.wasSuccessful()) {
-            log.warn("Could not adapt to model", result.getThrowable());
+            if (result == Result.POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION) {
+                log.debug("Could not adapt to model as PostConstruct method returned false"); // do no construct runtime exception in this case
+            } else {
+                log.warn("Could not adapt to model", result.getThrowable());
+            }
             return null;
         } else {
             return result.getValue();
@@ -359,7 +363,7 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable, ModelFacto
     }
 
     @SuppressWarnings("unchecked")
-    private <ModelType> Result<ModelType> internalCreateModel(final Object adaptable, final Class<ModelType> requestedType) {
+    <ModelType> Result<ModelType> internalCreateModel(final Object adaptable, final Class<ModelType> requestedType) {
         Result<ModelType> result;
         ThreadInvocationCounter threadInvocationCounter = invocationCountThreadLocal.get();
         if (threadInvocationCounter.isMaximumReached()) {
@@ -749,6 +753,9 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable, ModelFacto
         }
         try {
             object = invokePostConstruct(object);
+            if (object == null) {
+                return (Result<ModelType>) Result.POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION;
+            }
         } catch (InvocationTargetException e) {
             return new Result<>(new PostConstructException("Post-construct method has thrown an exception for model " + modelClass.getType(), e.getCause()));
         } catch (IllegalAccessException e) {
diff --git a/src/main/java/org/apache/sling/models/impl/Result.java b/src/main/java/org/apache/sling/models/impl/Result.java
index d056c92..df9612c 100644
--- a/src/main/java/org/apache/sling/models/impl/Result.java
+++ b/src/main/java/org/apache/sling/models/impl/Result.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.models.impl;
 
+import org.apache.sling.models.factory.PostConstructException;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -88,5 +89,13 @@ public class Result<SuccessObjectType> {
         return object != null;
     }
 
+    public static final Result<Object> POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION = new Result<Object>((RuntimeException)null) {
 
+        @Override
+        public @NotNull RuntimeException getThrowable() {
+            // generate exception lazily
+            return new PostConstructException("PostConstruct method returned false", null);
+        }
+        
+    };
 }
diff --git a/src/test/java/org/apache/sling/models/impl/PostConstructTest.java b/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
index 90c1b92..a6eaeb3 100644
--- a/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
+++ b/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
@@ -19,15 +19,16 @@ package org.apache.sling.models.impl;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.models.factory.PostConstructException;
-import org.apache.sling.models.testmodels.classes.FailingPostConstuctModel;
-import org.apache.sling.models.testmodels.classes.FalsePostConstuctModel;
+import org.apache.sling.models.testmodels.classes.FailingPostConstructModel;
+import org.apache.sling.models.testmodels.classes.FalsePostConstructModel;
 import org.apache.sling.models.testmodels.classes.SubClass;
 import org.apache.sling.models.testmodels.classes.SubClassOverriddenPostConstruct;
-import org.apache.sling.models.testmodels.classes.TruePostConstuctModel;
+import org.apache.sling.models.testmodels.classes.TruePostConstructModel;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -46,7 +47,7 @@ public class PostConstructTest {
     public void setup() {
         factory = AdapterFactoryTest.createModelAdapterFactory();
         // no injectors are necessary
-        factory.adapterImplementations.addClassesAsAdapterAndImplementation(SubClass.class, SubClassOverriddenPostConstruct.class, FailingPostConstuctModel.class, FalsePostConstuctModel.class, TruePostConstuctModel.class);
+        factory.adapterImplementations.addClassesAsAdapterAndImplementation(SubClass.class, SubClassOverriddenPostConstruct.class, FailingPostConstructModel.class, FalsePostConstructModel.class, TruePostConstructModel.class);
     }
 
     @Test
@@ -65,30 +66,34 @@ public class PostConstructTest {
 
     @Test
     public void testPostConstructMethodWhichThrowsException() {
-        FailingPostConstuctModel model = factory.getAdapter(resource, FailingPostConstuctModel.class);
+        FailingPostConstructModel model = factory.getAdapter(resource, FailingPostConstructModel.class);
         assertNull(model);
     }
 
     @Test
     public void testPostConstructMethodWhichReturnsFalse() {
-        FalsePostConstuctModel model = factory.getAdapter(resource, FalsePostConstuctModel.class);
+        FalsePostConstructModel model = factory.getAdapter(resource, FalsePostConstructModel.class);
         assertNull(model);
     }
 
     @Test
     public void testPostConstructMethodWhichReturnsTrue() {
-        TruePostConstuctModel model = factory.getAdapter(resource, TruePostConstuctModel.class);
+        TruePostConstructModel model = factory.getAdapter(resource, TruePostConstructModel.class);
         assertNotNull(model);
     }
 
-    @Test(expected = IllegalStateException.class)
+    @Test(expected = PostConstructException.class)
     public void testPostConstructMethodWhichReturnsFalseCreateModel() {
-        factory.createModel(resource, FalsePostConstuctModel.class);
+        factory.createModel(resource, FalsePostConstructModel.class);
+    }
+
+    public void testPostConstructMethodWhichReturnsFalseInternalCreateModel() {
+        assertSame(Result.POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION, factory.internalCreateModel(resource, FalsePostConstructModel.class));
     }
 
     @Test
     public void testPostConstructMethodWhichReturnsTrueCreateModel() {
-        TruePostConstuctModel model = factory.createModel(resource, TruePostConstuctModel.class);
+        TruePostConstructModel model = factory.createModel(resource, TruePostConstructModel.class);
         assertNotNull(model);
     }
 
@@ -96,7 +101,7 @@ public class PostConstructTest {
     public void testPostConstructMethodWhichThrowsExceptionThrowingException() {
         boolean thrown = false;
         try {
-            factory.createModel(resource, FailingPostConstuctModel.class);
+            factory.createModel(resource, FailingPostConstructModel.class);
         } catch (PostConstructException e) {
             assertTrue(e.getMessage().contains("Post-construct"));
             assertEquals("FAIL", e.getCause().getMessage());
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstuctModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java
similarity index 96%
rename from src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstuctModel.java
rename to src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java
index 7db3b92..186306f 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstuctModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java
@@ -24,7 +24,7 @@ import org.apache.sling.api.resource.Resource;
 import org.apache.sling.models.annotations.Model;
 
 @Model(adaptables=Resource.class)
-public class FailingPostConstuctModel {
+public class FailingPostConstructModel {
 
     @PostConstruct
     protected void pc() throws Exception {
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java
similarity index 96%
rename from src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java
rename to src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java
index 4c6b724..a1bd687 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java
@@ -24,7 +24,7 @@ import org.apache.sling.models.annotations.Model;
 import javax.annotation.PostConstruct;
 
 @Model(adaptables=Resource.class)
-public class FalsePostConstuctModel {
+public class FalsePostConstructModel {
 
     @PostConstruct
     protected boolean pc() throws Exception {
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java
similarity index 96%
rename from src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java
rename to src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java
index 4198f5f..06d21db 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java
@@ -24,7 +24,7 @@ import org.apache.sling.models.annotations.Model;
 import javax.annotation.PostConstruct;
 
 @Model(adaptables=Resource.class)
-public class TruePostConstuctModel {
+public class TruePostConstructModel {
 
     @PostConstruct
     protected boolean pc() throws Exception {