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 {