Repository: camel
Updated Branches:
  refs/heads/camel-2.18.x 467ded8f3 -> 92630afb2


CAMEL-10376 BeanInfo should prefer implementation methods instead of bridged 
methods


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/803f7e56
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/803f7e56
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/803f7e56

Branch: refs/heads/camel-2.18.x
Commit: 803f7e56302dca9171a94ceb6d381071725ae756
Parents: 467ded8
Author: Babur Duisenov <bduise...@gmail.com>
Authored: Mon Oct 10 15:46:09 2016 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Oct 13 10:22:08 2016 +0200

----------------------------------------------------------------------
 .../apache/camel/component/bean/BeanInfo.java   | 18 +++--
 .../bean/BeanInfoWithBridgedMethodTest.java     | 71 ++++++++++++++++++++
 2 files changed, 85 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/803f7e56/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java 
b/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
index 87be7ee..1fc4404 100644
--- a/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
+++ b/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
@@ -328,13 +328,18 @@ public class BeanInfo {
         }
 
         Set<Method> overrides = new HashSet<Method>();
-        Set<Method> bridges = new HashSet<Method>();
 
         // do not remove duplicates form class from the Java itself as they 
have some "duplicates" we need
         boolean javaClass = clazz.getName().startsWith("java.") || 
clazz.getName().startsWith("javax.");
         if (!javaClass) {
             // it may have duplicate methods already, even from declared or 
from interfaces + declared
             for (Method source : methods) {
+
+                // skip bridge methods in duplicate checks (as the bridge 
method is inserted by the compiler due to type erasure)
+                if (source.isBridge()) {
+                    continue;
+                }
+
                 for (Method target : methods) {
                     // skip ourselves
                     if (ObjectHelper.isOverridingMethod(source, target, true)) 
{
@@ -354,10 +359,15 @@ public class BeanInfo {
         if (Modifier.isPublic(clazz.getModifiers())) {
             // add additional interface methods
             List<Method> extraMethods = getInterfaceMethods(clazz);
-            for (Method target : extraMethods) {
-                for (Method source : methods) {
+            for (Method source : extraMethods) {
+                for (Method target : methods) {
                     if (ObjectHelper.isOverridingMethod(source, target, 
false)) {
-                        overrides.add(target);
+                        overrides.add(source);
+                    }
+                }
+                for (Method target : methodMap.keySet()) {
+                    if (ObjectHelper.isOverridingMethod(source, target, 
false)) {
+                        overrides.add(source);
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/camel/blob/803f7e56/camel-core/src/test/java/org/apache/camel/component/bean/BeanInfoWithBridgedMethodTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/bean/BeanInfoWithBridgedMethodTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/bean/BeanInfoWithBridgedMethodTest.java
new file mode 100644
index 0000000..813c11e
--- /dev/null
+++ 
b/camel-core/src/test/java/org/apache/camel/component/bean/BeanInfoWithBridgedMethodTest.java
@@ -0,0 +1,71 @@
+package org.apache.camel.component.bean;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Service;
+import org.apache.camel.impl.DefaultExchange;
+
+/**
+ * Unit test for bridged methods.
+ */
+public class BeanInfoWithBridgedMethodTest extends ContextTestSupport {
+
+    public void testBridgedMethod() throws Exception {
+        BeanInfo beanInfo = new BeanInfo(context, MyService.class);
+
+        DefaultExchange exchange = new DefaultExchange(context);
+        exchange.getIn().setBody(new Request(1));
+
+        try {
+            MyService myService = new MyService();
+            MethodInvocation mi = beanInfo.createInvocation(null, exchange);
+            assertEquals("MyService", 
mi.getMethod().getDeclaringClass().getSimpleName());
+            assertEquals(2, mi.getMethod().invoke(myService, new Request(1)));
+        } catch (AmbiguousMethodCallException e) {
+            fail("This should not be ambiguous!");
+        }
+    }
+
+    public void testPackagePrivate() throws Exception {
+        BeanInfo beanInfo = new BeanInfo(context, 
MyPackagePrivateService.class);
+
+        DefaultExchange exchange = new DefaultExchange(context);
+        exchange.getIn().setBody(new Request(1));
+
+        try {
+            MyPackagePrivateService myService = new MyPackagePrivateService();
+            MethodInvocation mi = beanInfo.createInvocation(null, exchange);
+            assertEquals("Service", 
mi.getMethod().getDeclaringClass().getSimpleName());
+            assertEquals(4, mi.getMethod().invoke(myService, new Request(2)));
+        } catch (AmbiguousMethodCallException e) {
+            fail("This should not be ambiguous!");
+        }
+    }
+
+    public static class Request {
+        int x;
+
+        public Request(int x) {
+            this.x = x;
+        }
+    }
+
+    public interface Service<R> {
+
+        int process(R request);
+    }
+
+    public static class MyService implements Service<Request> {
+
+        public int process(Request request) {
+            return request.x + 1;
+        }
+    }
+
+    static class MyPackagePrivateService implements Service<Request> {
+
+        public int process(Request request) {
+            return request.x + 2;
+        }
+    }
+
+}

Reply via email to