On Friday 18 March 2016 10:03:17 Carsten Ziegeler wrote: > Oliver Lietz wrote > > > On Friday 18 March 2016 08:08:55 Carsten Ziegeler wrote: > >> Hi, > > > > Hi Carsten, > > > >> 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? > > > > I don't get c): "flat list of resources" and "find out the hierarchy by > > looking into the resource tree". Can you give an example? > > Sure, assume you have a resource of type a/b - currently finding out all > super types requires you too look at /apps/a/b, see if there is a resource > super type property, do the same for /libs. Then use the found value and > repeat > the process until there is no such resource with a resource super type > property. > This can take a lot of time (sure you can write a script to do it) > > Now with a flat list at /foo/libs you'll find a /foo/libs/a:b resource > (we have to find a mapping from path to name, but that should be > doable), can look at the property - stay in the same place and do the > next look up. > It gets a little bit complicated as you have to look at /foo/apps and > /foo/libs - but these are just two places compared to N.
"(we have to find a mapping from path to name, but that should be doable)" – that was the missing piece, thanks. O. > Regards > Carsten