Hi Ruben,

so in general nothing would change about how to use rr.map() from a
consumer side (if that still happens via the rewriter pipeline by
e.g. "a link checker" as provided downstream, that's totally fine).

Now for people that want to replace the rewriter pipeline, we can just
extend the handling of the display context "html" in HTL - that is
used for XSS protection today already, it can as well call rr.map()
on links (rich text html fragments are parsed and stream twice
today)

-Georg


On 2020-03-30 04:17, r...@headwire.com wrote:
Georg,

one of the things that have to be considered here as well are links in
a href tags in text properties (eg from a rich text editor) in sling
model rendered output and in html rendered output

Ruben

-----Original Message-----
From: Georg Henzler <ghenz...@apache.org>
Sent: Sunday, March 29, 2020 5:13 PM
To: dev@sling.apache.org
Subject: [DISCUSS] Resource Mapping SPI

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