Hi,

I committed my first attempts into a new branch and added my notes
https://github.com/apache/sling-org-apache-sling-api/blob/jakarta-2/JAKARTA.md
In most cases, we just need to add some additional methods. And then there are some interfaces where we need to duplicate.

I think the biggest challenge is finding good names for the new interfaces. I think we should avoid something like V2 or Jakarta in the names. For example I created new packages for some of the interfaces instead. There are some left where I am not sure about a good name yet.

Happy new year!
Regards
Carsten

On 02.01.2025 09:43, Konrad Windszus wrote:
Hi Carsten,
Do you have some ballpark numbers of how many classes/interfaces are affected?
Any ideas yet for a naming scheme for those new Jakarta based interfaces?
SlingHttpServletRequestV2 or anything more verbose?

Thanks and happy new year 2025
Konrad

On 31. Dec 2024, at 11:49, Carsten Ziegeler <[email protected]> wrote:

I spent some time on this topic and I am now leaning towards solving it 
differently.

Our most important requirement is that existing code runs without changes. I 
think our second most important requirement is to keep maintenance of Sling 
code manageable as well as not causing too much discomfort to our user base.

The current plan was to update the most important parts of Sling (API, Engine, 
Auth) and replace in those bundles javax.servlet with jakarta.servlet. With 
that Sling would use jakarta servlet and without any further work this would be 
breaking all existing code. We came up with the idea to have some tooling that 
rewrites existing bundles and replaces usage of javax.servlet with 
jakarta.servlet (most likely at deployment or runtime time). With that our main 
requirement should be solved.

However, this most likely means that we have to maintain two branches for all 
those modules for bug fixes. It also means that we create an incompatible 
change for packages where it does not really make sense. The most prominent one 
is the resource package where javax.servlet is only used in single methods.

It also means it is an all or nothing approach for our users. Within a single 
bundle it is only possible to either use the old API or the new one - as we use 
the same package and class names. I have the feeling that this will create 
issues. While replacing in source code is easy, what about testing code, 3rd 
party libraries etc. All of that out of a sudden needs to work with 
jakarta.servlet. We have a huge ecosystem and I am almost certain that this 
will create pain here and there. Might again be solvable to some degree with 
additional tooling.

The easier solution for us and our users is most likely that we provide an API 
that can deal with both servlet APIs, basically duplicating interfaces where 
required. This allows for a step by step updating of existing user code and 
provides a much better support in your IDE (the deprecated and the new method 
are visible).

I was initially against this as I thought the implementation (in Sling Engine 
and scripting) will be way too complicated but weighting this pain in the 
implementation against potential pain for our users, I think we have to take 
the pain and deal with it. It might not be as bad as I initially thought. And 
to be fair, the tooling we would need is not there today either - there are 
some promising basic tools we could built upon, but still it does not come for 
free.

Long story short, I heavily favor now Option 1, providing new API based on 
jakarta.servlet next to the existing one.

Regards
Carsten

On 01.10.2023 15:59, Carsten Ziegeler wrote:
There are different options to do this move:

Option 1: provide new API interfaces based on Jakarta - parallel to the old 
ones with side-by-side packages (similar to the web console). Maybe this should 
focus on Servlet 6 (with removed deprecated stuff), to not have two migration 
steps for the users. While this is also an opportunity to clean up our API 
around the Servlet API, it unfortunately includes a complete fork of our API - 
and the implementation to support old and new one will be pretty complex.

Option 2: Update the existing API directly to Servlet 5/6. This breaks all code 
out there and forces it to migrate. This is only an option if we could provide 
tooling (byte code rewriting?) that either at assembly or runtime rewrites 
usage of the old packages to the new packages. This approach would not allow us 
to clean up the API. That would need to be handled separately.

Option 3: do nothing now and wait until this switch is actually becoming a real 
problem.

Giving the complexity of this problem, option 3 is maybe not the best choice. 
Option 1 is very tempting, but I fear the complexity and risk involved. I did 
this work for the web console and it was already quite challenging there. If 
Option 2 would work, this could be a nice way out.

Thoughts? Maybe there are better options?

--
Carsten Ziegeler
Adobe
[email protected]



--
Carsten Ziegeler
Adobe
[email protected]

Reply via email to