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

ahuber pushed a commit to branch 3975-telemetry
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/3975-telemetry by this push:
     new 7b76f211431 CAUSEWAY-3975: consolidating custom request processing 
logic (wicket)
7b76f211431 is described below

commit 7b76f211431e3a1b92fb8ca6768850071c8e6a42
Author: andi-huber <[email protected]>
AuthorDate: Fri Mar 20 23:38:59 2026 +0100

    CAUSEWAY-3975: consolidating custom request processing logic (wicket)
---
 .../testdomain/conf/Configuration_usingWicket.java |  5 +-
 .../{RequestCycle2.java => RootRequestMapper.java} | 67 ++++++++++------
 .../integration/WebRequestCycleForCauseway.java    | 10 ++-
 .../CausewayWicketAjaxRequestListenerUtil.java     | 91 ----------------------
 .../wicketapp/CausewayWicketApplication.java       |  7 +-
 5 files changed, 56 insertions(+), 124 deletions(-)

diff --git 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingWicket.java
 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingWicket.java
index b535c6edda3..e8c488746d9 100644
--- 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingWicket.java
+++ 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingWicket.java
@@ -61,7 +61,7 @@
 import org.apache.causeway.viewer.wicket.ui.pages.PageClassRegistry;
 import org.apache.causeway.viewer.wicket.ui.pages.obj.DomainObjectPage;
 import 
org.apache.causeway.viewer.wicket.viewer.CausewayModuleViewerWicketViewer;
-import 
org.apache.causeway.viewer.wicket.viewer.wicketapp.CausewayWicketAjaxRequestListenerUtil;
+import org.apache.causeway.viewer.wicket.viewer.integration.RootRequestMapper;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -349,8 +349,7 @@ protected IPageFactory newPageFactory() {
         @Override
         protected void internalInit() {
             super.internalInit();
-            // intercept AJAX requests and reload view-models so any detached 
entities are re-fetched
-            CausewayWicketAjaxRequestListenerUtil.setRootRequestMapper(this);
+            setRootRequestMapper(new RootRequestMapper(this));
         }
 
     }
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/RequestCycle2.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/RootRequestMapper.java
similarity index 54%
rename from 
viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/RequestCycle2.java
rename to 
viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/RootRequestMapper.java
index a7631deb424..1d50d625120 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/RequestCycle2.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/RootRequestMapper.java
@@ -18,34 +18,26 @@
  */
 package org.apache.causeway.viewer.wicket.viewer.integration;
 
+import org.apache.wicket.Application;
+import org.apache.wicket.SystemMapper;
+import org.apache.wicket.core.request.handler.ListenerRequestHandler;
+import org.apache.wicket.core.request.mapper.PageInstanceMapper;
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.cycle.RequestCycleContext;
+import org.apache.wicket.request.IRequestMapper;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.component.IRequestablePage;
 
 import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
 import org.apache.causeway.applib.services.iactnlayer.InteractionService;
-import org.apache.causeway.applib.services.user.UserService;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
+import org.apache.causeway.viewer.wicket.ui.pages.PageAbstract;
 
 import lombok.extern.slf4j.Slf4j;
 
-public class RequestCycle2 extends RequestCycle {
+public final class RootRequestMapper extends SystemMapper implements 
IRequestMapper {
 
-    public RequestCycle2(final RequestCycleContext context) {
-        super(context);
-    }
-
-    record Wrapper(IRequestHandler delegate) implements IRequestHandler {
-        @Override
-        public void respond(final IRequestCycle requestCycle) {
-            delegate.respond(requestCycle);
-        }
-        @Override
-        public void detach(final IRequestCycle requestCycle) {
-            delegate.detach(requestCycle);
-        }
-    }
+    public static ThreadLocal<InteractionContext> X = new ThreadLocal<>();
 
     @Slf4j
     record RequestHandlerWrapper(
@@ -67,18 +59,43 @@ public void detach(final IRequestCycle requestCycle) {
         }
     }
 
+    public RootRequestMapper(final Application application) {
+        super(application);
+    }
+
     @Override
-    protected IRequestHandler resolveRequestHandler() {
+    public IRequestHandler mapRequest(final Request request) {
         var mmc = MetaModelContext.instanceElseFail();
-
-        var ic = new SessionAuthenticator(mmc.getInteractionService(), 
mmc.lookupServiceElseFail(UserService.class))
-            .determineInteractionContext()
-            .orElse(null);
+//        var ic = new SessionAuthenticator(mmc.getInteractionService(), 
mmc.lookupServiceElseFail(UserService.class))
+//            .determineInteractionContext()
+//            .orElse(null);
 
         return new RequestHandlerWrapper(
                         mmc.getInteractionService(),
-                        ic,
-                        super.resolveRequestHandler());
+                        X.get(),
+                        super.mapRequest(request));
+    }
+
+    // intercept AJAX requests and reload view-models so any detached entities 
are re-fetched
+    @Override
+    protected IRequestMapper newPageInstanceMapper() {
+        return new PageInstanceMapper() {
+            @Override
+            public IRequestHandler mapRequest(final Request request) {
+                var handler = super.mapRequest(request);
+
+                if (handler instanceof ListenerRequestHandler) {
+
+                    final IRequestablePage iRequestablePage = 
((ListenerRequestHandler) handler).getPage();
+
+                    if (iRequestablePage instanceof PageAbstract pageAbstract) 
{
+                        pageAbstract.onNewRequestCycle();
+                    }
+                }
+
+                return handler;
+            }
+        };
     }
 
 }
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
index a4240799c16..5f52bc2a2ba 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
@@ -55,12 +55,14 @@
 import org.apache.causeway.applib.services.i18n.TranslationContext;
 import org.apache.causeway.applib.services.iactn.Interaction;
 import org.apache.causeway.applib.services.metrics.MetricsService;
