You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2012/09/13 14:40:23 UTC

svn commit: r1384308 - in /sling/trunk/bundles/resourceresolver/src: main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java

Author: fmeschbe
Date: Thu Sep 13 12:40:23 2012
New Revision: 1384308

URL: http://svn.apache.org/viewvc?rev=1384308&view=rev
Log:
SLING-2560 Support reverse mapping with regular expressions:
  - sling:match may be a replacement pattern (with $1 etc. references)
  - sling:internalRedirect may be a regular expression
  - sling:internalRedirect regaular expressions ignored for the resolution map

Modified:
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
    sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java?rev=1384308&r1=1384307&r2=1384308&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java Thu Sep 13 12:40:23 2012
@@ -18,8 +18,6 @@
  */
 package org.apache.sling.resourceresolver.impl.mapping;
 
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -35,7 +33,7 @@ import org.slf4j.LoggerFactory;
  * The <code>MapEntry</code> class represents a mapping entry in the mapping
  * configuration tree at <code>/etc/map</code>.
  * <p>
- * 
+ *
  * @see "http://cwiki.apache.org/SLING/flexible-resource-resolution.html"
  */
 public class MapEntry implements Comparable<MapEntry> {
@@ -72,7 +70,7 @@ public class MapEntry implements Compara
     /**
      * Returns a string used for matching map entries against the given request
      * or URI parts.
-     * 
+     *
      * @param scheme
      *            The URI scheme
      * @param host
@@ -110,16 +108,17 @@ public class MapEntry implements Compara
         return uriPath;
     }
 
-    public static URI toURI(final String uriPath) {
+    /**
+     * Converts the resolution path of the form http/host.77/the/path into an
+     * URI of the form http://host:77/the/path where any potential default port
+     * (80 for http and 443 for https) is actually removed. If the path is just
+     * a regular path such as /the/path, this method returns <code>null</code>.
+     */
+    public static String toURI(final String uriPath) {
         for (int i = 0; i < PATH_TO_URL_MATCH.length; i++) {
             final Matcher m = PATH_TO_URL_MATCH[i].matcher(uriPath);
             if (m.find()) {
-                final String newUriPath = m.replaceAll(PATH_TO_URL_REPLACEMENT[i]);
-                try {
-                    return new URI(newUriPath);
-                } catch (final URISyntaxException use) {
-                    // ignore, just don't return the uri as such
-                }
+                return m.replaceAll(PATH_TO_URL_REPLACEMENT[i]);
             }
         }
 
@@ -143,9 +142,9 @@ public class MapEntry implements Compara
                 return new MapEntry(url, status, trailingSlash, redirect);
             }
 
-            final String[] internalRedirect = props
-                            .get(ResourceResolverImpl.PROP_REDIRECT_INTERNAL,
-                                            String[].class);
+            final String[] internalRedirectProps = props.get(ResourceResolverImpl.PROP_REDIRECT_INTERNAL,
+                String[].class);
+            final String[] internalRedirect = filterRegExp(internalRedirectProps);
             if (internalRedirect != null) {
                 return new MapEntry(url, -1, trailingSlash, internalRedirect);
             }
@@ -196,12 +195,11 @@ public class MapEntry implements Compara
                                             String[].class);
             if (internalRedirect != null) {
 
+                // check whether the url is considered external or internal
                 int status = -1;
-                final URI extPathPrefix = toURI(url);
-                if (extPathPrefix != null) {
-                    url = getURI(extPathPrefix.getScheme(),
-                                    extPathPrefix.getHost(), extPathPrefix.getPort(),
-                                    extPathPrefix.getPath());
+                final String pathUri = toURI(url);
+                if (pathUri != null) {
+                    url = pathUri;
                     status = 302;
                 }
 
@@ -323,7 +321,7 @@ public class MapEntry implements Compara
     /**
      * Returns <code>true</code> if the string contains unescaped regular
      * expression special characters '+', '*', '?', '|', '(', '), '[', and ']'
-     * 
+     *
      * @param string
      * @return
      */
@@ -338,4 +336,26 @@ public class MapEntry implements Compara
         }
         return false;
     }
