Further to this,
I have done a first pass at a re-factored impl at 
http://codereview.appspot.com/124094

This is not integrated yet, and I haven't ported any of the unit tests to see if it *really* a) works b) is faster.

Ian

On 1 Oct 2009, at 21:12, Ian Boston wrote:

I have been looking at the way that Resources are resolved in Sling and noticed 2 things.
The resource resolution process used a lot, and
perhaps the structure of the tree is not optimal.

Below is a quick dump of the tree in psudo json.

IIUC, during resolution of say a resource from a path like "/apps/ sling/myapp/selector.GET.servlet" all the entires in the root ResourceProviderEntry will be checked in turn.

If there are 100's of entries in the root ResourceProviderEntry, then this could be expensive.

Take for example "/system/userManager"

This is going to have to check every entry becuase /system/ userManager happens to be at the bottom of the list in the root folder.

Has anyone looked at nesting the ResourceProviderEntries in a Map tree structure so that a path can be resolved by a number of lookups, rather than recursion?

eg something like



/** insert ASFL2 */

public interface ResourceProviderEntry2 extends Map<String,ResourceProviderEntry2> {
...
}

// rootMap is ResourceProviderEntry2
ResourceProviderEntry2 levelEntry = rootEntry;
List<ResourceProviderEntry2> rpePath = new ArrayList<ResourceProviderEntry2>();

// build a list of ResourceProviderEntry2 leading to the resource.
String[] elements = StrungUtils.split(fullPath,'/');
for ( String element : elements ) {
        if ( levelEntry.contansKey(element) ) {
            rpePath.add(levelEntry);
            levelEntry = levelEntry.get(element);
       } else {
           break;
       }
}
// reverse the list and ask each one in turn
Collections.reverse(rpePath);
for ( ResourceProviderEntry2 e : rpePath ) {
    Resource resource = e.getResource(...);
    if ( e != null ) {
        return e;
    }
}


I haven't implemented this or done tests but watching the resolution process I *think* it might be faster. I also havent checked how listChildren would work with this.

Ian



