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,