You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2021/12/22 22:14:40 UTC

[sling-org-apache-sling-caconfig-impl] branch master updated: SLING-8849 htl binding values provider improve flexibility (#3)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5a1da1a  SLING-8849 htl binding values provider improve flexibility (#3)
5a1da1a is described below

commit 5a1da1a80ed9d3677ba328c0cd5409bd0364f24f
Author: henrykuijpers <he...@gmail.com>
AuthorDate: Wed Dec 22 23:14:33 2021 +0100

    SLING-8849 htl binding values provider improve flexibility (#3)
    
    Co-authored-by: Henry Kuijpers <He...@amplexor.com>
    Co-authored-by: Brouns, Robin <Ro...@amplexor.com>
    Co-authored-by: Stefan Seifert <st...@users.noreply.github.com>
---
 pom.xml                                            |  2 +-
 .../impl/ConfigurationBindingsValueProvider.java   | 21 +++--
 ...ctResourceDetectionStrategyMultiplexerImpl.java | 74 +++++++++++++++++
 ...nfigurationInjectResourceDetectionStrategy.java | 40 +++++++++
 ...njectResourceDetectionStrategyMultiplexer.java} | 16 +++-
 .../management/multiplexer/package-info.java       |  2 +-
 .../ConfigurationBindingsValueProviderTest.java    | 24 +++++-
 ...sourceDetectionStrategyMultiplexerImplTest.java | 96 ++++++++++++++++++++++
 ...urationInjectResourceDetectionStrategyTest.java | 73 ++++++++++++++++
 9 files changed, 335 insertions(+), 13 deletions(-)

diff --git a/pom.xml b/pom.xml
index 91d2c63..bfd4d77 100644
--- a/pom.xml
+++ b/pom.xml
@@ -105,7 +105,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.caconfig.spi</artifactId>
-            <version>1.3.2</version>
+            <version>1.4.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProvider.java b/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProvider.java
index 6e08319..cf75502 100644
--- a/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProvider.java
+++ b/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProvider.java
@@ -29,6 +29,7 @@ import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.caconfig.ConfigurationBuilder;
+import org.apache.sling.caconfig.management.multiplexer.ConfigurationInjectResourceDetectionStrategyMultiplexer;
 import org.apache.sling.caconfig.management.multiplexer.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
@@ -71,29 +72,39 @@ public class ConfigurationBindingsValueProvider implements BindingsValuesProvide
     @Reference
     private ConfigurationMetadataProviderMultiplexer configMetadataProvider;
 
+    @Reference
+    private ConfigurationInjectResourceDetectionStrategyMultiplexer configurationInjectResourceDetectionStrategy;
+
     private boolean enabled;
 
     @Override
-    @SuppressWarnings("unused")
     public void addBindings(Bindings bindings) {
-        if (!enabled || !bindings.containsKey(SlingBindings.REQUEST)) {
+        if (!enabled) {
             return;
         }
-        SlingHttpServletRequest request = (SlingHttpServletRequest)bindings.get(SlingBindings.REQUEST);
-        Resource resource = request.getResource();
+
+        Resource resource = detectResourceForInjection(bindings);
         if (resource == null) {
             return;
         }
+
         Map<String,Object> configMap = new ConfigMap(resource, configMetadataProvider);
         bindings.put(BINDING_VARIABLE, configMap);
     }
 
+    private Resource detectResourceForInjection(Bindings bindings) {
+        SlingHttpServletRequest request = (SlingHttpServletRequest)bindings.get(SlingBindings.REQUEST);
+        if (request != null) {
+            return configurationInjectResourceDetectionStrategy.detectResource(request);
+        }
+        return (Resource)bindings.get(SlingBindings.RESOURCE);
+    }
+
     @Activate
     void activate(Config config) {
         this.enabled = config.enabled();
     }
 
-
     /**
      * This is a "virtual" containing configuration names as keys, and the underlying value maps/value map collections as values.
      * The map accesses only the data that is really required in a lazy fashion.
diff --git a/src/main/java/org/apache/sling/caconfig/impl/ConfigurationInjectResourceDetectionStrategyMultiplexerImpl.java b/src/main/java/org/apache/sling/caconfig/impl/ConfigurationInjectResourceDetectionStrategyMultiplexerImpl.java
new file mode 100644
index 0000000..428716d
--- /dev/null
+++ b/src/main/java/org/apache/sling/caconfig/impl/ConfigurationInjectResourceDetectionStrategyMultiplexerImpl.java
@@ -0,0 +1,74 @@
+/*
+ * 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.caconfig.impl;
+
+import java.util.Map;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.caconfig.management.multiplexer.ConfigurationInjectResourceDetectionStrategyMultiplexer;
+import org.apache.sling.caconfig.spi.ConfigurationInjectResourceDetectionStrategy;
+import org.apache.sling.commons.osgi.Order;
+import org.apache.sling.commons.osgi.RankedServices;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+
+/**
+ * Detects all {@link ConfigurationInjectResourceDetectionStrategy} implementations in the container
+ * and consolidates their result based on service ranking.
+ */
+@Component(service = ConfigurationInjectResourceDetectionStrategyMultiplexer.class,
+    reference={
+        @Reference(name="configurationBindingsResourceDetectionStrategy", service=ConfigurationInjectResourceDetectionStrategy.class,
+            bind="bindConfigurationInjectResourceDetectionStrategy", unbind="unbindConfigurationInjectResourceDetectionStrategy",
+            cardinality=ReferenceCardinality.MULTIPLE,
+            policy=ReferencePolicy.DYNAMIC, policyOption=ReferencePolicyOption.GREEDY)
+    })
+public class ConfigurationInjectResourceDetectionStrategyMultiplexerImpl implements ConfigurationInjectResourceDetectionStrategyMultiplexer {
+
+    private RankedServices<ConfigurationInjectResourceDetectionStrategy> resourceDetectionStrategies = new RankedServices<>(Order.DESCENDING);
+
+    protected void bindConfigurationInjectResourceDetectionStrategy(ConfigurationInjectResourceDetectionStrategy item, Map<String, Object> props) {
+        resourceDetectionStrategies.bind(item, props);
+    }
+
+    protected void unbindConfigurationInjectResourceDetectionStrategy(ConfigurationInjectResourceDetectionStrategy item, Map<String, Object> props) {
+        resourceDetectionStrategies.unbind(item, props);
+    }
+
+    /**
+     * Detects the resource by looking at the available bindings from the first implementation that has an answer.
+     */
+    @Override
+    public @Nullable Resource detectResource(@NotNull SlingHttpServletRequest request) {
+        for (ConfigurationInjectResourceDetectionStrategy resourceDetectionStrategy : resourceDetectionStrategies) {
+            Resource resource = resourceDetectionStrategy.detectResource(request);
+            if (resource != null) {
+                return resource;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInjectResourceDetectionStrategy.java b/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInjectResourceDetectionStrategy.java
new file mode 100644
index 0000000..b3a86a5
--- /dev/null
+++ b/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInjectResourceDetectionStrategy.java
@@ -0,0 +1,40 @@
+/*
+ * 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.caconfig.impl.def;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.caconfig.spi.ConfigurationInjectResourceDetectionStrategy;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Default implementation of {@link ConfigurationInjectResourceDetectionStrategy} which always
+ * uses the resource of the current request.
+ */
+@Component(service = ConfigurationInjectResourceDetectionStrategy.class)
+public class DefaultConfigurationInjectResourceDetectionStrategy implements ConfigurationInjectResourceDetectionStrategy {
+
+    @Override
+    public @Nullable Resource detectResource(@NotNull final SlingHttpServletRequest request) {
+        return request.getResource();
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java b/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationInjectResourceDetectionStrategyMultiplexer.java
similarity index 62%
copy from src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
copy to src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationInjectResourceDetectionStrategyMultiplexer.java
index a634a61..80fd481 100644
--- a/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
+++ b/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationInjectResourceDetectionStrategyMultiplexer.java
@@ -16,8 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.sling.caconfig.management.multiplexer;
+
+import org.apache.sling.caconfig.spi.ConfigurationInjectResourceDetectionStrategy;
+import org.osgi.annotation.versioning.ProviderType;
+
 /**
- * Multiplexer services provide aggregated access to all implementations of the related SPI interface.
+ * Detects all {@link ConfigurationInjectResourceDetectionStrategy} implementations in the container
+ * and consolidates their result based on service ranking.
  */
-@org.osgi.annotation.versioning.Version("1.1.2")
-package org.apache.sling.caconfig.management.multiplexer;
+@ProviderType
+public interface ConfigurationInjectResourceDetectionStrategyMultiplexer extends ConfigurationInjectResourceDetectionStrategy {
+
+    // inherits all methods from {@link ConfigurationInjectResourceDetectionStrategy}
+
+}
diff --git a/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java b/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
index a634a61..2800e2e 100644
--- a/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
+++ b/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
@@ -19,5 +19,5 @@
 /**
  * Multiplexer services provide aggregated access to all implementations of the related SPI interface.
  */
-@org.osgi.annotation.versioning.Version("1.1.2")
+@org.osgi.annotation.versioning.Version("1.2.0")
 package org.apache.sling.caconfig.management.multiplexer;
diff --git a/src/test/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProviderTest.java b/src/test/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProviderTest.java
index 3f14b1b..f7eec49 100644
--- a/src/test/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProviderTest.java
+++ b/src/test/java/org/apache/sling/caconfig/impl/ConfigurationBindingsValueProviderTest.java
@@ -38,6 +38,7 @@ import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.caconfig.ConfigurationBuilder;
 import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexerImpl;
+import org.apache.sling.caconfig.spi.ConfigurationInjectResourceDetectionStrategy;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
@@ -58,7 +59,7 @@ import com.google.common.collect.ImmutableSortedSet;
 @SuppressWarnings("unchecked")
 public class ConfigurationBindingsValueProviderTest {
 
-    private final static ValueMap VALUEMAP = new ValueMapDecorator(
+    private static final ValueMap VALUEMAP = new ValueMapDecorator(
             ImmutableMap.<String, Object> of("param1", "value1"));
 
     private static final SortedSet<String> CONFIG_NAMES = ImmutableSortedSet.of("name1", "name.2");
@@ -66,16 +67,18 @@ public class ConfigurationBindingsValueProviderTest {
     @Rule
     public SlingContext context = new SlingContext();
 
-    @Mock
+    @Mock(lenient = true)
     private SlingHttpServletRequest request;
     @Mock
     private Resource resource;
-    @Mock
+    @Mock(lenient = true)
     private Bindings bindings;
     @Mock
     private ConfigurationBuilder configBuilder;
     @Mock
     private ConfigurationMetadataProvider configMetadataProvider;
+    @Mock
+    private ConfigurationInjectResourceDetectionStrategy configurationBindingsResourceDetectionStrategy;
 
     private ConfigurationBindingsValueProvider underTest;
 
@@ -84,11 +87,14 @@ public class ConfigurationBindingsValueProviderTest {
     public void setUp() {
         context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexerImpl());
         context.registerService(ConfigurationMetadataProvider.class, configMetadataProvider);
+        context.registerInjectActivateService(new ConfigurationInjectResourceDetectionStrategyMultiplexerImpl());
+        context.registerService(ConfigurationInjectResourceDetectionStrategy.class, configurationBindingsResourceDetectionStrategy);
         when(configMetadataProvider.getConfigurationNames()).thenReturn(CONFIG_NAMES);
 
         when(bindings.containsKey(SlingBindings.REQUEST)).thenReturn(true);
         when(bindings.get(SlingBindings.REQUEST)).thenReturn(request);
         when(request.getResource()).thenReturn(resource);
+
         when(resource.adaptTo(ConfigurationBuilder.class)).thenReturn(configBuilder);
         when(configBuilder.name(anyString())).thenReturn(configBuilder);
         when(configBuilder.asValueMap()).thenReturn(VALUEMAP);
@@ -101,7 +107,19 @@ public class ConfigurationBindingsValueProviderTest {
     }
 
     @Test
+    public void testWithNoResourceFound() {
+        when(configurationBindingsResourceDetectionStrategy.detectResource(request)).thenReturn(null);
+
+        underTest = context.registerInjectActivateService(new ConfigurationBindingsValueProvider(), "enabled", true);
+        underTest.addBindings(bindings);
+
+        verify(bindings, never()).put(anyString(), any(Object.class));
+    }
+
+    @Test
     public void testWithConfig() {
+        when(configurationBindingsResourceDetectionStrategy.detectResource(request)).thenReturn(resource);
+
         underTest = context.registerInjectActivateService(new ConfigurationBindingsValueProvider(), "enabled", true);
         underTest.addBindings(bindings);
 
diff --git a/src/test/java/org/apache/sling/caconfig/impl/ConfigurationInjectResourceDetectionStrategyMultiplexerImplTest.java b/src/test/java/org/apache/sling/caconfig/impl/ConfigurationInjectResourceDetectionStrategyMultiplexerImplTest.java
new file mode 100644
index 0000000..5574c51
--- /dev/null
+++ b/src/test/java/org/apache/sling/caconfig/impl/ConfigurationInjectResourceDetectionStrategyMultiplexerImplTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.caconfig.impl;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.caconfig.spi.ConfigurationInjectResourceDetectionStrategy;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ConfigurationInjectResourceDetectionStrategyMultiplexerImplTest {
+
+    @Rule
+    public SlingContext context = new SlingContext();
+
+    @Mock
+    private SlingHttpServletRequest request;
+    @Mock
+    private Resource resource1;
+    @Mock
+    private Resource resource2;
+
+    private ConfigurationInjectResourceDetectionStrategy underTest;
+
+    @Before
+    public void setUp() {
+        underTest = context.registerInjectActivateService(new ConfigurationInjectResourceDetectionStrategyMultiplexerImpl());
+    }
+
+    @Test
+    public void testWithNoStrategies() {
+        assertNull(underTest.detectResource(request));
+    }
+
+    @Test
+    @SuppressWarnings("null")
+    public void testWithOneStrategy() {
+        ConfigurationInjectResourceDetectionStrategy strategy = mock(ConfigurationInjectResourceDetectionStrategy.class);
+        when(strategy.detectResource(request)).thenReturn(resource1);
+        context.registerService(ConfigurationInjectResourceDetectionStrategy.class, strategy);
+
+        assertSame(resource1, underTest.detectResource(request));
+    }
+
+    @Test
+    @SuppressWarnings("null")
+    public void testWithMultipleStrategies() {
+        ConfigurationInjectResourceDetectionStrategy strategy1 = mock(ConfigurationInjectResourceDetectionStrategy.class);
+        ConfigurationInjectResourceDetectionStrategy strategy2 = mock(ConfigurationInjectResourceDetectionStrategy.class);
+        ConfigurationInjectResourceDetectionStrategy strategy3 = mock(ConfigurationInjectResourceDetectionStrategy.class);
+
+        when(strategy1.detectResource(request)).thenReturn(null);
+        when(strategy2.detectResource(request)).thenReturn(resource2);
+
+        context.registerService(ConfigurationInjectResourceDetectionStrategy.class, strategy1);
+        context.registerService(ConfigurationInjectResourceDetectionStrategy.class, strategy2);
+        context.registerService(ConfigurationInjectResourceDetectionStrategy.class, strategy3);
+
+        assertSame(resource2, underTest.detectResource(request));
+
+        verify(strategy1, times(1)).detectResource(request);
+        verify(strategy2, times(1)).detectResource(request);
+        verifyNoMoreInteractions(strategy3);
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInjectResourceDetectionStrategyTest.java b/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInjectResourceDetectionStrategyTest.java
new file mode 100644
index 0000000..c56499a
--- /dev/null
+++ b/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInjectResourceDetectionStrategyTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.caconfig.impl.def;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.when;
+
+import javax.script.Bindings;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.caconfig.spi.ConfigurationInjectResourceDetectionStrategy;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class DefaultConfigurationInjectResourceDetectionStrategyTest {
+
+    @Rule
+    public SlingContext context = new SlingContext();
+
+    @Mock
+    private SlingHttpServletRequest request;
+
+    @Mock
+    private Resource resource;
+
+    @Mock
+    private Bindings bindings;
+
+    private ConfigurationInjectResourceDetectionStrategy underTest;
+
+    @Before
+    public void before() {
+        underTest = context.registerService(ConfigurationInjectResourceDetectionStrategy.class, new DefaultConfigurationInjectResourceDetectionStrategy());
+        when(request.getResource()).thenReturn(resource);
+    }
+
+    @Test
+    @SuppressWarnings("null")
+    public void testNoResource() {
+        when(request.getResource()).thenReturn(null);
+        assertNull(underTest.detectResource(request));
+    }
+
+    @Test
+    public void testWithResource() {
+        assertSame(resource, underTest.detectResource(request));
+    }
+
+}