/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.core.ext; import java.net.URL; /** * An interface used to log messages in deferred binding generators. */ public abstract class TreeLogger { /** * Provides extra information to the user, generally details of what caused * the problem or what the user should do to fix the problem. How this * information is interpreted and displayed is implementation-dependent. */ public abstract static class HelpInfo { /** * @return the text to use for an anchor if not null and getURL is non-null. */ public String getAnchorText() { return null; } /** * @return the prefix to go before the link. */ public String getPrefix() { return "More info: "; } /** * @return a URL containing extra information about the problem, or null if * none. */ public URL getURL() { return null; } } /** * A type-safe enum of all possible logging severity types. */ @SuppressWarnings("hiding") public enum Type { /** * Logs an error. */ ERROR(true), /** * Logs a warning. */ WARN(true), /** * Logs information. */ INFO(false), /** * Logs information related to lower-level operation. */ TRACE(false), /** * Logs detailed information that could be useful during debugging. */ DEBUG(false), /** * Logs extremely verbose and detailed information that is typically useful * only to product implementors. */ SPAM(false), /** * Logs everything -- quite a bit of stuff. */ ALL(false); /** * Gets all the possible severity types as an array. * * @return an array of severity types */ public static Type[] instances() { return Type.values(); } private final boolean needsAttention; /** * Constructs a log type with an optional parent. */ private Type(boolean needsAttention) { this.needsAttention = needsAttention; } /** * Gets the label for this severity type. * * @return the label */ public String getLabel() { return this.toString(); } /** * Determines whether this log type is of lower priority than some other log * type. * * @param other the other log type * @return <code>true</code> if this log type is lower priority */ public boolean isLowerPriorityThan(Type other) { // Counterintuitive: higher number is lower priority. return this.ordinal() > other.ordinal(); } /** * Indicates whether this severity type represents a high severity that * should be highlighted for the user. * * @return <code>true</code> if this severity is high, otherwise * <code>false</code>. */ public boolean needsAttention() { return needsAttention; } } /** * Logs an error. */ public static final Type ERROR = Type.ERROR; /** * Logs a warning. */ public static final Type WARN = Type.WARN; /** * Logs information. */ public static final Type INFO = Type.INFO; /** * Logs information related to lower-level operation. */ public static final Type TRACE = Type.TRACE; /** * Logs detailed information that could be useful during debugging. */ public static final Type DEBUG = Type.DEBUG; /** * Logs extremely verbose and detailed information that is typically useful * only to product implementors. */ public static final Type SPAM = Type.SPAM; /** * Logs everything -- quite a bit of stuff. */ public static final Type ALL = Type.ALL; /** * A valid logger that ignores all messages. Occasionally useful when calling * methods that require a logger parameter. */ public static final TreeLogger NULL = new TreeLogger() { @Override public TreeLogger branch(Type type, String msg, Throwable caught, HelpInfo helpInfo) { return this; } @Override public boolean isLoggable(Type type) { return false; } @Override public void log(Type type, String msg, Throwable caught, HelpInfo helpInfo) { // nothing } }; /** * Calls * {@link #branch(com.google.gwt.core.ext.TreeLogger.Type, String, Throwable, com.google.gwt.core.ext.TreeLogger.HelpInfo)} * with a <code>null</code> <code>caught</code> and <code>helpInfo</code>. */ public final TreeLogger branch(TreeLogger.Type type, String msg) { return branch(type, msg, null, null); } /** * Calls * {@link #branch(com.google.gwt.core.ext.TreeLogger.Type, String, Throwable, com.google.gwt.core.ext.TreeLogger.HelpInfo)} * with a <code>null</code> <code>helpInfo</code>. */ public final TreeLogger branch(TreeLogger.Type type, String msg, Throwable caught) { return branch(type, msg, caught, null); } /** * Produces a branched logger, which can be used to write messages that are * logically grouped together underneath the current logger. The details of * how/if the resulting messages are displayed is implementation-dependent. * * <p> * The log message supplied when branching serves two purposes. First, the * message should be considered a heading for all the child messages below it. * Second, the <code>type</code> of the message provides a hint as to the * importance of the children below it. As an optimization, an implementation * could return a "no-op" logger if messages of the specified type weren't * being logged, which the implication being that all nested log messages were * no more important than the level of their branch parent. * </p> * * <p> * As an example of how hierarchical logging can be used, a branched logger in * a GUI could write log message as child items of a parent node in a tree * control. If logging to streams, such as a text console, the branched logger * could prefix each entry with a unique string and indent its text so that it * could be sorted later to reconstruct a proper hierarchy. * </p> * * @param type * @param msg an optional message to log, which can be <code>null</code> if * only an exception is being logged * @param caught an optional exception to log, which can be <code>null</code> * if only a message is being logged * @param helpInfo extra information that might be used by the logger to * provide extended information to the user * @return an instance of {@link TreeLogger} representing the new branch of * the log; may be the same instance on which this method is called */ public abstract TreeLogger branch(TreeLogger.Type type, String msg, Throwable caught, HelpInfo helpInfo); /** * Determines whether or not a log entry of the specified type would actually * be logged. Caller use this method to avoid constructing log messages that * would be thrown away. */ public abstract boolean isLoggable(TreeLogger.Type type); /** * Calls {@link #log(TreeLogger.Type, String, Throwable, HelpInfo)} with a * <code>null</code> <code>caught</code> and <code>helpInfo</code>. */ public final void log(TreeLogger.Type type, String msg) { log(type, msg, null, null); } /** * Calls {@link #log(TreeLogger.Type, String, Throwable, HelpInfo)} with a * <code>null</code> <code>helpInfo</code>. */ public final void log(TreeLogger.Type type, String msg, Throwable caught) { log(type, msg, caught, null); } /** * Logs a message and/or an exception, with optional help info. It is also * legal to call this method using <code>null</code> arguments for <i>both</i> * <code>msg</code> and <code>caught</code>, in which case the log event * can be ignored. The <code>info</code> can provide extra information to * the logger; a logger may choose to ignore this info. * * @param type * @param msg an optional message to log, which can be <code>null</code> if * only an exception is being logged * @param caught an optional exception to log, which can be <code>null</code> * if only a message is being logged * @param helpInfo extra information that might be used by the logger to * provide extended information to the user */ public abstract void log(TreeLogger.Type type, String msg, Throwable caught, HelpInfo helpInfo); }