Improve the way meta lookups are caught & reported to the verbose handler

This commit is contained in:
Luck 2018-11-06 13:15:30 +00:00
parent 8584a9b72c
commit 9988011308
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
6 changed files with 67 additions and 17 deletions

View File

@ -133,7 +133,7 @@ public class VaultChatHook extends AbstractVaultChat {
User user = this.permissionHook.lookupUser(uuid);
Contexts contexts = this.permissionHook.contextForLookup(user, world);
MetaCache metaData = user.getCachedData().getMetaData(contexts);
String ret = metaData.getMetaValue(key, MetaCheckEvent.Origin.THIRD_PARTY_API);
String ret = metaData.getMeta(MetaCheckEvent.Origin.THIRD_PARTY_API).get(key);
if (log()) {
logMsg("#getUserMeta: %s - %s - %s - %s", user.getPlainDisplayName(), contexts.getContexts().toMultimap(), key, ret);
}
@ -211,7 +211,7 @@ public class VaultChatHook extends AbstractVaultChat {
}
Contexts contexts = this.permissionHook.contextForLookup(null, world);
MetaCache metaData = group.getCachedData().getMetaData(contexts);
String ret = metaData.getMetaValue(key, MetaCheckEvent.Origin.THIRD_PARTY_API);
String ret = metaData.getMeta(MetaCheckEvent.Origin.THIRD_PARTY_API).get(key);
if (log()) {
logMsg("#getGroupMeta: %s - %s - %s - %s", group.getName(), contexts.getContexts().toMultimap(), key, ret);
}

View File

@ -25,6 +25,8 @@
package me.lucko.luckperms.common.caching.type;
import com.google.common.collect.ForwardingListMultimap;
import com.google.common.collect.ForwardingMap;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedMap;
@ -152,22 +154,20 @@ public class MetaCache implements MetaData {
@Override
public @NonNull ListMultimap<String, String> getMetaMultimap() {
return this.metaMultimap;
return getMetaMultimap(MetaCheckEvent.Origin.LUCKPERMS_API);
}
public ListMultimap<String, String> getMetaMultimap(MetaCheckEvent.Origin origin) {
return new VerboseLoggedMetaMultimap(origin);
}
@Override
public @NonNull Map<String, String> getMeta() {
return this.meta;
return getMeta(MetaCheckEvent.Origin.LUCKPERMS_API);
}
public String getMetaValue(String key, MetaCheckEvent.Origin origin) {
String value = this.meta.get(key);
// log this meta lookup to the verbose handler
VerboseHandler verboseHandler = this.metadata.getParentContainer().getPlugin().getVerboseHandler();
verboseHandler.offerMetaCheckEvent(origin, this.metadata.getObjectName(), this.metadata.getContext(), key, String.valueOf(value));
return value;
public Map<String, String> getMeta(MetaCheckEvent.Origin origin) {
return new VerboseLoggedMetaMap(origin);
}
@Override
@ -180,4 +180,54 @@ public class MetaCache implements MetaData {
return this.suffixes;
}
private final class VerboseLoggedMetaMap extends ForwardingMap<String, String> {
private final MetaCheckEvent.Origin origin;
private VerboseLoggedMetaMap(MetaCheckEvent.Origin origin) {
this.origin = origin;
}
@Override
protected Map<String, String> delegate() {
return MetaCache.this.meta;
}
@Override
public String get(Object key) {
String value = super.get(key);
// log this meta lookup to the verbose handler
VerboseHandler verboseHandler = MetaCache.this.metadata.getParentContainer().getPlugin().getVerboseHandler();
verboseHandler.offerMetaCheckEvent(this.origin, MetaCache.this.metadata.getObjectName(), MetaCache.this.metadata.getContext(), (String) key, String.valueOf(value));
return value;
}
}
private final class VerboseLoggedMetaMultimap extends ForwardingListMultimap<String, String> {
private final MetaCheckEvent.Origin origin;
private VerboseLoggedMetaMultimap(MetaCheckEvent.Origin origin) {
this.origin = origin;
}
@Override
protected ListMultimap<String, String> delegate() {
return MetaCache.this.metaMultimap;
}
@Override
public List<String> get(String key) {
List<String> values = super.get(key);
// log this meta lookup to the verbose handler
VerboseHandler verboseHandler = MetaCache.this.metadata.getParentContainer().getPlugin().getVerboseHandler();
for (String value : values) {
verboseHandler.offerMetaCheckEvent(this.origin, MetaCache.this.metadata.getObjectName(), MetaCache.this.metadata.getContext(), key, String.valueOf(value));
}
return values;
}
}
}

View File

@ -264,14 +264,14 @@ public class DebugCommand extends SingleCommand {
})
.add("meta", () -> {
JObject metaMap = new JObject();
for (Map.Entry<String, String> entry : metaData.getMeta().entrySet()) {
for (Map.Entry<String, String> entry : metaData.getMeta(MetaCheckEvent.Origin.INTERNAL).entrySet()) {
metaMap.add(entry.getKey(), entry.getValue());
}
return metaMap;
})
.add("metaMap", () -> {
JObject metaMultimap = new JObject();
for (Map.Entry<String, Collection<String>> entry : metaData.getMetaMultimap().asMap().entrySet()) {
for (Map.Entry<String, Collection<String>> entry : metaData.getMetaMultimap(MetaCheckEvent.Origin.INTERNAL).asMap().entrySet()) {
JArray values = new JArray();
for (String v : entry.getValue()) {
values.add(v);

View File

@ -121,7 +121,7 @@ public class UserInfo extends SubCommand<User> {
suffix = "&f\"" + sussexValue + "&f\"";
}
ListMultimap<String, String> metaMap = data.getMetaMultimap();
ListMultimap<String, String> metaMap = data.getMetaMultimap(MetaCheckEvent.Origin.INTERNAL);
if (!metaMap.isEmpty()) {
meta = metaMap.entries().stream()
.map(e -> MessageUtils.contextToString(plugin.getLocaleManager(), e.getKey(), e.getValue()))

View File

@ -311,7 +311,7 @@ public abstract class CalculatedSubject implements LPSubject {
@Override
public Optional<String> getOption(ImmutableContextSet contexts, String key) {
Contexts lookupContexts = Contexts.of(contexts, Contexts.global().getSettings());
return Optional.ofNullable(this.cachedData.getMetaData(lookupContexts).getMetaValue(key, MetaCheckEvent.Origin.PLATFORM_API));
return Optional.ofNullable(this.cachedData.getMetaData(lookupContexts).getMeta(MetaCheckEvent.Origin.PLATFORM_API).get(key));
}
@Override

View File

@ -153,7 +153,7 @@ public abstract class HolderSubject<T extends PermissionHolder> implements LPSub
}
}
String val = data.getMetaValue(s, MetaCheckEvent.Origin.PLATFORM_API);
String val = data.getMeta(MetaCheckEvent.Origin.PLATFORM_API).get(s);
if (val != null) {
return Optional.of(val);
}