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

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


The following commit(s) were added to refs/heads/v4 by this push:
     new e6cb30941a3 CAUSEWAY-3889: IconUiEvent construction fix
e6cb30941a3 is described below

commit e6cb30941a30de343948a1a816a921f4456467f0
Author: Andi Huber <[email protected]>
AuthorDate: Fri Aug 29 10:26:03 2025 +0200

    CAUSEWAY-3889: IconUiEvent construction fix
---
 .../causeway/applib/events/EventObjectBase.java    | 35 +++--------------
 .../causeway/applib/events/ui/IconUiEvent.java     | 15 ++------
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |  4 +-
 .../causeway/viewer/wicket/ui/exec/Mediator.java   | 45 ++++++++++------------
 4 files changed, 31 insertions(+), 68 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/events/EventObjectBase.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/events/EventObjectBase.java
index 1bff7ae3f27..3b7b3eef7ef 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/events/EventObjectBase.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/events/EventObjectBase.java
@@ -18,18 +18,18 @@
  */
 package org.apache.causeway.applib.events;
 
-import java.util.Arrays;
 import java.util.Optional;
 import java.util.function.Supplier;
 
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.commons.functional.Try;
+import org.apache.causeway.commons.internal._Constants;
 import org.apache.causeway.commons.internal.base._Casts;
+import org.apache.causeway.commons.internal.reflection._ClassCache;
+import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedConstructor;
 import org.apache.causeway.commons.internal.reflection._Reflect;
 
-import static 
org.apache.causeway.commons.internal.reflection._Reflect.predicates.paramCount;
-
 /**
  * @since 2.0 {@index}
  */
@@ -56,9 +56,9 @@ public static <T, E extends EventObjectBase<T>> Optional<E> 
getInstanceWithSourc
      */
     public static <T, E extends EventObjectBase<T>> Optional<E> 
getInstanceWithSourceSupplier(
             final Class<E> eventType, final @Nullable Supplier<T> 
eventSourceSupplier) {
-        return _Reflect.getPublicConstructors(eventType)
-            .filter(paramCount(0))
-            .getFirst()
+        return _ClassCache.getInstance()
+            .lookupPublicConstructor(eventType, _Constants.emptyClasses)
+            .map(ResolvedConstructor::constructor)
             .map(_Reflect::invokeConstructor)
             .flatMap(Try::getValue)
             .map(evnt->{
@@ -68,29 +68,6 @@ public static <T, E extends EventObjectBase<T>> Optional<E> 
getInstanceWithSourc
             });
     }
 
