Skip to content

Commit c712cba

Browse files
committed
Make StackTraces less ass.
1 parent c445ce5 commit c712cba

File tree

3 files changed

+117
-36
lines changed

3 files changed

+117
-36
lines changed

src/main/java/cpw/mods/modlauncher/TransformerAuditTrail.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public void addPluginCustomAuditTrail(String clazz, ILaunchPluginService plugin,
5656
}
5757

5858
public void addPluginAuditTrail(String clazz, ILaunchPluginService plugin, ILaunchPluginService.Phase phase) {
59-
getTransformerActivities(clazz).add(new TransformerActivity(ITransformerActivity.Type.PLUGIN, plugin.name(), phase.name().substring(0,1)));
59+
getTransformerActivities(clazz).add(new TransformerActivity(ITransformerActivity.Type.PLUGIN, plugin.name(), phase.name()));
6060
}
6161

6262
public void addTransformerAuditTrail(String clazz, ITransformationService transformService, ITransformer<?> transformer) {

src/main/java/cpw/mods/modlauncher/log/ExtraDataTextRenderer.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,18 @@
55

66
package cpw.mods.modlauncher.log;
77

8-
import cpw.mods.modlauncher.Launcher;
9-
import cpw.mods.modlauncher.api.IEnvironment;
108
import cpw.mods.modlauncher.api.ITransformerAuditTrail;
119
import org.apache.logging.log4j.core.pattern.TextRenderer;
1210

13-
import java.util.Optional;
14-
11+
@Deprecated(forRemoval = true, since = "10.2.2")
1512
public class ExtraDataTextRenderer implements TextRenderer {
1613
private final TextRenderer wrapped;
17-
private final Optional<ITransformerAuditTrail> auditData;
14+
private final ITransformerAuditTrail trail;
1815
private final ThreadLocal<TransformerContext> currentClass = new ThreadLocal<>();
1916

20-
ExtraDataTextRenderer(final TextRenderer wrapped) {
17+
ExtraDataTextRenderer(final TextRenderer wrapped, ITransformerAuditTrail trail) {
2118
this.wrapped = wrapped;
22-
this.auditData = Optional.ofNullable(Launcher.INSTANCE).
23-
map(Launcher::environment).
24-
flatMap(env -> env.getProperty(IEnvironment.Keys.AUDITTRAIL.get()));
19+
this.trail = trail;
2520
}
2621

2722
@Override
@@ -38,8 +33,8 @@ public void render(final String input, final StringBuilder output, final String
3833
final TransformerContext classContext = currentClass.get();
3934
currentClass.remove();
4035
if (classContext != null) {
41-
final Optional<String> auditLine = auditData.map(data -> data.getAuditString(classContext.getClassName()));
42-
wrapped.render(" {"+ auditLine.orElse("") +"}", output, "StackTraceElement.Transformers");
36+
final String auditLine = trail == null ? "" : trail.getAuditString(classContext.getClassName());
37+
wrapped.render(" {" + auditLine + "}", output, "StackTraceElement.Transformers");
4338
}
4439
return;
4540
}

src/main/java/cpw/mods/modlauncher/log/TransformingThrowablePatternConverter.java

Lines changed: 110 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@
1212
import org.apache.logging.log4j.core.impl.ThrowableProxy;
1313
import org.apache.logging.log4j.core.pattern.*;
1414

15+
import cpw.mods.modlauncher.Launcher;
16+
import cpw.mods.modlauncher.api.IEnvironment;
17+
import cpw.mods.modlauncher.api.ITransformerAuditTrail;
18+
19+
import java.util.ArrayList;
1520
import java.util.Collections;
21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.Optional;
24+
import java.util.TreeMap;
1625

1726
/**
1827
* Started as a copy of {@link org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter} because
@@ -21,7 +30,9 @@
2130
@Plugin(name = "TransformingThrowablePatternConverter", category = PatternConverter.CATEGORY)
2231
@ConverterKeys({ "tEx" })
2332
public class TransformingThrowablePatternConverter extends ThrowablePatternConverter {
24-
static final String SUFFIXFLAG="☃☃☃☃☃SUFFIXFLAG☃☃☃☃☃";
33+
// Logger needs a suffix to trigger our 'enhancement' so pass in something that isn't empty.
34+
@SuppressWarnings("unused")
35+
private static final String SUFFIXFLAG = "{}";
2536
/**
2637
* @param name Name of converter.
2738
* @param style CSS style for output.
@@ -36,22 +47,75 @@ protected TransformingThrowablePatternConverter(final Configuration config, fina
3647
* {@inheritDoc}
3748
*/
3849
@Override
39-
public void format(final LogEvent event, final StringBuilder toAppendTo) {
40-
final ThrowableProxy proxy = event.getThrownProxy();
41-
final Throwable throwable = event.getThrown();
42-
if ((throwable != null || proxy != null) && options.anyLines()) {
43-
if (proxy == null) {
44-
super.format(event, toAppendTo);
45-
return;
46-
}
47-
final int len = toAppendTo.length();
48-
if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
49-
toAppendTo.append(' ');
50-
}
51-
final TextRenderer textRenderer = new ExtraDataTextRenderer(options.getTextRenderer());
52-
proxy.formatExtendedStackTraceTo(toAppendTo, options.getIgnorePackages(),
53-
textRenderer, SUFFIXFLAG, options.getSeparator());
50+
public void format(@SuppressWarnings("exports") final LogEvent event, final StringBuilder buf) {
51+
var proxy = event.getThrownProxy();
52+
if (!options.anyLines())
53+
return;
54+
55+
if (proxy == null) {
56+
super.format(event, buf);
57+
return;
5458
}
59+
60+
var len = buf.length();
61+
if (len > 0 && !Character.isWhitespace(buf.charAt(len - 1)))
62+
buf.append(' ');
63+
64+
var trail = Optional.ofNullable(Launcher.INSTANCE)
65+
.map(Launcher::environment)
66+
.flatMap(env -> env.getProperty(IEnvironment.Keys.AUDITTRAIL.get()))
67+
.orElse(null);
68+
69+
var nl = options.getSeparator();
70+
var renderer = options.getTextRenderer();
71+
var suffix = "";
72+
//renderer = new ExtraDataTextRenderer(renderer, trail);
73+
//suffix = SUFFIXFLAG;
74+
proxy.formatExtendedStackTraceTo(buf, options.getIgnorePackages(), renderer, suffix, nl);
75+
76+
if (trail == null)
77+
return;
78+
79+
final Map<String, List<String>> audit = new TreeMap<>();
80+
buildAuditMap(trail, audit, proxy);
81+
82+
line(buf, "Transformer Audit:");
83+
for (var cls : audit.keySet()) {
84+
line(buf, " ", cls);
85+
for (var line : audit.get(cls))
86+
line(buf, " ", line);
87+
}
88+
System.currentTimeMillis();
89+
}
90+
91+
private void line(StringBuilder sb, String... parts) {
92+
var renderer = options.getTextRenderer();
93+
for (var pt : parts)
94+
renderer.render(pt, sb, "Text");
95+
renderer.render(options.getSeparator(), sb, "Text");
96+
}
97+
98+
private static void buildAuditMap(ITransformerAuditTrail trail, Map<String, List<String>> map, ThrowableProxy proxy) {
99+
if (proxy == null)
100+
return;
101+
102+
for (var element : proxy.getExtendedStackTrace()) {
103+
var cls = element.getClassName();
104+
if (map.containsKey(cls))
105+
continue;
106+
107+
var lines = new ArrayList<String>();
108+
for (var activity : trail.getActivityFor(cls))
109+
lines.add(activity.getType().name() + ": " + String.join(":", activity.getContext()));
110+
111+
if (!lines.isEmpty())
112+
map.put(cls, lines);
113+
}
114+
115+
for (final ThrowableProxy suppressed : proxy.getSuppressedProxies())
116+
buildAuditMap(trail, map, suppressed);
117+
118+
buildAuditMap(trail, map, proxy.getCauseProxy());
55119
}
56120

57121
/**
@@ -62,17 +126,39 @@ public void format(final LogEvent event, final StringBuilder toAppendTo) {
62126
* only the first line of the throwable will be formatted.
63127
* @return instance of class.
64128
*/
65-
public static TransformingThrowablePatternConverter newInstance(final Configuration config, final String[] options) {
129+
public static TransformingThrowablePatternConverter newInstance(@SuppressWarnings("exports") final Configuration config, final String[] options) {
66130
return new TransformingThrowablePatternConverter(config, options);
67131
}
68132

69-
133+
@Deprecated(forRemoval = true, since = "10.2.2")
70134
public static String generateEnhancedStackTrace(final Throwable throwable) {
71-
final ThrowableProxy proxy = new ThrowableProxy(throwable);
72-
final StringBuilder buffer = new StringBuilder();
73-
final TextRenderer textRenderer = new ExtraDataTextRenderer(PlainTextRenderer.getInstance());
74-
proxy.formatExtendedStackTraceTo(buffer, Collections.emptyList(),
75-
textRenderer, SUFFIXFLAG, Strings.LINE_SEPARATOR);
76-
return buffer.toString();
135+
var proxy = new ThrowableProxy(throwable);
136+
var buf = new StringBuilder();
137+
138+
var trail = Optional.ofNullable(Launcher.INSTANCE)
139+
.map(Launcher::environment)
140+
.flatMap(env -> env.getProperty(IEnvironment.Keys.AUDITTRAIL.get()))
141+
.orElse(null);
142+
143+
var nl = Strings.LINE_SEPARATOR;
144+
var renderer = PlainTextRenderer.getInstance();
145+
var suffix = "";
146+
//renderer = new ExtraDataTextRenderer(renderer, trail);
147+
//suffix = SUFFIXFLAG;
148+
proxy.formatExtendedStackTraceTo(buf, Collections.emptyList(), renderer, suffix, nl);
149+
150+
if (trail != null) {
151+
final Map<String, List<String>> audit = new TreeMap<>();
152+
buildAuditMap(trail, audit, proxy);
153+
154+
buf.append("Transformer Audit:").append(nl);
155+
for (var cls : audit.keySet()) {
156+
buf.append(" ").append(cls).append(nl);
157+
for (var line : audit.get(cls))
158+
buf.append(" ").append(line).append(nl);
159+
}
160+
}
161+
162+
return buf.toString();
77163
}
78164
}

0 commit comments

Comments
 (0)