Prototype api
diff --git a/src/main/java/org/apache/sling/api/resource/ResourceResolver.java b/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
index 8a2b27d..73be59e 100644
--- a/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
+++ b/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
@@ -22,12 +22,13 @@
import java.util.Iterator;
import java.util.Map;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
import javax.servlet.http.HttpServletRequest;
import org.apache.sling.api.adapter.Adaptable;
+import org.apache.sling.api.resource.mapping.PathRewriter;
import org.apache.sling.api.resource.mapping.ResourceMapper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.osgi.annotation.versioning.ProviderType;
/**
@@ -172,16 +173,39 @@
String PROPERTY_RESOURCE_TYPE = "sling:resourceType";
/**
- * Resolves the resource from the given <code>absPath</code> optionally
- * taking <code>HttpServletRequest</code> into account, such as the value of
- * the <code>Host</code> request header. Returns a
+ * Resolves the resource from the given absolute path. Returns a
* {@link NonExistingResource} if the path cannot be resolved to an existing
* and accessible resource.
* <p>
- * The difference between this method and the {@link #resolve(String)}
- * method is, that this method may take request properties like the scheme,
- * the host header or request parameters into account to resolve the
- * resource.
+ *
+ * @param absPath The absolute path to be resolved to a resource. If this
+ * parameter is <code>null</code>, it is assumed to address the
+ * root of the resource tree. If the path is relative it is
+ * assumed relative to the root, that is a slash is prepended to
+ * the path before resolving it.
+ * @return The {@link Resource} addressed by the <code>absPath</code> or a
+ * {@link NonExistingResource} if no such resource can be resolved.
+ * @throws org.apache.sling.api.SlingException Or a subclass thereof may be
+ * thrown if an error occurs trying to resolve the resource.
+ * @throws IllegalStateException if this resource resolver has already been
+ * {@link #close() closed}.
+ * @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+ * Resolve a resource based on the path.
+ * @param path The full path
+ * @return The resolved resource
+ * @since 2.13.0
+ */
+ @NotNull Resource resolveResource(@NotNull String path);
+
+ /**
+ * Return the path rewriter associated with this resolver
+ * @return The path rewriter.
+ * @since 2.13.0
+ */
+ @NotNull PathRewriter getPathRewriter();
+
+ /**
+ * Same as calling rewrite on the path rewriter and resolveResource with the result.
*
* @param request The http servlet request object providing more hints at
* how to resolve the <code>absPath</code>. This parameter may be
@@ -200,22 +224,13 @@
* {@link #close() closed}.
* @since 2.0.4 (Sling API Bundle 2.0.4)
* @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+ * @deprecated
*/
+ @Deprecated
@NotNull Resource resolve(@NotNull HttpServletRequest request, @NotNull String absPath);
/**
- * Resolves the resource from the given absolute path. Returns a
- * {@link NonExistingResource} if the path cannot be resolved to an existing
- * and accessible resource.
- * <p>
- * This method is intended to apply the same algorithm to the absolute path
- * as is used by the {@link #resolve(HttpServletRequest)} method except for
- * cases where the latter uses request property such as request headers or
- * request parameters to resolve a resource.
- * <p>
- * It is ok for the implementation of this method to just call the
- * {@link #resolve(HttpServletRequest, String)} method with
- * <code>null</code> as the request argument.
+ * Same as calling rewrite on the path rewriter and resolveResource with the result.
*
* @param absPath The absolute path to be resolved to a resource. If this
* parameter is <code>null</code>, it is assumed to address the
@@ -229,7 +244,9 @@
* @throws IllegalStateException if this resource resolver has already been
* {@link #close() closed}.
* @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+ * @deprecated
*/
+ @Deprecated
@NotNull Resource resolve(@NotNull String absPath);
/**
@@ -262,60 +279,23 @@
@NotNull Resource resolve(@NotNull HttpServletRequest request);
/**
- * Returns a (request) path mapped from the (resource) path applying the reverse
- * mapping used by the {@link #resolve(String)} such that when the path is
- * given to the {@link #resolve(String)} method the same resource is
- * returned.
- * <p>
- * Note, that technically the <code>resourcePath</code> need not refer to an
- * existing resource. This method just applies the mappings and returns the
- * resulting string. If the <code>resourcePath</code> does not address an
- * existing resource roundtripping may of course not work and calling
- * {@link #resolve(String)} with the path returned may return
- * <code>null</code>.
- * <p>
- * This method is intended as the reverse operation of the
- * {@link #resolve(String)} method.
- * <p>
- * This method also does percent-encoding before returning the (request) path
- * (with charset UTF-8). Due to this calling this method multiple times in a nested
- * fashion might lead to an invalid (request) path which can subsequently not
- * be resolved via {@link #resolve(String)}.
+ * Same as calling reverseRewrite on the path rewriter
*
* @param resourcePath The path for which to return a mapped path.
* @return The mapped path.
* @throws IllegalStateException if this resource resolver has already been
* {@link #close() closed}.
- *
+ *
* @see ResourceMapper#getMapping(String, HttpServletRequest)
* @see <a href="https://tools.ietf.org/html/rfc3986#section-2.1">Percent-Encoding</a>
* @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+ * @deprecated
*/
+ @Deprecated
@NotNull String map(@NotNull String resourcePath);
/**
- * Returns an URL mapped from the (resource) path applying the reverse
- * mapping used by the {@link #resolve(HttpServletRequest, String)} such
- * that when the path is given to the
- * {@link #resolve(HttpServletRequest, String)} method the same resource is
- * returned.
- * <p>
- * Note, that technically the <code>resourcePath</code> need not refer to an
- * existing resource. This method just applies the mappings and returns the
- * resulting string. If the <code>resourcePath</code> does not address an
- * existing resource roundtripping may of course not work and calling
- * {@link #resolve(HttpServletRequest, String)} with the path returned may
- * return <code>null</code>.
- * <p>
- * This method is intended as the reverse operation of the
- * {@link #resolve(HttpServletRequest, String)} method. As such the URL
- * returned is expected to be an absolute URL including scheme, host, any
- * servlet context path and the actual path used to resolve the resource.
- * <p>
- * This method also does percent-encoding before returning the URL
- * (with charset UTF-8). Due to this calling this method multiple times in a nested
- * fashion might lead to an invalid URL which can subsequently not
- * be resolved via {@link #resolve(String)}.
+ * Same as calling reverseRewrite on the path rewriter
*
* @param request The http servlet request object which may be used to apply
* more mapping functionality.
@@ -324,11 +304,13 @@
* @throws IllegalStateException if this resource resolver has already been
* {@link #close() closed}.
* @since 2.0.4 (Sling API Bundle 2.0.4)
- *
+ *
* @see ResourceMapper#getMapping(String, HttpServletRequest)
* @see <a href="https://tools.ietf.org/html/rfc3986#section-2.1">Percent-Encoding</a>
* @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+ * @deprecated
*/
+ @Deprecated
@Nullable String map(@NotNull HttpServletRequest request, @NotNull String resourcePath);
/**
diff --git a/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java b/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
index 111c34c..8ce3967 100644
--- a/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
+++ b/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
@@ -21,9 +21,8 @@
import java.util.List;
import java.util.Map;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
-
+import org.jetbrains.annotations.Nullable;
import org.osgi.annotation.versioning.ProviderType;
/**
@@ -100,6 +99,13 @@
String SUBSERVICE = "sling.service.subservice";
/**
+ * Name of the authentication information property to pass in a
+ * dedicated PathRewriter object
+ * @since 2.13.0
+ */
+ String PATH_REWRITER = "service.path.rewriter";
+
+ /**
* Returns a new {@link ResourceResolver} instance with further
* configuration taken from the given <code>authenticationInfo</code> map.
* Generally this map will contain a user name and password to authenticate.
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/PathRewriter.java b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriter.java
new file mode 100644
index 0000000..47d9124
--- /dev/null
+++ b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriter.java
@@ -0,0 +1,43 @@
+/*
+ * 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.api.resource.mapping;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * @since 1.1.0
+ */
+@ProviderType
+public interface PathRewriter {
+
+ @NotNull String rewrite(@NotNull String path);
+
+ @NotNull String rewrite(@NotNull HttpServletRequest request, @NotNull String path);
+
+ @NotNull String reverseRewrite(@NotNull String path);
+
+ @NotNull String reverseRewrite(@NotNull HttpServletRequest request, @NotNull String path);
+
+
+ @Nullable HttpServletRequest getDefaultRequest();
+}
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/PathRewriterFactory.java b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriterFactory.java
new file mode 100644
index 0000000..b6c3d88
--- /dev/null
+++ b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriterFactory.java
@@ -0,0 +1,35 @@
+/*
+ * 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.api.resource.mapping;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * @since 1.1.0
+ */
+@ProviderType
+public interface PathRewriterFactory {
+
+ @NotNull PathRewriter newPathWriter();
+
+ @NotNull PathRewriter newPathWriter(@NotNull HttpServletRequest request);
+}
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java b/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java
index a302469..b218bc6 100644
--- a/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java
+++ b/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java
@@ -22,45 +22,44 @@
import javax.servlet.http.HttpServletRequest;
-import org.apache.sling.api.resource.ResourceResolver;
import org.jetbrains.annotations.NotNull;
import org.osgi.annotation.versioning.ProviderType;
/**
* Allows access to resource mappings
- *
+ *
* <p>This interface superceeds the resource mapping functionality present
- * in the {@link ResourceResolver}. Although the methods present in that
+ * in the {@link org.apache.sling.api.resource.ResourceResolver}. Although the methods present in that
* interface will continue to work, the resource mapper will provide better
* APIs to access the resource mappings.</p>
- *
- * <p>Implementations of this class are obtained by adapting a {@link ResourceResolver}
+ *
+ * <p>Implementations of this class are obtained by adapting a {@link org.apache.sling.api.resource.ResourceResolver}
* instance. As such, the mappings returned by its methods reflect the repository
- * permissions of the underyling resolver instance.</p>
+ * permissions of the underyling resolver instance.</p>
*/
@ProviderType
public interface ResourceMapper {
-
+
/**
* Returns a path mapped from the (resource) path applying the reverse
- * mapping used by the {@link ResourceResolver#resolve(String)} such that when the path is
- * given to the {@link ResourceResolver#resolve(String)} method the same resource is
+ * mapping used by the {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} such that when the path is
+ * given to the {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} method the same resource is
* returned.
* <p>
* Note, that technically the <code>resourcePath</code> need not refer to an
* existing resource. This method just applies the mappings and returns the
* resulting string. If the <code>resourcePath</code> does not address an
* existing resource roundtripping may of course not work and calling
- * {@link ResourceResolver#resolve(String)} with the path returned may return
+ * {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} with the path returned may return
* <code>null</code>.
* <p>
* This method is intended as the reverse operation of the
- * {@link ResourceResolver#resolve(String)} method.
+ * {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} method.
*
* @param resourcePath The path for which to return a mapped path.
* @return The mapped path.
* @throws IllegalStateException if the underlying resource resolver has already been
- * {@link ResourceResolver#close() closed}.
+ * {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
*
* @since 1.0.0 (Sling API Bundle 2.19.0)
*/
@@ -68,20 +67,20 @@
/**
* Returns an URL mapped from the (resource) path applying the reverse
- * mapping used by the {@link ResourceResolver#resolve(HttpServletRequest, String)} such
+ * mapping used by the {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} such
* that when the path is given to the
- * {@link ResourceResolver#resolve(HttpServletRequest, String)} method the same resource is
+ * {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} method the same resource is
* returned.
* <p>
* Note, that technically the <code>resourcePath</code> need not refer to an
* existing resource. This method just applies the mappings and returns the
* resulting string. If the <code>resourcePath</code> does not address an
* existing resource roundtripping may of course not work and calling
- * {@link ResourceResolver#resolve(HttpServletRequest, String)} with the path returned may
+ * {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} with the path returned may
* return <code>null</code>.
* <p>
* This method is intended as the reverse operation of the
- * {@link ResourceResolver#resolve(HttpServletRequest, String)} method. As such the URL
+ * {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} method. As such the URL
* returned is expected to be an absolute URL including scheme, host, any
* servlet context path and the actual path used to resolve the resource.
@@ -90,46 +89,46 @@
* more mapping functionality.
* @return The mapped URL.
* @throws IllegalStateException if the underlying resource resolver has already been
- * {@link ResourceResolver#close() closed}.
+ * {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
* @since 1.0.0 (Sling API Bundle 2.19.0)
*/
@NotNull String getMapping(@NotNull String resourcePath, @NotNull HttpServletRequest request);
-
+
/**
* Returns all possible mappings for a given {@code resourcePath} as paths.
- *
+ *
* <p>
* This method differs from the {@link #getMapping(String)} variant
* by guaranteeing that all possible mappings are returned for a specified path.
- *
+ *
* <p>
* The mappings are not returned in any particular order.
- *
+ *
* @param resourcePath The path for which to return a mapped path.
* @return a collection of mapped URLs, in no particular order. May not be null or empty.
* @throws IllegalStateException if the underlying resource resolver has already been
- * {@link ResourceResolver#close() closed}.
+ * {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
* @since 1.0.0 (Sling API Bundle 2.19.0)
*/
Collection<String> getAllMappings(@NotNull String resourcePath);
/**
* Returns all possible mappings for a given {@code resourcePath} as URLs.
- *
+ *
* <p>
* This method differs from the {@link #getMapping(String, HttpServletRequest)} variant
* by guaranteeing that all possible mappings are returned for a specified path.
- *
+ *
* <p>
* The mappings are not returned in any particular order.
- *
+ *
* @param resourcePath The path for which to return a mapped path.
* @param request The http servlet request object which may be used to apply
* more mapping functionality.
* @return a collection of mapped URLs, in no particular order. May not be null or empty.
* @throws IllegalStateException if the underlying resource resolver has already been
- * {@link ResourceResolver#close() closed}.
+ * {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
* @since 1.0.0 (Sling API Bundle 2.19.0)
*/
Collection<String> getAllMappings(@NotNull String resourcePath, @NotNull HttpServletRequest request);
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/package-info.java b/src/main/java/org/apache/sling/api/resource/mapping/package-info.java
index e871225..00a1ea1 100644
--- a/src/main/java/org/apache/sling/api/resource/mapping/package-info.java
+++ b/src/main/java/org/apache/sling/api/resource/mapping/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@Version("1.0.1")
+@Version("1.1.0")
package org.apache.sling.api.resource.mapping;
import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/api/resource/package-info.java b/src/main/java/org/apache/sling/api/resource/package-info.java
index 7bd85e6..ac05b61 100644
--- a/src/main/java/org/apache/sling/api/resource/package-info.java
+++ b/src/main/java/org/apache/sling/api/resource/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@Version("2.12.2")
+@Version("2.13.0")
package org.apache.sling.api.resource;
import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java b/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java
index 67c2fbf..5f650b8 100644
--- a/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java
+++ b/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java
@@ -18,7 +18,7 @@
import java.util.Iterator;
import java.util.Map;
-import org.jetbrains.annotations.NotNull;
+
import javax.servlet.http.HttpServletRequest;
import org.apache.sling.api.resource.LoginException;
@@ -26,6 +26,8 @@
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceWrapper;
+import org.apache.sling.api.resource.mapping.PathRewriter;
+import org.jetbrains.annotations.NotNull;
import org.osgi.annotation.versioning.ConsumerType;
/**
@@ -107,6 +109,16 @@
return wrapped.map(request, resourcePath);
}
+ @Override
+ public @NotNull Resource resolveResource(@NotNull String path) {
+ return wrapped.resolveResource(path);
+ }
+
+ @Override
+ public @NotNull PathRewriter getPathRewriter() {
+ return wrapped.getPathRewriter();
+ }
+
/**
* Wraps and returns the {@code Resource} obtained by calling {@code getResource} on the wrapped resource resolver.
*