diff --git a/zkbind/src/main/java/org/zkoss/bind/init/ViewModelAnnotationResolvers.java b/zkbind/src/main/java/org/zkoss/bind/init/ViewModelAnnotationResolvers.java index a5e890bd8ec..780ea4ced65 100644 --- a/zkbind/src/main/java/org/zkoss/bind/init/ViewModelAnnotationResolvers.java +++ b/zkbind/src/main/java/org/zkoss/bind/init/ViewModelAnnotationResolvers.java @@ -106,13 +106,13 @@ public static T getAnnotation(Class clazz, Class annot * @since 9.6.0 */ public static Method getOriginalMethod(Object base, Method method) { - Method m; + Method m = null; List resolvers = getResolvers(); for (ViewModelAnnotationResolver resolver : resolvers) { m = resolver.getOriginalMethod(base, method); - if (m != null) + if (m != null && !method.equals(m)) break; } - return method; + return m; } } \ No newline at end of file diff --git a/zkdoc/release-note b/zkdoc/release-note index 176791a181c..6d6d2d30932 100644 --- a/zkdoc/release-note +++ b/zkdoc/release-note @@ -2,6 +2,7 @@ ZK 10.1.0 * Features * Bugs + ZK-5764: Unable to call original method when using custom ViewModelAnnotationResolver * Upgrade Notes diff --git a/zktest/src/main/java/org/zkoss/zktest/test2/B101_ZK_5764VM.java b/zktest/src/main/java/org/zkoss/zktest/test2/B101_ZK_5764VM.java new file mode 100644 index 00000000000..bb47a958a92 --- /dev/null +++ b/zktest/src/main/java/org/zkoss/zktest/test2/B101_ZK_5764VM.java @@ -0,0 +1,33 @@ +/* B101_ZK_5764VM.java + + Purpose: + + Description: + + History: + Fri Aug 02 12:50:22 CST 2024, Created by jameschu + +Copyright (C) 2024 Potix Corporation. All Rights Reserved. +*/ +package org.zkoss.zktest.test2; + +import java.lang.reflect.Method; + +import org.zkoss.bind.annotation.Command; +import org.zkoss.bind.init.ViewModelAnnotationResolvers; +import org.zkoss.zk.ui.util.Clients; + +/** + * @author jameschu + */ +public class B101_ZK_5764VM { + @Command + public void update() { + try { + Method update = ViewModelAnnotationResolvers.getOriginalMethod(this, this.getClass().getMethod("update")); + Clients.log(update.getDeclaringClass().getName()); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/zktest/src/main/java/org/zkoss/zktest/test2/B101_ZK_5764ViewModelAnnotationHandler.java b/zktest/src/main/java/org/zkoss/zktest/test2/B101_ZK_5764ViewModelAnnotationHandler.java new file mode 100644 index 00000000000..f445f8123fd --- /dev/null +++ b/zktest/src/main/java/org/zkoss/zktest/test2/B101_ZK_5764ViewModelAnnotationHandler.java @@ -0,0 +1,45 @@ +/* + B101_ZK_5764ViewModelAnnotationHandler.java + Purpose: + + Description: + + History: + Fri Aug 02 12:50:22 CST 2024, Created by jameschu + +Copyright (C) 2024 Potix Corporation. All Rights Reserved. +*/ +package org.zkoss.zktest.test2; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +import org.zkoss.bind.ViewModelAnnotationResolver; + +/** + * @author jameschu + */ +public class B101_ZK_5764ViewModelAnnotationHandler implements ViewModelAnnotationResolver { + public T getAnnotation(Method method, Class annotationClass) { + return method.getAnnotation(annotationClass); + } + + public T getAnnotation(Class clazz, Class annotationClass) { + return (T) clazz.getAnnotation(annotationClass); + } + + public Method getOriginalMethod(Object base, Method method) { + try { + String targetMethodName = "update"; + if (targetMethodName.equals(method.getName())) { + return this.getClass().getMethod(targetMethodName); + } + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + return method; + } + + public void update() { + } +} diff --git a/zktest/src/main/webapp/WEB-INF/zk.xml b/zktest/src/main/webapp/WEB-INF/zk.xml index 2e2a4b3afbd..d10e2f5cd1f 100644 --- a/zktest/src/main/webapp/WEB-INF/zk.xml +++ b/zktest/src/main/webapp/WEB-INF/zk.xml @@ -844,4 +844,8 @@ Copyright (C) 2006 Potix Corporation. All Rights Reserved. + + + + diff --git a/zktest/src/main/webapp/test2/B101-ZK-5764-zk.xml b/zktest/src/main/webapp/test2/B101-ZK-5764-zk.xml new file mode 100644 index 00000000000..43777eeb124 --- /dev/null +++ b/zktest/src/main/webapp/test2/B101-ZK-5764-zk.xml @@ -0,0 +1,6 @@ + + + + org.zkoss.zktest.test2.B101_ZK_5764ViewModelAnnotationHandler + + \ No newline at end of file diff --git a/zktest/src/main/webapp/test2/B101-ZK-5764.zul b/zktest/src/main/webapp/test2/B101-ZK-5764.zul new file mode 100644 index 00000000000..eb4a021b6db --- /dev/null +++ b/zktest/src/main/webapp/test2/B101-ZK-5764.zul @@ -0,0 +1,26 @@ + + + + +
+
+
diff --git a/zktest/src/main/webapp/test2/config.properties b/zktest/src/main/webapp/test2/config.properties index ac37390c102..8b60e5982e3 100644 --- a/zktest/src/main/webapp/test2/config.properties +++ b/zktest/src/main/webapp/test2/config.properties @@ -3125,6 +3125,9 @@ B90-ZK-4431.zul=A,E,Multislider ##zats##B100-ZK-5650.zul=A,E,Fileupload,WebSocket ##zats##B100-ZK-5722.zul=A,E,XSS,Security +## B101 +##zats##B101-ZK-5764.zul=A,E,MVVM,Annotation,Method + ## # Features - 3.0.x version ## diff --git a/zktest/src/test/java/org/zkoss/zktest/zats/test2/B101_ZK_5764Test.java b/zktest/src/test/java/org/zkoss/zktest/zats/test2/B101_ZK_5764Test.java new file mode 100644 index 00000000000..19485e6c9e4 --- /dev/null +++ b/zktest/src/test/java/org/zkoss/zktest/zats/test2/B101_ZK_5764Test.java @@ -0,0 +1,38 @@ +/* B101_ZK_5764Test.java + + Purpose: + + Description: + + History: + Fri Aug 02 12:50:22 CST 2024, Created by jameschu + +Copyright (C) 2024 Potix Corporation. All Rights Reserved. +*/ +package org.zkoss.zktest.zats.test2; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import org.zkoss.test.webdriver.ExternalZkXml; +import org.zkoss.test.webdriver.ForkJVMTestOnly; +import org.zkoss.zats.mimic.DesktopAgent; +import org.zkoss.zktest.zats.ZATSTestCase; + +/** + * @author jameschu + */ +@ForkJVMTestOnly +public class B101_ZK_5764Test extends ZATSTestCase { + @RegisterExtension + public static final ExternalZkXml CONFIG = new ExternalZkXml("/test2/B101-ZK-5764-zk.xml"); + + @Test + public void test() { + DesktopAgent desktopAgent = connect(); + desktopAgent.query("button").click(); + assertEquals("org.zkoss.zktest.test2.B101_ZK_5764ViewModelAnnotationHandler", desktopAgent.getZkLog().get(0)); + } +}