Hi Konrad,

yes, ResourceURI at the moment would be both for internal and external links.

Immutable vs. Mutable is to be discussed (both ways have their own advantages)

ResourceUri resolve(ResourceURI, ...) (not useful for absolute/external URIs)
SlingUri map(SlingUri, ...) (can be useful even to map an external URI)

Because it is meant to be a pipeline of OSGi services in a row of which any could make the decision to switch from a plain path to a full URI IMHO we need to pass an interface that covers both. This approach could mean (names are
more descriptive than a real suggestion for now):

interface ResourceUri extends ArbitraryLink {...}
interface ResourcePath extends ArbitraryLink {...} # RequestPathInfo+query+fragment

The ResourceMapping interface would then look symmetric again:

ArbitraryLink resolve(ArbitraryLink, ...)
ArbitraryLink map(ArbitraryLink, ...)

-Georg

On 2020-03-30 21:17, Konrad Windszus wrote:
Hi Georg,

Is the class
https://github.com/apache/sling-org-apache-sling-api/blob/7dd23418280fcef234b42dbabf6e13e43ef2d4d0/src/main/java/org/apache/sling/api/resource/uri/ResourceURI.java
<https://github.com/apache/sling-org-apache-sling-api/blob/7dd23418280fcef234b42dbabf6e13e43ef2d4d0/src/main/java/org/apache/sling/api/resource/uri/ResourceURI.java>
supposed to be used for both internal as well as for external links?
I would rather come up with two separate classes (they don't have much
in common).

What about a generic SlingUri class with the two specializations
ResourceUri and AbsoluteUri (or ExternalUri)?

That you would lead the following signatures in
https://github.com/apache/sling-org-apache-sling-api/blob/7dd23418280fcef234b42dbabf6e13e43ef2d4d0/src/main/java/org/apache/sling/api/resource/mapping/spi/ResourceMapping.java
<https://github.com/apache/sling-org-apache-sling-api/blob/7dd23418280fcef234b42dbabf6e13e43ef2d4d0/src/main/java/org/apache/sling/api/resource/mapping/spi/ResourceMapping.java>:



I definitely prefer immutable classes with a dedicated builder but
that is up for another discussion I guess,

Konrad

On 30. Mar 2020, at 02:13, Georg Henzler <ghenz...@apache.org> wrote:

Hi all,

so to eventually follow up on what has been discussed at last year's
adaptTo Hackathon and in the mailing list afterwards [1]/[2] - I now
found the time to draft the proposal for a Resource Mapping SPI.

Two important points before we start:
* This is not meant to replace the Rewriting Pipelines as they exist
 today - it just would allow some Sling setups (maybe > 70%?) to move
 to a simpler solution avoiding the overhead of the rewriter pipeline
 while obviously losing its flexibility, but for many that will
 be ok (I fully agree with Bertrand [3] here)
* Let's focus the discussion first on if we would like to go into this
 direction instead of details (like mutable vs. immutable or naming,
 we can have detailed discussions around it once we decide to move on)

But now to the actual proposal to introduce two new interfaces to the
Sling API:

ResourceURI:

On Sling API level we treat links as strings (e.g. rr.map() returns
a String). Using Strings for links has produced many bugs in the past,
I think having an abstraction for a URI/link that is tailored for
Sling would help a lot (obviously plain JDK URI can be used, but
there is no support for selectors, suffix etc.).

Besides being generally a good idea IMHO, ResourceURI shall be used
for the other interface:

ResourceMapper:

Allows to hook into the rr.resolve() and rr.map() by implementing
exactly those two methods that work on instances of ResourceURI. The
idea is that n OSGi service instances of ResourceMapper build a
pipeline of mappers that rr would run through when rr.resolve() or
rr.map() is called (in the opposite direction for map). The request
is passed in as context to both methods but may be null as it is
today, implementations of ResourceMapper need to be able to handle
null.

The following mechanisms exist today for resource mapping in ootb
Sling:

* Config "resource.resolver.mapping" in JcrResourceResolverFactoryImpl
* Mappings via /etc/map
* Vanity Paths
* sling:alias

Those could be broken up into four implementations of ResourceMapper
that are configured by default.

About backwards-compatibility/breaking existing implementations: So
this is a BIG CHANGE. However to keep it safe I would start with
exactly one ResourceMapper active that is backed by today's
implementation. The next step is to break it in separate resource
mappers (as mentioned above) and just put them in a row.

The Resource Mapping SPI would bring the following benefits:

