Hi,

in the past years we added a lot of things here and there which over
time resulted in cruft and sometimes hard to understand / debug
problems. In order to have an even better framework which is easier to
manage but also scales better for the things to come, we should get rid
of this additional weigth.

One area which I think needs attention is the resource type handling.
We started years back with the two methods on a resource, getting a
resource type and optionally getting a resource super type.
A little bit later this was extended with what we call today the
resource type hierarchy: for a resource type a/b, a resource can be
created in /libs/a/b with a resource super type property. This can be
overlayed in /apps. (I'm assuming the default search paths here to keep
it simple).

While this sounds nice and and simple, it has several drawbacks (in no
particular order):
- it's hard to find out all the super types of a resource type
- the resource resolver which reads the type hierarchy needs read access
to the complete tree of /libs and /apps - just to find a few properties
here and there.
- two resources with the same resource type, might have different
resource super types or even a complete different hierarchy.
- there is no guarantee that the resource super type is static, which
means two calls to find the super type for a resource type could result
in different results, e.g. if the resource itself decides to return a
different value, or if a resource decorator is used which does so.
- for traversing the hierarchy we currently create an additional admin
resource resolver per resource resolver - which is a huge overhead.

Especially the last three points make improving the script resolution
hard - if not impossible. Today the cache is using the resource type and
resource super type of the resource as a key. However, given the above
information it is easy to create a scenario where the cache returns a
wrong script.

Taking all these things into account, I think we should somehow start
fresh with handling the resource type hierarchy and come to a better
solution. In this first step, I think we should not care about
compatibility. Once we have a great solution, we'll find a way on how to
achieve this.

My rough initial proposal would be:
a) forget about Resource#getResourceSuperType. This method is ignored
from now on (and deprecated)
b) the resource hierarchy is not spread across /libs, /apps anymore
c) we create a dedicated resource tree at /foo (I'm using /foo as a
placeholder as I don't want to start an endless discussion now on what
this path actually really is). We then have /foo/apps and /foo/libs.
Underneath each of these resources, there is a flat list of resources.
Each resource is associated with a resource type (through the name of
the resource) and has two properties: resource type and resource super type.
d) we create a service which has three methods

// get the super type
String getResourceSuperType(ResourceResolver resolver, String resourceType);
// get an ordered list of all super types
List<String> getResourceSuperTypes(ResourceResolver resolver, String
resourceType)
// check if resourceType is checkResourceType (either directly or one of
the parents)
boolean isResourceType(ResourceResolver resolver, String resourceType,
String checkResourceType)

We pass in the resource resolver to this service in order to pass in the
search paths and the current user rights. This should allow us to
continue with this service, even if we add tenant support at a later
time or do some other checks.

With this approach we have
a) a clear resource type hierarchy which is stable. A resource of type A
has always the same resource super types. (unless the hierarchy is
changed of course)
b) the service reading the hierarchy only needs read access in a single
place
c) it's easy to find out the hierarchy by looking into the resource tree
d) the hierarchy can easily be cached in memory

WDYT?

Regards
Carsten
-- 
Carsten Ziegeler
Adobe Research Switzerland
cziege...@apache.org

Reply via email to