Fix/catch IllegalArgumentException when estimating potential world contexts (#1951)

This commit is contained in:
Luck 2020-01-25 12:59:41 +00:00
parent 0864cf756c
commit 8fa629a243
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
2 changed files with 22 additions and 14 deletions

View File

@ -64,7 +64,10 @@ public class WorldCalculator implements ContextCalculator<Player> {
List<World> worlds = this.plugin.getBootstrap().getServer().getWorlds(); List<World> worlds = this.plugin.getBootstrap().getServer().getWorlds();
ImmutableContextSet.Builder builder = ImmutableContextSet.builder(); ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
for (World world : worlds) { for (World world : worlds) {
builder.add(DefaultContextKeys.WORLD_KEY, world.getName().toLowerCase()); String name = world.getName().toLowerCase();
if (!name.trim().isEmpty()) {
builder.add(DefaultContextKeys.WORLD_KEY, name);
}
} }
return builder.build(); return builder.build();
} }

View File

@ -31,6 +31,7 @@ import me.lucko.luckperms.common.context.contextset.ImmutableContextSetImpl;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import net.luckperms.api.context.ContextCalculator; import net.luckperms.api.context.ContextCalculator;
import net.luckperms.api.context.ContextSet;
import net.luckperms.api.context.ImmutableContextSet; import net.luckperms.api.context.ImmutableContextSet;
import net.luckperms.api.context.StaticContextCalculator; import net.luckperms.api.context.StaticContextCalculator;
import net.luckperms.api.query.QueryOptions; import net.luckperms.api.query.QueryOptions;
@ -62,14 +63,6 @@ public abstract class ContextManager<T> {
this.subjectClass = subjectClass; this.subjectClass = subjectClass;
} }
public ImmutableContextSet getPotentialContexts() {
ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
for (ContextCalculator<? super T> calculator : this.calculators) {
builder.addAll(calculator.estimatePotentialContexts());
}
return builder.build();
}
public Class<T> getSubjectClass() { public Class<T> getSubjectClass() {
return this.subjectClass; return this.subjectClass;
} }
@ -119,22 +112,19 @@ public abstract class ContextManager<T> {
protected QueryOptions calculate(T subject) { protected QueryOptions calculate(T subject) {
ImmutableContextSet.Builder accumulator = new ImmutableContextSetImpl.BuilderImpl(); ImmutableContextSet.Builder accumulator = new ImmutableContextSetImpl.BuilderImpl();
for (ContextCalculator<? super T> calculator : this.calculators) { for (ContextCalculator<? super T> calculator : this.calculators) {
try { try {
calculator.calculate(subject, accumulator::add); calculator.calculate(subject, accumulator::add);
} catch (Throwable e) { } catch (Throwable e) {
ContextManager.this.plugin.getLogger().warn("An exception was thrown by " + getCalculatorClass(calculator) + " whilst calculating the context of subject " + subject); this.plugin.getLogger().warn("An exception was thrown by " + getCalculatorClass(calculator) + " whilst calculating the context of subject " + subject);
e.printStackTrace(); e.printStackTrace();
} }
} }
return formQueryOptions(subject, accumulator.build()); return formQueryOptions(subject, accumulator.build());
} }
private QueryOptions calculateStatic() { private QueryOptions calculateStatic() {
ImmutableContextSet.Builder accumulator = new ImmutableContextSetImpl.BuilderImpl(); ImmutableContextSet.Builder accumulator = new ImmutableContextSetImpl.BuilderImpl();
for (StaticContextCalculator calculator : this.staticCalculators) { for (StaticContextCalculator calculator : this.staticCalculators) {
try { try {
calculator.calculate(accumulator::add); calculator.calculate(accumulator::add);
@ -143,10 +133,25 @@ public abstract class ContextManager<T> {
e.printStackTrace(); e.printStackTrace();
} }
} }
return formQueryOptions(accumulator.build()); return formQueryOptions(accumulator.build());
} }
public ImmutableContextSet getPotentialContexts() {
ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
for (ContextCalculator<? super T> calculator : this.calculators) {
ContextSet potentialContexts;
try {
potentialContexts = calculator.estimatePotentialContexts();
} catch (Throwable e) {
this.plugin.getLogger().warn("An exception was thrown by " + getCalculatorClass(calculator) + " whilst estimating potential contexts");
e.printStackTrace();
continue;
}
builder.addAll(potentialContexts);
}
return builder.build();
}
private final class StaticLookupCache extends ExpiringCache<QueryOptions> { private final class StaticLookupCache extends ExpiringCache<QueryOptions> {
StaticLookupCache() { StaticLookupCache() {
super(50L, TimeUnit.MILLISECONDS); super(50L, TimeUnit.MILLISECONDS);