This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-post.git


The following commit(s) were added to refs/heads/master by this push:
     new 34eaaa0  SLING-13086 - SlingPostServlet no longer register 
PostOperation services after the Jakarta migration (#33)
34eaaa0 is described below

commit 34eaaa0d1092e0bb3c871c9f91e5e2eec49df4a4
Author: Robert Munteanu <[email protected]>
AuthorDate: Mon Feb 2 14:12:39 2026 +0100

    SLING-13086 - SlingPostServlet no longer register PostOperation services 
after the Jakarta migration (#33)
    
    Adapt the PostOperationProxyProvider to also register proxy services for 
the JakartaPostOperation
    services.
---
 .../post/impl/PostOperationProxyProvider.java      | 40 ++++++++++++---
 .../impl/wrapper/JakartaToJavaxPostOperation.java  | 58 ++++++++++++++++++++++
 2 files changed, 90 insertions(+), 8 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/servlets/post/impl/PostOperationProxyProvider.java
 
b/src/main/java/org/apache/sling/servlets/post/impl/PostOperationProxyProvider.java
index df02e05..e2902f0 100644
--- 
a/src/main/java/org/apache/sling/servlets/post/impl/PostOperationProxyProvider.java
+++ 
b/src/main/java/org/apache/sling/servlets/post/impl/PostOperationProxyProvider.java
@@ -18,13 +18,16 @@
  */
 package org.apache.sling.servlets.post.impl;
 
+import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.IdentityHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.servlets.HtmlResponse;
+import org.apache.sling.servlets.post.JakartaPostOperation;
 import org.apache.sling.servlets.post.PostOperation;
 import org.apache.sling.servlets.post.PostResponse;
 import org.apache.sling.servlets.post.SlingPostOperation;
@@ -32,6 +35,8 @@ import org.apache.sling.servlets.post.SlingPostProcessor;
 import 
org.apache.sling.servlets.post.exceptions.PreconditionViolatedPersistenceException;
 import org.apache.sling.servlets.post.exceptions.TemporaryPersistenceException;
 import org.apache.sling.servlets.post.impl.helper.HtmlResponseProxy;
+import org.apache.sling.servlets.post.impl.wrapper.JakartaToJavaxPostOperation;
+import org.apache.sling.servlets.post.impl.wrapper.JavaxToJakartaPostOperation;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
@@ -46,20 +51,23 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * The <code>PostOperationProxyProvider</code> listens for legacy
- * {@link SlingPostOperation} services being registered and wraps them with a
- * proxy for the new {@link PostOperation} API and registers the procies.
+ * <p>Adapter bridge for various PostOperation APIs.</p>
+ *
+ * <p>The <code>PostOperationProxyProvider</code> listens for legacy
+ * {@link SlingPostOperation} services and for {@link JakartaPostOperation} 
services
+ * being registered, adapts them to the {@link PostOperation} API, and 
registers the proxies</p>
  */
 @Component(service = {})
+@SuppressWarnings("deprecation")
 public class PostOperationProxyProvider implements ServiceListener {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     /**
-     * The service listener filter to listen for SlingPostOperation services
+     * The service listener filter to listen for SlingPostOperation and 
JakartaPostOperation services
      */
-    private static final String REFERENCE_FILTER =
-            "(" + Constants.OBJECTCLASS + "=" + 
SlingPostOperation.SERVICE_NAME + ")";
+    private static final String REFERENCE_FILTER = "(|(" + 
Constants.OBJECTCLASS + "=" + SlingPostOperation.SERVICE_NAME
+            + ")(" + Constants.OBJECTCLASS + "=" + 
JakartaPostOperation.class.getName() + "))";
 
     // maps references to the SlingPostOperation services to the registrations
     // of the PostOperation proxies for unregistration purposes
@@ -159,8 +167,24 @@ public class PostOperationProxyProvider implements 
ServiceListener {
      * Called by serviceChanged
      */
     private void register(final ServiceReference serviceReference) {
-        final SlingPostOperation service = (SlingPostOperation) 
this.bundleContext.getService(serviceReference);
-        final PostOperationProxy proxy = new PostOperationProxy(service);
+        List<String> objectClass =
+                Arrays.asList((String[]) 
serviceReference.getProperties().get(Constants.OBJECTCLASS));
+        final Object proxy;
+        if (objectClass.contains(SlingPostOperation.SERVICE_NAME)) {
+            SlingPostOperation service = (SlingPostOperation) 
this.bundleContext.getService(serviceReference);
+            proxy = new PostOperationProxy(service);
+        } else if (objectClass.contains(JakartaPostOperation.class.getName())) 
{
+            JakartaPostOperation service = (JakartaPostOperation) 
this.bundleContext.getService(serviceReference);
+            if (service instanceof JavaxToJakartaPostOperation) {
+                // registered by the SlingPostServlet because a PostOperation 
service was bound, do not do anything
+                return;
+            } else {
+                proxy = new JakartaToJavaxPostOperation(service);
+            }
+        } else {
+            // should not happen, log
+            return;
+        }
 
         final BundleContext bundleContext = 
serviceReference.getBundle().getBundleContext();
         final Dictionary<String, Object> props = 
copyServiceProperties(serviceReference);
diff --git 
a/src/main/java/org/apache/sling/servlets/post/impl/wrapper/JakartaToJavaxPostOperation.java
 
b/src/main/java/org/apache/sling/servlets/post/impl/wrapper/JakartaToJavaxPostOperation.java
new file mode 100644
index 0000000..16a2cb8
--- /dev/null
+++ 
b/src/main/java/org/apache/sling/servlets/post/impl/wrapper/JakartaToJavaxPostOperation.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.servlets.post.impl.wrapper;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.wrappers.JavaxToJakartaRequestWrapper;
+import org.apache.sling.servlets.post.JakartaPostOperation;
+import org.apache.sling.servlets.post.PostOperation;
+import org.apache.sling.servlets.post.PostResponse;
+import org.apache.sling.servlets.post.SlingJakartaPostProcessor;
+import org.apache.sling.servlets.post.SlingPostProcessor;
+import 
org.apache.sling.servlets.post.exceptions.PreconditionViolatedPersistenceException;
+import org.apache.sling.servlets.post.exceptions.TemporaryPersistenceException;
+
+@SuppressWarnings("deprecation")
+public class JakartaToJavaxPostOperation implements PostOperation {
+
+    private static final SlingPostProcessor[] EMPTY_PROCESSORS = new 
SlingPostProcessor[0];
+
+    private final JakartaPostOperation delegate;
+
+    public JakartaToJavaxPostOperation(final JakartaPostOperation delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public void run(final SlingHttpServletRequest request, final PostResponse 
response, SlingPostProcessor[] processors)
+            throws PreconditionViolatedPersistenceException, 
TemporaryPersistenceException, PersistenceException {
+        if (processors == null) {
+            processors = EMPTY_PROCESSORS;
+        }
+        final SlingJakartaPostProcessor[] wrappers = new 
SlingJakartaPostProcessor[processors.length];
+        for (int i = 0; i < processors.length; i++) {
+            wrappers[i] = new JavaxToSlingJakartaPostProcessor(processors[i]);
+        }
+        this.delegate.run(
+                JavaxToJakartaRequestWrapper.toJakartaRequest(request),
+                new JavaxToJakartaPostResponse(response),
+                wrappers);
+    }
+}

Reply via email to