Skip to content

Commit 863a128

Browse files
committed
monitor handled listeners
1 parent 2eaf5e3 commit 863a128

File tree

5 files changed

+35
-19
lines changed

5 files changed

+35
-19
lines changed

src/main/java/com/mengcraft/script/EventListener.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@
1010
import org.bukkit.event.Listener;
1111
import org.bukkit.plugin.RegisteredListener;
1212

13+
import javax.script.Bindings;
1314
import java.util.Collections;
1415
import java.util.EnumMap;
1516
import java.util.List;
16-
import java.util.function.Consumer;
17-
import java.util.logging.Level;
1817

1918
/**
2019
* Created on 16-10-17.
@@ -42,7 +41,7 @@ protected void remove(HandledListener listener) {
4241
}
4342
}
4443

45-
public HandledListener add(ScriptPlugin script, Consumer<Event> executor, int order) {
44+
public HandledListener add(ScriptPlugin script, Bindings executor, int order) {
4645
CustomRegisteredListener custom = handledExecutors.computeIfAbsent(Utils.getEventPriority(order),
4746
priority -> new CustomRegisteredListener(priority, false));
4847
if (custom.isEmpty()) {
@@ -77,11 +76,7 @@ private CustomRegisteredListener(EventPriority priority, boolean ignoreCancelled
7776
public void callEvent(Event event) {
7877
if (clz == event.getClass()) {
7978
for (HandledListener listener : executors) {
80-
try {
81-
listener.getExecutor().accept(event);
82-
} catch (Exception e) {
83-
listener.getPlugin().getLogger().log(Level.SEVERE, name(), e);
84-
}
79+
listener.handle(event);
8580
}
8681
}
8782
}

src/main/java/com/mengcraft/script/HandledListener.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.mengcraft.script;
22

3+
import com.mengcraft.script.util.Utils;
34
import lombok.EqualsAndHashCode;
45
import org.bukkit.event.Event;
56
import org.bukkit.event.EventPriority;
67

8+
import javax.script.Bindings;
79
import java.util.Comparator;
810
import java.util.UUID;
9-
import java.util.function.Consumer;
11+
import java.util.logging.Level;
1012

1113
/**
1214
* Created on 16-10-17.
@@ -15,30 +17,40 @@
1517
public class HandledListener {
1618

1719
private final UUID id = UUID.randomUUID();// Use random id to func
18-
private final Consumer<Event> executor;
20+
private final Bindings executor;
1921
private final EventListener managedListener;
2022
private final int priority;
2123
private final ScriptPlugin plugin;
2224
private final EventPriority eventPriority;
2325

24-
public HandledListener(EventListener managedListener, ScriptPlugin plugin, Consumer<Event> executor, int priority, EventPriority eventPriority) {
26+
public HandledListener(EventListener managedListener, ScriptPlugin plugin, Bindings executor, int priority, EventPriority eventPriority) {
2527
this.managedListener = managedListener;
2628
this.plugin = plugin;
2729
this.executor = executor;
2830
this.priority = priority;
2931
this.eventPriority = eventPriority;
3032
}
3133

34+
public void handle(Event event) {
35+
long millis = System.currentTimeMillis();
36+
try {
37+
Utils.invoke(executor, event);
38+
} catch (Exception e) {
39+
plugin.getLogger().log(Level.SEVERE, String.format("Exception occurred while handle %s\n%s", event.getEventName(), executor.toString()), e);
40+
} finally {
41+
millis = System.currentTimeMillis() - millis;
42+
if (millis >= 5) {
43+
plugin.getLogger().warning(String.format("Consume too much time to handle %s. (%s millis)\n%s", event.getEventName(), millis, executor.toString()));
44+
}
45+
}
46+
}
47+
3248
public void remove() {
3349
if (plugin.remove(this)) {
3450
managedListener.remove(this);
3551
}
3652
}
3753

38-
public Consumer<Event> getExecutor() {
39-
return executor;
40-
}
41-
4254
public ScriptPlugin getPlugin() {
4355
return plugin;
4456
}

src/main/java/com/mengcraft/script/ScriptPlugin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,11 @@ public HandledPlaceholder addPlaceholder(String id, HandledPlaceholder.Func func
204204
throw new IllegalStateException("id " + id + " conflict");
205205
}
206206

207-
public HandledListener addListener(String event, Consumer<Event> i) {
208-
return addListener(event, i, -1);
207+
public HandledListener addListener(String event, Bindings executor) {
208+
return addListener(event, executor, -1);
209209
}
210210

211-
public HandledListener addListener(String eventName, Consumer<Event> executor, int priority) {
211+
public HandledListener addListener(String eventName, Bindings executor, int priority) {
212212
Preconditions.checkState(isHandled(), "unloaded");
213213
EventListener handle = EventMapping.INSTANCE.getListener(eventName);
214214
HandledListener add = handle.add(this, executor, priority);

src/main/java/com/mengcraft/script/loader/ScriptLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private static void loadListener(ScriptPlugin plugin, ScriptEngine ctx) {
8080
if (handle != null && EventMapping.INSTANCE.initialized(handle)) {
8181
var obj = ctx.get("handle");
8282
if (obj != null) {
83-
plugin.addListener(handle, ((Invocable) ctx).getInterface(obj, Consumer.class));
83+
plugin.addListener(handle, (Bindings) obj);
8484
}
8585
}
8686
}

src/main/java/com/mengcraft/script/util/Utils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import javax.script.ScriptEngine;
1212
import java.math.BigDecimal;
1313
import java.util.concurrent.atomic.AtomicInteger;
14+
import java.util.function.BiConsumer;
1415
import java.util.function.Consumer;
1516
import java.util.function.Function;
1617

@@ -19,6 +20,7 @@ public class Utils {
1920
private static final Yaml YAML = new Yaml();
2021
private static Function<Object, Bindings> java_from_invoker;
2122
private static Consumer<Bindings> function_invoker;
23+
private static BiConsumer<Bindings, Object> function_alt_invoker;
2224

2325
public static Yaml getYaml() {
2426
return YAML;
@@ -50,12 +52,19 @@ public static void setup(ScriptEngine js) {
5052
bindings = js.createBindings();
5153
js.eval("function accept(a){a();}", bindings);
5254
function_invoker = ((Invocable) js).getInterface(bindings, Consumer.class);
55+
bindings = js.createBindings();
56+
js.eval("function accept(a, b){a(b);}", bindings);
57+
function_alt_invoker = ((Invocable) js).getInterface(bindings, BiConsumer.class);
5358
}
5459

5560
public static void invoke(Bindings bindings) {
5661
function_invoker.accept(bindings);
5762
}
5863

64+
public static <T> void invoke(Bindings invokable, T obj) {
65+
function_alt_invoker.accept(invokable, obj);
66+
}
67+
5968
@SneakyThrows
6069
public static <T> Bindings fromJava(T obj) {
6170
return java_from_invoker.apply(obj);

0 commit comments

Comments
 (0)