* Being able to hook into the resource mapping via SPI allows
 for flexibility that is otherwise only possible Rewriting
 Pipelines - while link rewriting/checking is the only
 reason most projects use Rewriting Pipelines (with all its
 performance overhead)

* Extending the mapping process via a well-defined API that
 allows to write Touring-complete code is better than working
 with Strings in the Transformer (also for many cases it can
 be cleaner and better 'unit-testable' than /etc/maps)

* HTL there can be an option to automatically map all
 attributes of context uri (better performance, better for
 debugging if map() is called synchronously)

* Introducing the interface ResourceURI (with a backing helper
 class for everybody to use) is useful in general

See branch [4] for some first code of the proposal, in
particular ResourceMapping.java [5] and ResourceURI.java [6]

-Georg

[1] "[hackathon] externalization / resource mapping / rewriter" https://www.mail-archive.com/dev@sling.apache.org/msg87736.html [2] "Why get rid of the rewriter?" https://www.mail-archive.com/dev@sling.apache.org/msg87867.html
[3] https://www.mail-archive.com/dev@sling.apache.org/msg87855.html

[4] https://github.com/apache/sling-org-apache-sling-api/compare/feature/Resource_Mapping_SPI [5] https://github.com/apache/sling-org-apache-sling-api/blob/7dd23418280fcef234b42dbabf6e13e43ef2d4d0/src/main/java/org/apache/sling/api/resource/mapping/spi/ResourceMapping.java [6] https://github.com/apache/sling-org-apache-sling-api/blob/7dd23418280fcef234b42dbabf6e13e43ef2d4d0/src/main/java/org/apache/sling/api/resource/uri/ResourceURI.java



On 2020-01-17 10:45, Georg Henzler wrote:
Hi Konrad,
I think SLING-9005 is a good idea, but that is independent.
My idea idea was to leave resourceResolver.map() unchanged (as there
is a lot of code using it out there, also it makes conceptually sense
as is). Rather I‘d like to provide an SPI that allows to customize the
way of the behavior of resourceResolver.map() - I‘m thinking of a
ranked list of ResourceMapper services (default one being today’s
behavior). Robert also has done some work into this direction already,
I‘d like to extend on that.
I‘m currently on vacation but I have it on my list for when I‘m back.
-Georg
On 16. Jan 2020, at 15:01, Konrad Windszus <konra...@gmx.de> wrote:
I would like to revive this.
@Georg: IIRC you wanted to come up with a proposal for a externalizer API. Are you working on this?
Can we start by creating a JIRA ticket?
There has been a related ticket opened today: https://issues.apache.org/jira/browse/SLING-9005 <https://issues.apache.org/jira/browse/SLING-9005>
Konrad
On 5. Sep 2019, at 17:54, Jason E Bailey <jason.bai...@24601.org> wrote:
Specifically with regard to the re-writer
I'm working on a replacement for this which I'm currently calling the transformer -> https://github.com/apache/sling-whiteboard/tree/master/transformer 1. It uses an HTML tokenizer that was added to the HTML utilities to generate a stream of elements that can be modified and recombined. It's much faster then tagsoup or jsoup since it's not trying to build a valid document. This also means that it supports anything that you write out in html. HTML4,5+ 2. It uses services with an ordering priority and does pattern matching so that you can fine tune when the transformer is applied 3. The specific use case I was working on is creating a CSP header with a nonce or hash attribute to lock down the javascript that's on the page.
It's currently working but it's not finished.
Are there other problems with the rewriter that I haven't addressed?
--
Jason
On Thu, Sep 5, 2019, at 10:34 AM, Stefan Seifert wrote:
- resource mapping
- add a new SPI to define the mapping
- add a default impl that reads the mapping from /etc/map as it is
done today
- possible to override with service ranking
- but: there is already the ResourceMapper interface
 - introduced 1-2 years ago, use case was to get all existing
mappings
 - with this it's currently possible to replace mapping completely
with new logic
- maybe add a support to "contribute" additional mappings via a
service interface additional to this
- generic externalizer API
- naming not fixed yet, should not named "link" as this is too
specific. probably "URL".
- needs a java API for using, and an SPI for hooking in special rules
- then add mappings for views in HTL*, JSP, model exporter/JSON
 * probably starting with a sling-only HTL extension for try-out,
add it later to the spec when design is validated
- might be inspired by the basic features for wcm.io URL handler [1]
- rewriter pipeline
- should be deprecated and no longer be used - especially not for
link externalization via postprocessing
- it may still be in use out there for more exotic use cases like PDF
generation
- should probably removed from sling starter
stefan
[1] https://wcm.io/handler/url/

Reply via email to