You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2017/09/18 13:18:04 UTC
svn commit: r1808699 - in /sling/trunk/bundles/extensions/models/impl/src:
main/java/org/apache/sling/models/impl/
test/java/org/apache/sling/models/impl/
test/java/org/apache/sling/models/testmodels/classes/
Author: justin
Date: Mon Sep 18 13:18:04 2017
New Revision: 1808699
URL: http://svn.apache.org/viewvc?rev=1808699&view=rev
Log:
SLING-7124 - allow PostConstruct method to return a boolean to indicate a failure
Added:
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java
Modified:
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/Result.java
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java?rev=1808699&r1=1808698&r2=1808699&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java Mon Sep 18 13:18:04 2017
@@ -610,7 +610,7 @@ public class ModelAdapterFactory impleme
final Map<ValuePreparer, Object> preparedValues = new HashMap<>(VALUE_PREPARERS_COUNT);
- final ModelType object;
+ ModelType object;
if (constructorToUse.getConstructor().getParameterTypes().length == 0) {
// no parameters for constructor injection? instantiate it right away
object = constructorToUse.getConstructor().newInstance();
@@ -656,7 +656,7 @@ public class ModelAdapterFactory impleme
return new Result<>(missingElements);
}
try {
- invokePostConstruct(object);
+ object = invokePostConstruct(object);
} catch (InvocationTargetException e) {
return new Result<>(new PostConstructException("Post-construct method has thrown an exception for model " + modelClass.getType(), e.getCause()));
} catch (IllegalAccessException e) {
@@ -830,7 +830,7 @@ public class ModelAdapterFactory impleme
return true;
}
- private void invokePostConstruct(Object object) throws InvocationTargetException, IllegalAccessException {
+ private <ModelType> ModelType invokePostConstruct(ModelType object) throws InvocationTargetException, IllegalAccessException {
Class<?> clazz = object.getClass();
List<Method> postConstructMethods = new ArrayList<>();
while (clazz != null) {
@@ -849,13 +849,18 @@ public class ModelAdapterFactory impleme
if (!accessible) {
method.setAccessible(true);
}
- method.invoke(object);
+ Object result = method.invoke(object);
+ if (result instanceof Boolean && !((Boolean) result).booleanValue()) {
+ log.debug("PostConstruct method {}.{} returned false. Returning null model.", method.getDeclaringClass().getName(), method.getName());
+ return null;
+ }
} finally {
if (!accessible) {
method.setAccessible(false);
}
}
}
+ return object;
}
private RuntimeException setField(InjectableField injectableField, Object createdObject, Object value) {
Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/Result.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/Result.java?rev=1808699&r1=1808698&r2=1808699&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/Result.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/Result.java Mon Sep 18 13:18:04 2017
@@ -19,7 +19,6 @@
package org.apache.sling.models.impl;
import javax.annotation.Nonnull;
-
/**
* This class encapsulates a value of a generic class in case of success or the
* {@link RuntimeException}s in case of an error. It is used because the
@@ -59,7 +58,7 @@ public class Result<SuccessObjectType> {
*/
public @Nonnull RuntimeException getThrowable() {
if (t == null) {
- throw new IllegalStateException("No throwable available");
+ return new IllegalStateException("No throwable available");
}
return t;
}
@@ -87,4 +86,5 @@ public class Result<SuccessObjectType> {
return object != null;
}
+
}
Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java?rev=1808699&r1=1808698&r2=1808699&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java Mon Sep 18 13:18:04 2017
@@ -18,6 +18,7 @@ package org.apache.sling.models.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
@@ -26,8 +27,10 @@ import java.util.Hashtable;
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.SubClass;
import org.apache.sling.models.testmodels.classes.SubClassOverriddenPostConstruct;
+import org.apache.sling.models.testmodels.classes.TruePostConstuctModel;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,7 +59,7 @@ public class PostConstructTest {
when(componentCtx.getProperties()).thenReturn(new Hashtable<String, Object>());
factory.activate(componentCtx);
// no injectors are necessary
- factory.adapterImplementations.addClassesAsAdapterAndImplementation(SubClass.class, SubClassOverriddenPostConstruct.class, FailingPostConstuctModel.class);
+ factory.adapterImplementations.addClassesAsAdapterAndImplementation(SubClass.class, SubClassOverriddenPostConstruct.class, FailingPostConstuctModel.class, FalsePostConstuctModel.class, TruePostConstuctModel.class);
}
@Test
@@ -80,6 +83,29 @@ public class PostConstructTest {
}
@Test
+ public void testPostConstructMethodWhichReturnsFalse() {
+ FalsePostConstuctModel model = factory.getAdapter(resource, FalsePostConstuctModel.class);
+ assertNull(model);
+ }
+
+ @Test
+ public void testPostConstructMethodWhichReturnsTrue() {
+ TruePostConstuctModel model = factory.getAdapter(resource, TruePostConstuctModel.class);
+ assertNotNull(model);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testPostConstructMethodWhichReturnsFalseCreateModel() {
+ FalsePostConstuctModel model = factory.createModel(resource, FalsePostConstuctModel.class);
+ }
+
+ @Test
+ public void testPostConstructMethodWhichReturnsTrueCreateModel() {
+ TruePostConstuctModel model = factory.createModel(resource, TruePostConstuctModel.class);
+ assertNotNull(model);
+ }
+
+ @Test
public void testPostConstructMethodWhichThrowsExceptionThrowingException() {
boolean thrown = false;
try {
Added: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java?rev=1808699&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java (added)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java Mon Sep 18 13:18:04 2017
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.models.testmodels.classes;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+
+import javax.annotation.PostConstruct;
+
+@Model(adaptables=Resource.class)
+public class FalsePostConstuctModel {
+
+ @PostConstruct
+ protected boolean pc() throws Exception {
+ return false;
+ }
+
+}
Added: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java?rev=1808699&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java (added)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java Mon Sep 18 13:18:04 2017
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.models.testmodels.classes;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+
+import javax.annotation.PostConstruct;
+
+@Model(adaptables=Resource.class)
+public class TruePostConstuctModel {
+
+ @PostConstruct
+ protected boolean pc() throws Exception {
+ return true;
+ }
+
+}