summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Konrad <me@yawk.at>2015-05-18 11:14:47 +0200
committermd_5 <git@md-5.net>2015-05-18 20:08:38 +1000
commitb333b58c05a0392f3fcf825028c058518a50d1c7 (patch)
treebaaff40fb88d39992f820e9fb3085e3483f91009
parent65de010efb1a3a5ddad36160b8ad9b49420306e8 (diff)
downloadbukkit-b333b58c05a0392f3fcf825028c058518a50d1c7.tar
bukkit-b333b58c05a0392f3fcf825028c058518a50d1c7.tar.gz
bukkit-b333b58c05a0392f3fcf825028c058518a50d1c7.tar.lz
bukkit-b333b58c05a0392f3fcf825028c058518a50d1c7.tar.xz
bukkit-b333b58c05a0392f3fcf825028c058518a50d1c7.zip
SPIGOT-893: Fix bridge method registering generic listeners twice
-rw-r--r--src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java5
-rw-r--r--src/test/java/org/bukkit/event/SyntheticEventTest.java49
2 files changed, 54 insertions, 0 deletions
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
index 687029fb..21187717 100644
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
@@ -250,6 +250,11 @@ public final class JavaPluginLoader implements PluginLoader {
for (final Method method : methods) {
final EventHandler eh = method.getAnnotation(EventHandler.class);
if (eh == null) continue;
+ // Do not register bridge or synthetic methods to avoid event duplication
+ // Fixes SPIGOT-893
+ if (method.isBridge() || method.isSynthetic()) {
+ continue;
+ }
final Class<?> checkClass;
if (method.getParameterTypes().length != 1 || !Event.class.isAssignableFrom(checkClass = method.getParameterTypes()[0])) {
plugin.getLogger().severe(plugin.getDescription().getFullName() + " attempted to register an invalid EventHandler method signature \"" + method.toGenericString() + "\" in " + listener.getClass());
diff --git a/src/test/java/org/bukkit/event/SyntheticEventTest.java b/src/test/java/org/bukkit/event/SyntheticEventTest.java
new file mode 100644
index 00000000..df6cf000
--- /dev/null
+++ b/src/test/java/org/bukkit/event/SyntheticEventTest.java
@@ -0,0 +1,49 @@
+package org.bukkit.event;
+
+import org.bukkit.TestServer;
+import org.bukkit.plugin.PluginLoader;
+import org.bukkit.plugin.SimplePluginManager;
+import org.bukkit.plugin.TestPlugin;
+import org.bukkit.plugin.java.JavaPluginLoader;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SyntheticEventTest {
+ @SuppressWarnings("deprecation")
+ @Test
+ public void test() {
+ final JavaPluginLoader loader = new JavaPluginLoader(TestServer.getInstance());
+ TestPlugin plugin = new TestPlugin(getClass().getName()) {
+ @Override
+ public PluginLoader getPluginLoader() {
+ return loader;
+ }
+ };
+ SimplePluginManager pluginManager = new SimplePluginManager(TestServer.getInstance(), null);
+
+ TestEvent event = new TestEvent(false);
+ Impl impl = new Impl();
+
+ pluginManager.registerEvents(impl, plugin);
+ pluginManager.callEvent(event);
+
+ Assert.assertEquals(1, impl.callCount);
+ }
+
+ public static abstract class Base<E extends Event> implements Listener {
+ int callCount = 0;
+
+ public void accept(E evt) {
+ System.out.println("Invk " + evt);
+ callCount++;
+ }
+ }
+
+ public static class Impl extends Base<TestEvent> {
+ @Override
+ @EventHandler
+ public void accept(TestEvent evt) {
+ super.accept(evt);
+ }
+ }
+}