+
+    /**
+     * Returns an array of strings copied from the given strings where any
+     * regular expressions in the array are removed. If the input is
+     * <code>null</code> or no strings are provided <code>null</code> is
+     * returned. <code>null</code> is also returned if the strings only contain
+     * regular expressions.
+     */
+    private static String[] filterRegExp(final String... strings) {
+        if (strings == null || strings.length == 0) {
+            return null;
+        }
+
+        ArrayList<String> list = new ArrayList<String>(strings.length);
+        for (String string : strings) {
+            if (!isRegExp(string)) {
+                list.add(string);
+            }
+        }
+
+        return list.isEmpty() ? null : (String[]) list.toArray(new String[list.size()]);
+    }
 }

Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java?rev=1384308&r1=1384307&r2=1384308&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java Thu Sep 13 12:40:23 2012
@@ -23,8 +23,6 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.fail;
 
 import java.lang.reflect.Method;
-import java.net.URI;
-
 import junit.framework.TestCase;
 
 import org.apache.sling.resourceresolver.impl.mapping.MapEntry;
@@ -149,8 +147,39 @@ public class MapEntryTest {
         TestCase.assertTrue(isRegExp("http/[^.]+.www.example.com.8080/bla"));
     }
 
+    @Test public void test_filterRegExp() {
+        TestCase.assertNull(filterRegExp((String[]) null));
+        TestCase.assertNull(filterRegExp(new String[0]));
+
+        String aString = "plain";
+        String aString2 = "plain2";
+        String aPattern = "http/[^.]+.www.example.com.8080/bla";
+
+        TestCase.assertNull(filterRegExp(aPattern));
+
+        String[] res = filterRegExp(aString);
+        TestCase.assertNotNull(res);
+        TestCase.assertEquals(1, res.length);
+        TestCase.assertEquals(aString, res[0]);
+
+        res = filterRegExp(aString, aPattern);
+        TestCase.assertNotNull(res);
+        TestCase.assertEquals(1, res.length);
+        TestCase.assertEquals(aString, res[0]);
+
+        res = filterRegExp(aPattern, aString, aPattern);
+        TestCase.assertNotNull(res);
+        TestCase.assertEquals(1, res.length);
+        TestCase.assertEquals(aString, res[0]);
+
+        res = filterRegExp(aPattern, aString);
+        TestCase.assertNotNull(res);
+        TestCase.assertEquals(1, res.length);
+        TestCase.assertEquals(aString, res[0]);
+    }
+
     private void assertEqualUri(String expected, String uriPath) {
-        URI uri = MapEntry.toURI(uriPath);
+        String uri = MapEntry.toURI(uriPath);
         assertNotNull("Failed converting " + uriPath, uri);
         assertEquals(expected, uri.toString());
     }
@@ -171,4 +200,17 @@ public class MapEntryTest {
             return false; // quiesc compiler
         }
     }
+
+    private String[] filterRegExp(final String... strings) {
+        try {
+            Method m = MapEntry.class.getDeclaredMethod("filterRegExp", String[].class);
+            m.setAccessible(true);
+            return (String[]) m.invoke(null, new Object[] {
+                strings
+            });
+        } catch (Exception e) {
+            fail(e.toString());
+            return null; // quiesc compiler
+        }
+    }
 }



Re: svn commit: r1384308 - in /sling/trunk/bundles/resourceresolver/src: main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java

Posted by Felix Meschberger <fm...@adobe.com>.
Hi,

Am 13.09.2012 um 18:24 schrieb Justin Edelson:

> Hi Felix,
> Can you confirm that this change does not impact the current behavior
> that if sling:match is a regex, no mapping map entry is created? It
> looks that way to me, but I wanted to doublecheck.

Yes, I can confirm because I built it in (in the second chechin, though). There is a new filterRegExp method which takes the configured internal redirects and returns a list without any redirects containing regexp patterns.

This way, such regex internal redirects are ignored.

Regards
Felix


