You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by an...@apache.org on 2018/07/25 22:19:12 UTC

[sling-org-apache-sling-resourceresolver] branch feature/SLING-7768 updated (028427b -> 511d33d)

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

andysch pushed a change to branch feature/SLING-7768
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git.


    from 028427b  Initial development of the etc-map placeholder provider
     new 92bd020  Fix minor type
     new 511d33d  Rename the PlaceHolderProvider to StringInterpolationProvider and created a test suite to test the String Interpolation Provider with Map Entries

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            |   3 +
 .../impl/CommonResourceResolverFactoryImpl.java    |   2 +-
 .../impl/ResourceResolverFactoryActivator.java     |   8 +-
 .../resourceresolver/impl/mapping/MapEntries.java  |  14 +-
 ...vider.java => StringInterpolationProvider.java} |   8 +-
 ... StringInterpolationProviderConfiguration.java} |   8 +-
 ...l.java => StringInterpolationProviderImpl.java} |  28 +--
 .../impl/mapping/MapEntriesTest.java               |  21 ++-
 .../impl/mapping/PlaceholderProviderImplTest.java  | 139 ---------------
 .../mapping/StringInterpolationMapEntriesTest.java | 195 +++++++++++++++++++++
 .../StringInterpolationProviderImplTest.java       | 155 ++++++++++++++++
 11 files changed, 399 insertions(+), 182 deletions(-)
 rename src/main/java/org/apache/sling/resourceresolver/impl/mapping/{PlaceholderProvider.java => StringInterpolationProvider.java} (91%)
 rename src/main/java/org/apache/sling/resourceresolver/impl/mapping/{PlaceholderProviderConfiguration.java => StringInterpolationProviderConfiguration.java} (85%)
 rename src/main/java/org/apache/sling/resourceresolver/impl/mapping/{PlaceholderProviderImpl.java => StringInterpolationProviderImpl.java} (89%)
 delete mode 100644 src/test/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImplTest.java
 create mode 100644 src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationMapEntriesTest.java
 create mode 100644 src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImplTest.java


[sling-org-apache-sling-resourceresolver] 02/02: Rename the PlaceHolderProvider to StringInterpolationProvider and created a test suite to test the String Interpolation Provider with Map Entries

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andysch pushed a commit to branch feature/SLING-7768
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git

commit 511d33d2c65caa3495f0ec803d6816c002735c6e
Author: Andreas Schaefer <sc...@me.com>
AuthorDate: Wed Jul 25 15:18:58 2018 -0700

    Rename the PlaceHolderProvider to StringInterpolationProvider and created a test suite to test the String Interpolation Provider with Map Entries
---
 pom.xml                                            |   3 +
 .../impl/CommonResourceResolverFactoryImpl.java    |   2 +-
 .../impl/ResourceResolverFactoryActivator.java     |   8 +-
 .../resourceresolver/impl/mapping/MapEntries.java  |  14 +-
 ...vider.java => StringInterpolationProvider.java} |   8 +-
 ... StringInterpolationProviderConfiguration.java} |   6 +-
 ...l.java => StringInterpolationProviderImpl.java} |  28 +--
 .../impl/mapping/MapEntriesTest.java               |  21 ++-
 .../impl/mapping/PlaceholderProviderImplTest.java  | 139 ---------------
 .../mapping/StringInterpolationMapEntriesTest.java | 195 +++++++++++++++++++++
 .../StringInterpolationProviderImplTest.java       | 155 ++++++++++++++++
 11 files changed, 398 insertions(+), 181 deletions(-)

diff --git a/pom.xml b/pom.xml
index e0c613c..5466e8a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,6 +73,9 @@
                             javax.jcr;resolution:=optional,
                             *
                         </Import-Package>
