All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.vectorpublish.desktop.vp.DefaultLogger Maven / Gradle / Ivy

The newest version!
/*
 * 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 + ")"); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy