make SenderFactory nicer & maybe faster

This commit is contained in:
Luck 2016-09-03 00:14:40 +01:00
parent 861c1ddd69
commit cee96d7daa
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B

View File

@ -22,11 +22,13 @@
package me.lucko.luckperms.commands; package me.lucko.luckperms.commands;
import com.google.common.collect.ImmutableMap;
import lombok.Getter; import lombok.Getter;
import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.constants.Permission;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -35,7 +37,7 @@ import java.util.stream.Collectors;
*/ */
public abstract class SenderFactory<T> implements Runnable { public abstract class SenderFactory<T> implements Runnable {
private final Map<T, List<String>> messages = new HashMap<>(); private final Map<T, List<String>> messages = new HashMap<>();
//private final List<Map.Entry<T, String>> messages = new ArrayList<>(); private final AtomicBoolean shouldSend = new AtomicBoolean(false);
private final SenderFactory<T> factory = this; private final SenderFactory<T> factory = this;
protected abstract String getName(T t); protected abstract String getName(T t);
@ -48,9 +50,8 @@ public abstract class SenderFactory<T> implements Runnable {
final WeakReference<T> tRef = new WeakReference<>(t); final WeakReference<T> tRef = new WeakReference<>(t);
// Cache these permissions, so they can be accessed async // Cache these permissions, so they can be accessed async
final Map<Permission, Boolean> perms = Arrays.stream(Permission.values()) final Map<Permission, Boolean> perms = ImmutableMap.copyOf(Arrays.stream(Permission.values())
.map(p -> new AbstractMap.SimpleEntry<>(p, factory.hasPermission(t, p.getNode()))) .collect(Collectors.toMap(p -> p, p -> factory.hasPermission(t, p.getNode()))));
.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));
@Getter @Getter
final String name = factory.getName(t); final String name = factory.getName(t);
@ -69,25 +70,31 @@ public abstract class SenderFactory<T> implements Runnable {
messages.get(t).add(s); messages.get(t).add(s);
} }
shouldSend.set(true);
} }
} }
@Override @Override
public boolean hasPermission(Permission permission) { public boolean hasPermission(Permission permission) {
synchronized (perms) { return perms.get(permission);
return perms.get(permission);
}
} }
}; };
} }
@Override @Override
public final void run() { public final void run() {
if (!shouldSend.getAndSet(false)) {
return;
}
synchronized (messages) { synchronized (messages) {
if (!messages.isEmpty()) { for (Map.Entry<T, List<String>> e : messages.entrySet()) {
messages.entrySet().forEach(e -> e.getValue().forEach(s -> factory.sendMessage(e.getKey(), s))); for (String s : e.getValue()) {
messages.clear(); factory.sendMessage(e.getKey(), s);
}
} }
messages.clear();
} }
} }
} }