> 
> Thanks,
> Justin
> 
> 
> On Thu, Sep 13, 2012 at 8:40 AM,  <fm...@apache.org> wrote:
>> Author: fmeschbe
>> Date: Thu Sep 13 12:40:23 2012
>> New Revision: 1384308
>> 
>> URL: http://svn.apache.org/viewvc?rev=1384308&view=rev
>> Log:
>> SLING-2560 Support reverse mapping with regular expressions:
>>  - sling:match may be a replacement pattern (with $1 etc. references)
>>  - sling:internalRedirect may be a regular expression
>>  - sling:internalRedirect regaular expressions ignored for the resolution map
>> 
>> Modified:
>>    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
>>    sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java
>> 
>> Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
>> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java?rev=1384308&r1=1384307&r2=1384308&view=diff
>> ==============================================================================
>> --- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java (original)
>> +++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java Thu Sep 13 12:40:23 2012
>> @@ -18,8 +18,6 @@
>>  */
>> package org.apache.sling.resourceresolver.impl.mapping;
>> 
>> -import java.net.URI;
>> -import java.net.URISyntaxException;
>> import java.util.ArrayList;
>> import java.util.Arrays;
>> import java.util.List;
>> @@ -35,7 +33,7 @@ import org.slf4j.LoggerFactory;
>>  * The <code>MapEntry</code> class represents a mapping entry in the mapping
>>  * configuration tree at <code>/etc/map</code>.
>>  * <p>
>> - *
>> + *
>>  * @see "http://cwiki.apache.org/SLING/flexible-resource-resolution.html"
>>  */
>> public class MapEntry implements Comparable<MapEntry> {
>> @@ -72,7 +70,7 @@ public class MapEntry implements Compara
>>     /**
>>      * Returns a string used for matching map entries against the given request
>>      * or URI parts.
>> -     *
>> +     *
>>      * @param scheme
>>      *            The URI scheme
>>      * @param host
>> @@ -110,16 +108,17 @@ public class MapEntry implements Compara
>>         return uriPath;
>>     }
>> 
>> -    public static URI toURI(final String uriPath) {
>> +    /**
>> +     * Converts the resolution path of the form http/host.77/the/path into an
>> +     * URI of the form http://host:77/the/path where any potential default port
>> +     * (80 for http and 443 for https) is actually removed. If the path is just
>> +     * a regular path such as /the/path, this method returns <code>null</code>.
>> +     */
>> +    public static String toURI(final String uriPath) {
>>         for (int i = 0; i < PATH_TO_URL_MATCH.length; i++) {
>>             final Matcher m = PATH_TO_URL_MATCH[i].matcher(uriPath);
>>             if (m.find()) {
>> -                final String newUriPath = m.replaceAll(PATH_TO_URL_REPLACEMENT[i]);
>> -                try {
>> -                    return new URI(newUriPath);
>> -                } catch (final URISyntaxException use) {
>> -                    // ignore, just don't return the uri as such
>> -                }
>> +                return m.replaceAll(PATH_TO_URL_REPLACEMENT[i]);
>>             }
>>         }
>> 
>> @@ -143,9 +142,9 @@ public class MapEntry implements Compara
>>                 return new MapEntry(url, status, trailingSlash, redirect);
>>             }
>> 
>> -            final String[] internalRedirect = props
>> -                            .get(ResourceResolverImpl.PROP_REDIRECT_INTERNAL,
>> -                                            String[].class);
>> +            final String[] internalRedirectProps = props.get(ResourceResolverImpl.PROP_REDIRECT_INTERNAL,
>> +                String[].class);
>> +            final String[] internalRedirect = filterRegExp(internalRedirectProps);
>>             if (internalRedirect != null) {
>>                 return new MapEntry(url, -1, trailingSlash, internalRedirect);
>>             }
>> @@ -196,12 +195,11 @@ public class MapEntry implements Compara
>>                                             String[].class);
>>             if (internalRedirect != null) {
>> 
>> +                // check whether the url is considered external or internal
>>                 int status = -1;
>> -                final URI extPathPrefix = toURI(url);
>> -                if (extPathPrefix != null) {
>> -                    url = getURI(extPathPrefix.getScheme(),
>> -                                    extPathPrefix.getHost(), extPathPrefix.getPort(),
>> -                                    extPathPrefix.getPath());
>> +                final String pathUri = toURI(url);
>> +                if (pathUri != null) {
>> +                    url = pathUri;
>>                     status = 302;
>>                 }
>> 
>> @@ -323,7 +321,7 @@ public class MapEntry implements Compara
>>     /**
>>      * Returns <code>true</code> if the string contains unescaped regular
>>      * expression special characters '+', '*', '?', '|', '(', '), '[', and ']'
>> -     *
>> +     *
>>      * @param string
>>      * @return
>>      */
>> @@ -338,4 +336,26 @@ public class MapEntry implements Compara
>>         }
>>         return false;
>>     }
>> +
>> +    /**
>> +     * Returns an array of strings copied from the given strings where any
>> +     * regular expressions in the array are removed. If the input is
>> +     * <code>null</code> or no strings are provided <code>null</code> is
>> +     * returned. <code>null</code> is also returned if the strings only contain
>> +     * regular expressions.
>> +     */
>> +    private static String[] filterRegExp(final String... strings) {
>> +        if (strings == null || strings.length == 0) {
>> +            return null;
>> +        }
>> +
>> +        ArrayList<String> list = new ArrayList<String>(strings.length);
>> +        for (String string : strings) {
>> +            if (!isRegExp(string)) {
>> +                list.add(string);
>> +            }
>> +        }
>> +
>> +        return list.isEmpty() ? null : (String[]) list.toArray(new String[list.size()]);
>> +    }
>> }
>> 
>> Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java
>> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java?rev=1384308&r1=1384307&r2=1384308&view=diff
>> ==============================================================================
>> --- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java (original)
>> +++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java Thu Sep 13 12:40:23 2012
>> @@ -23,8 +23,6 @@ import static org.junit.Assert.assertNot
>> import static org.junit.Assert.fail;
>> 
>> import java.lang.reflect.Method;
>> -import java.net.URI;
>> -
>> import junit.framework.TestCase;
>> 
>> import org.apache.sling.resourceresolver.impl.mapping.MapEntry;
>> @@ -149,8 +147,39 @@ public class MapEntryTest {
>>         TestCase.assertTrue(isRegExp("http/[^.]+.www.example.com.8080/bla"));
>>     }
>> 
>> +    @Test public void test_filterRegExp() {
>> +        TestCase.assertNull(filterRegExp((String[]) null));
>> +        TestCase.assertNull(filterRegExp(new String[0]));
>> +
>> +        String aString = "plain";
>> +        String aString2 = "plain2";
>> +        String aPattern = "http/[^.]+.www.example.com.8080/bla";
>> +
>> +        TestCase.assertNull(filterRegExp(aPattern));
>> +
>> +        String[] res = filterRegExp(aString);
>> +        TestCase.assertNotNull(res);
>> +        TestCase.assertEquals(1, res.length);
>> +        TestCase.assertEquals(aString, res[0]);
>> +
>> +        res = filterRegExp(aString, aPattern);
>> +        TestCase.assertNotNull(res);
>> +        TestCase.assertEquals(1, res.length);
>> +        TestCase.assertEquals(aString, res[0]);
>> +
>> +        res = filterRegExp(aPattern, aString, aPattern);
>> +        TestCase.assertNotNull(res);
>> +        TestCase.assertEquals(1, res.length);
>> +        TestCase.assertEquals(aString, res[0]);
>> +
>> +        res = filterRegExp(aPattern, aString);
>> +        TestCase.assertNotNull(res);
>> +        TestCase.assertEquals(1, res.length);
>> +        TestCase.assertEquals(aString, res[0]);
>> +    }
>> +
>>     private void assertEqualUri(String expected, String uriPath) {
>> -        URI uri = MapEntry.toURI(uriPath);
>> +        String uri = MapEntry.toURI(uriPath);
>>         assertNotNull("Failed converting " + uriPath, uri);
>>         assertEquals(expected, uri.toString());
>>     }
>> @@ -171,4 +200,17 @@ public class MapEntryTest {
>>             return false; // quiesc compiler
>>         }
>>     }
>> +
>> +    private String[] filterRegExp(final String... strings) {
>> +        try {
>> +            Method m = MapEntry.class.getDeclaredMethod("filterRegExp", String[].class);
>> +            m.setAccessible(true);
>> +            return (String[]) m.invoke(null, new Object[] {
>> +                strings
>> +            });
>> +        } catch (Exception e) {
>> +            fail(e.toString());
>> +            return null; // quiesc compiler
>> +        }
>> +    }
>> }
>> 
>> 


