
net.vectorpublish.desktop.vp.DefaultLogger Maven / Gradle / Ivy
/*
* Copyright (c) 2016, Peter Rader. All rights reserved.
* ___ ___ __ ______ __ __ __ __
* | | |.-----..----.| |_ .-----..----.| __ \.--.--.| |--.| ||__|.-----.| |--.
* | | || -__|| __|| _|| _ || _|| __/| | || _ || || ||__ --|| |
* \_____/ |_____||____||____||_____||__| |___| |_____||_____||__||__||_____||__|__|
*
* http://www.gnu.org/licenses/gpl-3.0.html
*/
package net.vectorpublish.desktop.vp;
import java.net.URL;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.TreeSet;
import java.util.logging.Level;
import javax.inject.Inject;
import javax.inject.Named;
import javax.swing.JButton;
import net.vectorpublish.desktop.vp.api.conf.Config;
import net.vectorpublish.desktop.vp.log.Log;
import net.vectorpublish.desktop.vp.log.LoggerCache;
import net.vectorpublish.desktop.vp.ui.Namespace;
/**
* The default logging implementation.
*
* On class-load it creates a list of valid logging-levels from
* sun.util.logging
.
*/
@Named
public class DefaultLogger implements Log {
public static final Namespace NS_VOTE_LOGGING = Namespace.getNamespace("system.logging", "vote");
/**
* The known {@link Level levels}.
*
* The First is the very most communicative, the finest giving the very most
* informations.
*
* The Last is the most quiet log, usually its {@link Level#OFF off}.
*/
private static final Level[] LEVELS_DESCENDING_INFORMATIVE;
static {
final ResourceBundle bundle = ResourceBundle.getBundle("sun.util.logging.resources.logging",
Locale.getDefault());
final Enumeration bundleKeys = bundle.getKeys();
final TreeSet ts = new TreeSet<>(new Comparator() {
@Override
public int compare(Level quiet, Level chatty) {
if (quiet.intValue() < chatty.intValue()) {
return -1;
}
return 1;
}
});
while (bundleKeys.hasMoreElements()) {
final String levelKey = bundleKeys.nextElement();
final Level level = Level.parse(levelKey);
if (level != null) {
ts.add(level);
}
}
LEVELS_DESCENDING_INFORMATIVE = ts.toArray(new Level[0]);
}
@Inject
private final Config config = null;
@Inject
private final LoggerCache cache = null;
@Override
public void cache(String what) {
log("Cache: " + what);
}
@Override
public void calculated(String what, Object result) {
log("Calculated: " + what + " (" + result + ")");
}
@Override
public void checkThat(Object ob, String message) {
if (ob instanceof JButton) {
ob = ((JButton) ob).getAction();
}
log("Check that: " + ob + " " + message);
}
private LinkedList> findBeanStack() {
final LinkedList> beans = new LinkedList<>();
final Throwable exception = new Throwable();
final StackTraceElement[] stackTrace = exception.getStackTrace();
for (final StackTraceElement stackTraceElement : stackTrace) {
final String className = stackTraceElement.getClassName();
Class> clazz;
try {
clazz = Class.forName(className);
final Named[] named = clazz.getDeclaredAnnotationsByType(Named.class);
if (named != null && named.length > 0) {
beans.add(clazz);
}
} catch (final ClassNotFoundException e) {
final boolean isMaven = className.startsWith("org.apache.maven");
final boolean isMojo = e.getMessage().startsWith("org.codehaus.mojo.exec");
final boolean isHudson = e.getMessage().startsWith("hudson");
final boolean isJvnetHudson = e.getMessage().startsWith("org.jvnet.hudson");
if (!isMaven && !isMojo && !isHudson && !isJvnetHudson) {
e.printStackTrace(System.err);
}
}
}
return beans;
}
@Override
public void found(Object ob) {
log("Found: " + ob);
}
public Level getConfiguredLevel(final Class> last) {
String levelName = config.read(NS_VOTE_LOGGING, last.getCanonicalName());
if (levelName == null) {
levelName = Level.OFF.getName();
}
final Level level1 = Level.parse(levelName);
final Level level = level1;
return level;
}
/**
* Returns a level that is larger than a level.
*
* Warn is a larger level than Error.
*
* @param level
* The level we search a larger level for, never
* null
.
* @return The larger level, never null
.
* @throws RuntimeException
* If no larger level was found.
*/
private Level getLarger(Level level) throws RuntimeException {
// if its the largest anyway, return it.
if (level == LEVELS_DESCENDING_INFORMATIVE[0]) {
return level;
} else {
for (int levelIndex = 0; levelIndex < LEVELS_DESCENDING_INFORMATIVE.length; levelIndex++) {
if (level == LEVELS_DESCENDING_INFORMATIVE[levelIndex]) {
return LEVELS_DESCENDING_INFORMATIVE[levelIndex - 1];
}
}
throw new RuntimeException("Not found!");
}
}
private Level getShorter(Level level) {
// if its last anyway, return itself.
if (level == LEVELS_DESCENDING_INFORMATIVE[LEVELS_DESCENDING_INFORMATIVE.length - 1]) {
return level;
} else {
for (int levelIndex = 0; levelIndex < LEVELS_DESCENDING_INFORMATIVE.length; levelIndex++) {
if (level == LEVELS_DESCENDING_INFORMATIVE[levelIndex]) {
return LEVELS_DESCENDING_INFORMATIVE[levelIndex + 1];
}
}
throw new RuntimeException("Not found!");
}
}
@Override
public void log(Object message) {
final LinkedList> beans = findBeanStack();
while (beans.contains(DefaultLogger.class)) {
beans.remove(DefaultLogger.class);
}
String bean;
if (beans.isEmpty()) {
bean = "unknown";
} else {
bean = "";
for (final Class> clazz : beans) {
final String simpleName = clazz.getSimpleName();
bean += " > " + simpleName;
}
if (bean.length() > 3) {
bean = bean.substring(3);
}
}
if (beans.isEmpty()) {
beans.add(DefaultLogger.class);
}
final Level level = getConfiguredLevel(beans.getFirst());
cache.getLogger(beans.getFirst()).log(level,
beans.getFirst().getSimpleName() + " " + message + " \t (" + bean + ")");
}
@Override
public void methodIn(String string) {
log("Method in: " + string + " " + new Throwable().getStackTrace()[1].getMethodName());
}
@Override
public void missing(Object ob, String sentence) {
log("Missing: '" + ob + "'! " + sentence);
}
@Override
public void notify(Object string) {
log("Notify: " + string);
}
@Override
public void override(String what, Object newValue, Object oldValue) {
log("Override: " + what + " with value '" + oldValue + "' by the new value '" + newValue + "'");
}
@Override
public void searching(Object ob) {
log("Searching: " + ob);
}
@Override
public void show(Object obj) {
log("Show dialog: " + obj);
}
@Override
public void system(Object ob) {
log("System: " + ob);
}
@Override
public void user(Object ob) {
log("User: " + ob);
}
@Override
public void voteEnlargeLogging() throws RuntimeException {
final LinkedList> findBeanStack = findBeanStack();
final String clazz = findBeanStack.getLast().getCanonicalName();
String level = config.read(NS_VOTE_LOGGING, clazz);
if (level == null) {
level = Level.OFF.getName();
}
config.write(NS_VOTE_LOGGING, clazz, getLarger(Level.parse(level)).getName());
}
@Override
public void voteShortenLogging() {
final LinkedList> findBeanStack = findBeanStack();
final Class> last = findBeanStack.getLast();
final Level level = getConfiguredLevel(last);
config.write(NS_VOTE_LOGGING, last.getCanonicalName(), getShorter(level).getName());
}
@Override
public Performance turing(String name) {
return new Performance(name);
}
@Override
public void timeout(URL url, String string) {
log("Timeout: " + string + "(" + url + ")");
}
}