{
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@fca007",
   "prefix" : "/",
   "path" : "",
   "providers" : null,
   "entries" : [
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@4f95f6", "prefix" : "apps/sakai/messagestore/ chatupdate.GET.servlet/",
           "path" : "apps/sakai/messagestore/chatupdate.GET.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.sakaiproject.kernel.chat.ChatServlet,
               paths=[
                   [
                       /apps/sakai/messagestore/chatupdate.GET.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@5472e7",
           "prefix" : "apps/sakai/messagestore/email.POST.servlet/",
           "path" : "apps/sakai/messagestore/email.POST.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.sakaiproject.kernel.message.ChangeEmailAddressServlet,
               paths=[
                   [
                       /apps/sakai/messagestore/email.POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@891197",
           "prefix" : "apps/sakai/presence/DELETE.servlet/",
           "path" : "apps/sakai/presence/DELETE.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.sakaiproject.kernel.presence.servlets.PresenceControlServlet,
               paths=[
                   [
                       /apps/sakai/presence/html.servlet,
                       /apps/sakai/presence/PUT.servlet,
                       /apps/sakai/presence/DELETE.servlet,
                       /apps/sakai/presence/POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@ac96e0",
           "prefix" : "apps/sakai/presence/GET.servlet/",
           "path" : "apps/sakai/presence/GET.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.sakaiproject.kernel.presence.servlets.PresenceGetServlet,
               paths=[
                   [
                       /apps/sakai/presence/json.servlet,
                       /apps/sakai/presence/GET.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@e1f19a",
           "prefix" : "apps/sakai/presence/POST.servlet/",
           "path" : "apps/sakai/presence/POST.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.sakaiproject.kernel.presence.servlets.PresenceControlServlet,
               paths=[
                   [
                       /apps/sakai/presence/html.servlet,
                       /apps/sakai/presence/PUT.servlet,
                       /apps/sakai/presence/DELETE.servlet,
                       /apps/sakai/presence/POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@bcea3a",
           "prefix" : "apps/sakai/presence/PUT.servlet/",
           "path" : "apps/sakai/presence/PUT.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.sakaiproject.kernel.presence.servlets.PresenceControlServlet,
               paths=[
                   [
                       /apps/sakai/presence/html.servlet,
                       /apps/sakai/presence/PUT.servlet,
                       /apps/sakai/presence/DELETE.servlet,
                       /apps/sakai/presence/POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@b5c54d",
           "prefix" : "apps/sakai/presence/html.servlet/",
           "path" : "apps/sakai/presence/html.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.sakaiproject.kernel.presence.servlets.PresenceControlServlet,
               paths=[
                   [
                       /apps/sakai/presence/html.servlet,
                       /apps/sakai/presence/PUT.servlet,
                       /apps/sakai/presence/DELETE.servlet,
                       /apps/sakai/presence/POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@e5887b",
           "prefix" : "apps/sakai/presence/json.servlet/",
           "path" : "apps/sakai/presence/json.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.sakaiproject.kernel.presence.servlets.PresenceGetServlet,
               paths=[
                   [
                       /apps/sakai/presence/json.servlet,
                       /apps/sakai/presence/GET.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@6e2318",
           "prefix" : "apps/sling/servlet/default/acl.GET.servlet/",
           "path" : "apps/sling/servlet/default/acl.GET.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.apache.sling.jcr.jackrabbit.accessmanager.post.GetAclServlet,
               paths=[
                   [
                       /apps/sling/servlet/default/acl.GET.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@fcf854", "prefix" : "apps/sling/servlet/default/ deleteAce.POST.servlet/", "path" : "apps/sling/servlet/default/ deleteAce.POST.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.apache.sling.jcr.jackrabbit.accessmanager.post.DeleteAcesServlet,
               paths=[
                   [
/apps/sling/servlet/default/ deleteAce.POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@7e0b1b", "prefix" : "apps/sling/servlet/default/ modifyAce.POST.servlet/", "path" : "apps/sling/servlet/default/ modifyAce.POST.servlet",
           "providers" : [
ServletResourceProvider: servlet =org.apache.sling.jcr.jackrabbit.accessmanager.post.ModifyAceServlet,
               paths=[
                   [
/apps/sling/servlet/default/ modifyAce.POST.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@bb0c1c",
           "prefix" : "libs/sling/redirect/GET.servlet/",
           "path" : "libs/sling/redirect/GET.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.servlets.get.impl.RedirectServlet,
               paths=[
                   [
                       /libs/sling/redirect/GET.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@b14055",
           "prefix" : "libs/sling/servlet/default/GET.servlet/",
           "path" : "libs/sling/servlet/default/GET.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.servlets.get.impl.DefaultGetServlet,
               paths=[
                   [
                       /libs/sling/servlet/default/GET.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@7ba14a", "prefix" : "libs/sling/servlet/default/ query.json.servlet/",
           "path" : "libs/sling/servlet/default/query.json.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.servlets.get.impl.JsonQueryServlet,
               paths=[
                   [
                       /libs/sling/servlet/default/query.json.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@d70c0c",
           "prefix" : "system/sling.js/",
           "path" : "system/sling.js",
           "providers" : [
org.apache.sling.bundleresource.impl.bundleresourceprovi...@580ba6
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@94492c",
           "prefix" : "system/sling/info.servlet/",
           "path" : "system/sling/info.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.servlets.get.impl.impl.info.SlingInfoServlet,
               paths=[
                   [
                       /system/sling/info,
                       /system/sling/info.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@4ff5d9",
           "prefix" : "system/sling/info/",
           "path" : "system/sling/info",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.servlets.get.impl.impl.info.SlingInfoServlet,
               paths=[
                   [
                       /system/sling/info,
                       /system/sling/info.servlet
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@449757",
           "prefix" : "system/sling/login.servlet/",
           "path" : "system/sling/login.servlet",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.engine.impl.auth.LoginServlet,
               paths=[
                   [
                       /system/sling/login.servlet,
                       /system/sling/login
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@2c0b5c",
           "prefix" : "system/sling/login/",
           "path" : "system/sling/login",
           "providers" : [
ServletResourceProvider: servlet=org.apache.sling.engine.impl.auth.LoginServlet,
               paths=[
                   [
                       /system/sling/login.servlet,
                       /system/sling/login
                   ]
               ]
           ],
           "entries" : null
       },
       {
"id" : "org .apache .sling.jcr.resource.internal.helper.resourceprovideren...@efd42f",
           "prefix" : "system/userManager/",
           "path" : "system/userManager",
           "providers" : [
org .sakaiproject .kernel.user.resource.sakaiauthorizableresourceprovi...@538746
           ],
           "entries" : null
       }
   ]
}

Reply via email to