Use faster wildcard parsing method

This commit is contained in:
Luck 2016-11-20 20:41:39 +00:00
parent 51732fa660
commit 4874f9d051
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
3 changed files with 37 additions and 30 deletions

View File

@ -26,27 +26,32 @@ import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.common.calculators.PermissionProcessor; import me.lucko.luckperms.common.calculators.PermissionProcessor;
import java.util.Map; import java.util.Map;
import java.util.regex.Pattern;
public class WildcardProcessor implements PermissionProcessor { public class WildcardProcessor implements PermissionProcessor {
private static final Pattern SPLIT = Pattern.compile("\\.");
private Map<String, Boolean> map = null; private Map<String, Boolean> map = null;
@Override @Override
public Tristate hasPermission(String permission) { public Tristate hasPermission(String s) {
String node = permission; if (s.startsWith(".") || !s.contains(".")) {
throw new IllegalArgumentException();
while (true) {
int endIndex = node.lastIndexOf('.');
if (endIndex == -1) {
break;
} }
node = node.substring(0, endIndex); String[] parts = SPLIT.split(s);
if (!node.isEmpty()) { StringBuilder sb = new StringBuilder();
Boolean b = map.get(node + ".*");
for (int i = parts.length - 2; i >= 0; i--) {
for (int i1 = 0; i1 <= i; i1++) {
sb.append(parts[i1]).append(".");
}
Boolean b = map.get(sb.append("*").toString());
if (b != null) { if (b != null) {
return Tristate.fromBoolean(b); return Tristate.fromBoolean(b);
} }
}
sb.setLength(0);
} }
Boolean b = map.get("'*'"); Boolean b = map.get("'*'");

View File

@ -70,6 +70,7 @@ import org.spongepowered.api.event.game.state.GamePreInitializationEvent;
import org.spongepowered.api.event.game.state.GameStoppingServerEvent; import org.spongepowered.api.event.game.state.GameStoppingServerEvent;
import org.spongepowered.api.plugin.Dependency; import org.spongepowered.api.plugin.Dependency;
import org.spongepowered.api.plugin.Plugin; import org.spongepowered.api.plugin.Plugin;
import org.spongepowered.api.plugin.PluginContainer;
import org.spongepowered.api.scheduler.AsynchronousExecutor; import org.spongepowered.api.scheduler.AsynchronousExecutor;
import org.spongepowered.api.scheduler.Scheduler; import org.spongepowered.api.scheduler.Scheduler;
import org.spongepowered.api.scheduler.SpongeExecutorService; import org.spongepowered.api.scheduler.SpongeExecutorService;
@ -365,7 +366,7 @@ public class LPSpongePlugin implements LuckPermsPlugin {
@Override @Override
public Object getPlugin(String name) { public Object getPlugin(String name) {
return game.getPluginManager().getPlugin(name).get().getInstance().get(); return game.getPluginManager().getPlugin(name).map(PluginContainer::getInstance).orElse(null);
} }
@Override @Override
@ -375,11 +376,7 @@ public class LPSpongePlugin implements LuckPermsPlugin {
@Override @Override
public UUID getUUID(String playerName) { public UUID getUUID(String playerName) {
try { return game.getServer().getPlayer(playerName).map(Player::getUniqueId).orElse(null);
return game.getServer().getPlayer(playerName).get().getUniqueId();
} catch (Exception e) {
return null;
}
} }
@Override @Override

View File

@ -26,27 +26,32 @@ import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.common.calculators.PermissionProcessor; import me.lucko.luckperms.common.calculators.PermissionProcessor;
import java.util.Map; import java.util.Map;
import java.util.regex.Pattern;
public class SpongeWildcardProcessor implements PermissionProcessor { public class SpongeWildcardProcessor implements PermissionProcessor {
private static final Pattern SPLIT = Pattern.compile("\\.");
private Map<String, Boolean> map = null; private Map<String, Boolean> map = null;
@Override @Override
public Tristate hasPermission(String permission) { public Tristate hasPermission(String s) {
String node = permission; if (s.startsWith(".") || !s.contains(".")) {
throw new IllegalArgumentException();
while (true) {
int endIndex = node.lastIndexOf('.');
if (endIndex == -1) {
break;
} }
node = node.substring(0, endIndex); String[] parts = SPLIT.split(s);
if (!node.isEmpty()) { StringBuilder sb = new StringBuilder();
Boolean b = map.get(node);
for (int i = parts.length - 2; i >= 0; i--) {
for (int i1 = 0; i1 <= i; i1++) {
sb.append(parts[i1]).append(".");
}
Boolean b = map.get(sb.deleteCharAt(sb.length() - 1).toString());
if (b != null) { if (b != null) {
return Tristate.fromBoolean(b); return Tristate.fromBoolean(b);
} }
}
sb.setLength(0);
} }
return Tristate.UNDEFINED; return Tristate.UNDEFINED;