package org.atlasapi.persistence.logging; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collection; import java.util.List; import java.util.UUID; import org.joda.time.DateTime; import com.google.common.base.Functions; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.metabroadcast.common.time.DateTimeZones; @Deprecated public final class AdapterLogEntry { private final DateTime timestamp; private final String id; private final Severity severity; private String uri; private ExceptionSummary e; private String description; private String sourceClassName; public static AdapterLogEntry errorEntry() { return new AdapterLogEntry(Severity.ERROR); } public static AdapterLogEntry warnEntry() { return new AdapterLogEntry(Severity.WARN); } public static AdapterLogEntry infoEntry() { return new AdapterLogEntry(Severity.INFO); } public static AdapterLogEntry debugEntry() { return new AdapterLogEntry(Severity.DEBUG); } public enum Severity { ERROR, WARN, INFO, DEBUG; public boolean isMoreSevereOrSameAs(Severity severity) { return this.ordinal() <= severity.ordinal(); } } public AdapterLogEntry(String id, Severity severity, DateTime timestamp) { this.severity = severity; this.id = checkNotNull(id); this.timestamp = checkNotNull(timestamp); } public AdapterLogEntry(Severity severity) { this(UUID.randomUUID().toString(), severity, new DateTime(DateTimeZones.UTC)); } public AdapterLogEntry withUri(String uri) { this.uri = uri; return this; } public AdapterLogEntry withCause(Exception e) { return withException(new ExceptionSummary(e)); } public AdapterLogEntry withException(ExceptionSummary exceptionSummary) { this.e = exceptionSummary; return this; } public AdapterLogEntry withDescription(String message) { this.description = message; return this; } public AdapterLogEntry withDescription(String formatString, Object...args) { return withDescription(String.format(formatString, args)); } public String description() { return description; } public String uri() { return uri; } public DateTime timestamp() { return timestamp; } public AdapterLogEntry withSource(Class<?> clazz) { return withSourceClassName(clazz.getName()); } public AdapterLogEntry withSourceClassName(String sourceClassName) { this.sourceClassName = sourceClassName; return this; } public String id() { return id; } @Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof AdapterLogEntry) { return id.equals(((AdapterLogEntry) obj).id); } return false; } @Override public String toString() { return Objects.toStringHelper(this).add("id", id).toString(); } public static class ExceptionSummary { private final String clazz; private final String message; private final List<String> trace; private final ExceptionSummary cause; public ExceptionSummary(Throwable e) { this(e.getClass().getName(), e.getMessage(), toStrings(e.getStackTrace()), toCause(e)); } private static ExceptionSummary toCause(Throwable e) { Throwable cause = e.getCause(); if (cause != null) { return new ExceptionSummary(cause); } return null; } private static List<String> toStrings(StackTraceElement[] stackTrace) { return Lists.transform(ImmutableList.copyOf(stackTrace), Functions.toStringFunction()); } public ExceptionSummary(String clazz, String message, List<String> trace, ExceptionSummary cause) { this.trace = trace; this.clazz = checkNotNull(clazz); this.message = message; this.cause = cause; } public String className() { return clazz; } public String message() { return message; } @Override public String toString() { return classAndMessage(); } public Collection<String> trace() { return trace; } public List<String> traceAndMessage() { return ImmutableList.copyOf(Iterables.concat(ImmutableList.of(classAndMessage()), trace)); } private String classAndMessage() { return clazz + (message == null ? "" : " :" + message); } public ExceptionSummary cause() { return cause; } public List<String> fullTrace() { List<String> fullTrace = Lists.newArrayList(); for (ExceptionSummary summary : exceptionChain()) { fullTrace.addAll(summary.traceAndMessage()); } return fullTrace; } private List<ExceptionSummary> exceptionChain() { List<ExceptionSummary> chain = Lists.newArrayList(); ExceptionSummary current = this; while (current != null) { chain.add(current); current = current.cause; } return chain; } } public ExceptionSummary exceptionSummary() { return e; } public String classNameOfSource() { return sourceClassName; } public Severity severity() { return severity; } }