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

reta pushed a commit to branch 3.5.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 57be21cbd61816948105c6bf7a7c1697487b5a0f
Author: Jamie Goodyear <[email protected]>
AuthorDate: Sat Apr 6 13:36:50 2024 -0230

    [CXF-8996] JAXRS Bean introspection utility Beanspector improvement (#1784)
    
    * [CXF-8996] JAXRS Bean introspection utility Beanspector relies on 
Class.getMethods natural order
    
    * [CXF-8996] Remove debugging line from isSetter check
    
    (cherry picked from commit 2c45dc3c1f6c9fc83780d40a411e93093e5f6ecb)
    (cherry picked from commit e9e7f68255bc886fab5b40cdfbc1468199f81b23)
---
 .../apache/cxf/jaxrs/ext/search/Beanspector.java   | 101 ++++++++++++---------
 1 file changed, 58 insertions(+), 43 deletions(-)

diff --git 
a/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/Beanspector.java
 
b/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/Beanspector.java
index 628e05667f..7a2a3b7b0a 100644
--- 
a/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/Beanspector.java
+++ 
b/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/Beanspector.java
@@ -22,10 +22,12 @@ import java.beans.IntrospectionException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -58,49 +60,62 @@ public class Beanspector<T> {
         init();
     }
 
-    @SuppressWarnings("unchecked") 
-    private void init() { 
-        if (tclass == null) { 
-            tclass = (Class<T>)tobj.getClass(); 
-        } 
-        for (Method m : tclass.getMethods()) { 
-            if (isGetter(m)) { 
-                String pname = getPropertyName(m); 
-                if (!getters.containsKey(pname)) { 
-                    getters.put(getPropertyName(m), m); 
-                } else { 
-                    // Prefer the getter that has the most specialized class 
as a return type 
-                    Method met = getters.get(pname); 
-                    if 
(met.getReturnType().isAssignableFrom(m.getReturnType())) { 
-                        getters.put(pname, m); 
-                    } 
-                } 
-            } else if (isSetter(m)) { 
-                String pname = getPropertyName(m); 
-                if (!setters.containsKey(pname)) { 
-                    setters.put(getPropertyName(m), m); 
-                } else { 
-                    // Prefer the setter that has the most specialized class 
as a parameter 
-                    Method met = setters.get(pname); 
-                    if 
(met.getParameterTypes()[0].isAssignableFrom(m.getParameterTypes()[0])) { 
-                        setters.put(pname, m); 
-                    } 
-                } 
-            } 
-        } 
-        // check type equality for getter-setter pairs 
-        Set<String> pairs = new HashSet<>(getters.keySet()); 
-        pairs.retainAll(setters.keySet()); 
-        for (String accessor : pairs) { 
-            Class<?> getterClass = getters.get(accessor).getReturnType(); 
-            Class<?> setterClass = 
setters.get(accessor).getParameterTypes()[0]; 
-            if (!setterClass.isAssignableFrom(getterClass)) { 
-                throw new IllegalArgumentException(String 
-                        .format("Accessor '%s' type mismatch, getter type is 
%s while setter type is %s", 
-                                accessor, getterClass.getName(), 
setterClass.getName())); 
-            } 
-        } 
-    } 
+    @SuppressWarnings("unchecked")
+    private void init() {
+        if (tclass == null) {
+            tclass = (Class<T>)tobj.getClass();
+        }
+
+        List<Method> methods = Arrays.asList(tclass.getMethods());
+        Collections.sort(methods, (m1, m2) -> {
+            if (m1.getDeclaringClass().equals(m2.getDeclaringClass())) {
+                return 0;
+            } else if (m1.getDeclaringClass().equals(tclass)) {
+                return -1;
+            } else {
+                return 1;
+            }
+        });
+
+        for (Method m : methods) {
+            if (isGetter(m)) {
+                String pname = getPropertyName(m);
+                if (!getters.containsKey(pname)) {
+                    getters.put(getPropertyName(m), m);
+                } else {
+                    // Prefer the getter that has the most specialized class 
as a return type
+                    Method met = getters.get(pname);
+                    if 
(met.getReturnType().isAssignableFrom(m.getReturnType())) {
+                        getters.put(pname, m);
+                    }
+                }
+            } else if (isSetter(m)) {
+                String pname = getPropertyName(m);
+                if (!setters.containsKey(pname)) {
+                    setters.put(getPropertyName(m), m);
+                } else {
+                    // Prefer the setter that has the most specialized class 
as a parameter
+                    Method met = setters.get(pname);
+                    if 
(met.getParameterTypes()[0].isAssignableFrom(m.getParameterTypes()[0])) {
+                        setters.put(pname, m);
+                    }
+                }
+            }
+        }
+
+        // check type equality for getter-setter pairs
+        Set<String> pairs = new HashSet<>(getters.keySet());
+        pairs.retainAll(setters.keySet());
+        for (String accessor : pairs) {
+            Class<?> getterClass = getters.get(accessor).getReturnType();
+            Class<?> setterClass = 
setters.get(accessor).getParameterTypes()[0];
+            if (!setterClass.isAssignableFrom(getterClass)) {
+                throw new IllegalArgumentException(String
+                        .format("Accessor '%s' type mismatch, getter type is 
%s while setter type is %s",
+                                accessor, getterClass.getName(), 
setterClass.getName()));
+            }
+        }
+    }
 
     public T getBean() {
         return tobj;

Reply via email to