You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:55:44 UTC
[sling-org-apache-sling-models-impl] 14/24: SLING-3878 - allowing
the injection of parameterized request attributes
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.models.impl-1.1.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git
commit 035d6602769f6320f37578e2323b4f44a091dcae
Author: Justin Edelson <ju...@apache.org>
AuthorDate: Sun Aug 24 12:41:58 2014 +0000
SLING-3878 - allowing the injection of parameterized request attributes
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/impl@1620132 13f79535-47bb-0310-9956-ffa450edef68
---
.../impl/injectors/RequestAttributeInjector.java | 31 ++++++--
.../ParameterizedTypeFromRequestAttributeTest.java | 87 ++++++++++++++++++++++
2 files changed, 110 insertions(+), 8 deletions(-)
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java
index 23c3907..081bcbf 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java
@@ -17,6 +17,7 @@
package org.apache.sling.models.impl.injectors;
import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.servlet.ServletRequest;
@@ -51,16 +52,30 @@ public class RequestAttributeInjector implements Injector, InjectAnnotationProce
DisposalCallbackRegistry callbackRegistry) {
if (!(adaptable instanceof ServletRequest)) {
return null;
- } else if (declaredType instanceof Class<?>) {
- Class<?> clazz = (Class<?>) declaredType;
+ } else {
Object attribute = ((ServletRequest) adaptable).getAttribute(name);
- if (clazz.isInstance(attribute)) {
- return attribute;
- } else {
- return null;
+ if (attribute != null) {
+ if (declaredType instanceof Class<?>) {
+ Class<?> clazz = (Class<?>) declaredType;
+ if (clazz.isInstance(attribute)) {
+ return attribute;
+ } else {
+ return null;
+ }
+ } else if (declaredType instanceof ParameterizedType) {
+ ParameterizedType parameterizedType = (ParameterizedType) declaredType;
+ Type rawType = parameterizedType.getRawType();
+ if (rawType instanceof Class<?>) {
+ Class<?> clazz = (Class<?>) rawType;
+ if (clazz.isInstance(attribute)) {
+ return attribute;
+ } else {
+ return null;
+ }
+ }
+ }
+ log.debug("RequestAttributeInjector doesn't support type {}, type class {}.", declaredType, declaredType.getClass());
}
- } else {
- log.debug("BindingsInjector doesn't support non-class type {}", declaredType);
return null;
}
}
diff --git a/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java b/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java
new file mode 100644
index 0000000..3c9240a
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.impl;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import javax.inject.Inject;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.impl.injectors.RequestAttributeInjector;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ParameterizedTypeFromRequestAttributeTest {
+ private ModelAdapterFactory factory;
+
+ @Mock
+ private ComponentContext componentCtx;
+
+ @Mock
+ private BundleContext bundleContext;
+
+ @Mock
+ private SlingHttpServletRequest request;
+
+ @Before
+ public void setup() {
+ when(componentCtx.getBundleContext()).thenReturn(bundleContext);
+ when(componentCtx.getProperties()).thenReturn(new Hashtable<String, Object>());
+
+ factory = new ModelAdapterFactory();
+ factory.activate(componentCtx);
+
+ RequestAttributeInjector injector = new RequestAttributeInjector();
+ factory.bindInjector(injector, new ServicePropertiesMap(1, 1));
+ }
+
+ @Test
+ public void test() {
+ Iterator<Resource> it = Collections.<Resource> emptySet().iterator();
+
+ when(request.getAttribute("someResources")).thenReturn(it);
+ TestModel model = factory.getAdapter(request, TestModel.class);
+ assertNotNull(model);
+ assertEquals(it, model.getSomeResources());
+ }
+
+ @Model(adaptables = SlingHttpServletRequest.class)
+ public static class TestModel {
+
+ @Inject
+ private Iterator<Resource> someResources;
+
+ public Iterator<Resource> getSomeResources() {
+ return someResources;
+ }
+ }
+}
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.