From 3a894cb8a4a0118b163685c73dd1c8993781de7f Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Wed, 18 May 2016 11:05:20 +0200 Subject: [PATCH] Stack Trace Cut --- .../predicate/PredicateElementGarbage.java | 26 +++++++ .../predicate/PredicateElementRegexes.java | 67 +++++++++++++++++++ .../PredicateElementSignificant.java | 29 ++++++++ .../massivecraft/massivecore/util/MUtil.java | 37 +++++++++- 4 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/com/massivecraft/massivecore/predicate/PredicateElementGarbage.java create mode 100644 src/com/massivecraft/massivecore/predicate/PredicateElementRegexes.java create mode 100644 src/com/massivecraft/massivecore/predicate/PredicateElementSignificant.java diff --git a/src/com/massivecraft/massivecore/predicate/PredicateElementGarbage.java b/src/com/massivecraft/massivecore/predicate/PredicateElementGarbage.java new file mode 100644 index 00000000..e8a492ee --- /dev/null +++ b/src/com/massivecraft/massivecore/predicate/PredicateElementGarbage.java @@ -0,0 +1,26 @@ +package com.massivecraft.massivecore.predicate; + +import java.util.regex.Pattern; + +public class PredicateElementGarbage extends PredicateElementRegexes +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static PredicateElementGarbage i = new PredicateElementGarbage(); + public static PredicateElementGarbage get() { return i; } + public PredicateElementGarbage() + { + super( + "^" + Pattern.quote("com.massivecraft.massivelag.inject") + ".*$", // MassiveLag - Injected stuff for commands, tasks and events. + + "^" + Pattern.quote("com.massivecraft.massivecore.command.MassiveCoreBukkitCommand.execute") + ".*$", // MassiveCommand - Execution Garbage + "^" + Pattern.quote("com.massivecraft.massivecore.command.MassiveCommand.execute") + ".*$", // MassiveCommand - Execution Garbage + + "^" + Pattern.quote("sun.reflect") + ".*$", // Event Reflection + "^" + Pattern.quote("java.lang.reflect") + ".*$" // Event Reflection + ); + } + +} diff --git a/src/com/massivecraft/massivecore/predicate/PredicateElementRegexes.java b/src/com/massivecraft/massivecore/predicate/PredicateElementRegexes.java new file mode 100644 index 00000000..b8a4a63d --- /dev/null +++ b/src/com/massivecraft/massivecore/predicate/PredicateElementRegexes.java @@ -0,0 +1,67 @@ +package com.massivecraft.massivecore.predicate; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; + +import com.massivecraft.massivecore.collections.MassiveList; + +public class PredicateElementRegexes implements Predicate +{ + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private List patterns = Collections.emptyList(); + public List getPatterns() { return this.patterns; } + public void setPatterns(Collection patterns) { this.patterns = new MassiveList<>(patterns); } + public void setPatterns(Iterable regexes) { this.setPatterns(asPatterns(regexes));} + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public PredicateElementRegexes(String... regexes) + { + this.setPatterns(Arrays.asList(regexes)); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public boolean apply(StackTraceElement element) + { + if (element == null) return false; + String string = element.toString(); + for (Pattern pattern : this.getPatterns()) + { + if (pattern.matcher(string).matches()) return true; + } + return false; + } + + // -------------------------------------------- // + // UTIL + // -------------------------------------------- // + + protected List asPatterns(Iterable regexes) + { + // Create + List ret = new MassiveList<>(); + + // Fill + for (String regex : regexes) + { + Pattern pattern = Pattern.compile(regex); + ret.add(pattern); + } + + // Return + return ret; + } + +} diff --git a/src/com/massivecraft/massivecore/predicate/PredicateElementSignificant.java b/src/com/massivecraft/massivecore/predicate/PredicateElementSignificant.java new file mode 100644 index 00000000..f264757b --- /dev/null +++ b/src/com/massivecraft/massivecore/predicate/PredicateElementSignificant.java @@ -0,0 +1,29 @@ +package com.massivecraft.massivecore.predicate; + +import java.util.regex.Pattern; + +public class PredicateElementSignificant extends PredicateElementRegexes +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static PredicateElementSignificant i = new PredicateElementSignificant(); + public static PredicateElementSignificant get() { return i; } + public PredicateElementSignificant() + { + super( + // Command + "^" + Pattern.quote("org.bukkit.craftbukkit.") + ".*" +Pattern.quote(".CraftServer.dispatchCommand") + ".*$", // CraftBukkit + + // Task + "^" + Pattern.quote("org.bukkit.craftbukkit.") + ".*" +Pattern.quote(".scheduler.CraftTask.run") + ".*$", // CraftBukkit + + // Event + "^" + Pattern.quote("org.bukkit.plugin.RegisteredListener.callEvent") + ".*$", // Bukkit + "^" + Pattern.quote("us.Myles.PWP.TransparentListeners") + ".*$", // PerWorldPlugins <= 1.2.4 + "^" + Pattern.quote("me.incomprehendable.dev.pwp.transparentlisteners") + ".*$" // PerWorldPlugins >= 1.2.5 + ); + } + +} diff --git a/src/com/massivecraft/massivecore/util/MUtil.java b/src/com/massivecraft/massivecore/util/MUtil.java index 981afca7..abc8d13e 100644 --- a/src/com/massivecraft/massivecore/util/MUtil.java +++ b/src/com/massivecraft/massivecore/util/MUtil.java @@ -68,6 +68,8 @@ import com.massivecraft.massivecore.engine.EngineMassiveCoreWorldNameSet; import com.massivecraft.massivecore.mixin.MixinMessage; import com.massivecraft.massivecore.nms.NmsEntityGet; import com.massivecraft.massivecore.predicate.Predicate; +import com.massivecraft.massivecore.predicate.PredicateElementGarbage; +import com.massivecraft.massivecore.predicate.PredicateElementSignificant; import com.massivecraft.massivecore.util.extractor.Extractor; import com.massivecraft.massivecore.util.extractor.ExtractorPlayer; import com.massivecraft.massivecore.util.extractor.ExtractorPlayerName; @@ -344,7 +346,7 @@ public class MUtil StackTraceElement[] elements = thread.getStackTrace(); elements = Arrays.copyOfRange(elements, skip, elements.length); - return new ArrayList(Arrays.asList(elements)); + return new MassiveList<>(Arrays.asList(elements)); } public static List getStackTrace(Thread thread) @@ -380,6 +382,39 @@ public class MUtil return getStackTrace(thread, skip); } + // -------------------------------------------- // + // STACK TRACE: CUT + // -------------------------------------------- // + + public static void cutStackTrace(List trace) + { + // Cut Significant + int index = 0; + while (index < trace.size()) + { + StackTraceElement element = trace.get(index); + if (PredicateElementSignificant.get().apply(element)) break; + index++; + } + trace.subList(index, trace.size()).clear(); + + // Reverse + Collections.reverse(trace); + + // Eat Garbage + for (Iterator iterator = trace.iterator(); iterator.hasNext();) + { + StackTraceElement element = iterator.next(); + if (PredicateElementGarbage.get().apply(element)) + { + iterator.remove(); + } + } + + // Unreverse + Collections.reverse(trace); + } + // -------------------------------------------- // // STACK TRACE STRING: MANY // -------------------------------------------- //