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>.