-    /**
-     * Variant with additional constructor argument
-     */
-    public static <T, E extends EventObjectBase<T>, A> Optional<E> 
getInstanceWithSourceSupplier(
-            final Class<E> eventType, final @Nullable Supplier<T> 
eventSourceSupplier,
-            final Class<A> constructorArgType,
-            final A constructorArg) {
-
-        var parameterTypes = new Class[] {constructorArgType};
-
-        return _Reflect.getPublicConstructors(eventType)
-            .filter(paramCount(1))
-            
.filter(constructor->Arrays.equals(constructor.getParameterTypes(), 
parameterTypes))
-            .getFirst()
-            .map(constructor->_Reflect.invokeConstructor(constructor, 
constructorArg))
-            .flatMap(Try::getValue)
-            .map(evnt->_Casts.<E>uncheckedCast(evnt))
-            .map((E event)->{
-                event.sourceSupplier = eventSourceSupplier;
-                return event;
-            });
-    }
-
     // --
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/events/ui/IconUiEvent.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/events/ui/IconUiEvent.java
index eb7b6aec956..5cc0242c6db 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/events/ui/IconUiEvent.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/events/ui/IconUiEvent.java
@@ -51,20 +51,11 @@ public abstract class IconUiEvent<S> extends 
AbstractUiEvent<S> {
      * <p>Because the {@link EventObject} superclass prohibits a null source, 
a dummy value is temporarily used.
      */
     protected IconUiEvent() {
-        this(null, null);
+        super(null);
     }
 
-    public IconUiEvent(ObjectSupport.IconWhere iconWhere) {
-        this(null, iconWhere);
-    }
-
-    public IconUiEvent(final S source, ObjectSupport.IconWhere iconWhere) {
-        super(source);
-        this.iconWhere = iconWhere;
-    }
-
-    @Getter @Accessors(fluent = true)
-    private final ObjectSupport.IconWhere iconWhere;
+    @Getter @Setter @Accessors(fluent = true)
+    private ObjectSupport.IconWhere iconWhere;
 
     /**
      * Icon resource for corresponding domain object,
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
index 152d0d43ee5..e2dc74d72cb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
@@ -96,9 +96,9 @@ public void visitAttributes(final BiConsumer<String, Object> 
visitor) {
     }
 
     private IconUiEvent<Object> newIconUiEvent(final ManagedObject 
owningAdapter, ObjectSupport.IconWhere iconWhere) {
-        return EventObjectBase.getInstanceWithSourceSupplier(iconUiEventClass, 
owningAdapter::getPojo,
-            ObjectSupport.IconWhere.class, iconWhere)
+        var iconUiEvent = 
EventObjectBase.getInstanceWithSourceSupplier(iconUiEventClass, 
owningAdapter::getPojo)
             .orElseThrow();
+        return iconUiEvent.iconWhere(iconWhere);
     }
 
     private Optional<IconFacet> underlyingIconFacet() {
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
index 98b5225364b..b708cd3f019 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
@@ -134,31 +134,26 @@ void handle() {
                     // non-Ajax request => just stream the Lob to the browser
                     // or if this is a no-arg action, there also will be no 
parent for the component
                     requestCycle.scheduleRequestHandlerAfterCurrent(handler());
+                    return;
+                }
+                // otherwise,
+                // Ajax request => respond with a redirect to be able to 
stream the Lob to the client
+                final IRequestHandler requestHandler = handler();
+                if(requestHandler instanceof ResourceStreamRequestHandler 
scheduledHandler) {
+                    var streamingBehavior = new 
StreamAfterAjaxResponseBehavior(scheduledHandler);
+                    ajaxTarget.getPage().add(streamingBehavior);
+                    scheduleJs(ajaxTarget, 
javascriptFor_sameWindow(streamingBehavior.getCallbackUrl()), 100);
+                } else if(requestHandler instanceof 
RedirectRequestHandlerWithOpenUrlStrategy redirectHandler) {
+                    var fullUrl = expanded(requestCycle, 
redirectHandler.getRedirectUrl());
+                    var js = redirectHandler.getOpenUrlStrategy().isNewWindow()
+                        ? javascriptFor_newWindow(fullUrl)
+                        : javascriptFor_sameWindow(fullUrl);
+
+                    scheduleJs(ajaxTarget, js, 100);
                 } else {
-                    // otherwise,
-                    // Ajax request => respond with a redirect to be able to 
stream the Lob to the client
-                    final IRequestHandler requestHandler = handler();
-                    if(requestHandler instanceof ResourceStreamRequestHandler 
scheduledHandler) {
-                        var streamingBehavior = new 
StreamAfterAjaxResponseBehavior(scheduledHandler);
-                        var page = ajaxTarget.getPage();
-                        page.add(streamingBehavior);
-                        CharSequence callbackUrl = 
streamingBehavior.getCallbackUrl();
-                        scheduleJs(ajaxTarget, 
javascriptFor_sameWindow(callbackUrl), 10);
-                    } else if(requestHandler instanceof 
RedirectRequestHandlerWithOpenUrlStrategy redirectHandler) {
-
-                        final String url = redirectHandler.getRedirectUrl();
-                        final String fullUrl = expanded(requestCycle, url);
-
-                        if(redirectHandler.getOpenUrlStrategy().isNewWindow()) 
{
-                            scheduleJs(ajaxTarget, 
javascriptFor_newWindow(fullUrl), 100);
-                        } else {
-                            scheduleJs(ajaxTarget, 
javascriptFor_sameWindow(fullUrl), 100);
-                        }
-                    } else {
-                        throw _Exceptions.unrecoverable(
-                                "no logic implemented to handle 
IRequestHandler of type %s",
-                                requestHandler.getClass().getName());
-                    }
+                    throw _Exceptions.unrecoverable(
+                            "no logic implemented to handle IRequestHandler of 
type %s",
+                            requestHandler.getClass().getName());
                 }
             }
         }
@@ -195,7 +190,7 @@ private static String javascriptFor_sameWindow(final 
CharSequence url) {
 
     private static void scheduleJs(final AjaxRequestTarget target, final 
String js, final int millis) {
         // the timeout is needed to let Wicket release the channel
-        target.appendJavaScript(String.format("setTimeout(%s, %d);", js, 
millis));
+        target.appendJavaScript("setTimeout(%s, %d);".formatted(js, millis));
     }
 
     /**

Reply via email to