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));
+ }
+
+}