/* * Lilith - a log event viewer. * Copyright (C) 2007-2016 Joern Huxhorn * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package de.huxhorn.lilith.services.clipboard; import de.huxhorn.lilith.data.access.AccessEvent; import de.huxhorn.lilith.data.eventsource.EventWrapper; import de.huxhorn.lilith.data.logging.ExtendedStackTraceElement; import de.huxhorn.lilith.data.logging.LoggingEvent; import de.huxhorn.lilith.data.logging.Message; import de.huxhorn.lilith.data.logging.ThreadInfo; import de.huxhorn.lilith.data.logging.ThrowableInfo; import de.huxhorn.sulky.formatting.SafeString; import java.util.Collection; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; class FormatterTools { private FormatterTools() { } static { new FormatterTools(); // stfu, coverage } static Optional<AccessEvent> resolveAccessEvent(Object object) { return Optional.ofNullable(resolveAccessEventInternal(object)); } static Optional<LoggingEvent> resolveLoggingEvent(Object object) { return Optional.ofNullable(resolveLoggingEventInternal(object)); } static Optional<String> resolveFormattedMessage(Object object) { Message message = resolveMessageInternal(object); if (message != null) { String value = message.getMessage(); if (!isNullOrEmpty(value)) { return Optional.of(value); } } return Optional.empty(); } static Optional<String> resolveMessagePattern(Object object) { Message message = resolveMessageInternal(object); if (message != null) { String value = message.getMessagePattern(); if (!isNullOrEmpty(value)) { return Optional.of(value); } } return Optional.empty(); } static Optional<ExtendedStackTraceElement[]> resolveCallStack(Object object) { LoggingEvent value = resolveLoggingEventInternal(object); if (value != null) { ExtendedStackTraceElement[] callStack = value.getCallStack(); if (!isNullOrEmpty(callStack)) { return Optional.of(callStack); } } return Optional.empty(); } static Optional<ThrowableInfo> resolveThrowableInfo(Object object) { LoggingEvent value = resolveLoggingEventInternal(object); if (value != null) { return Optional.ofNullable(value.getThrowable()); } return Optional.empty(); } static Optional<String> resolveThrowableInfoName(Object object) { LoggingEvent value = resolveLoggingEventInternal(object); if (value != null) { ThrowableInfo throwable = value.getThrowable(); if (throwable != null) { String name = throwable.getName(); if (!isNullOrEmpty(name)) { return Optional.of(name); } } } return Optional.empty(); } static Optional<String> resolveThreadName(Object object) { LoggingEvent value = resolveLoggingEventInternal(object); if (value != null) { ThreadInfo threadInfo = value.getThreadInfo(); if (threadInfo != null) { String name = threadInfo.getName(); if (!isNullOrEmpty(name)) { return Optional.of(name); } } } return Optional.empty(); } static Optional<String> resolveThreadGroupName(Object object) { LoggingEvent value = resolveLoggingEventInternal(object); if (value != null) { ThreadInfo threadInfo = value.getThreadInfo(); if (threadInfo != null) { String name = threadInfo.getGroupName(); if (!isNullOrEmpty(name)) { return Optional.of(name); } } } return Optional.empty(); } static boolean isNullOrEmpty(Object object) { if (object == null) { return true; } if (object instanceof String) { return ((String) object).length() == 0; } if (object instanceof Map) { return ((Map) object).isEmpty(); } if (object instanceof Collection) { return ((Collection) object).isEmpty(); } if (object instanceof Object[]) { return ((Object[]) object).length == 0; } return false; } static String toStringOrNull(Object value) { if (isNullOrEmpty(value)) { return null; } if (value instanceof String) { return (String) value; } if (value instanceof Map) { return toStringOrNullInternal((Map) value); } if (value instanceof Collection) { return toStringOrNullInternal((Collection) value); } return SafeString.toString(value, SafeString.StringWrapping.CONTAINED, SafeString.StringStyle.GROOVY, SafeString.MapStyle.GROOVY); } private static String toStringOrNullInternal(Map<?, ?> value) { if (!(value instanceof SortedMap)) { if (!value.containsKey(null)) { // replace original map with sorted map, if possible try { value = new TreeMap<>(value); } catch (ClassCastException ignore) { // if not comparable } } } return SafeString.toString(value, SafeString.StringWrapping.CONTAINED, SafeString.StringStyle.GROOVY, SafeString.MapStyle.GROOVY); } private static String toStringOrNullInternal(Collection<?> value) { if (value instanceof Set) { if (!(value instanceof SortedSet)) { if (!value.contains(null)) { // replace original set with sorted set, if possible try { value = new TreeSet<>(value); } catch (ClassCastException ignore) { // if not comparable } } } } return SafeString.toString(value, SafeString.StringWrapping.CONTAINED, SafeString.StringStyle.GROOVY, SafeString.MapStyle.GROOVY); } private static AccessEvent resolveAccessEventInternal(Object object) { if (object instanceof EventWrapper) { EventWrapper wrapper = (EventWrapper) object; if (wrapper.getEvent() != null) { Object eventObj = wrapper.getEvent(); if (eventObj instanceof AccessEvent) { return (AccessEvent) eventObj; } } } return null; } private static LoggingEvent resolveLoggingEventInternal(Object object) { if (object instanceof EventWrapper) { EventWrapper wrapper = (EventWrapper) object; if (wrapper.getEvent() != null) { Object eventObj = wrapper.getEvent(); if (eventObj instanceof LoggingEvent) { return (LoggingEvent) eventObj; } } } return null; } private static Message resolveMessageInternal(Object object) { LoggingEvent event = resolveLoggingEventInternal(object); if (event != null) { return event.getMessage(); } return null; } }