Refactored CrashReportGenerator to avoid deadlocks and clarify code

This commit is contained in:
OLEGSHA 2020-11-10 01:25:42 +03:00
parent d5723b9ae6
commit 0017ecc5a7

View File

@ -57,30 +57,39 @@ public class CrashReportGenerator {
} }
private static void appendContextProviders(StringBuilder output) { private static void appendContextProviders(StringBuilder output) {
for (ContextProvider provider : PROVIDERS) {
if (provider != null) { // Do a local copy to avoid deadlocks -OLEGSHA
ContextProvider[] localProvidersCopy =
PROVIDERS.toArray(new ContextProvider[PROVIDERS.size()]);
for (ContextProvider provider : localProvidersCopy) {
if (provider == null) continue;
addSeparator(output);
try {
Map<String, String> buf = new HashMap<>(); Map<String, String> buf = new HashMap<>();
provider.provideContext(buf);
if (!buf.isEmpty()) {
output.append("Provider name: ").append(provider.getName()).append("\n");
for (Map.Entry<String, String> entry : buf.entrySet()) {
output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
}
}
} catch (Throwable t) {
output.append("\n");
String providerName;
try { try {
provider.provideContext(buf); providerName = provider.getName();
} catch (Throwable t1) {
if (!buf.isEmpty()) { providerName = provider.getClass().getName();
addSeparator(output);
output.append("Provider name: ").append(provider.getName()).append("\n");
for (Map.Entry<String, String> entry : buf.entrySet()) {
output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
}
}
} catch (Throwable t) {
output.append("\n");
try {
output.append(provider.getName()).append(" is broken").append("\n");
} catch (Throwable th) {
output.append(provider.getClass().getName()).append(" is broken").append("\n");
// You stupid
}
// Analyzer is broken
} }
output.append(providerName).append(" is broken").append("\n");
// ContextProvider is broken
} }
} }
} }
@ -90,26 +99,37 @@ public class CrashReportGenerator {
Throwable throwable, String messageFormat, Object[] args Throwable throwable, String messageFormat, Object[] args
) { ) {
boolean analyzerResponsesExist = false; boolean analyzerResponsesExist = false;
for (Analyzer analyzer : ANALYZERS) {
if (analyzer != null) {
String answer; // Do a local copy to avoid deadlocks -OLEGSHA
try { Analyzer[] localAnalyzersCopy =
answer = analyzer.analyze(throwable, messageFormat, args); ANALYZERS.toArray(new Analyzer[ANALYZERS.size()]);
if (answer != null && !answer.isEmpty()) { for (Analyzer analyzer : localAnalyzersCopy) {
analyzerResponsesExist = true; if (analyzer == null) continue;
output.append(analyzer.getName()).append(": ").append(answer).append("\n");
} String answer;
} catch (Throwable t) { try {
try { answer = analyzer.analyze(throwable, messageFormat, args);
analyzerResponsesExist = true;
output.append(analyzer.getName()).append(" is broken").append("\n"); if (answer != null && !answer.isEmpty()) {
} catch (Throwable th) { analyzerResponsesExist = true;
// You stupid output.append(analyzer.getName()).append(": ").append(answer).append("\n");
}
// Analyzer is broken
} }
} catch (Throwable t) {
analyzerResponsesExist = true;
output.append("\n");
String analyzerName;
try {
analyzerName = analyzer.getName();
} catch (Throwable t1) {
analyzerName = analyzer.getClass().getName();
}
output.append(analyzerName).append(" is broken").append("\n");
// Analyzer is broken
} }
} }
@ -117,7 +137,7 @@ public class CrashReportGenerator {
} }
private static void appendMessageFormat(StringBuilder output, String messageFormat, Object... arg) { private static void appendMessageFormat(StringBuilder output, String messageFormat, Object... arg) {
output.append("Provided description: ").append(String.format(messageFormat, arg)).append("\n"); output.append("Provided description: \n").append(String.format(messageFormat, arg)).append("\n");
addSeparator(output); addSeparator(output);
} }