Bug 525925 - DI-Container has to filter out isBridge() methods

Change-Id: If946b3b4dca2aced9b2101e1313b66d156959371
diff --git a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
index 72f764d..9492e2e 100644
--- a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
+++ b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
@@ -33,6 +33,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.WeakHashMap;
+import java.util.stream.Stream;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
@@ -837,7 +838,9 @@
 	private Method[] getDeclaredMethods(Class<?> c) {
 		Method[] methods = methodsCache.get(c);
 		if (methods == null) {
-			methods = c.getDeclaredMethods();
+			// filter out all bridge methods
+			methods = Stream.of(c.getDeclaredMethods())
+					.filter(m -> !m.isBridge()).toArray(s -> new Method[s]);
 			methodsCache.put(c, methods);
 		}
 		return methods;
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBridgeTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBridgeTest.java
new file mode 100644
index 0000000..619f9b9
--- /dev/null
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBridgeTest.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2018 BestSolution.at and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.core.internal.tests.di;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.EclipseContextFactory;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.InjectionException;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.junit.Test;
+
+public class InjectBridgeTest {
+	static class Base<T> {
+		public void testInject(T value) {
+
+		}
+
+		public void testInvoke(T value) {
+
+		}
+	}
+
+	static class Concrete extends Base<String> {
+		@Inject
+		@Override
+		public void testInject(String value) {
+		}
+
+		@Override
+		@Execute
+		public void testInvoke(String value) {
+
+		}
+	}
+
+	@Test
+	public void testInjection() {
+		IEclipseContext context = EclipseContextFactory.create();
+		context.set(String.class, "Value");
+
+		ContextInjectionFactory.make(Concrete.class, context);
+	}
+
+	@Test(expected = InjectionException.class)
+	public void testInjectionFail() {
+		IEclipseContext context = EclipseContextFactory.create();
+		context.set(Object.class, "Value");
+
+		ContextInjectionFactory.make(Concrete.class, context);
+	}
+
+	@Test
+	public void testInvokation() {
+		IEclipseContext context = EclipseContextFactory.create();
+		context.set(String.class, "Value");
+
+		ContextInjectionFactory.invoke(new Concrete(), Execute.class, context);
+	}
+
+	@Test(expected = InjectionException.class)
+	public void testInvokationFail() {
+		IEclipseContext context = EclipseContextFactory.create();
+		context.set(Object.class, "Value");
+		ContextInjectionFactory.invoke(new Concrete(), Execute.class, context);
+	}
+}
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/tests/CoreTestSuite.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/tests/CoreTestSuite.java
index 32b17de..6a4936a 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/tests/CoreTestSuite.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/tests/CoreTestSuite.java
@@ -42,6 +42,7 @@
 import org.eclipse.e4.core.internal.tests.di.DisposeClassLinkTest;
 import org.eclipse.e4.core.internal.tests.di.InjectArraysTest;
 import org.eclipse.e4.core.internal.tests.di.InjectBaseTypeTest;
+import org.eclipse.e4.core.internal.tests.di.InjectBridgeTest;
 import org.eclipse.e4.core.internal.tests.di.InjectionOrderTest;
 import org.eclipse.e4.core.internal.tests.di.InjectionResultLeakTest;
 import org.eclipse.e4.core.internal.tests.di.InvokeTest;
@@ -106,6 +107,7 @@
 		ExtraDependenciesTest.class,
 		ContextFunctionDynamicsTest.class,
 		InjectArraysTest.class,
+		InjectBridgeTest.class,
 		InvokeInRATTest.class,
 		Bug317183Test.class,
 		DependenciesLeakTest.class,