Re: svn commit: r1384308 - in /sling/trunk/bundles/resourceresolver/src: main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java

Posted by Justin Edelson <ju...@justinedelson.com>.
Hi Felix,
Can you confirm that this change does not impact the current behavior
that if sling:match is a regex, no mapping map entry is created? It
looks that way to me, but I wanted to doublecheck.

Thanks,
Justin


On Thu, Sep 13, 2012 at 8:40 AM,  <fm...@apache.org> wrote:
> Author: fmeschbe
> Date: Thu Sep 13 12:40:23 2012
> New Revision: 1384308
>
> URL: http://svn.apache.org/viewvc?rev=1384308&view=rev
> Log:
> SLING-2560 Support reverse mapping with regular expressions:
>   - sling:match may be a replacement pattern (with $1 etc. references)
>   - sling:internalRedirect may be a regular expression
>   - sling:internalRedirect regaular expressions ignored for the resolution map
>
> Modified:
>     sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
>     sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java
>
> Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java?rev=1384308&r1=1384307&r2=1384308&view=diff
> ==============================================================================
> --- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java (original)
> +++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java Thu Sep 13 12:40:23 2012
> @@ -18,8 +18,6 @@
>   */
>  package org.apache.sling.resourceresolver.impl.mapping;
>
> -import java.net.URI;
> -import java.net.URISyntaxException;
>  import java.util.ArrayList;
>  import java.util.Arrays;
>  import java.util.List;
> @@ -35,7 +33,7 @@ import org.slf4j.LoggerFactory;
>   * The <code>MapEntry</code> class represents a mapping entry in the mapping
>   * configuration tree at <code>/etc/map</code>.
>   * <p>
> - *
> + *
>   * @see "http://cwiki.apache.org/SLING/flexible-resource-resolution.html"
>   */
>  public class MapEntry implements Comparable<MapEntry> {
> @@ -72,7 +70,7 @@ public class MapEntry implements Compara
>      /**
>       * Returns a string used for matching map entries against the given request
>       * or URI parts.
> -     *
> +     *
>       * @param scheme
>       *            The URI scheme
>       * @param host
> @@ -110,16 +108,17 @@ public class MapEntry implements Compara
>          return uriPath;
>      }
>
> -    public static URI toURI(final String uriPath) {
> +    /**
> +     * Converts the resolution path of the form http/host.77/the/path into an
> +     * URI of the form http://host:77/the/path where any potential default port
> +     * (80 for http and 443 for https) is actually removed. If the path is just
> +     * a regular path such as /the/path, this method returns <code>null</code>.
> +     */
> +    public static String toURI(final String uriPath) {
>          for (int i = 0; i < PATH_TO_URL_MATCH.length; i++) {
>              final Matcher m = PATH_TO_URL_MATCH[i].matcher(uriPath);
>              if (m.find()) {
> -                final String newUriPath = m.replaceAll(PATH_TO_URL_REPLACEMENT[i]);
> -                try {
> -                    return new URI(newUriPath);
> -                } catch (final URISyntaxException use) {
> -                    // ignore, just don't return the uri as such
> -                }
> +                return m.replaceAll(PATH_TO_URL_REPLACEMENT[i]);
>              }
>          }
>
> @@ -143,9 +142,9 @@ public class MapEntry implements Compara
>                  return new MapEntry(url, status, trailingSlash, redirect);
>              }
>
> -            final String[] internalRedirect = props
> -                            .get(ResourceResolverImpl.PROP_REDIRECT_INTERNAL,
> -                                            String[].class);
> +            final String[] internalRedirectProps = props.get(ResourceResolverImpl.PROP_REDIRECT_INTERNAL,
> +                String[].class);
> +            final String[] internalRedirect = filterRegExp(internalRedirectProps);
>              if (internalRedirect != null) {
>                  return new MapEntry(url, -1, trailingSlash, internalRedirect);
>              }
> @@ -196,12 +195,11 @@ public class MapEntry implements Compara
>                                              String[].class);
>              if (internalRedirect != null) {
>
> +                // check whether the url is considered external or internal
>                  int status = -1;
> -                final URI extPathPrefix = toURI(url);
> -                if (extPathPrefix != null) {
> -                    url = getURI(extPathPrefix.getScheme(),
> -                                    extPathPrefix.getHost(), extPathPrefix.getPort(),
> -                                    extPathPrefix.getPath());
> +                final String pathUri = toURI(url);
> +                if (pathUri != null) {
> +                    url = pathUri;
>                      status = 302;
>                  }
>
> @@ -323,7 +321,7 @@ public class MapEntry implements Compara
>      /**
>       * Returns <code>true</code> if the string contains unescaped regular
>       * expression special characters '+', '*', '?', '|', '(', '), '[', and ']'
> -     *
> +     *
>       * @param string
>       * @return
>       */
> @@ -338,4 +336,26 @@ public class MapEntry implements Compara
>          }
>          return false;
>      }
> +
> +    /**
> +     * Returns an array of strings copied from the given strings where any
> +     * regular expressions in the array are removed. If the input is
> +     * <code>null</code> or no strings are provided <code>null</code> is
> +     * returned. <code>null</code> is also returned if the strings only contain
> +     * regular expressions.
> +     */
> +    private static String[] filterRegExp(final String... strings) {
> +        if (strings == null || strings.length == 0) {
> +            return null;
> +        }
> +
> +        ArrayList<String> list = new ArrayList<String>(strings.length);
> +        for (String string : strings) {
> +            if (!isRegExp(string)) {
> +                list.add(string);
> +            }
> +        }
> +
> +        return list.isEmpty() ? null : (String[]) list.toArray(new String[list.size()]);
> +    }
>  }
>
> Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java?rev=1384308&r1=1384307&r2=1384308&view=diff
> ==============================================================================
> --- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java (original)
> +++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntryTest.java Thu Sep 13 12:40:23 2012
> @@ -23,8 +23,6 @@ import static org.junit.Assert.assertNot
>  import static org.junit.Assert.fail;
>
>  import java.lang.reflect.Method;
> -import java.net.URI;
> -
>  import junit.framework.TestCase;
>
>  import org.apache.sling.resourceresolver.impl.mapping.MapEntry;
> @@ -149,8 +147,39 @@ public class MapEntryTest {
>          TestCase.assertTrue(isRegExp("http/[^.]+.www.example.com.8080/bla"));
>      }
>
> +    @Test public void test_filterRegExp() {
> +        TestCase.assertNull(filterRegExp((String[]) null));
> +        TestCase.assertNull(filterRegExp(new String[0]));
> +
> +        String aString = "plain";
> +        String aString2 = "plain2";
> +        String aPattern = "http/[^.]+.www.example.com.8080/bla";
> +
> +        TestCase.assertNull(filterRegExp(aPattern));
> +
> +        String[] res = filterRegExp(aString);
> +        TestCase.assertNotNull(res);
> +        TestCase.assertEquals(1, res.length);
> +        TestCase.assertEquals(aString, res[0]);
> +
> +        res = filterRegExp(aString, aPattern);
> +        TestCase.assertNotNull(res);
> +        TestCase.assertEquals(1, res.length);
> +        TestCase.assertEquals(aString, res[0]);
> +
> +        res = filterRegExp(aPattern, aString, aPattern);
> +        TestCase.assertNotNull(res);
> +        TestCase.assertEquals(1, res.length);
> +        TestCase.assertEquals(aString, res[0]);
> +
> +        res = filterRegExp(aPattern, aString);
> +        TestCase.assertNotNull(res);
> +        TestCase.assertEquals(1, res.length);
> +        TestCase.assertEquals(aString, res[0]);
> +    }
> +
>      private void assertEqualUri(String expected, String uriPath) {
> -        URI uri = MapEntry.toURI(uriPath);
> +        String uri = MapEntry.toURI(uriPath);
>          assertNotNull("Failed converting " + uriPath, uri);
>          assertEquals(expected, uri.toString());
>      }
> @@ -171,4 +200,17 @@ public class MapEntryTest {
>              return false; // quiesc compiler
>          }
>      }
> +
> +    private String[] filterRegExp(final String... strings) {
> +        try {
> +            Method m = MapEntry.class.getDeclaredMethod("filterRegExp", String[].class);
> +            m.setAccessible(true);
> +            return (String[]) m.invoke(null, new Object[] {
> +                strings
> +            });
> +        } catch (Exception e) {
> +            fail(e.toString());
> +            return null; // quiesc compiler
> +        }
> +    }
>  }
>
>