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
}
]
}