Added new context providers and fixed bugs
- RAMContextProvider - JavaVersionContextProvider - OpenALContextProvider - ArgsContextProvider - LanguageContextProvider
This commit is contained in:
parent
65bb5339c7
commit
6d6e0f6ca4
@ -19,18 +19,29 @@ package ru.windcorp.progressia;
|
||||
|
||||
import ru.windcorp.progressia.common.util.crash.CrashReports;
|
||||
import ru.windcorp.progressia.common.util.crash.analyzers.OutOfMemoryAnalyzer;
|
||||
import ru.windcorp.progressia.common.util.crash.providers.OSContextProvider;
|
||||
import ru.windcorp.progressia.common.util.crash.providers.*;
|
||||
|
||||
public class ProgressiaLauncher {
|
||||
|
||||
public static String[] arguments;
|
||||
|
||||
public static void launch(String[] args, Proxy proxy) {
|
||||
arguments = args.clone();
|
||||
setupCrashReports();
|
||||
proxy.initialize();
|
||||
}
|
||||
|
||||
private static void setupCrashReports() {
|
||||
// Context providers
|
||||
CrashReports.registerProvider(new OSContextProvider());
|
||||
CrashReports.registerProvider(new RAMContextProvider());
|
||||
CrashReports.registerProvider(new JavaVersionContextProvider());
|
||||
CrashReports.registerProvider(new OpenALContextProvider());
|
||||
CrashReports.registerProvider(new ArgsContextProvider());
|
||||
CrashReports.registerProvider(new LanguageContextProvider());
|
||||
// Analyzers
|
||||
CrashReports.registerAnalyzer(new OutOfMemoryAnalyzer());
|
||||
|
||||
Thread.setDefaultUncaughtExceptionHandler((Thread thread, Throwable t)-> {
|
||||
CrashReports.report(t,"Uncaught exception in thread %s", thread.getName());
|
||||
});
|
||||
|
@ -94,14 +94,12 @@ public class CrashReports {
|
||||
provider.provideContext(buf);
|
||||
|
||||
if (!buf.isEmpty()) {
|
||||
output.append("Provider name: ").append(provider.getName()).append("\n");
|
||||
output.append(StringUtilsTemp.center(provider.getName(), 80)).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 {
|
||||
@ -123,6 +121,10 @@ public class CrashReports {
|
||||
// Do a local copy to avoid deadlocks -OLEGSHA
|
||||
Analyzer[] localAnalyzersCopy = ANALYZERS.toArray(new Analyzer[ANALYZERS.size()]);
|
||||
|
||||
if (localAnalyzersCopy.length > 0) {
|
||||
output.append(StringUtilsTemp.center("Analyzers", 80)).append("\n");
|
||||
}
|
||||
|
||||
for (Analyzer analyzer : localAnalyzersCopy) {
|
||||
if (analyzer == null)
|
||||
continue;
|
||||
@ -157,7 +159,11 @@ public class CrashReports {
|
||||
}
|
||||
|
||||
private static void appendMessageFormat(StringBuilder output, String messageFormat, Object... arg) {
|
||||
output.append("Provided description: \n").append(String.format(messageFormat, arg)).append("\n");
|
||||
output.append("Provided description: \n");
|
||||
if (messageFormat.isEmpty())
|
||||
output.append("none").append("\n");
|
||||
else
|
||||
output.append(String.format(messageFormat, arg)).append("\n");
|
||||
|
||||
addSeparator(output);
|
||||
}
|
||||
@ -228,3 +234,24 @@ public class CrashReports {
|
||||
sb.append(StringUtil.sequence('-', 80)).append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
class StringUtilsTemp {
|
||||
public static String center(String s, int size) {
|
||||
return center(s, size, ' ');
|
||||
}
|
||||
|
||||
public static String center(String s, int size, char pad) {
|
||||
if (s == null || size <= s.length())
|
||||
return s;
|
||||
|
||||
StringBuilder sb = new StringBuilder(size);
|
||||
for (int i = 0; i < (size - s.length()) / 2; i++) {
|
||||
sb.append(pad);
|
||||
}
|
||||
sb.append(s);
|
||||
while (sb.length() < size) {
|
||||
sb.append(pad);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,27 @@
|
||||
package ru.windcorp.progressia.common.util.crash.providers;
|
||||
|
||||
import ru.windcorp.progressia.Progressia;
|
||||
import ru.windcorp.progressia.ProgressiaLauncher;
|
||||
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class ArgsContextProvider implements ContextProvider {
|
||||
|
||||
@Override
|
||||
public void provideContext(Map<String, String> output) {
|
||||
output.put("Number of arguments", ProgressiaLauncher.arguments.length + " total");
|
||||
if (ProgressiaLauncher.arguments.length > 0) {
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
for (String arg : ProgressiaLauncher.arguments) {
|
||||
buffer.append(arg).append(";");
|
||||
}
|
||||
output.put("Args", System.getProperty(buffer.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Arguments Context Provider";
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package ru.windcorp.progressia.common.util.crash.providers;
|
||||
|
||||
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class JavaVersionContextProvider implements ContextProvider {
|
||||
|
||||
@Override
|
||||
public void provideContext(Map<String, String> output) {
|
||||
// JAVA
|
||||
output.put("Java version", Runtime.version().toString());
|
||||
output.put("Java vendor", System.getProperty("java.vendor"));
|
||||
output.put("Java home path", System.getProperty("java.home"));
|
||||
// VM
|
||||
output.put("JVM vendor", System.getProperty("java.vm.vendor"));
|
||||
output.put("JVM name", System.getProperty("java.vm.name"));
|
||||
output.put("JVM version", System.getProperty("java.vm.version"));
|
||||
// Runtime
|
||||
output.put("Java Runtime name", System.getProperty("java.runtime.name"));
|
||||
output.put("Java Runtime version", System.getProperty("java.runtime.version"));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Java Version Context Provider";
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package ru.windcorp.progressia.common.util.crash.providers;
|
||||
|
||||
import ru.windcorp.progressia.client.localization.Localizer;
|
||||
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class LanguageContextProvider implements ContextProvider {
|
||||
|
||||
@Override
|
||||
public void provideContext(Map<String, String> output) {
|
||||
output.put("Language", Localizer.getInstance().getLanguage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Language Context Provider";
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package ru.windcorp.progressia.common.util.crash.providers;
|
||||
|
||||
import ru.windcorp.progressia.client.audio.AudioManager;
|
||||
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class OpenALContextProvider implements ContextProvider {
|
||||
|
||||
@Override
|
||||
public void provideContext(Map<String, String> output) {
|
||||
output.put("OpenAL version", AudioManager.ALversion());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Audio Context Provider";
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package ru.windcorp.progressia.common.util.crash.providers;
|
||||
|
||||
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class RAMContextProvider implements ContextProvider {
|
||||
|
||||
@Override
|
||||
public void provideContext(Map<String, String> output) {
|
||||
output.put("Max Memory", Long.toString(Runtime.getRuntime().maxMemory() / 1024 / 1024) + " MB");
|
||||
output.put("Total Memory", Long.toString(Runtime.getRuntime().totalMemory() / 1024 / 1024) + " MB");
|
||||
output.put("Free Memory", Long.toString(Runtime.getRuntime().freeMemory() / 1024 / 1024) + " MB");
|
||||
output.put("Used Memory", Long.toString((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024 / 1024) + " MB");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "RAM Context Provider";
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user