+                        <Export-Package>
+                            org.apache.sling.resourceresolver.impl.mapping
+                        </Export-Package>
                         <Provide-Capability>
                             osgi.service;objectClass=javax.servlet.Servlet,
                             osgi.service;objectClass=org.apache.sling.api.resource.ResourceResolverFactory,
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
index 3289098..d393cd8 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
@@ -322,7 +322,7 @@ public class CommonResourceResolverFactoryImpl implements ResourceResolverFactor
         }
         // set up the map entries from configuration
         try {
-            mapEntries = new MapEntries(this, bundleContext, this.activator.getEventAdmin(), this.activator.getPlaceholderProvider());
+            mapEntries = new MapEntries(this, bundleContext, this.activator.getEventAdmin(), this.activator.getStringInterpolationProvider());
         } catch (final Exception e) {
             logger.error("activate: Cannot access repository, failed setting up Mapping Support", e);
         }
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
index 371d5a3..478be4a 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
@@ -39,7 +39,7 @@ import org.apache.sling.api.resource.runtime.RuntimeService;
 import org.apache.sling.resourceresolver.impl.helper.ResourceDecoratorTracker;
 import org.apache.sling.resourceresolver.impl.mapping.MapEntries;
 import org.apache.sling.resourceresolver.impl.mapping.Mapping;
-import org.apache.sling.resourceresolver.impl.mapping.PlaceholderProvider;
+import org.apache.sling.resourceresolver.impl.mapping.StringInterpolationProvider;
 import org.apache.sling.resourceresolver.impl.observation.ResourceChangeListenerWhiteboard;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderTracker;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderTracker.ChangeListener;
