package ch.elexis.core.status; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.nio.charset.Charset; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.slf4j.Logger; // TODO refactor ... public class StatusUtil { public static void printStatus(Logger log, IStatus status) { print(log, "", status); } private static void print(Logger log, String indent, IStatus status) { if (status.isMultiStatus()) { log.warn(indent + status.getMessage().replace('\n', ' ')); String childIndent = indent + " "; for (IStatus c : status.getChildren()) { print(log, childIndent, c); } } else { log.warn(indent + status.getMessage().replace('\n', ' ')); } } public static void printStatus(PrintStream out, IStatus status) { print(out, "", status); } private static void print(PrintStream log, String indent, IStatus status) { if (status.isMultiStatus()) { log.print(indent + status.getMessage()); String childIndent = indent + " "; for (IStatus c : status.getChildren()) { print(log, childIndent, c); } } else { log.println(indent + status.getMessage()); } } public static IStatus errorSeeLog(String pluginId) { return new Status(Status.ERROR, pluginId, "Execution error, see log."); } public static String printStatus(IStatus status) { try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { PrintStream ps = new PrintStream(baos); printStatus(ps, status); return baos.toString(Charset.defaultCharset().toString()); } catch (IOException e) { return e.getMessage(); } } public static void logStatus(Logger log, IStatus status, boolean includeExceptionIfAvailable) { String message; if (status.isMultiStatus()) { message = status.getMessage(); } else { message = status.getMessage(); } boolean includeException = (includeExceptionIfAvailable && status.getException() != null); int severity = status.getSeverity(); switch (severity) { case Status.ERROR: if (includeException) { log.error(message, status.getException()); } else { log.error(message); } break; case Status.WARNING: if (includeException) { log.warn(message, status.getException()); } else { log.warn(message); } break; case Status.INFO: case Status.CANCEL: if (includeException) { log.info(message, status.getException()); } else { log.info(message); } break; case Status.OK: if (includeException) { log.debug(message, status.getException()); } else { log.debug(message); } break; default: break; } } }