I've uploaded a first pass patch at SLING-986
I would expect bugs at this stage, but though I should share incase I was on completely the wrong track.
Ian

On 25 May 2009, at 11:23, Felix Meschberger wrote:

Hi,

Ian Boston schrieb:
Felix,
Inline:
On 25 May 2009, at 09:22, Felix Meschberger wrote:

Hi Ian,

Replying to this, though I only completely understood your request after
reading your second post.

So what you really want is, that if a request comes in prefixed with

 /_user/private/

to be redirected to

 /_private/-some-path-/private/

where -some-path- is dynamic and includes the user id of the current
user. Right ?

yes, internally redirected as the /system/userManager/user/ieb does,
but, using normal content space.



This sounds similar to an earlier issue, which I recently closed
SLING-251 [1]. I closed this because it is rather old. In addition
resolving some prefix (be it "~" or "/_user/private") depends heavily on how "user home" locations are managed. And this is outside of the scope
of the ResourceResolver.

I agree, user home is a jcr management/instanace deployment issue.
The use cases for this are not limited just to users, any content tree
that is predicted to result in a URL path where there are millions of
direct children.
eg messaging inbox.

and where we don't want to expose the storage structure in the url (ie
want inbox/231243123 not inbox/2009/01/23/12/231243123 )
and where we do not want to list the children. (except by search with
paging)

or where we simply want to abstract the binding between url and storage.



I could imaging a plugable solution, though, in that for example we
enhance the mapping functionality of the ResourceResolver2. Currently there is such functionality to generate internal or external redirects
based on configuration in /etc/map.

We could extend this such, that it would be possible to bind a service
to such a configuration: the configuration value is an OSGi filter
expression to be used with the BundleContext.getServiceReference(String
name, String filter) method.

In addition a service interface would be defined:

 public interface MappingResolver {
     ResultType resolve(HttpServletRequest, String);
     ResultType map(HttpServletRequest, String);
 }

Configuration would be

 /etc/map/http/myhost/~
         -> sling:mapper = "(prefix='~')"

This would use the MappingResolver service registered with a
registration property "prefix" set to "~".

This would allow you to register a MappingResolver service for
/_user/private and have it called to resolve requests to /_user/ private
and also to have it called for creating the URL when calling the
ResourceResolver.map method.

WDYT ?


Yes I think that would do it, and provide a simpler extension point.

In the end I have created a VirtualResource and
AbstractVirturalResourceProvider[1] that make it possible for
ResourceResolvers to wrap any other resolved Resource, the only bit I
wasn't getting was to ensure that the VirtualResource did not have its
RequestPathInfo re computed.

Obviously the advantage of the Resource approach is ( I think, not
tested) that the ResourceProvider can bind to a resourceType anywhere in
the content system, the advantage of the /etc/map approach is that it
can be configured at runtime.

I suspect I am going to want more flexibility in the re-writer so would be happy to help. Some of our sys admins love httpd mod_rewrite and will
pounce on that level of functionality.

Would you make all of the /etc/map resolution go through the plugin
interface by making the existing code implement that interface?

Implementation wise, the MapEntry would probably be extended to support
calling the new service API instead of using configured patterns to
return the mapped path.

So this would be more or less transparent and each entry below /etc/ map
could effectively be either of

 * internal redirect (hard coded support for regular expressions)
 * external redirects (hard coded support for regular expressions)
 * service API call

Regards
Felix


Ian




[1] https://issues.apache.org/jira/browse/SLING-251

Reading the comments:
We have the use case for /~  implemented[2] already with the
VirtualResource approach, and the use case for /~ieb [3]
All of the SlingDefaultServlet methods appear to work as we are just
providing a Resource

[1]
http://github.com/ieb/open-experiments/tree/3c1a92784b8f3e0856e6e4aae623d52343f150c7/slingtests/osgikernel/bundles/virtual

[2]
http://github.com/ieb/open-experiments/blob/3c1a92784b8f3e0856e6e4aae623d52343f150c7/slingtests/osgikernel/bundles/personal/src/main/java/org/sakaiproject/kernel/personal/PersonalPrivateResourceProvider.java

[3]
http://github.com/ieb/open-experiments/blob/3c1a92784b8f3e0856e6e4aae623d52343f150c7/slingtests/osgikernel/bundles/personal/src/main/java/org/sakaiproject/kernel/personal/PersonalPublicResourceProvider.java




Ian Boston schrieb:
Hi,

Is it possible to internally Proxy an existing Sling Resource from
another ResourceProvider ?

eg

I have a PrivateResourceProvider that matches /_user/private

From that it builds a path based on the logged in user and the rest of
the url
eg
/_private/A3/D0/33/admin

eg
/_user/private/test1.html
results in
/_private/A3/D0/33/admin/test1.html

at that point I would like to internally get hold of the resource for
/_private/A3/D0/33/admin/test1.html and return with that from the
PrivateResourceProvider so that it handles everything. But, I get an
external redirect (302) to _private/A3/D0/33/admin/test1.html

Ian






Reply via email to