@@ -111,7 +111,7 @@ public class ResourceResolverFactoryActivator {
 
     /** Event admin. */
     @Reference
-    PlaceholderProvider placeholderProvider;
+    StringInterpolationProvider stringInterpolationProvider;
 
     /** Service User Mapper */
     @Reference
@@ -158,8 +158,8 @@ public class ResourceResolverFactoryActivator {
         return this.eventAdmin;
     }
 
-    public PlaceholderProvider getPlaceholderProvider() {
-        return placeholderProvider;
+    public StringInterpolationProvider getStringInterpolationProvider() {
+        return stringInterpolationProvider;
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
index 7877171..89fa39b 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
@@ -55,7 +55,6 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.resource.LoginException;
-import org.apache.sling.api.resource.QuerySyntaxException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
@@ -69,7 +68,6 @@ import org.apache.sling.resourceresolver.impl.ResourceResolverImpl;
 import org.apache.sling.resourceresolver.impl.mapping.MapConfigurationProvider.VanityPathConfig;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
@@ -153,10 +151,10 @@ public class MapEntries implements
 
     private Thread aliasTraversal = null;
 
-    private PlaceholderProvider placeholderProvider;
+    private StringInterpolationProvider stringInterpolationProvider;
 
     @SuppressWarnings({ "unchecked" })
-    public MapEntries(final MapConfigurationProvider factory, final BundleContext bundleContext, final EventAdmin eventAdmin, final PlaceholderProvider placeholderProvider)
+    public MapEntries(final MapConfigurationProvider factory, final BundleContext bundleContext, final EventAdmin eventAdmin, final StringInterpolationProvider stringInterpolationProvider)
         throws LoginException, IOException {
 
     	this.resolver = factory.getServiceResourceResolver(factory.getServiceUserAuthenticationInfo("mapping"));
@@ -167,7 +165,7 @@ public class MapEntries implements
         this.mapMaps = Collections.<MapEntry> emptyList();
         this.vanityTargets = Collections.<String,List <String>>emptyMap();
         this.aliasMap = Collections.emptyMap();
-        this.placeholderProvider = placeholderProvider;
+        this.stringInterpolationProvider = stringInterpolationProvider;
 
         doInit();
 
@@ -991,9 +989,9 @@ public class MapEntries implements
                 trailingSlash = true;
             }
             // Check for placeholders and replace if needed
-            PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(name);
-            if(check.getStatus() == PlaceholderProvider.STATUS.found) {
-                name = placeholderProvider.resolve(check);
+            StringInterpolationProvider.Check check = stringInterpolationProvider.hasPlaceholder(name);
+            if(check.getStatus() == StringInterpolationProvider.STATUS.found) {
+                name = stringInterpolationProvider.resolve(check);
             }
 
             final String childPath = parentPath.concat(name);
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProvider.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProvider.java
similarity index 91%
rename from src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProvider.java
rename to src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProvider.java
index 95c01d7..aa398e2 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProvider.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProvider.java
@@ -25,16 +25,16 @@ import java.util.List;
  * that depend on the environment like host names / ports for dev, test,
  * qa, staging, prod systems
  *
- * Placeholders are enclosed in two opening/closing round brackets: {{replaceMe}}
+ * Placeholders are enclosed in Starting and Ending Delimiters (see PLACEHOLDER_START/END_TOKEN)
  * The name of the placeholder can contain any character except opening or closing
  * brackets (no nesting).
  */
-public interface PlaceholderProvider {
+public interface StringInterpolationProvider {
 
     enum STATUS {found, unknown, none};
 
-    public static final String PLACEHOLDER_START_TOKEN = "{{";
-    public static final String PLACEHOLDER_END_TOKEN = "}}";
+    public static final String PLACEHOLDER_START_TOKEN = "${";
+    public static final String PLACEHOLDER_END_TOKEN = "}";
     /**
      * Checks if the given values contains a placeholder and if that placeholder is known
      * @param value String to check
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderConfiguration.java
similarity index 87%
rename from src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java
rename to src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderConfiguration.java
index eea215c..664669e 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderConfiguration.java
@@ -21,9 +21,9 @@ package org.apache.sling.resourceresolver.impl.mapping;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@ObjectClassDefinition(name = "Apache Sling Placeholder Provider",
-    description = "Configures the Placeholder Provider and the location of its key/value pairs")
-public @interface PlaceholderProviderConfiguration {
+@ObjectClassDefinition(name = "Apache Sling String Interpolation Provider",
+    description = "Configures the String Interpolation Provider and the location of its key/value pairs")
+public @interface StringInterpolationProviderConfiguration {
     @AttributeDefinition(
         name = "Placeholder Values",
         description = "A list of key / value pairs separated by a equal (=) sign. " +
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java
similarity index 89%
rename from src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImpl.java
rename to src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java
index 836a3cf..5150c83 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java
@@ -35,15 +35,15 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-@Designate(ocd = PlaceholderProviderConfiguration.class)
-@Component(name = "org.apache.sling.resourceresolver.impl.mapping.PlaceholderProvider")
-public class PlaceholderProviderImpl
-    implements PlaceholderProvider
+@Designate(ocd = StringInterpolationProviderConfiguration.class)
+@Component(name = "org.apache.sling.resourceresolver.impl.mapping.StringInterpolationProvider")
+public class StringInterpolationProviderImpl
+    implements StringInterpolationProvider
 {
     /** Logger. */
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-    public static PlaceholderProviderConfiguration DEFAULT_CONFIG;
+    public static StringInterpolationProviderConfiguration DEFAULT_CONFIG;
 
     static {
         final InvocationHandler handler = new InvocationHandler() {
@@ -51,12 +51,12 @@ public class PlaceholderProviderImpl
             @Override
             public Object invoke(final Object obj, final Method calledMethod, final Object[] args)
                 throws Throwable {
-                if ( calledMethod.getDeclaringClass().isAssignableFrom(PlaceholderProviderConfiguration.class) ) {
+                if ( calledMethod.getDeclaringClass().isAssignableFrom(StringInterpolationProviderConfiguration.class) ) {
                     return calledMethod.getDefaultValue();
                 }
                 if ( calledMethod.getDeclaringClass() == Object.class ) {
                     if ( calledMethod.getName().equals("toString") && (args == null || args.length == 0) ) {
-                        return "Generated @" + PlaceholderProviderConfiguration.class.getName() + " instance";
+                        return "Generated @" + StringInterpolationProviderConfiguration.class.getName() + " instance";
                     }
                     if ( calledMethod.getName().equals("hashCode") && (args == null || args.length == 0) ) {
                         return this.hashCode();
@@ -68,15 +68,15 @@ public class PlaceholderProviderImpl
                 throw new InternalError("unexpected method dispatched: " + calledMethod);
             }
         };
-        DEFAULT_CONFIG = (PlaceholderProviderConfiguration) Proxy.newProxyInstance(
-            PlaceholderProviderConfiguration.class.getClassLoader(),
-            new Class[] { PlaceholderProviderConfiguration.class },
+        DEFAULT_CONFIG = (StringInterpolationProviderConfiguration) Proxy.newProxyInstance(
+            StringInterpolationProviderConfiguration.class.getClassLoader(),
+            new Class[] { StringInterpolationProviderConfiguration.class },
             handler
         );
     }
 
     private BundleContext bundleContext;
-    private PlaceholderProviderConfiguration config = DEFAULT_CONFIG;
+    private StringInterpolationProviderConfiguration config = DEFAULT_CONFIG;
     private Map<String, String> placeholderEntries = new HashMap<>();
 
     // ---------- SCR Integration ---------------------------------------------
@@ -85,7 +85,7 @@ public class PlaceholderProviderImpl
      * Activates this component (called by SCR before)
      */
     @Activate
-    protected void activate(final BundleContext bundleContext, final PlaceholderProviderConfiguration config) {
+    protected void activate(final BundleContext bundleContext, final StringInterpolationProviderConfiguration config) {
         this.bundleContext = bundleContext;
         this.config = config;
         for(String line: this.config.place_holder_key_value_pairs()) {
@@ -110,7 +110,7 @@ public class PlaceholderProviderImpl
      * Modifies this component (called by SCR to update this component)
      */
     @Modified
-    protected void modified(final BundleContext bundleContext, final PlaceholderProviderConfiguration config) {
+    protected void modified(final BundleContext bundleContext, final StringInterpolationProviderConfiguration config) {
         this.deactivate();
         this.activate(bundleContext, config);
     }
@@ -169,7 +169,7 @@ public class PlaceholderProviderImpl
                 answer += value;
                 carret = carret + end - start + PLACEHOLDER_END_TOKEN.length();
             }
-            if(carret < line.length() - 1) {
+            if(carret < line.length()) {
                 // There is some text left after the last placeholder so copy this to the target line
                 answer += line.substring(carret);
             }
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
index 86f3766..682dacf 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.resourceresolver.impl.mapping;
 
+import static org.apache.sling.resourceresolver.impl.mapping.MapEntries.PROP_REDIRECT_EXTERNAL;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -32,10 +33,13 @@ import static org.mockito.Mockito.when;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -59,6 +63,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.resource.observation.ResourceChange;
@@ -102,7 +107,7 @@ public class MapEntriesTest {
     private EventAdmin eventAdmin;
 
     @Mock
-    private PlaceholderProvider placeholderProvider;
+    private StringInterpolationProvider stringInterpolationProvider;
 
     private Map<String, Map<String, String>> aliasMap;
 
@@ -140,7 +145,7 @@ public class MapEntriesTest {
         when(resourceResolver.findResources(anyString(), eq("sql"))).thenReturn(
                 Collections.<Resource> emptySet().iterator());
 
-        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider);
+        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
         final Field aliasMapField = MapEntries.class.getDeclaredField("aliasMap");
         aliasMapField.setAccessible(true);
 
@@ -856,7 +861,7 @@ public class MapEntriesTest {
         addResource.setAccessible(true);
 
         when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
-        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider);
+        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
 
         Resource parent = mock(Resource.class);
         when(parent.getPath()).thenReturn("/parent");
@@ -881,7 +886,7 @@ public class MapEntriesTest {
         addResource.setAccessible(true);
 
         when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
-        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider);
+        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
 
         Resource parent = mock(Resource.class);
         when(parent.getPath()).thenReturn("/parent");
@@ -906,7 +911,7 @@ public class MapEntriesTest {
         removeAlias.setAccessible(true);
 
         when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(false);
-        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider);
+        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
 
         Resource parent = mock(Resource.class);
         when(parent.getPath()).thenReturn("/parent");
@@ -1659,7 +1664,7 @@ public class MapEntriesTest {
 	final Method addResource = MapEntries.class.getDeclaredMethod("addResource", String.class, AtomicBoolean.class);
         addResource.setAccessible(true);
 
-        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider);
+        mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
 
         Resource parent = mock(Resource.class);
         when(parent.getPath()).thenReturn("/parent");
@@ -1709,7 +1714,7 @@ public class MapEntriesTest {
 	final Method addResource = MapEntries.class.getDeclaredMethod("addResource", String.class, AtomicBoolean.class);
         addResource.setAccessible(true);
 
-        mapEntries = Mockito.spy(new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider));
+        mapEntries = Mockito.spy(new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider));
         doReturn(100).when(mapEntries).getTraversalRetryInterval();
 
         Resource parent = mock(Resource.class);
@@ -1766,7 +1771,7 @@ public class MapEntriesTest {
 	final Method addResource = MapEntries.class.getDeclaredMethod("addResource", String.class, AtomicBoolean.class);
         addResource.setAccessible(true);
 
-        mapEntries = Mockito.spy(new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, placeholderProvider));
+        mapEntries = Mockito.spy(new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider));
         doReturn(100).when(mapEntries).getTraversalRetryInterval();
 
         Resource parent = mock(Resource.class);
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImplTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImplTest.java
deleted file mode 100644
index 472bcad..0000000
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderImplTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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.resourceresolver.impl.mapping;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.osgi.framework.BundleContext;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.when;
-
-public class PlaceholderProviderImplTest {
-
-    @Mock
-    private BundleContext bundleContext;
-
-    @Mock
-    private PlaceholderProviderConfiguration placeholderProviderConfiguration;
-
-    @SuppressWarnings({ "unchecked" })
-    @Before
-    public void setup() throws Exception {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void test_simple_one_placeholder() {
-        when(placeholderProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
-            new String[] { "one=two"}
-        );
-
-        PlaceholderProviderImpl placeholderProvider = new PlaceholderProviderImpl();
-        placeholderProvider.activate(bundleContext, placeholderProviderConfiguration);
-
-        String line = "{{one}}";
-        PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(line);
-        assertEquals("Wrong Check status", PlaceholderProvider.STATUS.found, check.getStatus());
-        String resolved = placeholderProvider.resolve(check);
-        assertEquals("Wrong resolved line", "two", resolved);
-    }
-
-    @Test
-    public void test_simple_text_one_placeholder() {
-        when(placeholderProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
-            new String[] { "one=two"}
-        );
-
-        PlaceholderProviderImpl placeholderProvider = new PlaceholderProviderImpl();
-        placeholderProvider.activate(bundleContext, placeholderProviderConfiguration);
-
-        String line = "Here is {{one}}, too";
-        PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(line);
-        assertEquals("Wrong Check status", PlaceholderProvider.STATUS.found, check.getStatus());
-        String resolved = placeholderProvider.resolve(check);
-        assertEquals("Wrong resolved line", "Here is two, too", resolved);
-    }
-
-    @Test
-    public void test_two_placeholders() {
-        when(placeholderProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
-            new String[] { "one=two", "three=four"}
-        );
-
-        PlaceholderProviderImpl placeholderProvider = new PlaceholderProviderImpl();
-        placeholderProvider.activate(bundleContext, placeholderProviderConfiguration);
-
-        String line = "{{one}} with another {{three}}";
-        PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(line);
-        assertEquals("Wrong Check status", PlaceholderProvider.STATUS.found, check.getStatus());
-        String resolved = placeholderProvider.resolve(check);
-        assertEquals("Wrong resolved line", "two with another four", resolved);
-    }
-
-    @Test
-    public void test_three_placeholders() {
-        when(placeholderProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
-            new String[] { "one=two", "three=four", "five=six"}
-        );
-
-        PlaceholderProviderImpl placeholderProvider = new PlaceholderProviderImpl();
-        placeholderProvider.activate(bundleContext, placeholderProviderConfiguration);
-
-        String line = "Here comes {{one}} with another {{three}} equals {{five}}, horray!";
-        PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(line);
-        assertEquals("Wrong Check status", PlaceholderProvider.STATUS.found, check.getStatus());
-        String resolved = placeholderProvider.resolve(check);
-        assertEquals("Wrong resolved line", "Here comes two with another four equals six, horray!", resolved);
-    }
-
-    @Test
-    public void test_no_placeholders() {
-        when(placeholderProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
-            new String[] { "one=two", "three=four", "five=six"}
-        );
-
-        PlaceholderProviderImpl placeholderProvider = new PlaceholderProviderImpl();
-        placeholderProvider.activate(bundleContext, placeholderProviderConfiguration);
-
-        String line = "Here comes is a text with no placeholders!";
-        PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(line);
-        assertEquals("Wrong Check status", PlaceholderProvider.STATUS.none, check.getStatus());
-        String resolved = placeholderProvider.resolve(check);
-        assertEquals("Wrong resolved line", "Here comes is a text with no placeholders!", resolved);
-    }
-
-    @Test
-    public void test_unkown_placeholders() {
-        when(placeholderProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
-            new String[] { "one=two", "three=four", "five=six"}
-        );
-
-        PlaceholderProviderImpl placeholderProvider = new PlaceholderProviderImpl();
-        placeholderProvider.activate(bundleContext, placeholderProviderConfiguration);
-
-        String line = "Here comes {{unkown}} placeholders!";
-        PlaceholderProvider.Check check = placeholderProvider.hasPlaceholder(line);
-        assertEquals("Wrong Check status", PlaceholderProvider.STATUS.unknown, check.getStatus());
-        String resolved = placeholderProvider.resolve(check);
-        assertEquals("Wrong resolved line", "Here comes {{unkown}} placeholders!", resolved);
-    }
-}
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationMapEntriesTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationMapEntriesTest.java
new file mode 100644
index 0000000..8392637
--- /dev/null
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationMapEntriesTest.java
@@ -0,0 +1,195 @@
+/*
+ * 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.resourceresolver.impl.mapping;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.resource.path.Path;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.event.EventAdmin;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.sling.resourceresolver.impl.mapping.MapEntries.PROP_REDIRECT_EXTERNAL;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+/**
+ * These are tests that are testing the Sling Interpolation Feature (SLING-7768)
+ * on the MapEntries level
+ */
+public class StringInterpolationMapEntriesTest {
+    private static final String PROP_REG_EXP = "sling:match";
+
+    @Mock
+    private MapConfigurationProvider resourceResolverFactory;
+
+    @Mock
+    private BundleContext bundleContext;
+
+    @Mock
+    private EventAdmin eventAdmin;
+
+    @Mock
+    private ResourceResolver resourceResolver;
+
+    @Mock
+    private StringInterpolationProviderConfiguration stringInterpolationProviderConfiguration;
+
+    File vanityBloomFilterFile;
+
+    private Resource map;
+    private Resource http;
+
+    @SuppressWarnings({"unchecked"})
+    @Before
+    public void setup() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        when(resourceResolverFactory.getServiceResourceResolver(any(Map.class))).thenReturn(resourceResolver);
+        when(resourceResolverFactory.isVanityPathEnabled()).thenReturn(true);
+        final List<MapConfigurationProvider.VanityPathConfig> configs = new ArrayList<>();
+        when(resourceResolverFactory.getVanityPathConfig()).thenReturn(configs);
+        when(resourceResolverFactory.isOptimizeAliasResolutionEnabled()).thenReturn(true);
+        when(resourceResolverFactory.isForceNoAliasTraversal()).thenReturn(true);
+        when(resourceResolverFactory.getObservationPaths()).thenReturn(new Path[] {new Path("/")});
+        when(resourceResolverFactory.getMapRoot()).thenReturn(MapEntries.DEFAULT_MAP_ROOT);
+        when(resourceResolverFactory.getMaxCachedVanityPathEntries()).thenReturn(-1L);
+        when(resourceResolverFactory.isMaxCachedVanityPathEntriesStartup()).thenReturn(true);
+        when(resourceResolver.findResources(anyString(), eq("sql"))).thenReturn(
+            Collections.<Resource> emptySet().iterator());
+        vanityBloomFilterFile = new File("target/test-classes/resourcesvanityBloomFilter.txt");
+        when(bundleContext.getDataFile("vanityBloomFilter.txt")).thenReturn(vanityBloomFilterFile);
+
+        map = setupEtcMapResource("/etc", "map");
+        http = setupEtcMapResource("http", map);
+    }
+
+    @Test
+    public void simple_node_string_interpolation() throws Exception {
+        // To avoid side effects the String Interpolation uses its own Resource Resolver
+        Resource sivOne = setupEtcMapResource("${siv.one}", http,PROP_REDIRECT_EXTERNAL, "/content/test-me");
+        StringInterpolationProvider stringInterpolationProvider = setupStringInterpolationProvider(new String[] {"siv.one=test-value"});
+
+        MapEntries mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
+        List<MapEntry> mapMaps = mapEntries.getResolveMaps();
+        assertEquals("Expected one mapping", 1, mapMaps.size());
+        MapEntry mapEntry = mapMaps.get(0);
+        assertEquals("Wrong String Interpolation for siv.one", "^http/test-value/", mapEntry.getPattern());
+        String[] redirects = mapEntry.getRedirect();
+        assertEquals("Expected one redirect", 1, redirects.length);
+        assertEquals("Wrong Mapping found for siv.one", "/content/test-me/", redirects[0]);
+    }
+
+    @Test
+    public void simple_match_string_interpolation() throws Exception {
+        // To avoid side effects the String Interpolation uses its own Resource Resolver
+        Resource sivOne = setupEtcMapResource("test-node", http,
+            PROP_REG_EXP, "${siv.one}/",
+            PROP_REDIRECT_EXTERNAL, "/content/test-me/"
+        );
+        StringInterpolationProvider stringInterpolationProvider = setupStringInterpolationProvider(new String[] {"siv.one=test-value"});
+
+        MapEntries mapEntries = new MapEntries(resourceResolverFactory, bundleContext, eventAdmin, stringInterpolationProvider);
+        List<MapEntry> mapMaps = mapEntries.getResolveMaps();
+        assertEquals("Expected one mapping", 1, mapMaps.size());
+        MapEntry mapEntry = mapMaps.get(0);
+        assertEquals("Wrong String Interpolation for siv.one", "^http/test-value/", mapEntry.getPattern());
+        String[] redirects = mapEntry.getRedirect();
+        assertEquals("Expected one redirect", 1, redirects.length);
+        assertEquals("Wrong Mapping found for siv.one", "/content/test-me/", redirects[0]);
+    }
+
+    // -------------------------- private methods ----------
+
+    private ValueMap buildValueMap(Object... string) {
+        final Map<String, Object> data = new HashMap<>();
+        for (int i = 0; i < string.length; i = i + 2) {
+            data.put((String) string[i], string[i+1]);
+        }
+        return new ValueMapDecorator(data);
+    }
+
+    private Resource setupEtcMapResource(String parentPath, String name, String...valueMapPairs) {
+        return setupEtcMapResource0(parentPath, name, null, valueMapPairs);
+    }
+    private Resource setupEtcMapResource(String name, Resource parent, String...valueMapPairs) {
+        return setupEtcMapResource0(null, name, parent, valueMapPairs);
+    }
+    private Resource setupEtcMapResource0(String parentPath, String name, Resource parent, String...valueMapPairs) {
+        Resource resource = mock(Resource.class, withSettings().name(name).extraInterfaces(ResourceDecorator.class));
+        String path = (parent == null ? parentPath : parent.getPath()) + "/" + name;
+        when(resource.getPath()).thenReturn(path);
+        when(resource.getName()).thenReturn(name);
+        ValueMap valueMap = buildValueMap(valueMapPairs);
+        when(resource.getValueMap()).thenReturn(valueMap);
+        when(resource.adaptTo(ValueMap.class)).thenReturn(valueMap);
+        when(resourceResolver.getResource(resource.getPath())).thenReturn(resource);
+        if(parent != null) {
+            List<Resource> childList = ((ResourceDecorator) parent).getChildrenList();
+            childList.add(resource);
+        }
+        final List<Resource> childrenList = new ArrayList<>();
+        when(((ResourceDecorator) resource).getChildrenList()).thenReturn(childrenList);
+        // Delay the children list iterator to make sure all children are added beforehand
+        // Iterators have a modCount that is set when created. Any changes to the underlying list will
+        // change that modCount and the usage of the iterator will fail due to Concurrent Modification Exception
+        when(resource.listChildren()).thenAnswer(new Answer<Iterator<Resource>>() {
+            @Override
+            public Iterator<Resource> answer(InvocationOnMock invocation) throws Throwable {
+                return childrenList.iterator();
+            }
+        });
+
+        return resource;
+    }
+
+    private StringInterpolationProvider setupStringInterpolationProvider(final String[] placeholderValues) {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(placeholderValues);
+        StringInterpolationProviderImpl stringInterpolationProvider = new StringInterpolationProviderImpl();
+        stringInterpolationProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+        return stringInterpolationProvider;
+    }
+
+    /**
+     * Iterator to piggyback the list of Resources onto a Resource Mock
+     * so that we can add children to them and create the iterators after
+     * everything is setup
+     */
+    private static interface ResourceDecorator {
+        public List<Resource> getChildrenList();
+    }
+}
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImplTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImplTest.java
new file mode 100644
index 0000000..212c928
--- /dev/null
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImplTest.java
@@ -0,0 +1,155 @@
+/*
+ * 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.resourceresolver.impl.mapping;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.osgi.framework.BundleContext;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+import static org.apache.sling.resourceresolver.impl.mapping.StringInterpolationProvider.PLACEHOLDER_START_TOKEN;
+import static org.apache.sling.resourceresolver.impl.mapping.StringInterpolationProvider.PLACEHOLDER_END_TOKEN;
+
+public class StringInterpolationProviderImplTest {
+
+    @Mock
+    private BundleContext bundleContext;
+
+    @Mock
+    private StringInterpolationProviderConfiguration stringInterpolationProviderConfiguration;
+
+    @SuppressWarnings({ "unchecked" })
+    @Before
+    public void setup() throws Exception {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void test_simple_one_placeholder() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "one=two"}
+        );
+
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = PLACEHOLDER_START_TOKEN + "one" + PLACEHOLDER_END_TOKEN;
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.found, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "two", resolved);
+    }
+
+    @Test
+    public void test_simple_text_one_placeholder() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "one=two"}
+        );
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = "Here is " + PLACEHOLDER_START_TOKEN + "one" + PLACEHOLDER_END_TOKEN + ", too";
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.found, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "Here is two, too", resolved);
+    }
+
+    @Test
+    public void test_two_placeholders() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "one=two", "three=four"}
+        );
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = PLACEHOLDER_START_TOKEN + "one" + PLACEHOLDER_END_TOKEN + " with another " + PLACEHOLDER_START_TOKEN + "three" + PLACEHOLDER_END_TOKEN;
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.found, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "two with another four", resolved);
+    }
+
+    @Test
+    public void test_three_placeholders() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "one=two", "three=four", "five=six"}
+        );
+
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = "Here comes " + PLACEHOLDER_START_TOKEN + "one" + PLACEHOLDER_END_TOKEN + " with another " + PLACEHOLDER_START_TOKEN + "three" + PLACEHOLDER_END_TOKEN + " equals " + PLACEHOLDER_START_TOKEN + "five" + PLACEHOLDER_END_TOKEN + ", horray!";
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.found, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "Here comes two with another four equals six, horray!", resolved);
+    }
+
+    @Test
+    public void test_no_placeholders() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "one=two", "three=four", "five=six"}
+        );
+
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = "Here comes is a text with no placeholders!";
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.none, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "Here comes is a text with no placeholders!", resolved);
+    }
+
+    @Test
+    public void test_unkown_placeholders() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "one=two", "three=four", "five=six"}
+        );
+
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = "Here comes " + PLACEHOLDER_START_TOKEN + "unkown" + PLACEHOLDER_END_TOKEN + " placeholders!";
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.unknown, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "Here comes ${unkown} placeholders!", resolved);
+    }
+
+    @Test
+    public void test_trailing_slash_placeholders() {
+        when(stringInterpolationProviderConfiguration.place_holder_key_value_pairs()).thenReturn(
+            new String[] { "siv.one=test-value"}
+        );
+
+        StringInterpolationProviderImpl placeholderProvider = new StringInterpolationProviderImpl();
+        placeholderProvider.activate(bundleContext, stringInterpolationProviderConfiguration);
+
+        String line = PLACEHOLDER_START_TOKEN + "siv.one" + PLACEHOLDER_END_TOKEN + "/";
+        StringInterpolationProvider.Check check = placeholderProvider.hasPlaceholder(line);
+        assertEquals("Wrong Check status", StringInterpolationProvider.STATUS.found, check.getStatus());
+        String resolved = placeholderProvider.resolve(check);
+        assertEquals("Wrong resolved line", "test-value/", resolved);
+    }
+}


[sling-org-apache-sling-resourceresolver] 01/02: Fix minor type

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andysch pushed a commit to branch feature/SLING-7768
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git

commit 92bd020efcbc65793a8af14bbe42dc72780b3483
Author: Andreas Schaefer <sc...@me.com>
AuthorDate: Mon Jul 16 15:52:36 2018 -0700

    Fix minor type
---
 .../resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java
index 33dc71e..eea215c 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PlaceholderProviderConfiguration.java
@@ -27,7 +27,7 @@ public @interface PlaceholderProviderConfiguration {
     @AttributeDefinition(
         name = "Placeholder Values",
         description = "A list of key / value pairs separated by a equal (=) sign. " +
-            "The key is not permitted to contain a '=' sign and the first occurrance of '=' " +
+            "The key is not permitted to contain a '=' sign and the first occurrence of '=' " +
             "separates the key from the value. If no '=' is found the entire key / value pair " +
             "is dropped.")
     String[] place_holder_key_value_pairs() default {"phv.default.host.name=localhost"};