+import org.apache.causeway.applib.services.user.UserService;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.base._Timing;
 import org.apache.causeway.commons.internal.base._Timing.StopWatch;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import 
org.apache.causeway.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.causeway.viewer.commons.model.error.ExceptionModel;
@@ -142,7 +144,13 @@ public synchronized void onBeginRequest(final RequestCycle 
requestCycle) {
             }
             return;
         }
-        
+
+        var mmc = MetaModelContext.instanceElseFail();
+        var ic = new SessionAuthenticator(mmc.getInteractionService(), 
mmc.lookupServiceElseFail(UserService.class))
+              .determineInteractionContext()
+              .orElse(null);
+        RootRequestMapper.X.set(ic);
+
         if(log.isTraceEnabled()) {
             log.trace("onBeginRequest out - session about to open");
         }
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketAjaxRequestListenerUtil.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketAjaxRequestListenerUtil.java
deleted file mode 100644
index 6a7c3ed4b11..00000000000
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketAjaxRequestListenerUtil.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  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.causeway.viewer.wicket.viewer.wicketapp;
-
-import org.apache.wicket.SystemMapper;
-import org.apache.wicket.core.request.handler.ListenerRequestHandler;
-import org.apache.wicket.core.request.mapper.PageInstanceMapper;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.IRequestMapper;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.component.IRequestablePage;
-
-import org.apache.causeway.viewer.wicket.ui.pages.PageAbstract;
-
-import lombok.experimental.UtilityClass;
-
-@UtilityClass
-public final class CausewayWicketAjaxRequestListenerUtil {
-
-    public void setRootRequestMapper(
-            final WebApplication app) {
-
-        app.setRootRequestMapper(new SystemMapper(app) {
-            @Override
-            protected IRequestMapper newPageInstanceMapper() {
-                return new PageInstanceMapper() {
-                    @Override
-                    public IRequestHandler mapRequest(final Request request) {
-                        var handler = super.mapRequest(request);
-                        //final boolean isAjax = 
((WebRequest)request).isAjax();
-
-                        if(handler instanceof ListenerRequestHandler) {
-//                            _Debug.log("AJAX via ListenerRequestHandler");
-//                            
RequestCycle.get().getListeners().add(newRequestCycleListener());
-
-                            final IRequestablePage iRequestablePage =
-                                    
((ListenerRequestHandler)handler).getPage();
-
-                            if(iRequestablePage instanceof PageAbstract 
pageAbstract) {
-                                pageAbstract.onNewRequestCycle();
-                            }
-
-                        }
-
-                        return handler;
-                    }
-                };
-            }
-        });
-    }
-
-//    public IListener newAjaxListener() {
-//
-//        RequestCycle x;
-//
-//        return new IListener() {;
-//            @Override
-//            public void onBeforeRespond(final Map<String, Component> map, 
final AjaxRequestTarget target) {
-//                _Debug.log("AJAX via IListener");
-//                DomainObjectPage.broadcastAjaxRequest(target.getPage(), 
target);
-//            }
-//        };
-//    }
-
-//    private IRequestCycleListener newRequestCycleListener() {
-//        return new IRequestCycleListener() {
-//            @Override
-//            public void onRequestHandlerResolved(final RequestCycle cycle, 
final IRequestHandler handler) {
-//                _Debug.log("RequestCycle: handler resolved %s", handler);
-//            }
-//        };
-//    }
-
-}
diff --git 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketApplication.java
 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketApplication.java
index 706c9855140..41bb10f8294 100644
--- 
a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketApplication.java
+++ 
b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/wicketapp/CausewayWicketApplication.java
@@ -68,7 +68,7 @@
 import 
org.apache.causeway.viewer.wicket.viewer.integration.AuthenticatedWebSessionForCauseway;
 import 
org.apache.causeway.viewer.wicket.viewer.integration.CausewayResourceSettings;
 import 
org.apache.causeway.viewer.wicket.viewer.integration.ConverterForObjectAdapter;
-import org.apache.causeway.viewer.wicket.viewer.integration.RequestCycle2;
+import org.apache.causeway.viewer.wicket.viewer.integration.RootRequestMapper;
 import 
org.apache.causeway.viewer.wicket.viewer.integration.WebRequestCycleForCauseway;
 
 import lombok.Getter;
@@ -138,10 +138,9 @@ protected void internalInit() {
         // settings before any other.
         setResourceSettings(new CausewayResourceSettings(this));
         super.internalInit();
-        setRequestCycleProvider(RequestCycle2::new);
+        //setRequestCycleProvider(RequestCycle2::new);
 
-        // intercept AJAX requests and reload view-models so any detached 
entities are re-fetched
-        CausewayWicketAjaxRequestListenerUtil.setRootRequestMapper(this);
+        setRootRequestMapper(new RootRequestMapper(this));
     }
 
     private AjaxRequestTarget decorate(final AjaxRequestTarget 
ajaxRequestTarget) {

Reply via email to