-
-package org.apache.log4j;
-
-
-/**
- Use this class to quickly configure the package.
-
- For file based configuration see {@link
- PropertyConfigurator}. For XML based configuration see {@link
- org.apache.log4j.xml.DOMConfigurator DOMConfigurator}.
-
- @since 0.8.1
- @author Ceki Gülcü */
-public class BasicConfigurator {
-
- protected BasicConfigurator() {
- }
-
- /**
- Add a {@link ConsoleAppender} that uses {@link PatternLayout}
- using the {@link PatternLayout#TTCC_CONVERSION_PATTERN} and
- prints to System.out to the root category. */
- static
- public
- void configure() {
- Logger root = Logger.getRootLogger();
- root.addAppender(new ConsoleAppender(
- new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
- }
-
- /**
- Add appender to the root category.
- @param appender The appender to add to the root category.
- */
- static
- public
- void configure(Appender appender) {
- Logger root = Logger.getRootLogger();
- root.addAppender(appender);
- }
-
- /**
- Reset the default hierarchy to its defaut. It is equivalent to
- calling
- Category.getDefaultHierarchy().resetConfiguration().
-
- See {@link Hierarchy#resetConfiguration()} for more details. */
- public
- static
- void resetConfiguration() {
- LogManager.resetConfiguration();
- }
-}
diff --git a/java/src/org/apache/log4j/Category.java b/java/src/org/apache/log4j/Category.java
deleted file mode 100644
index e0cb561..0000000
--- a/java/src/org/apache/log4j/Category.java
+++ /dev/null
@@ -1,1062 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contibutors: Alex Blewitt
-// Markus Oestreicher
-// Frank Hoering
-// Nelson Minar
-// Jim Cakalic
-// Avy Sharell
-// Ciaran Treanor
-// Jeff Turner
-// Michael Horwitz
-// Calvin Chan
-// Aaron Greenhouse
-// Beat Meier
-// Colin Sampaleanu
-
-package org.apache.log4j;
-
-import org.apache.log4j.spi.AppenderAttachable;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.HierarchyEventListener;
-import org.apache.log4j.helpers.NullEnumeration;
-import org.apache.log4j.helpers.AppenderAttachableImpl;
-
-import java.util.Enumeration;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Vector;
-
-
-/**
- * This class has been deprecated and
- * replaced by the {@link Logger} subclass. It
- * will be kept around to preserve backward compatibility until mid
- * 2003.
- *
- * Logger is a subclass of Category, i.e. it extends
- * Category. In other words, a logger is a category. Thus,
- * all operations that can be performed on a category can be
- * performed on a logger. Internally, whenever log4j is asked to
- * produce a Category object, it will instead produce a Logger
- * object. Log4j 1.2 will never produce Category objects but
- * only Logger instances. In order to preserve backward
- * compatibility, methods that previously accepted category objects
- * still continue to accept category objects.
- *
- *
For example, the following are all legal and will work as
- * expected.
- *
-
- // Deprecated form:
- Category cat = Category.getInstance("foo.bar")
-
- // Preferred form for retrieving loggers:
- Logger logger = Logger.getLogger("foo.bar")
-
-
- * The first form is deprecated and should be avoided.
- *
- *
There is absolutely no need for new client code to use or
- * refer to the Category class. Whenever possible,
- * please avoid referring to it or using it.
- *
- *
See the short manual for an
- * introduction on this class.
- *
- * See the document entitled preparing
- * for log4j 1.3 for a more detailed discussion.
- *
- * @author Ceki Gülcü
- * @author Anders Kristensen
- */
-public class Category implements AppenderAttachable {
-
- /**
- The hierarchy where categories are attached to by default.
- */
- //static
- //public
- //final Hierarchy defaultHierarchy = new Hierarchy(new
- // RootCategory(Level.DEBUG));
-
- /**
- The name of this category.
- */
- protected String name;
-
- /**
- The assigned level of this category. The
- level variable need not be assigned a value in
- which case it is inherited form the hierarchy. */
- volatile protected Level level;
-
- /**
- The parent of this category. All categories have at least one
- ancestor which is the root category. */
- volatile protected Category parent;
-
- /**
- The fully qualified name of the Category class. See also the
- getFQCN method. */
- private static final String FQCN = Category.class.getName();
-
- protected ResourceBundle resourceBundle;
-
- // Categories need to know what Hierarchy they are in
- protected LoggerRepository repository;
-
-
- AppenderAttachableImpl aai;
-
- /** Additivity is set to true by default, that is children inherit
- the appenders of their ancestors by default. If this variable is
- set to false then the appenders found in the
- ancestors of this category are not used. However, the children
- of this category will inherit its appenders, unless the children
- have their additivity flag set to false too. See
- the user manual for more details. */
- protected boolean additive = true;
-
- /**
- This constructor created a new Category instance and
- sets its name.
-
-
It is intended to be used by sub-classes only. You should not
- create categories directly.
-
- @param name The name of the category.
- */
- protected
- Category(String name) {
- this.name = name;
- }
-
- /**
- Add newAppender to the list of appenders of this
- Category instance.
-
-
If newAppender is already in the list of
- appenders, then it won't be added again.
- */
- synchronized
- public
- void addAppender(Appender newAppender) {
- if(aai == null) {
- aai = new AppenderAttachableImpl();
- }
- aai.addAppender(newAppender);
- repository.fireAddAppenderEvent(this, newAppender);
- }
-
- /**
- If assertion parameter is false, then
- logs msg as an {@link #error(Object) error} statement.
-
-
The assert method has been renamed to
- assertLog because assert is a language
- reserved word in JDK 1.4.
-
- @param assertion
- @param msg The message to print if assertion is
- false.
-
- @since 1.2 */
- public
- void assertLog(boolean assertion, String msg) {
- if(!assertion)
- this.error(msg);
- }
-
-
- /**
- Call the appenders in the hierrachy starting at
- this. If no appenders could be found, emit a
- warning.
-
-
This method calls all the appenders inherited from the
- hierarchy circumventing any evaluation of whether to log or not
- to log the particular log request.
-
- @param event the event to log. */
- public
- void callAppenders(LoggingEvent event) {
- int writes = 0;
-
- for(Category c = this; c != null; c=c.parent) {
- // Protected against simultaneous call to addAppender, removeAppender,...
- synchronized(c) {
- if(c.aai != null) {
- writes += c.aai.appendLoopOnAppenders(event);
- }
- if(!c.additive) {
- break;
- }
- }
- }
-
- if(writes == 0) {
- repository.emitNoAppenderWarning(this);
- }
- }
-
- /**
- Close all attached appenders implementing the AppenderAttachable
- interface.
- @since 1.0
- */
- synchronized
- void closeNestedAppenders() {
- Enumeration enumeration = this.getAllAppenders();
- if(enumeration != null) {
- while(enumeration.hasMoreElements()) {
- Appender a = (Appender) enumeration.nextElement();
- if(a instanceof AppenderAttachable) {
- a.close();
- }
- }
- }
- }
-
- /**
- Log a message object with the {@link Level#DEBUG DEBUG} level.
-
-
This method first checks if this category is DEBUG
- enabled by comparing the level of this category with the {@link
- Level#DEBUG DEBUG} level. If this category is
- DEBUG enabled, then it converts the message object
- (passed as parameter) to a string by invoking the appropriate
- {@link org.apache.log4j.or.ObjectRenderer}. It then proceeds to call all the
- registered appenders in this category and also higher in the
- hierarchy depending on the value of the additivity flag.
-
-
WARNING Note that passing a {@link Throwable} to this
- method will print the name of the Throwable but no
- stack trace. To print a stack trace use the {@link #debug(Object,
- Throwable)} form instead.
-
- @param message the message object to log. */
- public
- void debug(Object message) {
- if(repository.isDisabled(Level.DEBUG_INT))
- return;
- if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
- forcedLog(FQCN, Level.DEBUG, message, null);
- }
- }
-
-
- /**
- Log a message object with the DEBUG level including
- the stack trace of the {@link Throwable} t passed as
- parameter.
-
-
See {@link #debug(Object)} form for more detailed information.
-
- @param message the message object to log.
- @param t the exception to log, including its stack trace. */
- public
- void debug(Object message, Throwable t) {
- if(repository.isDisabled(Level.DEBUG_INT))
- return;
- if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.DEBUG, message, t);
- }
-
- /**
- Log a message object with the {@link Level#ERROR ERROR} Level.
-
-
This method first checks if this category is ERROR
- enabled by comparing the level of this category with {@link
- Level#ERROR ERROR} Level. If this category is ERROR
- enabled, then it converts the message object passed as parameter
- to a string by invoking the appropriate {@link
- org.apache.log4j.or.ObjectRenderer}. It proceeds to call all the
- registered appenders in this category and also higher in the
- hierarchy depending on the value of the additivity flag.
-
-
WARNING Note that passing a {@link Throwable} to this
- method will print the name of the Throwable but no
- stack trace. To print a stack trace use the {@link #error(Object,
- Throwable)} form instead.
-
- @param message the message object to log */
- public
- void error(Object message) {
- if(repository.isDisabled(Level.ERROR_INT))
- return;
- if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.ERROR, message, null);
- }
-
- /**
- Log a message object with the ERROR level including
- the stack trace of the {@link Throwable} t passed as
- parameter.
-
-
See {@link #error(Object)} form for more detailed information.
-
- @param message the message object to log.
- @param t the exception to log, including its stack trace. */
- public
- void error(Object message, Throwable t) {
- if(repository.isDisabled(Level.ERROR_INT))
- return;
- if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.ERROR, message, t);
-
- }
-
-
- /**
- If the named category exists (in the default hierarchy) then it
- returns a reference to the category, otherwise it returns
- null.
-
- @deprecated Please use {@link LogManager#exists} instead.
-
- @since 0.8.5 */
- public
- static
- Logger exists(String name) {
- return LogManager.exists(name);
- }
-
- /**
- Log a message object with the {@link Level#FATAL FATAL} Level.
-
-
This method first checks if this category is FATAL
- enabled by comparing the level of this category with {@link
- Level#FATAL FATAL} Level. If the category is FATAL
- enabled, then it converts the message object passed as parameter
- to a string by invoking the appropriate
- {@link org.apache.log4j.or.ObjectRenderer}. It
- proceeds to call all the registered appenders in this category and
- also higher in the hierarchy depending on the value of the
- additivity flag.
-
-
WARNING Note that passing a {@link Throwable} to this
- method will print the name of the Throwable but no stack trace. To
- print a stack trace use the {@link #fatal(Object, Throwable)} form
- instead.
-
- @param message the message object to log */
- public
- void fatal(Object message) {
- if(repository.isDisabled(Level.FATAL_INT))
- return;
- if(Level.FATAL.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.FATAL, message, null);
- }
-
- /**
- Log a message object with the FATAL level including
- the stack trace of the {@link Throwable} t passed as
- parameter.
-
-
See {@link #fatal(Object)} for more detailed information.
-
- @param message the message object to log.
- @param t the exception to log, including its stack trace. */
- public
- void fatal(Object message, Throwable t) {
- if(repository.isDisabled(Level.FATAL_INT))
- return;
- if(Level.FATAL.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.FATAL, message, t);
- }
-
-
- /**
- This method creates a new logging event and logs the event
- without further checks. */
- protected
- void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
- callAppenders(new LoggingEvent(fqcn, this, level, message, t));
- }
-
-
- /**
- Get the additivity flag for this Category instance.
- */
- public
- boolean getAdditivity() {
- return additive;
- }
-
- /**
- Get the appenders contained in this category as an {@link
- Enumeration}. If no appenders can be found, then a {@link NullEnumeration}
- is returned.
-
- @return Enumeration An enumeration of the appenders in this category. */
- synchronized
- public
- Enumeration getAllAppenders() {
- if(aai == null)
- return NullEnumeration.getInstance();
- else
- return aai.getAllAppenders();
- }
-
- /**
- Look for the appender named as name.
-
-
Return the appender with that name if in the list. Return
- null otherwise. */
- synchronized
- public
- Appender getAppender(String name) {
- if(aai == null || name == null)
- return null;
-
- return aai.getAppender(name);
- }
-
- /**
- Starting from this category, search the category hierarchy for a
- non-null level and return it. Otherwise, return the level of the
- root category.
-
-
The Category class is designed so that this method executes as
- quickly as possible.
- */
- public
- Level getEffectiveLevel() {
- for(Category c = this; c != null; c=c.parent) {
- if(c.level != null)
- return c.level;
- }
- return null; // If reached will cause an NullPointerException.
- }
-
- /**
- *
- * @deprecated Please use the the {@link #getEffectiveLevel} method
- * instead.
- * */
- public
- Priority getChainedPriority() {
- for(Category c = this; c != null; c=c.parent) {
- if(c.level != null)
- return c.level;
- }
- return null; // If reached will cause an NullPointerException.
- }
-
-
- /**
- Returns all the currently defined categories in the default
- hierarchy as an {@link java.util.Enumeration Enumeration}.
-
-
The root category is not included in the returned
- {@link Enumeration}.
-
- @deprecated Please use {@link LogManager#getCurrentLoggers()} instead.
- */
- public
- static
- Enumeration getCurrentCategories() {
- return LogManager.getCurrentLoggers();
- }
-
-
- /**
- Return the default Hierarchy instance.
-
- @deprecated Please use {@link LogManager#getLoggerRepository()} instead.
-
- @since 1.0
- */
- public
- static
- LoggerRepository getDefaultHierarchy() {
- return LogManager.getLoggerRepository();
- }
-
- /**
- Return the the {@link Hierarchy} where this Category
- instance is attached.
-
- @deprecated Please use {@link #getLoggerRepository} instead.
-
- @since 1.1 */
- public
- LoggerRepository getHierarchy() {
- return repository;
- }
-
- /**
- Return the the {@link LoggerRepository} where this
- Category is attached.
-
- @since 1.2 */
- public
- LoggerRepository getLoggerRepository() {
- return repository;
- }
-
-
- /**
- * @deprecated Make sure to use {@link Logger#getLogger(String)} instead.
- */
- public
- static
- Category getInstance(String name) {
- return LogManager.getLogger(name);
- }
-
- /**
- * @deprecated Please make sure to use {@link Logger#getLogger(Class)} instead.
- */
- public
- static
- Category getInstance(Class clazz) {
- return LogManager.getLogger(clazz);
- }
-
-
- /**
- Return the category name. */
- public
- final
- String getName() {
- return name;
- }
-
-
- /**
- Returns the parent of this category. Note that the parent of a
- given category may change during the lifetime of the category.
-
-
The root category will return null.
-
- @since 1.2
- */
- final
- public
- Category getParent() {
- return this.parent;
- }
-
-
- /**
- Returns the assigned {@link Level}, if any, for this Category.
-
- @return Level - the assigned Level, can be null.
- */
- final
- public
- Level getLevel() {
- return this.level;
- }
-
- /**
- @deprecated Please use {@link #getLevel} instead.
- */
- final
- public
- Level getPriority() {
- return this.level;
- }
-
-
- /**
- * @deprecated Please use {@link Logger#getRootLogger()} instead.
- */
- final
- public
- static
- Category getRoot() {
- return LogManager.getRootLogger();
- }
-
- /**
- Return the inherited {@link ResourceBundle} for this
- category.
-
-
This method walks the hierarchy to find the appropriate
- resource bundle. It will return the resource bundle attached to
- the closest ancestor of this category, much like the way
- priorities are searched. In case there is no bundle in the
- hierarchy then null is returned.
-
- @since 0.9.0 */
- public
- ResourceBundle getResourceBundle() {
- for(Category c = this; c != null; c=c.parent) {
- if(c.resourceBundle != null)
- return c.resourceBundle;
- }
- // It might be the case that there is no resource bundle
- return null;
- }
-
- /**
- Returns the string resource coresponding to key in
- this category's inherited resource bundle. See also {@link
- #getResourceBundle}.
-
-
If the resource cannot be found, then an {@link #error error}
- message will be logged complaining about the missing resource.
- */
- protected
- String getResourceBundleString(String key) {
- ResourceBundle rb = getResourceBundle();
- // This is one of the rare cases where we can use logging in order
- // to report errors from within log4j.
- if(rb == null) {
- //if(!hierarchy.emittedNoResourceBundleWarning) {
- //error("No resource bundle has been set for category "+name);
- //hierarchy.emittedNoResourceBundleWarning = true;
- //}
- return null;
- }
- else {
- try {
- return rb.getString(key);
- }
- catch(MissingResourceException mre) {
- error("No resource is associated with key \""+key+"\".");
- return null;
- }
- }
- }
-
- /**
- Log a message object with the {@link Level#INFO INFO} Level.
-
-
This method first checks if this category is INFO
- enabled by comparing the level of this category with {@link
- Level#INFO INFO} Level. If the category is INFO
- enabled, then it converts the message object passed as parameter
- to a string by invoking the appropriate
- {@link org.apache.log4j.or.ObjectRenderer}. It
- proceeds to call all the registered appenders in this category and
- also higher in the hierarchy depending on the value of the
- additivity flag.
-
-
WARNING Note that passing a {@link Throwable} to this
- method will print the name of the Throwable but no stack trace. To
- print a stack trace use the {@link #info(Object, Throwable)} form
- instead.
-
- @param message the message object to log */
- public
- void info(Object message) {
- if(repository.isDisabled(Level.INFO_INT))
- return;
- if(Level.INFO.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.INFO, message, null);
- }
-
- /**
- Log a message object with the INFO level including
- the stack trace of the {@link Throwable} t passed as
- parameter.
-
-
See {@link #info(Object)} for more detailed information.
-
- @param message the message object to log.
- @param t the exception to log, including its stack trace. */
- public
- void info(Object message, Throwable t) {
- if(repository.isDisabled(Level.INFO_INT))
- return;
- if(Level.INFO.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.INFO, message, t);
- }
-
- /**
- Is the appender passed as parameter attached to this category?
- */
- public
- boolean isAttached(Appender appender) {
- if(appender == null || aai == null)
- return false;
- else {
- return aai.isAttached(appender);
- }
- }
-
- /**
- * Check whether this category is enabled for the DEBUG
- * Level.
- *
- *
This function is intended to lessen the computational cost of
- * disabled log debug statements.
- *
- *
For some cat Category object, when you write,
- *
- * cat.debug("This is entry number: " + i );
- *
- *
- * You incur the cost constructing the message, concatenatiion in
- * this case, regardless of whether the message is logged or not.
- *
- *
If you are worried about speed, then you should write
- *
- * if(cat.isDebugEnabled()) {
- * cat.debug("This is entry number: " + i );
- * }
- *
- *
- * This way you will not incur the cost of parameter
- * construction if debugging is disabled for cat. On
- * the other hand, if the cat is debug enabled, you
- * will incur the cost of evaluating whether the category is debug
- * enabled twice. Once in isDebugEnabled and once in
- * the debug. This is an insignificant overhead
- * since evaluating a category takes about 1%% of the time it
- * takes to actually log.
- *
- * @return boolean - true if this category is debug
- * enabled, false otherwise.
- * */
- public
- boolean isDebugEnabled() {
- if(repository.isDisabled( Level.DEBUG_INT))
- return false;
- return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
- }
-
- /**
- Check whether this category is enabled for a given {@link
- Level} passed as parameter.
-
- See also {@link #isDebugEnabled}.
-
- @return boolean True if this category is enabled for level.
- */
- public
- boolean isEnabledFor(Priority level) {
- if(repository.isDisabled(level.level))
- return false;
- return level.isGreaterOrEqual(this.getEffectiveLevel());
- }
-
- /**
- Check whether this category is enabled for the info Level.
- See also {@link #isDebugEnabled}.
-
- @return boolean - true if this category is enabled
- for level info, false otherwise.
- */
- public
- boolean isInfoEnabled() {
- if(repository.isDisabled(Level.INFO_INT))
- return false;
- return Level.INFO.isGreaterOrEqual(this.getEffectiveLevel());
- }
-
-
- /**
- Log a localized message. The user supplied parameter
- key is replaced by its localized version from the
- resource bundle.
-
- @see #setResourceBundle
-
- @since 0.8.4 */
- public
- void l7dlog(Priority priority, String key, Throwable t) {
- if(repository.isDisabled(priority.level)) {
- return;
- }
- if(priority.isGreaterOrEqual(this.getEffectiveLevel())) {
- String msg = getResourceBundleString(key);
- // if message corresponding to 'key' could not be found in the
- // resource bundle, then default to 'key'.
- if(msg == null) {
- msg = key;
- }
- forcedLog(FQCN, priority, msg, t);
- }
- }
- /**
- Log a localized and parameterized message. First, the user
- supplied key is searched in the resource
- bundle. Next, the resulting pattern is formatted using
- {@link java.text.MessageFormat#format(String,Object[])} method with the
- user supplied object array params.
-
- @since 0.8.4
- */
- public
- void l7dlog(Priority priority, String key, Object[] params, Throwable t) {
- if(repository.isDisabled(priority.level)) {
- return;
- }
- if(priority.isGreaterOrEqual(this.getEffectiveLevel())) {
- String pattern = getResourceBundleString(key);
- String msg;
- if(pattern == null)
- msg = key;
- else
- msg = java.text.MessageFormat.format(pattern, params);
- forcedLog(FQCN, priority, msg, t);
- }
- }
-
- /**
- This generic form is intended to be used by wrappers.
- */
- public
- void log(Priority priority, Object message, Throwable t) {
- if(repository.isDisabled(priority.level)) {
- return;
- }
- if(priority.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, priority, message, t);
- }
-
- /**
- This generic form is intended to be used by wrappers.
- */
- public
- void log(Priority priority, Object message) {
- if(repository.isDisabled(priority.level)) {
- return;
- }
- if(priority.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, priority, message, null);
- }
-
- /**
-
- This is the most generic printing method. It is intended to be
- invoked by wrapper classes.
-
- @param callerFQCN The wrapper class' fully qualified class name.
- @param level The level of the logging request.
- @param message The message of the logging request.
- @param t The throwable of the logging request, may be null. */
- public
- void log(String callerFQCN, Priority level, Object message, Throwable t) {
- if(repository.isDisabled(level.level)) {
- return;
- }
- if(level.isGreaterOrEqual(this.getEffectiveLevel())) {
- forcedLog(callerFQCN, level, message, t);
- }
- }
-
- /**
- * LoggerRepository forgot the fireRemoveAppenderEvent method,
- * if using the stock Hierarchy implementation, then call its fireRemove.
- * Custom repositories can implement HierarchyEventListener if they
- * want remove notifications.
- * @param appender appender, may be null.
- */
- private void fireRemoveAppenderEvent(final Appender appender) {
- if (appender != null) {
- if (repository instanceof Hierarchy) {
- ((Hierarchy) repository).fireRemoveAppenderEvent(this, appender);
- } else if (repository instanceof HierarchyEventListener) {
- ((HierarchyEventListener) repository).removeAppenderEvent(this, appender);
- }
- }
- }
-
- /**
- Remove all previously added appenders from this Category
- instance.
-
-
This is useful when re-reading configuration information.
- */
- synchronized
- public
- void removeAllAppenders() {
- if(aai != null) {
- Vector appenders = new Vector();
- for (Enumeration iter = aai.getAllAppenders(); iter != null && iter.hasMoreElements();) {
- appenders.add(iter.nextElement());
- }
- aai.removeAllAppenders();
- for(Enumeration iter = appenders.elements(); iter.hasMoreElements();) {
- fireRemoveAppenderEvent((Appender) iter.nextElement());
- }
- aai = null;
- }
- }
-
-
- /**
- Remove the appender passed as parameter form the list of appenders.
-
- @since 0.8.2
- */
- synchronized
- public
- void removeAppender(Appender appender) {
- if(appender == null || aai == null)
- return;
- boolean wasAttached = aai.isAttached(appender);
- aai.removeAppender(appender);
- if (wasAttached) {
- fireRemoveAppenderEvent(appender);
- }
- }
-
- /**
- Remove the appender with the name passed as parameter form the
- list of appenders.
-
- @since 0.8.2 */
- synchronized
- public
- void removeAppender(String name) {
- if(name == null || aai == null) return;
- Appender appender = aai.getAppender(name);
- aai.removeAppender(name);
- if (appender != null) {
- fireRemoveAppenderEvent(appender);
- }
- }
-
- /**
- Set the additivity flag for this Category instance.
- @since 0.8.1
- */
- public
- void setAdditivity(boolean additive) {
- this.additive = additive;
- }
-
- /**
- Only the Hiearchy class can set the hiearchy of a
- category. Default package access is MANDATORY here. */
- final
- void setHierarchy(LoggerRepository repository) {
- this.repository = repository;
- }
-
- /**
- Set the level of this Category. If you are passing any of
- Level.DEBUG, Level.INFO,
- Level.WARN, Level.ERROR,
- Level.FATAL as a parameter, you need to case them as
- Level.
-
-
As in
logger.setLevel((Level) Level.DEBUG);
-
-
- Null values are admitted. */
- public
- void setLevel(Level level) {
- this.level = level;
- }
-
-
- /**
- Set the level of this Category.
-
-
Null values are admitted.
-
- @deprecated Please use {@link #setLevel} instead.
- */
- public
- void setPriority(Priority priority) {
- this.level = (Level) priority;
- }
-
-
- /**
- Set the resource bundle to be used with localized logging
- methods {@link #l7dlog(Priority,String,Throwable)} and {@link
- #l7dlog(Priority,String,Object[],Throwable)}.
-
- @since 0.8.4
- */
- public
- void setResourceBundle(ResourceBundle bundle) {
- resourceBundle = bundle;
- }
-
- /**
- Calling this method will safely close and remove all
- appenders in all the categories including root contained in the
- default hierachy.
-
-
Some appenders such as {@link org.apache.log4j.net.SocketAppender}
- and {@link AsyncAppender} need to be closed before the
- application exists. Otherwise, pending logging events might be
- lost.
-
-
The shutdown method is careful to close nested
- appenders before closing regular appenders. This is allows
- configurations where a regular appender is attached to a category
- and again to a nested appender.
-
- @deprecated Please use {@link LogManager#shutdown()} instead.
-
- @since 1.0
- */
- public
- static
- void shutdown() {
- LogManager.shutdown();
- }
-
-
- /**
- Log a message object with the {@link Level#WARN WARN} Level.
-
-
This method first checks if this category is WARN
- enabled by comparing the level of this category with {@link
- Level#WARN WARN} Level. If the category is WARN
- enabled, then it converts the message object passed as parameter
- to a string by invoking the appropriate
- {@link org.apache.log4j.or.ObjectRenderer}. It
- proceeds to call all the registered appenders in this category and
- also higher in the hieararchy depending on the value of the
- additivity flag.
-
-
WARNING Note that passing a {@link Throwable} to this
- method will print the name of the Throwable but no stack trace. To
- print a stack trace use the {@link #warn(Object, Throwable)} form
- instead.
-
- @param message the message object to log. */
- public
- void warn(Object message) {
- if(repository.isDisabled( Level.WARN_INT))
- return;
-
- if(Level.WARN.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.WARN, message, null);
- }
-
- /**
- Log a message with the WARN level including the
- stack trace of the {@link Throwable} t passed as
- parameter.
-
-
See {@link #warn(Object)} for more detailed information.
-
- @param message the message object to log.
- @param t the exception to log, including its stack trace. */
- public
- void warn(Object message, Throwable t) {
- if(repository.isDisabled(Level.WARN_INT))
- return;
- if(Level.WARN.isGreaterOrEqual(this.getEffectiveLevel()))
- forcedLog(FQCN, Level.WARN, message, t);
- }
-}
diff --git a/java/src/org/apache/log4j/CategoryKey.java b/java/src/org/apache/log4j/CategoryKey.java
deleted file mode 100644
index fe0fff7..0000000
--- a/java/src/org/apache/log4j/CategoryKey.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-/**
- CategoryKey is a wrapper for String that apparently accellerated
- hash table lookup in early JVM's.
- @author Ceki Gülcü
-*/
-class CategoryKey {
-
- String name;
- int hashCache;
-
- CategoryKey(String name) {
- this.name = name;
- hashCache = name.hashCode();
- }
-
- final
- public
- int hashCode() {
- return hashCache;
- }
-
- final
- public
- boolean equals(Object rArg) {
- if(this == rArg)
- return true;
-
- if(rArg != null && CategoryKey.class == rArg.getClass())
- return name.equals(((CategoryKey)rArg ).name);
- else
- return false;
- }
-}
diff --git a/java/src/org/apache/log4j/ConsoleAppender.java b/java/src/org/apache/log4j/ConsoleAppender.java
deleted file mode 100644
index b44fd5f..0000000
--- a/java/src/org/apache/log4j/ConsoleAppender.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import org.apache.log4j.helpers.LogLog;
-
-/**
- * ConsoleAppender appends log events to System.out or
- * System.err using a layout specified by the user. The
- * default target is System.out.
- *
- * @author Ceki Gülcü
- * @author Curt Arnold
- * @since 1.1 */
-public class ConsoleAppender extends WriterAppender {
-
- public static final String SYSTEM_OUT = "System.out";
- public static final String SYSTEM_ERR = "System.err";
-
- protected String target = SYSTEM_OUT;
-
- /**
- * Determines if the appender honors reassignments of System.out
- * or System.err made after configuration.
- */
- private boolean follow = false;
-
- /**
- * Constructs an unconfigured appender.
- */
- public ConsoleAppender() {
- }
-
- /**
- * Creates a configured appender.
- *
- * @param layout layout, may not be null.
- */
- public ConsoleAppender(Layout layout) {
- this(layout, SYSTEM_OUT);
- }
-
- /**
- * Creates a configured appender.
- * @param layout layout, may not be null.
- * @param target target, either "System.err" or "System.out".
- */
- public ConsoleAppender(Layout layout, String target) {
- setLayout(layout);
- setTarget(target);
- activateOptions();
- }
-
- /**
- * Sets the value of the Target option. Recognized values
- * are "System.out" and "System.err". Any other value will be
- * ignored.
- * */
- public
- void setTarget(String value) {
- String v = value.trim();
-
- if (SYSTEM_OUT.equalsIgnoreCase(v)) {
- target = SYSTEM_OUT;
- } else if (SYSTEM_ERR.equalsIgnoreCase(v)) {
- target = SYSTEM_ERR;
- } else {
- targetWarn(value);
- }
- }
-
- /**
- * Returns the current value of the Target property. The
- * default value of the option is "System.out".
- *
- * See also {@link #setTarget}.
- * */
- public
- String getTarget() {
- return target;
- }
-
- /**
- * Sets whether the appender honors reassignments of System.out
- * or System.err made after configuration.
- * @param newValue if true, appender will use value of System.out or
- * System.err in force at the time when logging events are appended.
- * @since 1.2.13
- */
- public final void setFollow(final boolean newValue) {
- follow = newValue;
- }
-
- /**
- * Gets whether the appender honors reassignments of System.out
- * or System.err made after configuration.
- * @return true if appender will use value of System.out or
- * System.err in force at the time when logging events are appended.
- * @since 1.2.13
- */
- public final boolean getFollow() {
- return follow;
- }
-
- void targetWarn(String val) {
- LogLog.warn("["+val+"] should be System.out or System.err.");
- LogLog.warn("Using previously set target, System.out by default.");
- }
-
- /**
- * Prepares the appender for use.
- */
- public void activateOptions() {
- if (follow) {
- if (target.equals(SYSTEM_ERR)) {
- setWriter(createWriter(new SystemErrStream()));
- } else {
- setWriter(createWriter(new SystemOutStream()));
- }
- } else {
- if (target.equals(SYSTEM_ERR)) {
- setWriter(createWriter(System.err));
- } else {
- setWriter(createWriter(System.out));
- }
- }
-
- super.activateOptions();
- }
-
- /**
- * {@inheritDoc}
- */
- protected
- final
- void closeWriter() {
- if (follow) {
- super.closeWriter();
- }
- }
-
-
- /**
- * An implementation of OutputStream that redirects to the
- * current System.err.
- *
- */
- private static class SystemErrStream extends OutputStream {
- public SystemErrStream() {
- }
-
- public void close() {
- }
-
- public void flush() {
- System.err.flush();
- }
-
- public void write(final byte[] b) throws IOException {
- System.err.write(b);
- }
-
- public void write(final byte[] b, final int off, final int len)
- throws IOException {
- System.err.write(b, off, len);
- }
-
- public void write(final int b) throws IOException {
- System.err.write(b);
- }
- }
-
- /**
- * An implementation of OutputStream that redirects to the
- * current System.out.
- *
- */
- private static class SystemOutStream extends OutputStream {
- public SystemOutStream() {
- }
-
- public void close() {
- }
-
- public void flush() {
- System.out.flush();
- }
-
- public void write(final byte[] b) throws IOException {
- System.out.write(b);
- }
-
- public void write(final byte[] b, final int off, final int len)
- throws IOException {
- System.out.write(b, off, len);
- }
-
- public void write(final int b) throws IOException {
- System.out.write(b);
- }
- }
-
-}
diff --git a/java/src/org/apache/log4j/DailyRollingFileAppender.java b/java/src/org/apache/log4j/DailyRollingFileAppender.java
deleted file mode 100644
index 79a3b5c..0000000
--- a/java/src/org/apache/log4j/DailyRollingFileAppender.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.io.IOException;
-import java.io.File;
-import java.io.InterruptedIOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.Calendar;
-import java.util.TimeZone;
-import java.util.Locale;
-
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- DailyRollingFileAppender extends {@link FileAppender} so that the
- underlying file is rolled over at a user chosen frequency.
-
- DailyRollingFileAppender has been observed to exhibit
- synchronization issues and data loss. The log4j extras
- companion includes alternatives which should be considered
- for new deployments and which are discussed in the documentation
- for org.apache.log4j.rolling.RollingFileAppender.
-
-
The rolling schedule is specified by the DatePattern
- option. This pattern should follow the {@link SimpleDateFormat}
- conventions. In particular, you must escape literal text
- within a pair of single quotes. A formatted version of the date
- pattern is used as the suffix for the rolled file name.
-
-
For example, if the File option is set to
- /foo/bar.log and the DatePattern set to
- '.'yyyy-MM-dd, on 2001-02-16 at midnight, the logging
- file /foo/bar.log will be copied to
- /foo/bar.log.2001-02-16 and logging for 2001-02-17
- will continue in /foo/bar.log until it rolls over
- the next day.
-
-
Is is possible to specify monthly, weekly, half-daily, daily,
- hourly, or minutely rollover schedules.
-
-
-
- | DatePattern |
- Rollover schedule |
- Example |
-
-
- '.'yyyy-MM
- | Rollover at the beginning of each month |
-
- At midnight of May 31st, 2002 /foo/bar.log will be
- copied to /foo/bar.log.2002-05. Logging for the month
- of June will be output to /foo/bar.log until it is
- also rolled over the next month.
-
- |
- '.'yyyy-ww
-
- | Rollover at the first day of each week. The first day of the
- week depends on the locale. |
-
- Assuming the first day of the week is Sunday, on Saturday
- midnight, June 9th 2002, the file /foo/bar.log will be
- copied to /foo/bar.log.2002-23. Logging for the 24th week
- of 2002 will be output to /foo/bar.log until it is
- rolled over the next week.
-
- |
- '.'yyyy-MM-dd
-
- | Rollover at midnight each day. |
-
- At midnight, on March 8th, 2002, /foo/bar.log will
- be copied to /foo/bar.log.2002-03-08. Logging for the
- 9th day of March will be output to /foo/bar.log until
- it is rolled over the next day.
-
- |
- '.'yyyy-MM-dd-a
-
- | Rollover at midnight and midday of each day. |
-
- At noon, on March 9th, 2002, /foo/bar.log will be
- copied to /foo/bar.log.2002-03-09-AM. Logging for the
- afternoon of the 9th will be output to /foo/bar.log
- until it is rolled over at midnight.
-
- |
- '.'yyyy-MM-dd-HH
-
- | Rollover at the top of every hour. |
-
- At approximately 11:00.000 o'clock on March 9th, 2002,
- /foo/bar.log will be copied to
- /foo/bar.log.2002-03-09-10. Logging for the 11th hour
- of the 9th of March will be output to /foo/bar.log
- until it is rolled over at the beginning of the next hour.
-
-
- |
- '.'yyyy-MM-dd-HH-mm
-
- | Rollover at the beginning of every minute. |
-
- At approximately 11:23,000, on March 9th, 2001,
- /foo/bar.log will be copied to
- /foo/bar.log.2001-03-09-10-22. Logging for the minute
- of 11:23 (9th of March) will be output to
- /foo/bar.log until it is rolled over the next minute.
-
- |
-
- Do not use the colon ":" character in anywhere in the
- DatePattern option. The text before the colon is interpeted
- as the protocol specificaion of a URL which is probably not what
- you want.
-
-
- @author Eirik Lygre
- @author Ceki Gülcü*/
-public class DailyRollingFileAppender extends FileAppender {
-
-
- // The code assumes that the following constants are in a increasing
- // sequence.
- static final int TOP_OF_TROUBLE=-1;
- static final int TOP_OF_MINUTE = 0;
- static final int TOP_OF_HOUR = 1;
- static final int HALF_DAY = 2;
- static final int TOP_OF_DAY = 3;
- static final int TOP_OF_WEEK = 4;
- static final int TOP_OF_MONTH = 5;
-
-
- /**
- The date pattern. By default, the pattern is set to
- "'.'yyyy-MM-dd" meaning daily rollover.
- */
- private String datePattern = "'.'yyyy-MM-dd";
-
- /**
- The log file will be renamed to the value of the
- scheduledFilename variable when the next interval is entered. For
- example, if the rollover period is one hour, the log file will be
- renamed to the value of "scheduledFilename" at the beginning of
- the next hour.
-
- The precise time when a rollover occurs depends on logging
- activity.
- */
- private String scheduledFilename;
-
- /**
- The next time we estimate a rollover should occur. */
- private long nextCheck = System.currentTimeMillis () - 1;
-
- Date now = new Date();
-
- SimpleDateFormat sdf;
-
- RollingCalendar rc = new RollingCalendar();
-
- int checkPeriod = TOP_OF_TROUBLE;
-
- // The gmtTimeZone is used only in computeCheckPeriod() method.
- static final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
-
-
- /**
- The default constructor does nothing. */
- public DailyRollingFileAppender() {
- }
-
- /**
- Instantiate a DailyRollingFileAppender and open the
- file designated by filename. The opened filename will
- become the ouput destination for this appender.
-
- */
- public DailyRollingFileAppender (Layout layout, String filename,
- String datePattern) throws IOException {
- super(layout, filename, true);
- this.datePattern = datePattern;
- activateOptions();
- }
-
- /**
- The DatePattern takes a string in the same format as
- expected by {@link SimpleDateFormat}. This options determines the
- rollover schedule.
- */
- public void setDatePattern(String pattern) {
- datePattern = pattern;
- }
-
- /** Returns the value of the DatePattern option. */
- public String getDatePattern() {
- return datePattern;
- }
-
- public void activateOptions() {
- super.activateOptions();
- if(datePattern != null && fileName != null) {
- now.setTime(System.currentTimeMillis());
- sdf = new SimpleDateFormat(datePattern);
- int type = computeCheckPeriod();
- printPeriodicity(type);
- rc.setType(type);
- File file = new File(fileName);
- scheduledFilename = fileName+sdf.format(new Date(file.lastModified()));
-
- } else {
- LogLog.error("Either File or DatePattern options are not set for appender ["
- +name+"].");
- }
- }
-
- void printPeriodicity(int type) {
- switch(type) {
- case TOP_OF_MINUTE:
- LogLog.debug("Appender ["+name+"] to be rolled every minute.");
- break;
- case TOP_OF_HOUR:
- LogLog.debug("Appender ["+name
- +"] to be rolled on top of every hour.");
- break;
- case HALF_DAY:
- LogLog.debug("Appender ["+name
- +"] to be rolled at midday and midnight.");
- break;
- case TOP_OF_DAY:
- LogLog.debug("Appender ["+name
- +"] to be rolled at midnight.");
- break;
- case TOP_OF_WEEK:
- LogLog.debug("Appender ["+name
- +"] to be rolled at start of week.");
- break;
- case TOP_OF_MONTH:
- LogLog.debug("Appender ["+name
- +"] to be rolled at start of every month.");
- break;
- default:
- LogLog.warn("Unknown periodicity for appender ["+name+"].");
- }
- }
-
-
- // This method computes the roll over period by looping over the
- // periods, starting with the shortest, and stopping when the r0 is
- // different from from r1, where r0 is the epoch formatted according
- // the datePattern (supplied by the user) and r1 is the
- // epoch+nextMillis(i) formatted according to datePattern. All date
- // formatting is done in GMT and not local format because the test
- // logic is based on comparisons relative to 1970-01-01 00:00:00
- // GMT (the epoch).
-
- int computeCheckPeriod() {
- RollingCalendar rollingCalendar = new RollingCalendar(gmtTimeZone, Locale.getDefault());
- // set sate to 1970-01-01 00:00:00 GMT
- Date epoch = new Date(0);
- if(datePattern != null) {
- for(int i = TOP_OF_MINUTE; i <= TOP_OF_MONTH; i++) {
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
- simpleDateFormat.setTimeZone(gmtTimeZone); // do all date formatting in GMT
- String r0 = simpleDateFormat.format(epoch);
- rollingCalendar.setType(i);
- Date next = new Date(rollingCalendar.getNextCheckMillis(epoch));
- String r1 = simpleDateFormat.format(next);
- //System.out.println("Type = "+i+", r0 = "+r0+", r1 = "+r1);
- if(r0 != null && r1 != null && !r0.equals(r1)) {
- return i;
- }
- }
- }
- return TOP_OF_TROUBLE; // Deliberately head for trouble...
- }
-
- /**
- Rollover the current file to a new file.
- */
- void rollOver() throws IOException {
-
- /* Compute filename, but only if datePattern is specified */
- if (datePattern == null) {
- errorHandler.error("Missing DatePattern option in rollOver().");
- return;
- }
-
- String datedFilename = fileName+sdf.format(now);
- // It is too early to roll over because we are still within the
- // bounds of the current interval. Rollover will occur once the
- // next interval is reached.
- if (scheduledFilename.equals(datedFilename)) {
- return;
- }
-
- // close current file, and rename it to datedFilename
- this.closeFile();
-
- File target = new File(scheduledFilename);
- if (target.exists()) {
- target.delete();
- }
-
- File file = new File(fileName);
- boolean result = file.renameTo(target);
- if(result) {
- LogLog.debug(fileName +" -> "+ scheduledFilename);
- } else {
- LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
- }
-
- try {
- // This will also close the file. This is OK since multiple
- // close operations are safe.
- this.setFile(fileName, true, this.bufferedIO, this.bufferSize);
- }
- catch(IOException e) {
- errorHandler.error("setFile("+fileName+", true) call failed.");
- }
- scheduledFilename = datedFilename;
- }
-
- /**
- * This method differentiates DailyRollingFileAppender from its
- * super class.
- *
- *
Before actually logging, this method will check whether it is
- * time to do a rollover. If it is, it will schedule the next
- * rollover time and then rollover.
- * */
- protected void subAppend(LoggingEvent event) {
- long n = System.currentTimeMillis();
- if (n >= nextCheck) {
- now.setTime(n);
- nextCheck = rc.getNextCheckMillis(now);
- try {
- rollOver();
- }
- catch(IOException ioe) {
- if (ioe instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("rollOver() failed.", ioe);
- }
- }
- super.subAppend(event);
- }
-}
-
-/**
- * RollingCalendar is a helper class to DailyRollingFileAppender.
- * Given a periodicity type and the current time, it computes the
- * start of the next interval.
- * */
-class RollingCalendar extends GregorianCalendar {
- private static final long serialVersionUID = -3560331770601814177L;
-
- int type = DailyRollingFileAppender.TOP_OF_TROUBLE;
-
- RollingCalendar() {
- super();
- }
-
- RollingCalendar(TimeZone tz, Locale locale) {
- super(tz, locale);
- }
-
- void setType(int type) {
- this.type = type;
- }
-
- public long getNextCheckMillis(Date now) {
- return getNextCheckDate(now).getTime();
- }
-
- public Date getNextCheckDate(Date now) {
- this.setTime(now);
-
- switch(type) {
- case DailyRollingFileAppender.TOP_OF_MINUTE:
- this.set(Calendar.SECOND, 0);
- this.set(Calendar.MILLISECOND, 0);
- this.add(Calendar.MINUTE, 1);
- break;
- case DailyRollingFileAppender.TOP_OF_HOUR:
- this.set(Calendar.MINUTE, 0);
- this.set(Calendar.SECOND, 0);
- this.set(Calendar.MILLISECOND, 0);
- this.add(Calendar.HOUR_OF_DAY, 1);
- break;
- case DailyRollingFileAppender.HALF_DAY:
- this.set(Calendar.MINUTE, 0);
- this.set(Calendar.SECOND, 0);
- this.set(Calendar.MILLISECOND, 0);
- int hour = get(Calendar.HOUR_OF_DAY);
- if(hour < 12) {
- this.set(Calendar.HOUR_OF_DAY, 12);
- } else {
- this.set(Calendar.HOUR_OF_DAY, 0);
- this.add(Calendar.DAY_OF_MONTH, 1);
- }
- break;
- case DailyRollingFileAppender.TOP_OF_DAY:
- this.set(Calendar.HOUR_OF_DAY, 0);
- this.set(Calendar.MINUTE, 0);
- this.set(Calendar.SECOND, 0);
- this.set(Calendar.MILLISECOND, 0);
- this.add(Calendar.DATE, 1);
- break;
- case DailyRollingFileAppender.TOP_OF_WEEK:
- this.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek());
- this.set(Calendar.HOUR_OF_DAY, 0);
- this.set(Calendar.MINUTE, 0);
- this.set(Calendar.SECOND, 0);
- this.set(Calendar.MILLISECOND, 0);
- this.add(Calendar.WEEK_OF_YEAR, 1);
- break;
- case DailyRollingFileAppender.TOP_OF_MONTH:
- this.set(Calendar.DATE, 1);
- this.set(Calendar.HOUR_OF_DAY, 0);
- this.set(Calendar.MINUTE, 0);
- this.set(Calendar.SECOND, 0);
- this.set(Calendar.MILLISECOND, 0);
- this.add(Calendar.MONTH, 1);
- break;
- default:
- throw new IllegalStateException("Unknown periodicity type.");
- }
- return getTime();
- }
-}
diff --git a/java/src/org/apache/log4j/DefaultCategoryFactory.java b/java/src/org/apache/log4j/DefaultCategoryFactory.java
deleted file mode 100644
index c7bb0c4..0000000
--- a/java/src/org/apache/log4j/DefaultCategoryFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggerFactory;
-
-class DefaultCategoryFactory implements LoggerFactory {
-
- DefaultCategoryFactory() {
- }
-
- public
- Logger makeNewLoggerInstance(String name) {
- return new Logger(name);
- }
-}
diff --git a/java/src/org/apache/log4j/DefaultThrowableRenderer.java b/java/src/org/apache/log4j/DefaultThrowableRenderer.java
deleted file mode 100644
index 29bfe06..0000000
--- a/java/src/org/apache/log4j/DefaultThrowableRenderer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.ThrowableRenderer;
-
-import java.io.StringWriter;
-import java.io.PrintWriter;
-import java.io.LineNumberReader;
-import java.io.StringReader;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-
-/**
- * Default implementation of ThrowableRenderer using
- * Throwable.printStackTrace.
- *
- * @since 1.2.16
- */
-public final class DefaultThrowableRenderer implements ThrowableRenderer {
- /**
- * Construct new instance.
- */
- public DefaultThrowableRenderer() {
-
- }
-
-
- /**
- * {@inheritDoc}
- */
- public String[] doRender(final Throwable throwable) {
- return render(throwable);
- }
-
- /**
- * Render throwable using Throwable.printStackTrace.
- * @param throwable throwable, may not be null.
- * @return string representation.
- */
- public static String[] render(final Throwable throwable) {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- try {
- throwable.printStackTrace(pw);
- } catch(RuntimeException ex) {
- }
- pw.flush();
- LineNumberReader reader = new LineNumberReader(
- new StringReader(sw.toString()));
- ArrayList lines = new ArrayList();
- try {
- String line = reader.readLine();
- while(line != null) {
- lines.add(line);
- line = reader.readLine();
- }
- } catch(IOException ex) {
- if (ex instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- lines.add(ex.toString());
- }
- String[] tempRep = new String[lines.size()];
- lines.toArray(tempRep);
- return tempRep;
- }
-}
diff --git a/java/src/org/apache/log4j/Dispatcher.java b/java/src/org/apache/log4j/Dispatcher.java
deleted file mode 100644
index e879ff0..0000000
--- a/java/src/org/apache/log4j/Dispatcher.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.helpers.AppenderAttachableImpl;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Obsolete AsyncAppender dispatcher provided for compatibility only.
- *
- * @deprecated Since 1.3.
- */
-class Dispatcher extends Thread {
- /**
- * @deprecated
- */
- private org.apache.log4j.helpers.BoundedFIFO bf;
- private AppenderAttachableImpl aai;
- private boolean interrupted = false;
- AsyncAppender container;
-
- /**
- *
- * @param bf
- * @param container
- * @deprecated
- */
- Dispatcher(org.apache.log4j.helpers.BoundedFIFO bf, AsyncAppender container) {
- this.bf = bf;
- this.container = container;
- this.aai = container.aai;
-
- // It is the user's responsibility to close appenders before
- // exiting.
- this.setDaemon(true);
-
- // set the dispatcher priority to lowest possible value
- this.setPriority(Thread.MIN_PRIORITY);
- this.setName("Dispatcher-" + getName());
-
- // set the dispatcher priority to MIN_PRIORITY plus or minus 2
- // depending on the direction of MIN to MAX_PRIORITY.
- //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2);
- }
-
- void close() {
- synchronized (bf) {
- interrupted = true;
-
- // We have a waiting dispacther if and only if bf.length is
- // zero. In that case, we need to give it a death kiss.
- if (bf.length() == 0) {
- bf.notify();
- }
- }
- }
-
- /**
- * The dispatching strategy is to wait until there are events in the buffer
- * to process. After having processed an event, we release the monitor
- * (variable bf) so that new events can be placed in the buffer, instead of
- * keeping the monitor and processing the remaining events in the buffer.
- *
- *
- * Other approaches might yield better results.
- *
- */
- public void run() {
- //Category cat = Category.getInstance(Dispatcher.class.getName());
- LoggingEvent event;
-
- while (true) {
- synchronized (bf) {
- if (bf.length() == 0) {
- // Exit loop if interrupted but only if the the buffer is empty.
- if (interrupted) {
- //cat.info("Exiting.");
- break;
- }
-
- try {
- //LogLog.debug("Waiting for new event to dispatch.");
- bf.wait();
- } catch (InterruptedException e) {
- break;
- }
- }
-
- event = bf.get();
-
- if (bf.wasFull()) {
- //LogLog.debug("Notifying AsyncAppender about freed space.");
- bf.notify();
- }
- }
-
- // synchronized
- synchronized (container.aai) {
- if ((aai != null) && (event != null)) {
- aai.appendLoopOnAppenders(event);
- }
- }
- }
-
- // while
- // close and remove all appenders
- aai.removeAllAppenders();
- }
-}
diff --git a/java/src/org/apache/log4j/EnhancedPatternLayout.java b/java/src/org/apache/log4j/EnhancedPatternLayout.java
deleted file mode 100644
index 926053a..0000000
--- a/java/src/org/apache/log4j/EnhancedPatternLayout.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.helpers.PatternConverter;
-import org.apache.log4j.pattern.BridgePatternConverter;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-// Contributors: Nelson Minar
-// Anders Kristensen
-
-/**
- * This class is an enhanced version of org.apache.log4j.PatternLayout
- * which was originally developed as part of the abandoned log4j 1.3
- * effort and has been available in the extras companion.
- * This pattern layout should be used in preference to
- * org.apache.log4j.PatternLayout except when compatibility
- * where PatternLayout has been extended either through subclassing
- * or alternative pattern parsers.
- *
- *
- * A flexible layout configurable with pattern string. The goal of this class
- * is to {@link #format format} a {@link LoggingEvent} and return the results
- * in a {@link StringBuffer}. The format of the result depends on the
- * conversion pattern.
- *
- *
- *
The conversion pattern is closely related to the conversion
- * pattern of the printf function in C. A conversion pattern is
- * composed of literal text and format control expressions called
- * conversion specifiers.
- *
- *
Note that you are free to insert any literal text within the
- * conversion pattern.
- *
-
- Each conversion specifier starts with a percent sign (%) and is
- followed by optional format modifiers and a conversion
- character. The conversion character specifies the type of
- data, e.g. category, priority, date, thread name. The format
- modifiers control such things as field width, padding, left and
- right justification. The following is a simple example.
-
-
Let the conversion pattern be "%-5p [%t]: %m%n" and assume
- that the log4j environment was set to use a EnhancedPatternLayout. Then the
- statements
-
- Category root = Category.getRoot();
- root.debug("Message 1");
- root.warn("Message 2");
-
- would yield the output
-
- DEBUG [main]: Message 1
- WARN [main]: Message 2
-
-
- Note that there is no explicit separator between text and
- conversion specifiers. The pattern parser knows when it has reached
- the end of a conversion specifier when it reads a conversion
- character. In the example above the conversion specifier
- %-5p means the priority of the logging event should be left
- justified to a width of five characters.
-
- The recognized conversion characters are
-
-
-
- | Conversion Character |
- Effect |
-
-
- | c |
-
- Used to output the category of the logging event. The
- category conversion specifier can be optionally followed by
- NameAbbreviator pattern.
-
- For example, for the category name "alpha.beta.gamma" the pattern
- %c{2} will output the last two elements ("beta.gamma"),
- %c{-2} will remove two elements leaving "gamma",
- %c{1.} will output "a.b.gamma".
-
- |
-
-
-
- | C |
-
- Used to output the fully qualified class name of the caller
- issuing the logging request. This conversion specifier
- can be optionally followed by precision specifier, that
- is a decimal constant in brackets.
-
- | Used to output the category of the logging event. The
- category conversion specifier can be optionally followed by
- NameAbbreviator pattern.
-
- For example, for the category name "alpha.beta.gamma" the pattern
- %c{2} will output the last two elements ("beta.gamma"),
- %c{-2} will remove two elements leaving "gamma",
- %c{1.} will output "a.b.gamma".
-
- WARNING Generating the caller class information is
- slow. Thus, its use should be avoided unless execution speed is
- not an issue.
-
- |
-
-
- | d | Used to output the date of
- the logging event. The date conversion specifier may be
- followed by a set of braces containing a
- date and time pattern strings {@link java.text.SimpleDateFormat},
- ABSOLUTE, DATE or ISO8601
- and a set of braces containing a time zone id per
- {@link java.util.TimeZone#getTimeZone(String)}.
- For example, %d{HH:mm:ss,SSS},
- %d{dd MMM yyyy HH:mm:ss,SSS},
- %d{DATE} or %d{HH:mm:ss}{GMT+0}. If no date format specifier is given then
- ISO8601 format is assumed.
- |
-
-
-
- | F |
-
- Used to output the file name where the logging request was
- issued.
-
- WARNING Generating caller location information is
- extremely slow and should be avoided unless execution speed
- is not an issue.
-
- |
-
-
- | l |
-
- Used to output location information of the caller which generated
- the logging event.
-
- The location information depends on the JVM implementation but
- usually consists of the fully qualified name of the calling
- method followed by the callers source the file name and line
- number between parentheses.
-
- The location information can be very useful. However, its
- generation is extremely slow and should be avoided
- unless execution speed is not an issue.
-
- |
-
-
-
- | L |
-
- Used to output the line number from where the logging request
- was issued.
-
- WARNING Generating caller location information is
- extremely slow and should be avoided unless execution speed
- is not an issue.
-
- |
-
-
-
- | m |
- Used to output the application supplied message associated with
- the logging event. |
-
-
-
- | M |
-
- Used to output the method name where the logging request was
- issued.
-
- WARNING Generating caller location information is
- extremely slow and should be avoided unless execution speed
- is not an issue.
-
- |
-
-
- | n |
-
- Outputs the platform dependent line separator character or
- characters.
-
- This conversion character offers practically the same
- performance as using non-portable line separator strings such as
- "\n", or "\r\n". Thus, it is the preferred way of specifying a
- line separator.
-
-
- |
-
-
- | p |
- Used to output the priority of the logging event. |
-
-
-
-
- | r |
-
- Used to output the number of milliseconds elapsed since the construction
- of the layout until the creation of the logging event. |
-
-
-
-
- | t |
-
- Used to output the name of the thread that generated the
- logging event. |
-
-
-
-
-
- | x |
-
- Used to output the NDC (nested diagnostic context) associated
- with the thread that generated the logging event.
- |
-
-
-
-
- | X |
-
-
-
- Used to output the MDC (mapped diagnostic context) associated
- with the thread that generated the logging event. The X
- conversion character can be followed by the key for the
- map placed between braces, as in %X{clientNumber} where
- clientNumber is the key. The value in the MDC
- corresponding to the key will be output. If no additional sub-option
- is specified, then the entire contents of the MDC key value pair set
- is output using a format {{key1,val1},{key2,val2}}
-
- See {@link MDC} class for more details.
-
-
- |
-
-
-
- | properties |
-
-
- Used to output the Properties associated
- with the logging event. The properties
- conversion word can be followed by the key for the
- map placed between braces, as in %properties{application} where
- application is the key. The value in the Properties bundle
- corresponding to the key will be output. If no additional sub-option
- is specified, then the entire contents of the Properties key value pair set
- is output using a format {{key1,val1},{key2,val2}}
- |
-
-
-
- | throwable |
-
-
- Used to output the Throwable trace that has been bound to the LoggingEvent, by
- default this will output the full trace as one would normally
- find by a call to Throwable.printStackTrace().
- %throwable{short} or %throwable{1} will output the first line of
- stack trace. throwable{none} or throwable{0} will suppress
- the stack trace. %throwable{n} will output n lines of stack trace
- if a positive integer or omit the last -n lines if a negative integer.
- If no %throwable pattern is specified, the appender will take
- responsibility to output the stack trace as it sees fit.
- |
-
-
-
-
- | % |
-
- The sequence %% outputs a single percent sign.
- |
-
-
-
-
- By default the relevant information is output as is. However,
- with the aid of format modifiers it is possible to change the
- minimum field width, the maximum field width and justification.
-
-
The optional format modifier is placed between the percent sign
- and the conversion character.
-
-
The first optional format modifier is the left justification
- flag which is just the minus (-) character. Then comes the
- optional minimum field width modifier. This is a decimal
- constant that represents the minimum number of characters to
- output. If the data item requires fewer characters, it is padded on
- either the left or the right until the minimum width is
- reached. The default is to pad on the left (right justify) but you
- can specify right padding with the left justification flag. The
- padding character is space. If the data item is larger than the
- minimum field width, the field is expanded to accommodate the
- data. The value is never truncated.
-
-
This behavior can be changed using the maximum field
- width modifier which is designated by a period followed by a
- decimal constant. If the data item is longer than the maximum
- field, then the extra characters are removed from the
- beginning of the data item and not from the end. For
- example, it the maximum field width is eight and the data item is
- ten characters long, then the first two characters of the data item
- are dropped. This behavior deviates from the printf function in C
- where truncation is done from the end.
-
-
Below are various format modifier examples for the category
- conversion specifier.
-
-
-
- | Format modifier
- | left justify
- | minimum width
- | maximum width
- | comment
-
- |
- | %20c |
- false |
- 20 |
- none |
-
- Left pad with spaces if the category name is less than 20
- characters long.
-
- |
| %-20c | true | 20 | none | Right pad with
- spaces if the category name is less than 20 characters long.
-
- |
- | %.30c |
- NA |
- none |
- 30 |
-
- Truncate from the beginning if the category name is longer than 30
- characters.
-
- |
- | %20.30c |
- false |
- 20 |
- 30 |
-
- Left pad with spaces if the category name is shorter than 20
- characters. However, if category name is longer than 30 characters,
- then truncate from the beginning.
-
- |
- | %-20.30c |
- true |
- 20 |
- 30 |
-
- Right pad with spaces if the category name is shorter than 20
- characters. However, if category name is longer than 30 characters,
- then truncate from the beginning.
-
- |
-
- Below are some examples of conversion patterns.
-
-
-
- - %r [%t] %-5p %c %x - %m%n
-
- This is essentially the TTCC layout.
-
-
- %-6r [%15.15t] %-5p %30.30c %x - %m%n
-
-
- Similar to the TTCC layout except that the relative time is
- right padded if less than 6 digits, thread name is right padded if
- less than 15 characters and truncated if longer and the category
- name is left padded if shorter than 30 characters and truncated if
- longer.
-
-
-
- The above text is largely inspired from Peter A. Darnell and
- Philip E. Margolis' highly recommended book "C -- a Software
- Engineering Approach", ISBN 0-387-97389-3.
-
- @author James P. Cakalic
- @author Ceki Gülcü
-
-
- @since 1.2.16 */
-public class EnhancedPatternLayout extends Layout {
- /** Default pattern string for log output. Currently set to the
- string "%m%n" which just prints the application supplied
- message. */
- public static final String DEFAULT_CONVERSION_PATTERN = "%m%n";
-
- /** A conversion pattern equivalent to the TTCCCLayout.
- Current value is %r [%t] %p %c %x - %m%n. */
- public static final String TTCC_CONVERSION_PATTERN =
- "%r [%t] %p %c %x - %m%n";
-
- /**
- * Initial size of internal buffer, no longer used.
- * @deprecated since 1.3
- */
- protected final int BUF_SIZE = 256;
-
- /**
- * Maximum capacity of internal buffer, no longer used.
- * @deprecated since 1.3
- */
- protected final int MAX_CAPACITY = 1024;
-
- /**
- * Customized pattern conversion rules are stored under this key in the
- * {@link org.apache.log4j.spi.LoggerRepository LoggerRepository} object store.
- */
- public static final String PATTERN_RULE_REGISTRY = "PATTERN_RULE_REGISTRY";
-
-
- /**
- * Initial converter for pattern.
- */
- private PatternConverter head;
-
- /**
- * Conversion pattern.
- */
- private String conversionPattern;
-
- /**
- * True if any element in pattern formats information from exceptions.
- */
- private boolean handlesExceptions;
-
- /**
- Constructs a EnhancedPatternLayout using the DEFAULT_LAYOUT_PATTERN.
-
- The default pattern just produces the application supplied message.
- */
- public EnhancedPatternLayout() {
- this(DEFAULT_CONVERSION_PATTERN);
- }
-
- /**
- * Constructs a EnhancedPatternLayout using the supplied conversion pattern.
- * @param pattern conversion pattern.
- */
- public EnhancedPatternLayout(final String pattern) {
- this.conversionPattern = pattern;
- head = createPatternParser(
- (pattern == null) ? DEFAULT_CONVERSION_PATTERN : pattern).parse();
- if (head instanceof BridgePatternConverter) {
- handlesExceptions = !((BridgePatternConverter) head).ignoresThrowable();
- } else {
- handlesExceptions = false;
- }
- }
-
- /**
- * Set the ConversionPattern option. This is the string which
- * controls formatting and consists of a mix of literal content and
- * conversion specifiers.
- *
- * @param conversionPattern conversion pattern.
- */
- public void setConversionPattern(final String conversionPattern) {
- this.conversionPattern =
- OptionConverter.convertSpecialChars(conversionPattern);
- head = createPatternParser(this.conversionPattern).parse();
- if (head instanceof BridgePatternConverter) {
- handlesExceptions = !((BridgePatternConverter) head).ignoresThrowable();
- } else {
- handlesExceptions = false;
- }
- }
-
- /**
- * Returns the value of the ConversionPattern option.
- * @return conversion pattern.
- */
- public String getConversionPattern() {
- return conversionPattern;
- }
-
-
- /**
- Returns PatternParser used to parse the conversion string. Subclasses
- may override this to return a subclass of PatternParser which recognize
- custom conversion characters.
-
- @since 0.9.0
- */
- protected org.apache.log4j.helpers.PatternParser createPatternParser(String pattern) {
- return new org.apache.log4j.pattern.BridgePatternParser(pattern);
- }
-
-
- /**
- Activates the conversion pattern. Do not forget to call this method after
- you change the parameters of the EnhancedPatternLayout instance.
- */
- public void activateOptions() {
- // nothing to do.
- }
-
-
- /**
- * Formats a logging event to a writer.
- * @param event logging event to be formatted.
- */
- public String format(final LoggingEvent event) {
- StringBuffer buf = new StringBuffer();
- for(PatternConverter c = head;
- c != null;
- c = c.next) {
- c.format(buf, event);
- }
- return buf.toString();
- }
-
- /**
- * Will return false if any of the conversion specifiers in the pattern
- * handles {@link Exception Exceptions}.
- * @return true if the pattern formats any information from exceptions.
- */
- public boolean ignoresThrowable() {
- return !handlesExceptions;
- }
-}
diff --git a/java/src/org/apache/log4j/EnhancedThrowableRenderer.java b/java/src/org/apache/log4j/EnhancedThrowableRenderer.java
deleted file mode 100644
index c5b8d7b..0000000
--- a/java/src/org/apache/log4j/EnhancedThrowableRenderer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.ThrowableRenderer;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.security.CodeSource;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Enhanced implementation of ThrowableRenderer. Uses Throwable.getStackTrace
- * if running on JDK 1.4 or later and delegates to DefaultThrowableRenderer.render
- * on earlier virtual machines.
- *
- * @since 1.2.16
- */
-public final class EnhancedThrowableRenderer implements ThrowableRenderer {
- /**
- * Throwable.getStackTrace() method.
- */
- private Method getStackTraceMethod;
- /**
- * StackTraceElement.getClassName() method.
- */
- private Method getClassNameMethod;
-
-
- /**
- * Construct new instance.
- */
- public EnhancedThrowableRenderer() {
- try {
- Class[] noArgs = null;
- getStackTraceMethod = Throwable.class.getMethod("getStackTrace", noArgs);
- Class ste = Class.forName("java.lang.StackTraceElement");
- getClassNameMethod = ste.getMethod("getClassName", noArgs);
- } catch(Exception ex) {
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public String[] doRender(final Throwable throwable) {
- if (getStackTraceMethod != null) {
- try {
- Object[] noArgs = null;
- Object[] elements = (Object[]) getStackTraceMethod.invoke(throwable, noArgs);
- String[] lines = new String[elements.length + 1];
- lines[0] = throwable.toString();
- Map classMap = new HashMap();
- for(int i = 0; i < elements.length; i++) {
- lines[i+1] = formatElement(elements[i], classMap);
- }
- return lines;
- } catch(Exception ex) {
- }
- }
- return DefaultThrowableRenderer.render(throwable);
- }
-
- /**
- * Format one element from stack trace.
- * @param element element, may not be null.
- * @param classMap map of class name to location.
- * @return string representation of element.
- */
- private String formatElement(final Object element, final Map classMap) {
- StringBuffer buf = new StringBuffer("\tat ");
- buf.append(element);
- try {
- String className = getClassNameMethod.invoke(element, (Object[]) null).toString();
- Object classDetails = classMap.get(className);
- if (classDetails != null) {
- buf.append(classDetails);
- } else {
- Class cls = findClass(className);
- int detailStart = buf.length();
- buf.append('[');
- try {
- CodeSource source = cls.getProtectionDomain().getCodeSource();
- if (source != null) {
- URL locationURL = source.getLocation();
- if (locationURL != null) {
- //
- // if a file: URL
- //
- if ("file".equals(locationURL.getProtocol())) {
- String path = locationURL.getPath();
- if (path != null) {
- //
- // find the last file separator character
- //
- int lastSlash = path.lastIndexOf('/');
- int lastBack = path.lastIndexOf(File.separatorChar);
- if (lastBack > lastSlash) {
- lastSlash = lastBack;
- }
- //
- // if no separator or ends with separator (a directory)
- // then output the URL, otherwise just the file name.
- //
- if (lastSlash <= 0 || lastSlash == path.length() - 1) {
- buf.append(locationURL);
- } else {
- buf.append(path.substring(lastSlash + 1));
- }
- }
- } else {
- buf.append(locationURL);
- }
- }
- }
- } catch(SecurityException ex) {
- }
- buf.append(':');
- Package pkg = cls.getPackage();
- if (pkg != null) {
- String implVersion = pkg.getImplementationVersion();
- if (implVersion != null) {
- buf.append(implVersion);
- }
- }
- buf.append(']');
- classMap.put(className, buf.substring(detailStart));
- }
- } catch(Exception ex) {
- }
- return buf.toString();
- }
-
- /**
- * Find class given class name.
- * @param className class name, may not be null.
- * @return class, will not be null.
- * @throws ClassNotFoundException thrown if class can not be found.
- */
- private Class findClass(final String className) throws ClassNotFoundException {
- try {
- return Thread.currentThread().getContextClassLoader().loadClass(className);
- } catch (ClassNotFoundException e) {
- try {
- return Class.forName(className);
- } catch (ClassNotFoundException e1) {
- return getClass().getClassLoader().loadClass(className);
- }
- }
- }
-
-}
diff --git a/java/src/org/apache/log4j/FileAppender.java b/java/src/org/apache/log4j/FileAppender.java
deleted file mode 100644
index 0728695..0000000
--- a/java/src/org/apache/log4j/FileAppender.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.Writer;
-
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.QuietWriter;
-import org.apache.log4j.spi.ErrorCode;
-
-// Contibutors: Jens Uwe Pipka
-// Ben Sandee
-
-/**
- * FileAppender appends log events to a file.
- *
- * Support for java.io.Writer and console appending
- * has been deprecated and then removed. See the replacement
- * solutions: {@link WriterAppender} and {@link ConsoleAppender}.
- *
- * @author Ceki Gülcü
- * */
-public class FileAppender extends WriterAppender {
-
- /** Controls file truncatation. The default value for this variable
- * is true, meaning that by default a
- * FileAppender will append to an existing file and not
- * truncate it.
- *
- *
This option is meaningful only if the FileAppender opens the
- * file.
- */
- protected boolean fileAppend = true;
-
- /**
- The name of the log file. */
- protected String fileName = null;
-
- /**
- Do we do bufferedIO? */
- protected boolean bufferedIO = false;
-
- /**
- * Determines the size of IO buffer be. Default is 8K.
- */
- protected int bufferSize = 8*1024;
-
-
- /**
- The default constructor does not do anything.
- */
- public
- FileAppender() {
- }
-
- /**
- Instantiate a FileAppender and open the file
- designated by filename. The opened filename will
- become the output destination for this appender.
-
-
If the append parameter is true, the file will be
- appended to. Otherwise, the file designated by
- filename will be truncated before being opened.
-
-
If the bufferedIO parameter is true,
- then buffered IO will be used to write to the output file.
-
- */
- public
- FileAppender(Layout layout, String filename, boolean append, boolean bufferedIO,
- int bufferSize) throws IOException {
- this.layout = layout;
- this.setFile(filename, append, bufferedIO, bufferSize);
- }
-
- /**
- Instantiate a FileAppender and open the file designated by
- filename. The opened filename will become the output
- destination for this appender.
-
-
If the append parameter is true, the file will be
- appended to. Otherwise, the file designated by
- filename will be truncated before being opened.
- */
- public
- FileAppender(Layout layout, String filename, boolean append)
- throws IOException {
- this.layout = layout;
- this.setFile(filename, append, false, bufferSize);
- }
-
- /**
- Instantiate a FileAppender and open the file designated by
- filename. The opened filename will become the output
- destination for this appender.
-
-
The file will be appended to. */
- public
- FileAppender(Layout layout, String filename) throws IOException {
- this(layout, filename, true);
- }
-
- /**
- The File property takes a string value which should be the
- name of the file to append to.
-
-
Note that the special values
- "System.out" or "System.err" are no longer honored.
-
-
Note: Actual opening of the file is made when {@link
- #activateOptions} is called, not when the options are set. */
- public void setFile(String file) {
- // Trim spaces from both ends. The users probably does not want
- // trailing spaces in file names.
- String val = file.trim();
- fileName = val;
- }
-
- /**
- Returns the value of the Append option.
- */
- public
- boolean getAppend() {
- return fileAppend;
- }
-
-
- /** Returns the value of the File option. */
- public
- String getFile() {
- return fileName;
- }
-
- /**
- If the value of File is not null, then {@link
- #setFile} is called with the values of File and
- Append properties.
-
- @since 0.8.1 */
- public
- void activateOptions() {
- if(fileName != null) {
- try {
- setFile(fileName, fileAppend, bufferedIO, bufferSize);
- }
- catch(java.io.IOException e) {
- errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.",
- e, ErrorCode.FILE_OPEN_FAILURE);
- }
- } else {
- //LogLog.error("File option not set for appender ["+name+"].");
- LogLog.warn("File option not set for appender ["+name+"].");
- LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");
- }
- }
-
- /**
- Closes the previously opened file.
- */
- protected
- void closeFile() {
- if(this.qw != null) {
- try {
- this.qw.close();
- }
- catch(java.io.IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- // Exceptionally, it does not make sense to delegate to an
- // ErrorHandler. Since a closed appender is basically dead.
- LogLog.error("Could not close " + qw, e);
- }
- }
- }
-
- /**
- Get the value of the BufferedIO option.
-
-
BufferedIO will significatnly increase performance on heavily
- loaded systems.
-
- */
- public
- boolean getBufferedIO() {
- return this.bufferedIO;
- }
-
-
- /**
- Get the size of the IO buffer.
- */
- public
- int getBufferSize() {
- return this.bufferSize;
- }
-
-
-
- /**
- The Append option takes a boolean value. It is set to
- true by default. If true, then File
- will be opened in append mode by {@link #setFile setFile} (see
- above). Otherwise, {@link #setFile setFile} will open
- File in truncate mode.
-
-
Note: Actual opening of the file is made when {@link
- #activateOptions} is called, not when the options are set.
- */
- public
- void setAppend(boolean flag) {
- fileAppend = flag;
- }
-
- /**
- The BufferedIO option takes a boolean value. It is set to
- false by default. If true, then File
- will be opened and the resulting {@link java.io.Writer} wrapped
- around a {@link BufferedWriter}.
-
- BufferedIO will significatnly increase performance on heavily
- loaded systems.
-
- */
- public
- void setBufferedIO(boolean bufferedIO) {
- this.bufferedIO = bufferedIO;
- if(bufferedIO) {
- immediateFlush = false;
- }
- }
-
-
- /**
- Set the size of the IO buffer.
- */
- public
- void setBufferSize(int bufferSize) {
- this.bufferSize = bufferSize;
- }
-
- /**
-
Sets and opens the file where the log output will
- go. The specified file must be writable.
-
-
If there was already an opened file, then the previous file
- is closed first.
-
-
Do not use this method directly. To configure a FileAppender
- or one of its subclasses, set its properties one by one and then
- call activateOptions.
-
- @param fileName The path to the log file.
- @param append If true will append to fileName. Otherwise will
- truncate fileName. */
- public
- synchronized
- void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
- throws IOException {
- LogLog.debug("setFile called: "+fileName+", "+append);
-
- // It does not make sense to have immediate flush and bufferedIO.
- if(bufferedIO) {
- setImmediateFlush(false);
- }
-
- reset();
- FileOutputStream ostream = null;
- try {
- //
- // attempt to create file
- //
- ostream = new FileOutputStream(fileName, append);
- } catch(FileNotFoundException ex) {
- //
- // if parent directory does not exist then
- // attempt to create it and try to create file
- // see bug 9150
- //
- String parentName = new File(fileName).getParent();
- if (parentName != null) {
- File parentDir = new File(parentName);
- if(!parentDir.exists() && parentDir.mkdirs()) {
- ostream = new FileOutputStream(fileName, append);
- } else {
- throw ex;
- }
- } else {
- throw ex;
- }
- }
- Writer fw = createWriter(ostream);
- if(bufferedIO) {
- fw = new BufferedWriter(fw, bufferSize);
- }
- this.setQWForFiles(fw);
- this.fileName = fileName;
- this.fileAppend = append;
- this.bufferedIO = bufferedIO;
- this.bufferSize = bufferSize;
- writeHeader();
- LogLog.debug("setFile ended");
- }
-
-
- /**
- Sets the quiet writer being used.
-
- This method is overriden by {@link RollingFileAppender}.
- */
- protected
- void setQWForFiles(Writer writer) {
- this.qw = new QuietWriter(writer, errorHandler);
- }
-
-
- /**
- Close any previously opened file and call the parent's
- reset. */
- protected
- void reset() {
- closeFile();
- this.fileName = null;
- super.reset();
- }
-}
-
diff --git a/java/src/org/apache/log4j/HTMLLayout.java b/java/src/org/apache/log4j/HTMLLayout.java
deleted file mode 100644
index f7020cf..0000000
--- a/java/src/org/apache/log4j/HTMLLayout.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.helpers.Transform;
-
-/**
- * This layout outputs events in a HTML table.
- *
- * Appenders using this layout should have their encoding
- * set to UTF-8 or UTF-16, otherwise events containing
- * non ASCII characters could result in corrupted
- * log files.
- *
- * @author Ceki Gülcü
- */
-public class HTMLLayout extends Layout {
-
- protected final int BUF_SIZE = 256;
- protected final int MAX_CAPACITY = 1024;
-
- static String TRACE_PREFIX = "
";
-
- // output buffer appended to when format() is invoked
- private StringBuffer sbuf = new StringBuffer(BUF_SIZE);
-
- /**
- A string constant used in naming the option for setting the the
- location information flag. Current value of this string
- constant is LocationInfo.
-
-
Note that all option keys are case sensitive.
-
- @deprecated Options are now handled using the JavaBeans paradigm.
- This constant is not longer needed and will be removed in the
- near term.
-
- */
- public static final String LOCATION_INFO_OPTION = "LocationInfo";
-
- /**
- A string constant used in naming the option for setting the the
- HTML document title. Current value of this string
- constant is Title.
- */
- public static final String TITLE_OPTION = "Title";
-
- // Print no location info by default
- boolean locationInfo = false;
-
- String title = "Log4J Log Messages";
-
- /**
- The LocationInfo option takes a boolean value. By
- default, it is set to false which means there will be no location
- information output by this layout. If the the option is set to
- true, then the file name and line number of the statement
- at the origin of the log statement will be output.
-
-
If you are embedding this layout within an {@link
- org.apache.log4j.net.SMTPAppender} then make sure to set the
- LocationInfo option of that appender as well.
- */
- public
- void setLocationInfo(boolean flag) {
- locationInfo = flag;
- }
-
- /**
- Returns the current value of the LocationInfo option.
- */
- public
- boolean getLocationInfo() {
- return locationInfo;
- }
-
- /**
- The Title option takes a String value. This option sets the
- document title of the generated HTML document.
-
-
Defaults to 'Log4J Log Messages'.
- */
- public
- void setTitle(String title) {
- this.title = title;
- }
-
- /**
- Returns the current value of the Title option.
- */
- public
- String getTitle() {
- return title;
- }
-
- /**
- Returns the content type output by this layout, i.e "text/html".
- */
- public
- String getContentType() {
- return "text/html";
- }
-
- /**
- No options to activate.
- */
- public
- void activateOptions() {
- }
-
- public
- String format(LoggingEvent event) {
-
- if(sbuf.capacity() > MAX_CAPACITY) {
- sbuf = new StringBuffer(BUF_SIZE);
- } else {
- sbuf.setLength(0);
- }
-
- sbuf.append(Layout.LINE_SEP + "
" + Layout.LINE_SEP);
-
- sbuf.append("| ");
- sbuf.append(event.timeStamp - LoggingEvent.getStartTime());
- sbuf.append(" | " + Layout.LINE_SEP);
-
- String escapedThread = Transform.escapeTags(event.getThreadName());
- sbuf.append("");
- sbuf.append(escapedThread);
- sbuf.append(" | " + Layout.LINE_SEP);
-
- sbuf.append("");
- if (event.getLevel().equals(Level.DEBUG)) {
- sbuf.append("");
- sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
- sbuf.append("");
- }
- else if(event.getLevel().isGreaterOrEqual(Level.WARN)) {
- sbuf.append("");
- sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
- sbuf.append("");
- } else {
- sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
- }
- sbuf.append(" | " + Layout.LINE_SEP);
-
- String escapedLogger = Transform.escapeTags(event.getLoggerName());
- sbuf.append("");
- sbuf.append(escapedLogger);
- sbuf.append(" | " + Layout.LINE_SEP);
-
- if(locationInfo) {
- LocationInfo locInfo = event.getLocationInformation();
- sbuf.append("");
- sbuf.append(Transform.escapeTags(locInfo.getFileName()));
- sbuf.append(':');
- sbuf.append(locInfo.getLineNumber());
- sbuf.append(" | " + Layout.LINE_SEP);
- }
-
- sbuf.append("");
- sbuf.append(Transform.escapeTags(event.getRenderedMessage()));
- sbuf.append(" | " + Layout.LINE_SEP);
- sbuf.append("
" + Layout.LINE_SEP);
-
- if (event.getNDC() != null) {
- sbuf.append("| ");
- sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));
- sbuf.append(" |
" + Layout.LINE_SEP);
- }
-
- String[] s = event.getThrowableStrRep();
- if(s != null) {
- sbuf.append("| ");
- appendThrowableAsHTML(s, sbuf);
- sbuf.append(" |
" + Layout.LINE_SEP);
- }
-
- return sbuf.toString();
- }
-
- void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {
- if(s != null) {
- int len = s.length;
- if(len == 0)
- return;
- sbuf.append(Transform.escapeTags(s[0]));
- sbuf.append(Layout.LINE_SEP);
- for(int i = 1; i < len; i++) {
- sbuf.append(TRACE_PREFIX);
- sbuf.append(Transform.escapeTags(s[i]));
- sbuf.append(Layout.LINE_SEP);
- }
- }
- }
-
- /**
- Returns appropriate HTML headers.
- */
- public
- String getHeader() {
- StringBuffer sbuf = new StringBuffer();
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("" + title + "" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("
" + Layout.LINE_SEP);
- sbuf.append("Log session start time " + new java.util.Date() + "
" + Layout.LINE_SEP);
- sbuf.append("
" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("" + Layout.LINE_SEP);
- sbuf.append("| Time | " + Layout.LINE_SEP);
- sbuf.append("Thread | " + Layout.LINE_SEP);
- sbuf.append("Level | " + Layout.LINE_SEP);
- sbuf.append("Category | " + Layout.LINE_SEP);
- if(locationInfo) {
- sbuf.append("File:Line | " + Layout.LINE_SEP);
- }
- sbuf.append("Message | " + Layout.LINE_SEP);
- sbuf.append("
" + Layout.LINE_SEP);
- return sbuf.toString();
- }
-
- /**
- Returns the appropriate HTML footers.
- */
- public
- String getFooter() {
- StringBuffer sbuf = new StringBuffer();
- sbuf.append("
" + Layout.LINE_SEP);
- sbuf.append("
" + Layout.LINE_SEP);
- sbuf.append("");
- return sbuf.toString();
- }
-
- /**
- The HTML layout handles the throwable contained in logging
- events. Hence, this method return false. */
- public
- boolean ignoresThrowable() {
- return false;
- }
-}
diff --git a/java/src/org/apache/log4j/Hierarchy.java b/java/src/org/apache/log4j/Hierarchy.java
deleted file mode 100644
index 5b712e0..0000000
--- a/java/src/org/apache/log4j/Hierarchy.java
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// WARNING This class MUST not have references to the Category or
-// WARNING RootCategory classes in its static initiliazation neither
-// WARNING directly nor indirectly.
-
-// Contributors:
-// Luke Blanshard
-// Mario Schomburg - IBM Global Services/Germany
-// Anders Kristensen
-// Igor Poteryaev
-
-package org.apache.log4j;
-
-
-import java.util.Hashtable;
-import java.util.Enumeration;
-import java.util.Vector;
-
-import org.apache.log4j.spi.LoggerFactory;
-import org.apache.log4j.spi.HierarchyEventListener;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.RendererSupport;
-import org.apache.log4j.or.RendererMap;
-import org.apache.log4j.or.ObjectRenderer;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.ThrowableRendererSupport;
-import org.apache.log4j.spi.ThrowableRenderer;
-
-/**
- This class is specialized in retrieving loggers by name and also
- maintaining the logger hierarchy.
-
- The casual user does not have to deal with this class
- directly.
-
-
The structure of the logger hierarchy is maintained by the
- {@link #getLogger} method. The hierarchy is such that children link
- to their parent but parents do not have any pointers to their
- children. Moreover, loggers can be instantiated in any order, in
- particular descendant before ancestor.
-
-
In case a descendant is created before a particular ancestor,
- then it creates a provision node for the ancestor and adds itself
- to the provision node. Other descendants of the same ancestor add
- themselves to the previously created provision node.
-
- @author Ceki Gülcü
-
-*/
-public class Hierarchy implements LoggerRepository, RendererSupport, ThrowableRendererSupport {
-
- private LoggerFactory defaultFactory;
- private Vector listeners;
-
- Hashtable ht;
- Logger root;
- RendererMap rendererMap;
-
- int thresholdInt;
- Level threshold;
-
- boolean emittedNoAppenderWarning = false;
- boolean emittedNoResourceBundleWarning = false;
-
- private ThrowableRenderer throwableRenderer = null;
-
- /**
- Create a new logger hierarchy.
-
- @param root The root of the new hierarchy.
-
- */
- public
- Hierarchy(Logger root) {
- ht = new Hashtable();
- listeners = new Vector(1);
- this.root = root;
- // Enable all level levels by default.
- setThreshold(Level.ALL);
- this.root.setHierarchy(this);
- rendererMap = new RendererMap();
- defaultFactory = new DefaultCategoryFactory();
- }
-
- /**
- Add an object renderer for a specific class.
- */
- public
- void addRenderer(Class classToRender, ObjectRenderer or) {
- rendererMap.put(classToRender, or);
- }
-
- public
- void addHierarchyEventListener(HierarchyEventListener listener) {
- if(listeners.contains(listener)) {
- LogLog.warn("Ignoring attempt to add an existent listener.");
- } else {
- listeners.addElement(listener);
- }
- }
-
- /**
- This call will clear all logger definitions from the internal
- hashtable. Invoking this method will irrevocably mess up the
- logger hierarchy.
-
-
You should really know what you are doing before
- invoking this method.
-
- @since 0.9.0 */
- public
- void clear() {
- //System.out.println("\n\nAbout to clear internal hash table.");
- ht.clear();
- }
-
- public
- void emitNoAppenderWarning(Category cat) {
- // No appenders in hierarchy, warn user only once.
- if(!this.emittedNoAppenderWarning) {
- LogLog.warn("No appenders could be found for logger (" +
- cat.getName() + ").");
- LogLog.warn("Please initialize the log4j system properly.");
- LogLog.warn("See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.");
- this.emittedNoAppenderWarning = true;
- }
- }
-
- /**
- Check if the named logger exists in the hierarchy. If so return
- its reference, otherwise returns null.
-
- @param name The name of the logger to search for.
-
- */
- public
- Logger exists(String name) {
- Object o = ht.get(new CategoryKey(name));
- if(o instanceof Logger) {
- return (Logger) o;
- } else {
- return null;
- }
- }
-
- /**
- The string form of {@link #setThreshold(Level)}.
- */
- public
- void setThreshold(String levelStr) {
- Level l = (Level) Level.toLevel(levelStr, null);
- if(l != null) {
- setThreshold(l);
- } else {
- LogLog.warn("Could not convert ["+levelStr+"] to Level.");
- }
- }
-
-
- /**
- Enable logging for logging requests with level l or
- higher. By default all levels are enabled.
-
- @param l The minimum level for which logging requests are sent to
- their appenders. */
- public
- void setThreshold(Level l) {
- if(l != null) {
- thresholdInt = l.level;
- threshold = l;
- }
- }
-
- public
- void fireAddAppenderEvent(Category logger, Appender appender) {
- if(listeners != null) {
- int size = listeners.size();
- HierarchyEventListener listener;
- for(int i = 0; i < size; i++) {
- listener = (HierarchyEventListener) listeners.elementAt(i);
- listener.addAppenderEvent(logger, appender);
- }
- }
- }
-
- void fireRemoveAppenderEvent(Category logger, Appender appender) {
- if(listeners != null) {
- int size = listeners.size();
- HierarchyEventListener listener;
- for(int i = 0; i < size; i++) {
- listener = (HierarchyEventListener) listeners.elementAt(i);
- listener.removeAppenderEvent(logger, appender);
- }
- }
- }
-
- /**
- Returns a {@link Level} representation of the enable
- state.
-
- @since 1.2 */
- public
- Level getThreshold() {
- return threshold;
- }
-
- /**
- Returns an integer representation of the this repository's
- threshold.
-
- @since 1.2 */
- //public
- //int getThresholdInt() {
- // return thresholdInt;
- //}
-
-
- /**
- Return a new logger instance named as the first parameter using
- the default factory.
-
-
If a logger of that name already exists, then it will be
- returned. Otherwise, a new logger will be instantiated and
- then linked with its existing ancestors as well as children.
-
- @param name The name of the logger to retrieve.
-
- */
- public
- Logger getLogger(String name) {
- return getLogger(name, defaultFactory);
- }
-
- /**
- Return a new logger instance named as the first parameter using
- factory.
-
-
If a logger of that name already exists, then it will be
- returned. Otherwise, a new logger will be instantiated by the
- factory parameter and linked with its existing
- ancestors as well as children.
-
- @param name The name of the logger to retrieve.
- @param factory The factory that will make the new logger instance.
-
- */
- public
- Logger getLogger(String name, LoggerFactory factory) {
- //System.out.println("getInstance("+name+") called.");
- CategoryKey key = new CategoryKey(name);
- // Synchronize to prevent write conflicts. Read conflicts (in
- // getChainedLevel method) are possible only if variable
- // assignments are non-atomic.
- Logger logger;
-
- synchronized(ht) {
- Object o = ht.get(key);
- if(o == null) {
- logger = factory.makeNewLoggerInstance(name);
- logger.setHierarchy(this);
- ht.put(key, logger);
- updateParents(logger);
- return logger;
- } else if(o instanceof Logger) {
- return (Logger) o;
- } else if (o instanceof ProvisionNode) {
- //System.out.println("("+name+") ht.get(this) returned ProvisionNode");
- logger = factory.makeNewLoggerInstance(name);
- logger.setHierarchy(this);
- ht.put(key, logger);
- updateChildren((ProvisionNode) o, logger);
- updateParents(logger);
- return logger;
- }
- else {
- // It should be impossible to arrive here
- return null; // but let's keep the compiler happy.
- }
- }
- }
-
- /**
- Returns all the currently defined categories in this hierarchy as
- an {@link java.util.Enumeration Enumeration}.
-
-
The root logger is not included in the returned
- {@link Enumeration}. */
- public
- Enumeration getCurrentLoggers() {
- // The accumlation in v is necessary because not all elements in
- // ht are Logger objects as there might be some ProvisionNodes
- // as well.
- Vector v = new Vector(ht.size());
-
- Enumeration elems = ht.elements();
- while(elems.hasMoreElements()) {
- Object o = elems.nextElement();
- if(o instanceof Logger) {
- v.addElement(o);
- }
- }
- return v.elements();
- }
-
- /**
- @deprecated Please use {@link #getCurrentLoggers} instead.
- */
- public
- Enumeration getCurrentCategories() {
- return getCurrentLoggers();
- }
-
-
- /**
- Get the renderer map for this hierarchy.
- */
- public
- RendererMap getRendererMap() {
- return rendererMap;
- }
-
-
- /**
- Get the root of this hierarchy.
-
- @since 0.9.0
- */
- public
- Logger getRootLogger() {
- return root;
- }
-
- /**
- This method will return true if this repository is
- disabled for level object passed as parameter and
- false otherwise. See also the {@link
- #setThreshold(Level) threshold} emthod. */
- public
- boolean isDisabled(int level) {
- return thresholdInt > level;
- }
-
- /**
- @deprecated Deprecated with no replacement.
- */
- public
- void overrideAsNeeded(String override) {
- LogLog.warn("The Hiearchy.overrideAsNeeded method has been deprecated.");
- }
-
- /**
- Reset all values contained in this hierarchy instance to their
- default. This removes all appenders from all categories, sets
- the level of all non-root categories to null,
- sets their additivity flag to true and sets the level
- of the root logger to {@link Level#DEBUG DEBUG}. Moreover,
- message disabling is set its default "off" value.
-
-
Existing categories are not removed. They are just reset.
-
-
This method should be used sparingly and with care as it will
- block all logging until it is completed.
-
- @since 0.8.5 */
- public
- void resetConfiguration() {
-
- getRootLogger().setLevel((Level) Level.DEBUG);
- root.setResourceBundle(null);
- setThreshold(Level.ALL);
-
- // the synchronization is needed to prevent JDK 1.2.x hashtable
- // surprises
- synchronized(ht) {
- shutdown(); // nested locks are OK
-
- Enumeration cats = getCurrentLoggers();
- while(cats.hasMoreElements()) {
- Logger c = (Logger) cats.nextElement();
- c.setLevel(null);
- c.setAdditivity(true);
- c.setResourceBundle(null);
- }
- }
- rendererMap.clear();
- throwableRenderer = null;
- }
-
- /**
- Does nothing.
-
- @deprecated Deprecated with no replacement.
- */
- public
- void setDisableOverride(String override) {
- LogLog.warn("The Hiearchy.setDisableOverride method has been deprecated.");
- }
-
-
-
- /**
- Used by subclasses to add a renderer to the hierarchy passed as parameter.
- */
- public
- void setRenderer(Class renderedClass, ObjectRenderer renderer) {
- rendererMap.put(renderedClass, renderer);
- }
-
- /**
- * {@inheritDoc}
- */
- public void setThrowableRenderer(final ThrowableRenderer renderer) {
- throwableRenderer = renderer;
- }
-
- /**
- * {@inheritDoc}
- */
- public ThrowableRenderer getThrowableRenderer() {
- return throwableRenderer;
- }
-
-
- /**
- Shutting down a hierarchy will safely close and remove
- all appenders in all categories including the root logger.
-
- Some appenders such as {@link org.apache.log4j.net.SocketAppender}
- and {@link AsyncAppender} need to be closed before the
- application exists. Otherwise, pending logging events might be
- lost.
-
-
The shutdown method is careful to close nested
- appenders before closing regular appenders. This is allows
- configurations where a regular appender is attached to a logger
- and again to a nested appender.
-
-
- @since 1.0 */
- public
- void shutdown() {
- Logger root = getRootLogger();
-
- // begin by closing nested appenders
- root.closeNestedAppenders();
-
- synchronized(ht) {
- Enumeration cats = this.getCurrentLoggers();
- while(cats.hasMoreElements()) {
- Logger c = (Logger) cats.nextElement();
- c.closeNestedAppenders();
- }
-
- // then, remove all appenders
- root.removeAllAppenders();
- cats = this.getCurrentLoggers();
- while(cats.hasMoreElements()) {
- Logger c = (Logger) cats.nextElement();
- c.removeAllAppenders();
- }
- }
- }
-
-
- /**
- This method loops through all the *potential* parents of
- 'cat'. There 3 possible cases:
-
- 1) No entry for the potential parent of 'cat' exists
-
- We create a ProvisionNode for this potential parent and insert
- 'cat' in that provision node.
-
- 2) There entry is of type Logger for the potential parent.
-
- The entry is 'cat's nearest existing parent. We update cat's
- parent field with this entry. We also break from the loop
- because updating our parent's parent is our parent's
- responsibility.
-
- 3) There entry is of type ProvisionNode for this potential parent.
-
- We add 'cat' to the list of children for this potential parent.
- */
- final
- private
- void updateParents(Logger cat) {
- String name = cat.name;
- int length = name.length();
- boolean parentFound = false;
-
- //System.out.println("UpdateParents called for " + name);
-
- // if name = "w.x.y.z", loop thourgh "w.x.y", "w.x" and "w", but not "w.x.y.z"
- for(int i = name.lastIndexOf('.', length-1); i >= 0;
- i = name.lastIndexOf('.', i-1)) {
- String substr = name.substring(0, i);
-
- //System.out.println("Updating parent : " + substr);
- CategoryKey key = new CategoryKey(substr); // simple constructor
- Object o = ht.get(key);
- // Create a provision node for a future parent.
- if(o == null) {
- //System.out.println("No parent "+substr+" found. Creating ProvisionNode.");
- ProvisionNode pn = new ProvisionNode(cat);
- ht.put(key, pn);
- } else if(o instanceof Category) {
- parentFound = true;
- cat.parent = (Category) o;
- //System.out.println("Linking " + cat.name + " -> " + ((Category) o).name);
- break; // no need to update the ancestors of the closest ancestor
- } else if(o instanceof ProvisionNode) {
- ((ProvisionNode) o).addElement(cat);
- } else {
- Exception e = new IllegalStateException("unexpected object type " +
- o.getClass() + " in ht.");
- e.printStackTrace();
- }
- }
- // If we could not find any existing parents, then link with root.
- if(!parentFound)
- cat.parent = root;
- }
-
- /**
- We update the links for all the children that placed themselves
- in the provision node 'pn'. The second argument 'cat' is a
- reference for the newly created Logger, parent of all the
- children in 'pn'
-
- We loop on all the children 'c' in 'pn':
-
- If the child 'c' has been already linked to a child of
- 'cat' then there is no need to update 'c'.
-
- Otherwise, we set cat's parent field to c's parent and set
- c's parent field to cat.
-
- */
- final
- private
- void updateChildren(ProvisionNode pn, Logger logger) {
- //System.out.println("updateChildren called for " + logger.name);
- final int last = pn.size();
-
- for(int i = 0; i < last; i++) {
- Logger l = (Logger) pn.elementAt(i);
- //System.out.println("Updating child " +p.name);
-
- // Unless this child already points to a correct (lower) parent,
- // make cat.parent point to l.parent and l.parent to cat.
- if(!l.parent.name.startsWith(logger.name)) {
- logger.parent = l.parent;
- l.parent = logger;
- }
- }
- }
-
-}
-
-
diff --git a/java/src/org/apache/log4j/Layout.java b/java/src/org/apache/log4j/Layout.java
deleted file mode 100644
index 63015aa..0000000
--- a/java/src/org/apache/log4j/Layout.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.OptionHandler;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- Extend this abstract class to create your own log layout format.
-
- @author Ceki Gülcü
-
-*/
-
-public abstract class Layout implements OptionHandler {
-
- // Note that the line.separator property can be looked up even by
- // applets.
- public final static String LINE_SEP = System.getProperty("line.separator");
- public final static int LINE_SEP_LEN = LINE_SEP.length();
-
-
- /**
- Implement this method to create your own layout format.
- */
- abstract
- public
- String format(LoggingEvent event);
-
- /**
- Returns the content type output by this layout. The base class
- returns "text/plain".
- */
- public
- String getContentType() {
- return "text/plain";
- }
-
- /**
- Returns the header for the layout format. The base class returns
- null. */
- public
- String getHeader() {
- return null;
- }
-
- /**
- Returns the footer for the layout format. The base class returns
- null. */
- public
- String getFooter() {
- return null;
- }
-
-
-
- /**
- If the layout handles the throwable object contained within
- {@link LoggingEvent}, then the layout should return
- false. Otherwise, if the layout ignores throwable
- object, then the layout should return true.
- If ignoresThrowable is true, the appender is responsible for
- rendering the throwable.
-
-
The {@link SimpleLayout}, {@link TTCCLayout}, {@link
- PatternLayout} all return true. The {@link
- org.apache.log4j.xml.XMLLayout} returns false.
-
- @since 0.8.4 */
- abstract
- public
- boolean ignoresThrowable();
-
-}
diff --git a/java/src/org/apache/log4j/Level.java b/java/src/org/apache/log4j/Level.java
deleted file mode 100644
index 5028862..0000000
--- a/java/src/org/apache/log4j/Level.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Kitching Simon
-// Nicholas Wolff
-
-package org.apache.log4j;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectStreamException;
-import java.io.Serializable;
-
-/**
- Defines the minimum set of levels recognized by the system, that is
- OFF, FATAL, ERROR,
- WARN, INFODEBUG and
- ALL.
-
- The Level class may be subclassed to define a larger
- level set.
-
- @author Ceki Gülcü
-
- */
-public class Level extends Priority implements Serializable {
-
- /**
- * TRACE level integer value.
- * @since 1.2.12
- */
- public static final int TRACE_INT = 5000;
-
- /**
- The OFF has the highest possible rank and is
- intended to turn off logging. */
- final static public Level OFF = new Level(OFF_INT, "OFF", 0);
-
- /**
- The FATAL level designates very severe error
- events that will presumably lead the application to abort.
- */
- final static public Level FATAL = new Level(FATAL_INT, "FATAL", 0);
-
- /**
- The ERROR level designates error events that
- might still allow the application to continue running. */
- final static public Level ERROR = new Level(ERROR_INT, "ERROR", 3);
-
- /**
- The WARN level designates potentially harmful situations.
- */
- final static public Level WARN = new Level(WARN_INT, "WARN", 4);
-
- /**
- The INFO level designates informational messages
- that highlight the progress of the application at coarse-grained
- level. */
- final static public Level INFO = new Level(INFO_INT, "INFO", 6);
-
- /**
- The DEBUG Level designates fine-grained
- informational events that are most useful to debug an
- application. */
- final static public Level DEBUG = new Level(DEBUG_INT, "DEBUG", 7);
-
- /**
- * The TRACE Level designates finer-grained
- * informational events than the DEBUGALL has the lowest possible rank and is intended to
- turn on all logging. */
- final static public Level ALL = new Level(ALL_INT, "ALL", 7);
-
- /**
- * Serialization version id.
- */
- static final long serialVersionUID = 3491141966387921974L;
-
- /**
- Instantiate a Level object.
- */
- protected
- Level(int level, String levelStr, int syslogEquivalent) {
- super(level, levelStr, syslogEquivalent);
- }
-
-
- /**
- Convert the string passed as argument to a level. If the
- conversion fails, then this method returns {@link #DEBUG}.
- */
- public
- static
- Level toLevel(String sArg) {
- return (Level) toLevel(sArg, Level.DEBUG);
- }
-
- /**
- Convert an integer passed as argument to a level. If the
- conversion fails, then this method returns {@link #DEBUG}.
-
- */
- public
- static
- Level toLevel(int val) {
- return (Level) toLevel(val, Level.DEBUG);
- }
-
- /**
- Convert an integer passed as argument to a level. If the
- conversion fails, then this method returns the specified default.
- */
- public
- static
- Level toLevel(int val, Level defaultLevel) {
- switch(val) {
- case ALL_INT: return ALL;
- case DEBUG_INT: return Level.DEBUG;
- case INFO_INT: return Level.INFO;
- case WARN_INT: return Level.WARN;
- case ERROR_INT: return Level.ERROR;
- case FATAL_INT: return Level.FATAL;
- case OFF_INT: return OFF;
- case TRACE_INT: return Level.TRACE;
- default: return defaultLevel;
- }
- }
-
- /**
- Convert the string passed as argument to a level. If the
- conversion fails, then this method returns the value of
- defaultLevel.
- */
- public
- static
- Level toLevel(String sArg, Level defaultLevel) {
- if(sArg == null)
- return defaultLevel;
-
- String s = sArg.toUpperCase();
-
- if(s.equals("ALL")) return Level.ALL;
- if(s.equals("DEBUG")) return Level.DEBUG;
- if(s.equals("INFO")) return Level.INFO;
- if(s.equals("WARN")) return Level.WARN;
- if(s.equals("ERROR")) return Level.ERROR;
- if(s.equals("FATAL")) return Level.FATAL;
- if(s.equals("OFF")) return Level.OFF;
- if(s.equals("TRACE")) return Level.TRACE;
- //
- // For Turkish i problem, see bug 40937
- //
- if(s.equals("\u0130NFO")) return Level.INFO;
- return defaultLevel;
- }
-
- /**
- * Custom deserialization of Level.
- * @param s serialization stream.
- * @throws IOException if IO exception.
- * @throws ClassNotFoundException if class not found.
- */
- private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException {
- s.defaultReadObject();
- level = s.readInt();
- syslogEquivalent = s.readInt();
- levelStr = s.readUTF();
- if (levelStr == null) {
- levelStr = "";
- }
- }
-
- /**
- * Serialize level.
- * @param s serialization stream.
- * @throws IOException if exception during serialization.
- */
- private void writeObject(final ObjectOutputStream s) throws IOException {
- s.defaultWriteObject();
- s.writeInt(level);
- s.writeInt(syslogEquivalent);
- s.writeUTF(levelStr);
- }
-
- /**
- * Resolved deserialized level to one of the stock instances.
- * May be overriden in classes derived from Level.
- * @return resolved object.
- * @throws ObjectStreamException if exception during resolution.
- */
- private Object readResolve() throws ObjectStreamException {
- //
- // if the deserizalized object is exactly an instance of Level
- //
- if (getClass() == Level.class) {
- return toLevel(level);
- }
- //
- // extension of Level can't substitute stock item
- //
- return this;
- }
-
-}
diff --git a/java/src/org/apache/log4j/LogMF.java b/java/src/org/apache/log4j/LogMF.java
deleted file mode 100644
index 2df99fc..0000000
--- a/java/src/org/apache/log4j/LogMF.java
+++ /dev/null
@@ -1,1677 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.text.DateFormat;
-import java.text.MessageFormat;
-import java.text.NumberFormat;
-import java.util.Date;
-import java.util.ResourceBundle;
-import java.util.Locale;
-
-
-/**
- * This class provides parameterized logging services
- * using the pattern syntax of java.text.MessageFormat.
- * Message formatting is only performed when the
- * request exceeds the threshold level of the logger.
- * When the pattern only contains literal text and
- * default conversion patterns (that is "{0}" and similar)
- * a simple fast compatible formatter is used.
- * If the pattern contains more complex conversion patterns,
- * formatting will be delegated to java.text.MessageFormatter
- * which can be substantially slower.
- *
- * @see org.apache.log4j.LogSF
- * @since 1.2.16
- *
- */
-public final class LogMF extends LogXF {
- /**
- * private constructor.
- *
- */
- private LogMF() {
- }
-
- /**
- * Number format.
- */
- private static NumberFormat numberFormat = null;
- /**
- * Locale at time of last number format request.
- */
- private static Locale numberLocale = null;
- /**
- * Date format.
- */
- private static DateFormat dateFormat = null;
- /**
- * Locale at time of last date format request.
- */
- private static Locale dateLocale = null;
-
- /**
- * Format number.
- * @param n number to format, may not be null.
- * @return formatted value.
- */
- private static synchronized String formatNumber(final Object n) {
- Locale currentLocale = Locale.getDefault();
- if (currentLocale != numberLocale || numberFormat == null) {
- numberLocale = currentLocale;
- numberFormat = NumberFormat.getInstance(currentLocale);
- }
- return numberFormat.format(n);
- }
-
-
- /**
- * Format date.
- * @param d date, may not be null.
- * @return formatted value.
- */
- private static synchronized String formatDate(final Object d) {
- Locale currentLocale = Locale.getDefault();
- if (currentLocale != dateLocale || dateFormat == null) {
- dateLocale = currentLocale;
- dateFormat = DateFormat.getDateTimeInstance(
- DateFormat.SHORT,
- DateFormat.SHORT,
- currentLocale);
- }
- return dateFormat.format(d);
- }
-
- /**
- * Format a single parameter like a "{0}" formatting specifier.
- *
- * @param arg0 parameter, may be null.
- * @return string representation of arg0.
- */
- private static String formatObject(final Object arg0) {
- if (arg0 instanceof String) {
- return arg0.toString();
- } else if (arg0 instanceof Double ||
- arg0 instanceof Float) {
- return formatNumber(arg0);
- } else if (arg0 instanceof Date) {
- return formatDate(arg0);
- }
- return String.valueOf(arg0);
- }
-
-
- /**
- * Determines if pattern contains only {n} format elements
- * and not apostrophes.
- *
- * @param pattern pattern, may not be null.
- * @return true if pattern only contains {n} format elements.
- */
- private static boolean isSimple(final String pattern) {
- if (pattern.indexOf('\'') != -1) {
- return false;
- }
- for(int pos = pattern.indexOf('{');
- pos != -1;
- pos = pattern.indexOf('{', pos + 1)) {
- if (pos + 2 >= pattern.length() ||
- pattern.charAt(pos+2) != '}' ||
- pattern.charAt(pos+1) < '0' ||
- pattern.charAt(pos+1) > '9') {
- return false;
- }
- }
- return true;
-
- }
-
- /**
- * Formats arguments using MessageFormat.
- * @param pattern pattern, may be malformed or null.
- * @param arguments arguments, may be null or mismatched.
- * @return Message string or null
- */
- private static String format(final String pattern,
- final Object[] arguments) {
- if (pattern == null) {
- return null;
- } else if(isSimple(pattern)) {
- String formatted[] = new String[10];
- int prev = 0;
- String retval = "";
- int pos = pattern.indexOf('{');
- while(pos >= 0) {
- if(pos + 2 < pattern.length() &&
- pattern.charAt(pos+2) == '}' &&
- pattern.charAt(pos+1) >= '0' &&
- pattern.charAt(pos+1) <= '9') {
- int index = pattern.charAt(pos+1) - '0';
- retval += pattern.substring(prev, pos);
- if (formatted[index] == null) {
- if (arguments == null || index >= arguments.length) {
- formatted[index] = pattern.substring(pos, pos+3);
- } else {
- formatted[index] = formatObject(arguments[index]);
- }
- }
- retval += formatted[index];
- prev = pos + 3;
- pos = pattern.indexOf('{', prev);
- } else {
- pos = pattern.indexOf('{', pos + 1);
- }
- }
- retval += pattern.substring(prev);
- return retval;
- }
- try {
- return MessageFormat.format(pattern, arguments);
- } catch (IllegalArgumentException ex) {
- return pattern;
- }
- }
-
- /**
- * Formats a single argument using MessageFormat.
- * @param pattern pattern, may be malformed or null.
- * @param arguments arguments, may be null or mismatched.
- * @return Message string or null
- */
- private static String format(final String pattern,
- final Object arg0) {
- if (pattern == null) {
- return null;
- } else if(isSimple(pattern)) {
- String formatted = null;
- int prev = 0;
- String retval = "";
- int pos = pattern.indexOf('{');
- while(pos >= 0) {
- if(pos + 2 < pattern.length() &&
- pattern.charAt(pos+2) == '}' &&
- pattern.charAt(pos+1) >= '0' &&
- pattern.charAt(pos+1) <= '9') {
- int index = pattern.charAt(pos+1) - '0';
- retval += pattern.substring(prev, pos);
- if (index != 0) {
- retval += pattern.substring(pos, pos+3);
- } else {
- if (formatted == null) {
- formatted = formatObject(arg0);
- }
- retval += formatted;
- }
- prev = pos + 3;
- pos = pattern.indexOf('{', prev);
- } else {
- pos = pattern.indexOf('{', pos + 1);
- }
- }
- retval += pattern.substring(prev);
- return retval;
- }
- try {
- return MessageFormat.format(pattern, new Object[] { arg0 });
- } catch (IllegalArgumentException ex) {
- return pattern;
- }
- }
-
-
- /**
- * Formats arguments using MessageFormat using a pattern from
- * a resource bundle.
- * @param resourceBundleName name of resource bundle, may be null.
- * @param key key for pattern in resource bundle, may be null.
- * @param arguments arguments, may be null or mismatched.
- * @return Message string or null
- */
- private static String format(
- final String resourceBundleName,
- final String key,
- final Object[] arguments) {
- String pattern;
- if (resourceBundleName != null) {
- try {
- ResourceBundle bundle =
- ResourceBundle.getBundle(resourceBundleName);
- pattern = bundle.getString(key);
- } catch (Exception ex) {
- pattern = key;
- }
- } else {
- pattern = key;
- }
- return format(pattern, arguments);
- }
-
-
- /**
- * Fully Qualified Class Name of this class.
- */
- private static final String FQCN = LogMF.class.getName();
-
- /**
- * Equivalent of Logger.forcedLog.
- *
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param msg message, may be null.
- */
- private static void forcedLog(final Logger logger,
- final Level level,
- final String msg) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, level, msg, null));
- }
-
- /**
- * Equivalent of Logger.forcedLog.
- *
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param msg message, may be null.
- * @param t throwable.
- */
- private static void forcedLog(final Logger logger,
- final Level level,
- final String msg,
- final Throwable t) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, level, msg, t));
- }
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be
- * formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at error level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void error(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.ERROR)) {
- forcedLog(logger, Level.ERROR, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at fatal level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void fatal(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.FATAL)) {
- forcedLog(logger, Level.FATAL, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be
- * formatted and substituted.
- */
- public static void trace(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void debug(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void info(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void warn(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at error level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void error(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.ERROR)) {
- forcedLog(logger, Level.ERROR, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at fatal level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void fatal(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.FATAL)) {
- forcedLog(logger, Level.FATAL, format(pattern, arguments), t);
- }
- }
-
-
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE,
- format(pattern, toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG,
- format(pattern, toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern,
- toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern,
- toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern,
- toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param parameters parameters to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, parameters));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param parameters parameters to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final Throwable t,
- final String pattern,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, parameters), t);
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(param1)));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final boolean param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final byte param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final char param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final short param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final int param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final long param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final float param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final double param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at specifed level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param level level, may not be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level, format(pattern,
- toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param parameters parameters to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, parameters));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param t throwable, may be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param parameters parameters to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final Throwable t,
- final String bundleName,
- final String key,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, parameters), t);
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(param1)));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final boolean param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final char param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final byte param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final short param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final int param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final long param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final float param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final double param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param0 Parameter to the log message.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param0,
- final Object param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(param0, param1)));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param0 Parameter to the log message.
- * @param param1 Parameter to the log message.
- * @param param2 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param0,
- final Object param1,
- final Object param2) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(param0, param1, param2)));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param0 Parameter to the log message.
- * @param param1 Parameter to the log message.
- * @param param2 Parameter to the log message.
- * @param param3 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param0,
- final Object param1,
- final Object param2,
- final Object param3) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key,
- toArray(param0, param1, param2, param3)));
- }
- }
-
-}
diff --git a/java/src/org/apache/log4j/LogManager.java b/java/src/org/apache/log4j/LogManager.java
deleted file mode 100644
index 5b9659c..0000000
--- a/java/src/org/apache/log4j/LogManager.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggerFactory;
-import org.apache.log4j.spi.RepositorySelector;
-import org.apache.log4j.spi.DefaultRepositorySelector;
-import org.apache.log4j.spi.RootLogger;
-import org.apache.log4j.spi.NOPLoggerRepository;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.helpers.LogLog;
-
-import java.net.URL;
-import java.net.MalformedURLException;
-
-
-import java.util.Enumeration;
-import java.io.StringWriter;
-import java.io.PrintWriter;
-
-/**
- * Use the LogManager class to retreive {@link Logger}
- * instances or to operate on the current {@link
- * LoggerRepository}. When the LogManager class is loaded
- * into memory the default initalzation procedure is inititated. The
- * default intialization procedure is described in the short log4j manual.
- *
- * @author Ceki Gülcü */
-public class LogManager {
-
- /**
- * @deprecated This variable is for internal use only. It will
- * become package protected in future versions.
- * */
- static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
-
- static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml";
-
- /**
- * @deprecated This variable is for internal use only. It will
- * become private in future versions.
- * */
- static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration";
-
- /**
- * @deprecated This variable is for internal use only. It will
- * become private in future versions.
- * */
- static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass";
-
- /**
- * @deprecated This variable is for internal use only. It will
- * become private in future versions.
- */
- public static final String DEFAULT_INIT_OVERRIDE_KEY =
- "log4j.defaultInitOverride";
-
-
- static private Object guard = null;
- static private RepositorySelector repositorySelector;
-
- static {
- // By default we use a DefaultRepositorySelector which always returns 'h'.
- Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
- repositorySelector = new DefaultRepositorySelector(h);
-
- /** Search for the properties file log4j.properties in the CLASSPATH. */
- String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY,
- null);
-
- // if there is no default init override, then get the resource
- // specified by the user or the default config file.
- if(override == null || "false".equalsIgnoreCase(override)) {
-
- String configurationOptionStr = OptionConverter.getSystemProperty(
- DEFAULT_CONFIGURATION_KEY,
- null);
-
- String configuratorClassName = OptionConverter.getSystemProperty(
- CONFIGURATOR_CLASS_KEY,
- null);
-
- URL url = null;
-
- // if the user has not specified the log4j.configuration
- // property, we search first for the file "log4j.xml" and then
- // "log4j.properties"
- if(configurationOptionStr == null) {
- url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
- if(url == null) {
- url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
- }
- } else {
- try {
- url = new URL(configurationOptionStr);
- } catch (MalformedURLException ex) {
- // so, resource is not a URL:
- // attempt to get the resource from the class path
- url = Loader.getResource(configurationOptionStr);
- }
- }
-
- // If we have a non-null url, then delegate the rest of the
- // configuration to the OptionConverter.selectAndConfigure
- // method.
- if(url != null) {
- LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
- try {
- OptionConverter.selectAndConfigure(url, configuratorClassName,
- LogManager.getLoggerRepository());
- } catch (NoClassDefFoundError e) {
- LogLog.warn("Error during default initialization", e);
- }
- } else {
- LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
- }
- } else {
- LogLog.debug("Default initialization of overridden by " +
- DEFAULT_INIT_OVERRIDE_KEY + "property.");
- }
- }
-
- /**
- Sets LoggerFactory but only if the correct
- guard is passed as parameter.
-
-
Initally the guard is null. If the guard is
- null, then invoking this method sets the logger
- factory and the guard. Following invocations will throw a {@link
- IllegalArgumentException}, unless the previously set
- guard is passed as the second parameter.
-
-
This allows a high-level component to set the {@link
- RepositorySelector} used by the LogManager.
-
-
For example, when tomcat starts it will be able to install its
- own repository selector. However, if and when Tomcat is embedded
- within JBoss, then JBoss will install its own repository selector
- and Tomcat will use the repository selector set by its container,
- JBoss. */
- static
- public
- void setRepositorySelector(RepositorySelector selector, Object guard)
- throws IllegalArgumentException {
- if((LogManager.guard != null) && (LogManager.guard != guard)) {
- throw new IllegalArgumentException(
- "Attempted to reset the LoggerFactory without possessing the guard.");
- }
-
- if(selector == null) {
- throw new IllegalArgumentException("RepositorySelector must be non-null.");
- }
-
- LogManager.guard = guard;
- LogManager.repositorySelector = selector;
- }
-
-
- /**
- * This method tests if called from a method that
- * is known to result in class members being abnormally
- * set to null but is assumed to be harmless since the
- * all classes are in the process of being unloaded.
- *
- * @param ex exception used to determine calling stack.
- * @return true if calling stack is recognized as likely safe.
- */
- private static boolean isLikelySafeScenario(final Exception ex) {
- StringWriter stringWriter = new StringWriter();
- ex.printStackTrace(new PrintWriter(stringWriter));
- String msg = stringWriter.toString();
- return msg.indexOf("org.apache.catalina.loader.WebappClassLoader.stop") != -1;
- }
-
- static
- public
- LoggerRepository getLoggerRepository() {
- if (repositorySelector == null) {
- repositorySelector = new DefaultRepositorySelector(new NOPLoggerRepository());
- guard = null;
- Exception ex = new IllegalStateException("Class invariant violation");
- String msg =
- "log4j called after unloading, see http://logging.apache.org/log4j/1.2/faq.html#unload.";
- if (isLikelySafeScenario(ex)) {
- LogLog.debug(msg, ex);
- } else {
- LogLog.error(msg, ex);
- }
- }
- return repositorySelector.getLoggerRepository();
- }
-
- /**
- Retrieve the appropriate root logger.
- */
- public
- static
- Logger getRootLogger() {
- // Delegate the actual manufacturing of the logger to the logger repository.
- return getLoggerRepository().getRootLogger();
- }
-
- /**
- Retrieve the appropriate {@link Logger} instance.
- */
- public
- static
- Logger getLogger(final String name) {
- // Delegate the actual manufacturing of the logger to the logger repository.
- return getLoggerRepository().getLogger(name);
- }
-
- /**
- Retrieve the appropriate {@link Logger} instance.
- */
- public
- static
- Logger getLogger(final Class clazz) {
- // Delegate the actual manufacturing of the logger to the logger repository.
- return getLoggerRepository().getLogger(clazz.getName());
- }
-
-
- /**
- Retrieve the appropriate {@link Logger} instance.
- */
- public
- static
- Logger getLogger(final String name, final LoggerFactory factory) {
- // Delegate the actual manufacturing of the logger to the logger repository.
- return getLoggerRepository().getLogger(name, factory);
- }
-
- public
- static
- Logger exists(final String name) {
- return getLoggerRepository().exists(name);
- }
-
- public
- static
- Enumeration getCurrentLoggers() {
- return getLoggerRepository().getCurrentLoggers();
- }
-
- public
- static
- void shutdown() {
- getLoggerRepository().shutdown();
- }
-
- public
- static
- void resetConfiguration() {
- getLoggerRepository().resetConfiguration();
- }
-}
-
diff --git a/java/src/org/apache/log4j/LogSF.java b/java/src/org/apache/log4j/LogSF.java
deleted file mode 100644
index 8302e20..0000000
--- a/java/src/org/apache/log4j/LogSF.java
+++ /dev/null
@@ -1,1541 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.util.ResourceBundle;
-
-
-/**
- * This class provides parameterized logging services
- * using the SLF4J pattern syntax.
- *
- * Message formatting is only performed when the
- * request exceeds the threshold level of the logger.
- *
- * @since 1.2.16
- *
- */
-public final class LogSF extends LogXF {
- /**
- * private constructor.
- *
- */
- private LogSF() {
- }
-
-
-
-
- /**
- * Formats arguments using SLF4J-like formatter.
- * @param pattern pattern, may be malformed.
- * @param arguments arguments.
- * @return Message string
- */
- private static String format(final String pattern,
- final Object[] arguments) {
- if (pattern != null) {
- String retval = "";
- int count = 0;
- int prev = 0;
- int pos = pattern.indexOf("{");
- while(pos >= 0) {
- if (pos == 0 || pattern.charAt(pos-1) != '\\') {
- retval += pattern.substring(prev, pos);
- if (pos + 1 < pattern.length() && pattern.charAt(pos+1) == '}') {
- if(arguments != null && count < arguments.length) {
- retval += arguments[count++];
- } else {
- retval += "{}";
- }
- prev = pos + 2;
- } else {
- retval += "{";
- prev = pos + 1;
- }
- } else {
- retval += pattern.substring(prev, pos - 1) + "{";
- prev = pos + 1;
- }
- pos = pattern.indexOf("{", prev);
- }
- return retval + pattern.substring(prev);
- }
- return null;
- }
-
- /**
- * Formats arguments using MessageFormat.
- * @param pattern pattern, may be malformed.
- * @param arg0 argument, may be null or mismatched.
- * @return Message string
- */
- private static String format(final String pattern, final Object arg0) {
- if (pattern != null) {
- //
- // if there is an escaped brace, delegate to multi-param formatter
- if (pattern.indexOf("\\{") >= 0) {
- return format(pattern, new Object[] { arg0 });
- }
- int pos = pattern.indexOf("{}");
- if (pos >= 0) {
- return pattern.substring(0, pos) + arg0 + pattern.substring(pos+2);
- }
- }
- return pattern;
- }
-
- /**
- * Formats arguments using MessageFormat using a pattern from
- * a resource bundle.
- * @param resourceBundleName name of resource bundle, may be null.
- * @param key key for pattern in resource bundle, may be null.
- * @param arguments arguments, may be null or mismatched.
- * @return Message string or null
- */
- private static String format(
- final String resourceBundleName,
- final String key,
- final Object[] arguments) {
- String pattern;
- if (resourceBundleName != null) {
- try {
- ResourceBundle bundle =
- ResourceBundle.getBundle(resourceBundleName);
- pattern = bundle.getString(key);
- } catch (Exception ex) {
- pattern = key;
- }
- } else {
- pattern = key;
- }
- return format(pattern, arguments);
- }
-
-
- /**
- * Fully Qualified Class Name of this class.
- */
- private static final String FQCN = LogSF.class.getName();
-
- /**
- * Equivalent of Logger.forcedLog.
- *
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param msg message, may be null.
- */
- private static void forcedLog(final Logger logger,
- final Level level,
- final String msg) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, level, msg, null));
- }
-
- /**
- * Equivalent of Logger.forcedLog.
- *
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param msg message, may be null.
- * @param t throwable.
- */
- private static void forcedLog(final Logger logger,
- final Level level,
- final String msg,
- final Throwable t) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, level, msg, t));
- }
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be
- * formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at error level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void error(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.ERROR)) {
- forcedLog(logger, Level.ERROR, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at fatal level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void fatal(final Logger logger, final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.FATAL)) {
- forcedLog(logger, Level.FATAL, format(pattern, arguments));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be
- * formatted and substituted.
- */
- public static void trace(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void debug(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void info(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void warn(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at error level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void error(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.ERROR)) {
- forcedLog(logger, Level.ERROR, format(pattern, arguments), t);
- }
- }
-
- /**
- * Log a parameterized message at fatal level.
- * @param logger logger, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param arguments an array of arguments to be formatted and substituted.
- */
- public static void fatal(final Logger logger,
- final Throwable t,
- final String pattern,
- final Object[] arguments) {
- if (logger.isEnabledFor(Level.FATAL)) {
- forcedLog(logger, Level.FATAL, format(pattern, arguments), t);
- }
- }
-
-
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at trace level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void trace(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isEnabledFor(TRACE)) {
- forcedLog(logger, TRACE,
- format(pattern, toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at debug level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void debug(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isDebugEnabled()) {
- forcedLog(logger, Level.DEBUG,
- format(pattern, toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern,
- toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at info level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void info(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isInfoEnabled()) {
- forcedLog(logger, Level.INFO, format(pattern,
- toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final boolean argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final char argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final byte argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final short argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final int argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final long argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final float argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final double argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, valueOf(argument)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param argument a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object argument) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern, argument));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at warn level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void warn(final Logger logger, final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isEnabledFor(Level.WARN)) {
- forcedLog(logger, Level.WARN, format(pattern,
- toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param parameters parameters to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, parameters));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param t throwable, may be null.
- * @param pattern pattern, may be null.
- * @param parameters parameters to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final Throwable t,
- final String pattern,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, parameters), t);
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(param1)));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final boolean param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final byte param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final char param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final short param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final int param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final long param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final float param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param param1 parameter to the log message.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final double param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object arg0, final Object arg1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(arg0, arg1)));
- }
- }
-
- /**
- * Log a parameterized message at specifed level.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param pattern pattern, may be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object arg0, final Object arg1, final Object arg2) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(pattern, toArray(arg0, arg1, arg2)));
- }
- }
-
- /**
- * Log a parameterized message at specified level.
- * @param logger logger, may not be null.
- * @param pattern pattern, may be null.
- * @param level level, may not be null.
- * @param arg0 a value to be formatted and substituted.
- * @param arg1 a value to be formatted and substituted.
- * @param arg2 a value to be formatted and substituted.
- * @param arg3 a value to be formatted and substituted.
- */
- public static void log(final Logger logger,
- final Level level,
- final String pattern,
- final Object arg0, final Object arg1, final Object arg2,
- final Object arg3) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level, format(pattern,
- toArray(arg0, arg1, arg2, arg3)));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param parameters parameters to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, parameters));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param t throwable, may be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param parameters parameters to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final Throwable t,
- final String bundleName,
- final String key,
- final Object[] parameters) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, parameters), t);
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(param1)));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final boolean param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final char param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final byte param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final short param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final int param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final long param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final float param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final double param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(valueOf(param1))));
- }
- }
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param0 Parameter to the log message.
- * @param param1 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param0,
- final Object param1) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(param0, param1)));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param0 Parameter to the log message.
- * @param param1 Parameter to the log message.
- * @param param2 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param0,
- final Object param1,
- final Object param2) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key, toArray(param0, param1, param2)));
- }
- }
-
-
- /**
- * Log a parameterized message using a pattern from a resource bundle.
- * @param logger logger, may not be null.
- * @param level level, may not be null.
- * @param bundleName resource bundle name, may be null.
- * @param key key, may be null.
- * @param param0 Parameter to the log message.
- * @param param1 Parameter to the log message.
- * @param param2 Parameter to the log message.
- * @param param3 Parameter to the log message.
- */
- public static void logrb(final Logger logger,
- final Level level,
- final String bundleName,
- final String key,
- final Object param0,
- final Object param1,
- final Object param2,
- final Object param3) {
- if (logger.isEnabledFor(level)) {
- forcedLog(logger, level,
- format(bundleName, key,
- toArray(param0, param1, param2, param3)));
- }
- }
-}
diff --git a/java/src/org/apache/log4j/LogXF.java b/java/src/org/apache/log4j/LogXF.java
deleted file mode 100644
index de2b94b..0000000
--- a/java/src/org/apache/log4j/LogXF.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * This is a base class for LogMF and LogSF parameterized logging classes.
- *
- *
- * @see org.apache.log4j.LogMF
- * @see org.apache.log4j.LogSF
- * @since 1.2.16
- */
-public abstract class LogXF {
- /**
- * Trace level.
- */
- protected static final Level TRACE = new Level(5000, "TRACE", 7);
- /**
- * Fully Qualified Class Name of this class.
- */
- private static final String FQCN = LogXF.class.getName();
-
- protected LogXF() {
- }
-
- /**
- * Returns a Boolean instance representing the specified boolean.
- * Boolean.valueOf was added in JDK 1.4.
- *
- * @param b a boolean value.
- * @return a Boolean instance representing b.
- */
- protected static Boolean valueOf(final boolean b) {
- if (b) {
- return Boolean.TRUE;
- }
- return Boolean.FALSE;
- }
-
- /**
- * Returns a Character instance representing the specified char.
- * Character.valueOf was added in JDK 1.5.
- *
- * @param c a character value.
- * @return a Character instance representing c.
- */
- protected static Character valueOf(final char c) {
- return new Character(c);
- }
-
- /**
- * Returns a Byte instance representing the specified byte.
- * Byte.valueOf was added in JDK 1.5.
- *
- * @param b a byte value.
- * @return a Byte instance representing b.
- */
- protected static Byte valueOf(final byte b) {
- return new Byte(b);
- }
-
- /**
- * Returns a Short instance representing the specified short.
- * Short.valueOf was added in JDK 1.5.
- *
- * @param b a short value.
- * @return a Byte instance representing b.
- */
- protected static Short valueOf(final short b) {
- return new Short(b);
- }
-
- /**
- * Returns an Integer instance representing the specified int.
- * Integer.valueOf was added in JDK 1.5.
- *
- * @param b an int value.
- * @return an Integer instance representing b.
- */
- protected static Integer valueOf(final int b) {
- return new Integer(b);
- }
-
- /**
- * Returns a Long instance representing the specified long.
- * Long.valueOf was added in JDK 1.5.
- *
- * @param b a long value.
- * @return a Long instance representing b.
- */
- protected static Long valueOf(final long b) {
- return new Long(b);
- }
-
- /**
- * Returns a Float instance representing the specified float.
- * Float.valueOf was added in JDK 1.5.
- *
- * @param b a float value.
- * @return a Float instance representing b.
- */
- protected static Float valueOf(final float b) {
- return new Float(b);
- }
-
- /**
- * Returns a Double instance representing the specified double.
- * Double.valueOf was added in JDK 1.5.
- *
- * @param b a double value.
- * @return a Byte instance representing b.
- */
- protected static Double valueOf(final double b) {
- return new Double(b);
- }
-
- /**
- * Create new array.
- *
- * @param param1 parameter 1.
- * @return new array.
- */
- protected static Object[] toArray(final Object param1) {
- return new Object[]{
- param1
- };
- }
-
- /**
- * Create new array.
- *
- * @param param1 parameter 1.
- * @param param2 parameter 2.
- * @return new array.
- */
- protected static Object[] toArray(final Object param1,
- final Object param2) {
- return new Object[]{
- param1, param2
- };
- }
-
- /**
- * Create new array.
- *
- * @param param1 parameter 1.
- * @param param2 parameter 2.
- * @param param3 parameter 3.
- * @return new array.
- */
- protected static Object[] toArray(final Object param1,
- final Object param2,
- final Object param3) {
- return new Object[]{
- param1, param2, param3
- };
- }
-
- /**
- * Create new array.
- *
- * @param param1 parameter 1.
- * @param param2 parameter 2.
- * @param param3 parameter 3.
- * @param param4 parameter 4.
- * @return new array.
- */
- protected static Object[] toArray(final Object param1,
- final Object param2,
- final Object param3,
- final Object param4) {
- return new Object[]{
- param1, param2, param3, param4
- };
- }
-
- /**
- * Log an entering message at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- */
- public static void entering(final Logger logger,
- final String sourceClass,
- final String sourceMethod) {
- if (logger.isDebugEnabled()) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- sourceClass + "." + sourceMethod + " ENTRY", null));
- }
- }
-
- /**
- * Log an entering message with a parameter at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- * @param param parameter, may be null.
- */
- public static void entering(final Logger logger,
- final String sourceClass,
- final String sourceMethod,
- final String param) {
- if (logger.isDebugEnabled()) {
- String msg = sourceClass + "." + sourceMethod + " ENTRY " + param;
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- msg, null));
- }
- }
-
- /**
- * Log an entering message with a parameter at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- * @param param parameter, may be null.
- */
- public static void entering(final Logger logger,
- final String sourceClass,
- final String sourceMethod,
- final Object param) {
- if (logger.isDebugEnabled()) {
- String msg = sourceClass + "." + sourceMethod + " ENTRY ";
- if (param == null) {
- msg += "null";
- } else {
- try {
- msg += param;
- } catch(Throwable ex) {
- msg += "?";
- }
- }
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- msg, null));
- }
- }
-
- /**
- * Log an entering message with an array of parameters at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- * @param params parameters, may be null.
- */
- public static void entering(final Logger logger,
- final String sourceClass,
- final String sourceMethod,
- final Object[] params) {
- if (logger.isDebugEnabled()) {
- String msg = sourceClass + "." + sourceMethod + " ENTRY ";
- if (params != null && params.length > 0) {
- String delim = "{";
- for (int i = 0; i < params.length; i++) {
- try {
- msg += delim + params[i];
- } catch(Throwable ex) {
- msg += delim + "?";
- }
- delim = ",";
- }
- msg += "}";
- } else {
- msg += "{}";
- }
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- msg, null));
- }
- }
-
- /**
- * Log an exiting message at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- */
- public static void exiting(final Logger logger,
- final String sourceClass,
- final String sourceMethod) {
- if (logger.isDebugEnabled()) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- sourceClass + "." + sourceMethod + " RETURN", null));
- }
- }
-
- /**
- * Log an exiting message with result at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- * @param result result, may be null.
- */
- public static void exiting(
- final Logger logger,
- final String sourceClass,
- final String sourceMethod,
- final String result) {
- if (logger.isDebugEnabled()) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- sourceClass + "." + sourceMethod + " RETURN " + result, null));
- }
- }
-
- /**
- * Log an exiting message with result at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- * @param result result, may be null.
- */
- public static void exiting(
- final Logger logger,
- final String sourceClass,
- final String sourceMethod,
- final Object result) {
- if (logger.isDebugEnabled()) {
- String msg = sourceClass + "." + sourceMethod + " RETURN ";
- if (result == null) {
- msg += "null";
- } else {
- try {
- msg += result;
- } catch(Throwable ex) {
- msg += "?";
- }
- }
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- msg, null));
- }
- }
-
- /**
- * Logs a throwing message at DEBUG level.
- *
- * @param logger logger, may not be null.
- * @param sourceClass source class, may be null.
- * @param sourceMethod method, may be null.
- * @param thrown throwable, may be null.
- */
- public static void throwing(
- final Logger logger,
- final String sourceClass,
- final String sourceMethod,
- final Throwable thrown) {
- if (logger.isDebugEnabled()) {
- logger.callAppenders(new LoggingEvent(FQCN, logger, Level.DEBUG,
- sourceClass + "." + sourceMethod + " THROW", thrown));
- }
- }
-}
diff --git a/java/src/org/apache/log4j/Logger.java b/java/src/org/apache/log4j/Logger.java
deleted file mode 100644
index 957145f..0000000
--- a/java/src/org/apache/log4j/Logger.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggerFactory;
-
-
-/**
- This is the central class in the log4j package. Most logging
- operations, except configuration, are done through this class.
-
- @since log4j 1.2
-
- @author Ceki Gülcü */
-public class Logger extends Category {
-
- /**
- The fully qualified name of the Logger class. See also the
- getFQCN method. */
- private static final String FQCN = Logger.class.getName();
-
-
- protected
- Logger(String name) {
- super(name);
- }
-
- /**
- Log a message object with the {@link Level#FINE FINE} level which
- is just an alias for the {@link Level#DEBUG DEBUG} level.
-
-
This method first checks if this category is DEBUG
- enabled by comparing the level of this category with the {@link
- Level#DEBUG DEBUG} level. If this category is
- DEBUG enabled, then it converts the message object
- (passed as parameter) to a string by invoking the appropriate
- {@link org.apache.log4j.or.ObjectRenderer}. It then proceeds to call all the
- registered appenders in this category and also higher in the
- hierarchy depending on the value of the additivity flag.
-
-
WARNING Note that passing a {@link Throwable} to this
- method will print the name of the Throwable but no
- stack trace. To print a stack trace use the {@link #debug(Object,
- Throwable)} form instead.
-
- @param message the message object to log. */
- //public
- //void fine(Object message) {
- // if(repository.isDisabled(Level.DEBUG_INT))
- // return;
- // if(Level.DEBUG.isGreaterOrEqual(this.getChainedLevel())) {
- // forcedLog(FQCN, Level.DEBUG, message, null);
- // }
- //}
-
-
- /**
- Log a message object with the FINE level including
- the stack trace of the {@link Throwable} t passed as
- parameter.
-
-
See {@link #fine(Object)} form for more detailed information.
-
- @param message the message object to log.
- @param t the exception to log, including its stack trace. */
- //public
- //void fine(Object message, Throwable t) {
- // if(repository.isDisabled(Level.DEBUG_INT))
- // return;
- // if(Level.DEBUG.isGreaterOrEqual(this.getChainedLevel()))
- // forcedLog(FQCN, Level.FINE, message, t);
- //}
-
- /**
- * Retrieve a logger named according to the value of the
- * name parameter. If the named logger already exists,
- * then the existing instance will be returned. Otherwise, a new
- * instance is created.
- *
- *
By default, loggers do not have a set level but inherit it
- * from their neareast ancestor with a set level. This is one of the
- * central features of log4j.
- *
- * @param name The name of the logger to retrieve.
- */
- static
- public
- Logger getLogger(String name) {
- return LogManager.getLogger(name);
- }
-
- /**
- * Shorthand for getLogger(clazz.getName()).
- *
- * @param clazz The name of clazz will be used as the
- * name of the logger to retrieve. See {@link #getLogger(String)}
- * for more detailed information.
- */
- static
- public
- Logger getLogger(Class clazz) {
- return LogManager.getLogger(clazz.getName());
- }
-
-
- /**
- * Return the root logger for the current logger repository.
- *
- * The {@link #getName Logger.getName()} method for the root logger always returns
- * stirng value: "root". However, calling
- * Logger.getLogger("root") does not retrieve the root
- * logger but a logger just under root named "root".
- *
- * In other words, calling this method is the only way to retrieve the
- * root logger.
- */
- public
- static
- Logger getRootLogger() {
- return LogManager.getRootLogger();
- }
-
- /**
- Like {@link #getLogger(String)} except that the type of logger
- instantiated depends on the type returned by the {@link
- LoggerFactory#makeNewLoggerInstance} method of the
- factory parameter.
-
-
This method is intended to be used by sub-classes.
-
- @param name The name of the logger to retrieve.
-
- @param factory A {@link LoggerFactory} implementation that will
- actually create a new Instance.
-
- @since 0.8.5 */
- public
- static
- Logger getLogger(String name, LoggerFactory factory) {
- return LogManager.getLogger(name, factory);
- }
-
- /**
- * Log a message object with the {@link org.apache.log4j.Level#TRACE TRACE} level.
- *
- * @param message the message object to log.
- * @see #debug(Object) for an explanation of the logic applied.
- * @since 1.2.12
- */
- public void trace(Object message) {
- if (repository.isDisabled(Level.TRACE_INT)) {
- return;
- }
-
- if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) {
- forcedLog(FQCN, Level.TRACE, message, null);
- }
- }
-
- /**
- * Log a message object with the TRACE level including the
- * stack trace of the {@link Throwable}t passed as parameter.
- *
- *
- * See {@link #debug(Object)} form for more detailed information.
- *
- *
- * @param message the message object to log.
- * @param t the exception to log, including its stack trace.
- * @since 1.2.12
- */
- public void trace(Object message, Throwable t) {
- if (repository.isDisabled(Level.TRACE_INT)) {
- return;
- }
-
- if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) {
- forcedLog(FQCN, Level.TRACE, message, t);
- }
- }
-
- /**
- * Check whether this category is enabled for the TRACE Level.
- * @since 1.2.12
- *
- * @return boolean - true if this category is enabled for level
- * TRACE, false otherwise.
- */
- public boolean isTraceEnabled() {
- if (repository.isDisabled(Level.TRACE_INT)) {
- return false;
- }
-
- return Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel());
- }
-
-}
diff --git a/java/src/org/apache/log4j/MDC.java b/java/src/org/apache/log4j/MDC.java
deleted file mode 100644
index 5d861af..0000000
--- a/java/src/org/apache/log4j/MDC.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.util.Hashtable;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.ThreadLocalMap;
-
-/**
- The MDC class is similar to the {@link NDC} class except that it is
- based on a map instead of a stack. It provides mapped
- diagnostic contexts. A Mapped Diagnostic Context, or
- MDC in short, is an instrument for distinguishing interleaved log
- output from different sources. Log output is typically interleaved
- when a server handles multiple clients near-simultaneously.
-
- The MDC is managed on a per thread basis. A
- child thread automatically inherits a copy of the mapped
- diagnostic context of its parent.
-
-
The MDC class requires JDK 1.2 or above. Under JDK 1.1 the MDC
- will always return empty values but otherwise will not affect or
- harm your application.
-
- @since 1.2
-
- @author Ceki Gülcü */
-public class MDC {
-
- final static MDC mdc = new MDC();
-
- static final int HT_SIZE = 7;
-
- boolean java1;
-
- Object tlm;
-
- private
- MDC() {
- java1 = Loader.isJava1();
- if(!java1) {
- tlm = new ThreadLocalMap();
- }
- }
-
- /**
- Put a context value (the o parameter) as identified
- with the key parameter into the current thread's
- context map.
-
-
If the current thread does not have a context map it is
- created as a side effect.
-
- */
- static
- public
- void put(String key, Object o) {
- if (mdc != null) {
- mdc.put0(key, o);
- }
- }
-
- /**
- Get the context identified by the key parameter.
-
-
This method has no side effects.
- */
- static
- public
- Object get(String key) {
- if (mdc != null) {
- return mdc.get0(key);
- }
- return null;
- }
-
- /**
- Remove the the context identified by the key
- parameter.
-
- */
- static
- public
- void remove(String key) {
- if (mdc != null) {
- mdc.remove0(key);
- }
- }
-
-
- /**
- * Get the current thread's MDC as a hashtable. This method is
- * intended to be used internally.
- * */
- public static Hashtable getContext() {
- if (mdc != null) {
- return mdc.getContext0();
- } else {
- return null;
- }
- }
-
- /**
- * Remove all values from the MDC.
- * @since 1.2.16
- */
- public static void clear() {
- if (mdc != null) {
- mdc.clear0();
- }
- }
-
-
- private
- void put0(String key, Object o) {
- if(java1 || tlm == null) {
- return;
- } else {
- Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
- if(ht == null) {
- ht = new Hashtable(HT_SIZE);
- ((ThreadLocalMap)tlm).set(ht);
- }
- ht.put(key, o);
- }
- }
-
- private
- Object get0(String key) {
- if(java1 || tlm == null) {
- return null;
- } else {
- Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
- if(ht != null && key != null) {
- return ht.get(key);
- } else {
- return null;
- }
- }
- }
-
- private
- void remove0(String key) {
- if(!java1 && tlm != null) {
- Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
- if(ht != null) {
- ht.remove(key);
- }
- }
- }
-
-
- private
- Hashtable getContext0() {
- if(java1 || tlm == null) {
- return null;
- } else {
- return (Hashtable) ((ThreadLocalMap)tlm).get();
- }
- }
-
- private
- void clear0() {
- if(!java1 && tlm != null) {
- Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
- if(ht != null) {
- ht.clear();
- }
- }
- }
-
-}
diff --git a/java/src/org/apache/log4j/NDC.java b/java/src/org/apache/log4j/NDC.java
deleted file mode 100644
index 2b8b8be..0000000
--- a/java/src/org/apache/log4j/NDC.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Dan Milstein
-// Ray Millard
-
-package org.apache.log4j;
-
-import java.util.Hashtable;
-import java.util.Stack;
-import java.util.Enumeration;
-import java.util.Vector;
-
-import org.apache.log4j.helpers.LogLog;
-
-/**
- The NDC class implements nested diagnostic contexts as
- defined by Neil Harrison in the article "Patterns for Logging
- Diagnostic Messages" part of the book "Pattern Languages of
- Program Design 3" edited by Martin et al.
-
-
A Nested Diagnostic Context, or NDC in short, is an instrument
- to distinguish interleaved log output from different sources. Log
- output is typically interleaved when a server handles multiple
- clients near-simultaneously.
-
-
Interleaved log output can still be meaningful if each log entry
- from different contexts had a distinctive stamp. This is where NDCs
- come into play.
-
-
Note that NDCs are managed on a per thread
- basis. NDC operations such as {@link #push push}, {@link
- #pop}, {@link #clear}, {@link #getDepth} and {@link #setMaxDepth}
- affect the NDC of the current thread only. NDCs of other
- threads remain unaffected.
-
-
For example, a servlet can build a per client request NDC
- consisting the clients host name and other information contained in
- the the request. Cookies are another source of distinctive
- information. To build an NDC one uses the {@link #push push}
- operation. Simply put,
-
-
- - Contexts can be nested.
-
-
- When entering a context, call
NDC.push. As a
- side effect, if there is no nested diagnostic context for the
- current thread, this method will create it.
-
- - When leaving a context, call
NDC.pop.
-
- - When exiting a thread make sure to call {@link #remove
- NDC.remove()}.
-
-
- There is no penalty for forgetting to match each
- push operation with a corresponding pop,
- except the obvious mismatch between the real application context
- and the context set in the NDC.
-
-
If configured to do so, {@link PatternLayout} and {@link
- TTCCLayout} instances automatically retrieve the nested diagnostic
- context for the current thread without any user intervention.
- Hence, even if a servlet is serving multiple clients
- simultaneously, the logs emanating from the same code (belonging to
- the same category) can still be distinguished because each client
- request will have a different NDC tag.
-
-
Heavy duty systems should call the {@link #remove} method when
- leaving the running method of a thread. This ensures that the memory
- used by the thread can be freed by the Java garbage
- collector. There is a mechanism to lazily remove references to dead
- threads. In practice, this means that you can be a little sloppy
- and sometimes forget to call {@link #remove} before exiting a
- thread.
-
-
A thread may inherit the nested diagnostic context of another
- (possibly parent) thread using the {@link #inherit inherit}
- method. A thread may obtain a copy of its NDC with the {@link
- #cloneStack cloneStack} method and pass the reference to any other
- thread, in particular to a child.
-
- @author Ceki Gülcü
- @since 0.7.0
-
-*/
-
-public class NDC {
-
- // The synchronized keyword is not used in this class. This may seem
- // dangerous, especially since the class will be used by
- // multiple-threads. In particular, all threads share the same
- // hashtable (the "ht" variable). This is OK since java hashtables
- // are thread safe. Same goes for Stacks.
-
- // More importantly, when inheriting diagnostic contexts the child
- // thread is handed a clone of the parent's NDC. It follows that
- // each thread has its own NDC (i.e. stack).
-
- static Hashtable ht = new Hashtable();
-
- static int pushCounter = 0; // the number of times push has been called
- // after the latest call to lazyRemove
-
- // The number of times we allow push to be called before we call lazyRemove
- // 5 is a relatively small number. As such, lazyRemove is not called too
- // frequently. We thus avoid the cost of creating an Enumeration too often.
- // The higher this number, the longer is the avarage period for which all
- // logging calls in all threads are blocked.
- static final int REAP_THRESHOLD = 5;
-
- // No instances allowed.
- private NDC() {}
-
- /**
- * Get NDC stack for current thread.
- * @return NDC stack for current thread.
- */
- private static Stack getCurrentStack() {
- if (ht != null) {
- return (Stack) ht.get(Thread.currentThread());
- }
- return null;
- }
-
-
- /**
- Clear any nested diagnostic information if any. This method is
- useful in cases where the same thread can be potentially used
- over and over in different unrelated contexts.
-
-
This method is equivalent to calling the {@link #setMaxDepth}
- method with a zero maxDepth argument.
-
- @since 0.8.4c */
- public
- static
- void clear() {
- Stack stack = getCurrentStack();
- if(stack != null)
- stack.setSize(0);
- }
-
-
- /**
- Clone the diagnostic context for the current thread.
-
-
Internally a diagnostic context is represented as a stack. A
- given thread can supply the stack (i.e. diagnostic context) to a
- child thread so that the child can inherit the parent thread's
- diagnostic context.
-
-
The child thread uses the {@link #inherit inherit} method to
- inherit the parent's diagnostic context.
-
- @return Stack A clone of the current thread's diagnostic context.
-
- */
- public
- static
- Stack cloneStack() {
- Stack stack = getCurrentStack();
- if(stack == null)
- return null;
- else {
- return (Stack) stack.clone();
- }
- }
-
-
- /**
- Inherit the diagnostic context of another thread.
-
-
The parent thread can obtain a reference to its diagnostic
- context using the {@link #cloneStack} method. It should
- communicate this information to its child so that it may inherit
- the parent's diagnostic context.
-
-
The parent's diagnostic context is cloned before being
- inherited. In other words, once inherited, the two diagnostic
- contexts can be managed independently.
-
-
In java, a child thread cannot obtain a reference to its
- parent, unless it is directly handed the reference. Consequently,
- there is no client-transparent way of inheriting diagnostic
- contexts. Do you know any solution to this problem?
-
- @param stack The diagnostic context of the parent thread.
-
- */
- public
- static
- void inherit(Stack stack) {
- if(stack != null)
- ht.put(Thread.currentThread(), stack);
- }
-
-
- /**
- Never use this method directly, use the {@link
- org.apache.log4j.spi.LoggingEvent#getNDC} method instead.
- */
- static
- public
- String get() {
- Stack s = getCurrentStack();
- if(s != null && !s.isEmpty())
- return ((DiagnosticContext) s.peek()).fullMessage;
- else
- return null;
- }
-
- /**
- * Get the current nesting depth of this diagnostic context.
- *
- * @see #setMaxDepth
- * @since 0.7.5
- */
- public
- static
- int getDepth() {
- Stack stack = getCurrentStack();
- if(stack == null)
- return 0;
- else
- return stack.size();
- }
-
- private
- static
- void lazyRemove() {
- if (ht == null) return;
-
- // The synchronization on ht is necessary to prevent JDK 1.2.x from
- // throwing ConcurrentModificationExceptions at us. This sucks BIG-TIME.
- // One solution is to write our own hashtable implementation.
- Vector v;
-
- synchronized(ht) {
- // Avoid calling clean-up too often.
- if(++pushCounter <= REAP_THRESHOLD) {
- return; // We release the lock ASAP.
- } else {
- pushCounter = 0; // OK let's do some work.
- }
-
- int misses = 0;
- v = new Vector();
- Enumeration enumeration = ht.keys();
- // We give up after 4 straigt missses. That is 4 consecutive
- // inspected threads in 'ht' that turn out to be alive.
- // The higher the proportion on dead threads in ht, the higher the
- // chances of removal.
- while(enumeration.hasMoreElements() && (misses <= 4)) {
- Thread t = (Thread) enumeration.nextElement();
- if(t.isAlive()) {
- misses++;
- } else {
- misses = 0;
- v.addElement(t);
- }
- }
- } // synchronized
-
- int size = v.size();
- for(int i = 0; i < size; i++) {
- Thread t = (Thread) v.elementAt(i);
- LogLog.debug("Lazy NDC removal for thread [" + t.getName() + "] ("+
- ht.size() + ").");
- ht.remove(t);
- }
- }
-
- /**
- Clients should call this method before leaving a diagnostic
- context.
-
-
The returned value is the value that was pushed last. If no
- context is available, then the empty string "" is returned.
-
- @return String The innermost diagnostic context.
-
- */
- public
- static
- String pop() {
- Stack stack = getCurrentStack();
- if(stack != null && !stack.isEmpty())
- return ((DiagnosticContext) stack.pop()).message;
- else
- return "";
- }
-
- /**
- Looks at the last diagnostic context at the top of this NDC
- without removing it.
-
-
The returned value is the value that was pushed last. If no
- context is available, then the empty string "" is returned.
-
- @return String The innermost diagnostic context.
-
- */
- public
- static
- String peek() {
- Stack stack = getCurrentStack();
- if(stack != null && !stack.isEmpty())
- return ((DiagnosticContext) stack.peek()).message;
- else
- return "";
- }
-
- /**
- Push new diagnostic context information for the current thread.
-
-
The contents of the message parameter is
- determined solely by the client.
-
- @param message The new diagnostic context information. */
- public
- static
- void push(String message) {
- Stack stack = getCurrentStack();
-
- if(stack == null) {
- DiagnosticContext dc = new DiagnosticContext(message, null);
- stack = new Stack();
- Thread key = Thread.currentThread();
- ht.put(key, stack);
- stack.push(dc);
- } else if (stack.isEmpty()) {
- DiagnosticContext dc = new DiagnosticContext(message, null);
- stack.push(dc);
- } else {
- DiagnosticContext parent = (DiagnosticContext) stack.peek();
- stack.push(new DiagnosticContext(message, parent));
- }
- }
-
- /**
- Remove the diagnostic context for this thread.
-
-
Each thread that created a diagnostic context by calling
- {@link #push} should call this method before exiting. Otherwise,
- the memory used by the thread cannot be reclaimed by the
- VM.
-
-
As this is such an important problem in heavy duty systems and
- because it is difficult to always guarantee that the remove
- method is called before exiting a thread, this method has been
- augmented to lazily remove references to dead threads. In
- practice, this means that you can be a little sloppy and
- occasionally forget to call {@link #remove} before exiting a
- thread. However, you must call remove sometime. If
- you never call it, then your application is sure to running out of
- memory.
-
- */
- static
- public
- void remove() {
- if (ht != null) {
- ht.remove(Thread.currentThread());
-
- // Lazily remove dead-thread references in ht.
- lazyRemove();
- }
- }
-
- /**
- Set maximum depth of this diagnostic context. If the current
- depth is smaller or equal to maxDepth, then no
- action is taken.
-
-
This method is a convenient alternative to multiple {@link
- #pop} calls. Moreover, it is often the case that at the end of
- complex call sequences, the depth of the NDC is
- unpredictable. The setMaxDepth method circumvents
- this problem.
-
-
For example, the combination
-
- void foo() {
- int depth = NDC.getDepth();
-
- ... complex sequence of calls
-
- NDC.setMaxDepth(depth);
- }
-
-
- ensures that between the entry and exit of foo the depth of the
- diagnostic stack is conserved.
-
- @see #getDepth
- @since 0.7.5 */
- static
- public
- void setMaxDepth(int maxDepth) {
- Stack stack = getCurrentStack();
- if(stack != null && maxDepth < stack.size())
- stack.setSize(maxDepth);
- }
-
- // =====================================================================
- private static class DiagnosticContext {
-
- String fullMessage;
- String message;
-
- DiagnosticContext(String message, DiagnosticContext parent) {
- this.message = message;
- if(parent != null) {
- fullMessage = parent.fullMessage + ' ' + message;
- } else {
- fullMessage = message;
- }
- }
- }
-}
-
diff --git a/java/src/org/apache/log4j/PatternLayout.java b/java/src/org/apache/log4j/PatternLayout.java
deleted file mode 100644
index d668a75..0000000
--- a/java/src/org/apache/log4j/PatternLayout.java
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.helpers.PatternParser;
-import org.apache.log4j.helpers.PatternConverter;
-
-
-// Contributors: Nelson Minar
-// Anders Kristensen
-
-/**
-
- A flexible layout configurable with pattern string.
-
- This code is known to have synchronization and other issues
- which are not present in org.apache.log4j.EnhancedPatternLayout.
- EnhancedPatternLayout should be used in preference to PatternLayout.
- EnhancedPatternLayout is distributed in the log4j extras companion.
-
- The goal of this class is to {@link #format format} a {@link
- LoggingEvent} and return the results as a String. The results
- depend on the conversion pattern.
-
-
The conversion pattern is closely related to the conversion
- pattern of the printf function in C. A conversion pattern is
- composed of literal text and format control expressions called
- conversion specifiers.
-
-
You are free to insert any literal text within the conversion
- pattern.
-
-
Each conversion specifier starts with a percent sign (%) and is
- followed by optional format modifiers and a conversion
- character. The conversion character specifies the type of
- data, e.g. category, priority, date, thread name. The format
- modifiers control such things as field width, padding, left and
- right justification. The following is a simple example.
-
-
Let the conversion pattern be "%-5p [%t]: %m%n" and assume
- that the log4j environment was set to use a PatternLayout. Then the
- statements
-
- Category root = Category.getRoot();
- root.debug("Message 1");
- root.warn("Message 2");
-
- would yield the output
-
- DEBUG [main]: Message 1
- WARN [main]: Message 2
-
-
- Note that there is no explicit separator between text and
- conversion specifiers. The pattern parser knows when it has reached
- the end of a conversion specifier when it reads a conversion
- character. In the example above the conversion specifier
- %-5p means the priority of the logging event should be left
- justified to a width of five characters.
-
- The recognized conversion characters are
-
-
-
- | Conversion Character |
- Effect |
-
-
- | c |
-
- Used to output the category of the logging event. The
- category conversion specifier can be optionally followed by
- precision specifier, that is a decimal constant in
- brackets.
-
- If a precision specifier is given, then only the corresponding
- number of right most components of the category name will be
- printed. By default the category name is printed in full.
-
- For example, for the category name "a.b.c" the pattern
- %c{2} will output "b.c".
-
- |
-
-
-
- | C |
-
- Used to output the fully qualified class name of the caller
- issuing the logging request. This conversion specifier
- can be optionally followed by precision specifier, that
- is a decimal constant in brackets.
-
- If a precision specifier is given, then only the corresponding
- number of right most components of the class name will be
- printed. By default the class name is output in fully qualified form.
-
- For example, for the class name "org.apache.xyz.SomeClass", the
- pattern %C{1} will output "SomeClass".
-
- WARNING Generating the caller class information is
- slow. Thus, use should be avoided unless execution speed is
- not an issue.
-
- |
-
-
- | d | Used to output the date of
- the logging event. The date conversion specifier may be
- followed by a date format specifier enclosed between
- braces. For example, %d{HH:mm:ss,SSS} or
- %d{dd MMM yyyy HH:mm:ss,SSS}. If no
- date format specifier is given then ISO8601 format is
- assumed.
-
- The date format specifier admits the same syntax as the
- time pattern string of the {@link
- java.text.SimpleDateFormat}. Although part of the standard
- JDK, the performance of SimpleDateFormat is
- quite poor.
-
- For better results it is recommended to use the log4j date
- formatters. These can be specified using one of the strings
- "ABSOLUTE", "DATE" and "ISO8601" for specifying {@link
- org.apache.log4j.helpers.AbsoluteTimeDateFormat
- AbsoluteTimeDateFormat}, {@link
- org.apache.log4j.helpers.DateTimeDateFormat DateTimeDateFormat}
- and respectively {@link
- org.apache.log4j.helpers.ISO8601DateFormat
- ISO8601DateFormat}. For example, %d{ISO8601} or
- %d{ABSOLUTE}.
-
- These dedicated date formatters perform significantly
- better than {@link java.text.SimpleDateFormat}.
- |
-
-
-
- | F |
-
- Used to output the file name where the logging request was
- issued.
-
- WARNING Generating caller location information is
- extremely slow and should be avoided unless execution speed
- is not an issue.
-
- |
-
-
- | l |
-
- Used to output location information of the caller which generated
- the logging event.
-
- The location information depends on the JVM implementation but
- usually consists of the fully qualified name of the calling
- method followed by the callers source the file name and line
- number between parentheses.
-
- The location information can be very useful. However, its
- generation is extremely slow and should be avoided
- unless execution speed is not an issue.
-
- |
-
-
-
- | L |
-
- Used to output the line number from where the logging request
- was issued.
-
- WARNING Generating caller location information is
- extremely slow and should be avoided unless execution speed
- is not an issue.
-
- |
-
-
-
- | m |
- Used to output the application supplied message associated with
- the logging event. |
-
-
-
- | M |
-
- Used to output the method name where the logging request was
- issued.
-
- WARNING Generating caller location information is
- extremely slow and should be avoided unless execution speed
- is not an issue.
-
- |
-
-
- | n |
-
- Outputs the platform dependent line separator character or
- characters.
-
- This conversion character offers practically the same
- performance as using non-portable line separator strings such as
- "\n", or "\r\n". Thus, it is the preferred way of specifying a
- line separator.
-
-
- |
-
-
- | p |
- Used to output the priority of the logging event. |
-
-
-
-
- | r |
-
- Used to output the number of milliseconds elapsed from the construction
- of the layout until the creation of the logging event. |
-
-
-
-
- | t |
-
- Used to output the name of the thread that generated the
- logging event. |
-
-
-
-
-
- | x |
-
- Used to output the NDC (nested diagnostic context) associated
- with the thread that generated the logging event.
- |
-
-
-
-
- | X |
-
-
-
- Used to output the MDC (mapped diagnostic context) associated
- with the thread that generated the logging event. The X
- conversion character must be followed by the key for the
- map placed between braces, as in %X{clientNumber} where
- clientNumber is the key. The value in the MDC
- corresponding to the key will be output.
-
- See {@link MDC} class for more details.
-
-
- |
-
-
-
-
- | % |
-
- The sequence %% outputs a single percent sign.
- |
-
-
-
-
- By default the relevant information is output as is. However,
- with the aid of format modifiers it is possible to change the
- minimum field width, the maximum field width and justification.
-
-
The optional format modifier is placed between the percent sign
- and the conversion character.
-
-
The first optional format modifier is the left justification
- flag which is just the minus (-) character. Then comes the
- optional minimum field width modifier. This is a decimal
- constant that represents the minimum number of characters to
- output. If the data item requires fewer characters, it is padded on
- either the left or the right until the minimum width is
- reached. The default is to pad on the left (right justify) but you
- can specify right padding with the left justification flag. The
- padding character is space. If the data item is larger than the
- minimum field width, the field is expanded to accommodate the
- data. The value is never truncated.
-
-
This behavior can be changed using the maximum field
- width modifier which is designated by a period followed by a
- decimal constant. If the data item is longer than the maximum
- field, then the extra characters are removed from the
- beginning of the data item and not from the end. For
- example, it the maximum field width is eight and the data item is
- ten characters long, then the first two characters of the data item
- are dropped. This behavior deviates from the printf function in C
- where truncation is done from the end.
-
-
Below are various format modifier examples for the category
- conversion specifier.
-
-
-
- | Format modifier
- | left justify
- | minimum width
- | maximum width
- | comment
-
- |
- | %20c |
- false |
- 20 |
- none |
-
- Left pad with spaces if the category name is less than 20
- characters long.
-
- |
| %-20c | true | 20 | none | Right pad with
- spaces if the category name is less than 20 characters long.
-
- |
- | %.30c |
- NA |
- none |
- 30 |
-
- Truncate from the beginning if the category name is longer than 30
- characters.
-
- |
- | %20.30c |
- false |
- 20 |
- 30 |
-
- Left pad with spaces if the category name is shorter than 20
- characters. However, if category name is longer than 30 characters,
- then truncate from the beginning.
-
- |
- | %-20.30c |
- true |
- 20 |
- 30 |
-
- Right pad with spaces if the category name is shorter than 20
- characters. However, if category name is longer than 30 characters,
- then truncate from the beginning.
-
- |
-
- Below are some examples of conversion patterns.
-
-
-
- - %r [%t] %-5p %c %x - %m%n
-
- This is essentially the TTCC layout.
-
-
- %-6r [%15.15t] %-5p %30.30c %x - %m%n
-
-
- Similar to the TTCC layout except that the relative time is
- right padded if less than 6 digits, thread name is right padded if
- less than 15 characters and truncated if longer and the category
- name is left padded if shorter than 30 characters and truncated if
- longer.
-
-
-
- The above text is largely inspired from Peter A. Darnell and
- Philip E. Margolis' highly recommended book "C -- a Software
- Engineering Approach", ISBN 0-387-97389-3.
-
- @author James P. Cakalic
- @author Ceki Gülcü
-
-
- @since 0.8.2 */
-public class PatternLayout extends Layout {
-
-
- /** Default pattern string for log output. Currently set to the
- string "%m%n" which just prints the application supplied
- message. */
- public final static String DEFAULT_CONVERSION_PATTERN ="%m%n";
-
- /** A conversion pattern equivalent to the TTCCCLayout.
- Current value is %r [%t] %p %c %x - %m%n. */
- public final static String TTCC_CONVERSION_PATTERN
- = "%r [%t] %p %c %x - %m%n";
-
-
- protected final int BUF_SIZE = 256;
- protected final int MAX_CAPACITY = 1024;
-
-
- // output buffer appended to when format() is invoked
- private StringBuffer sbuf = new StringBuffer(BUF_SIZE);
-
- private String pattern;
-
- private PatternConverter head;
-
- /**
- Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN.
-
- The default pattern just produces the application supplied message.
- */
- public PatternLayout() {
- this(DEFAULT_CONVERSION_PATTERN);
- }
-
- /**
- Constructs a PatternLayout using the supplied conversion pattern.
- */
- public PatternLayout(String pattern) {
- this.pattern = pattern;
- head = createPatternParser((pattern == null) ? DEFAULT_CONVERSION_PATTERN :
- pattern).parse();
- }
-
- /**
- Set the ConversionPattern option. This is the string which
- controls formatting and consists of a mix of literal content and
- conversion specifiers.
- */
- public
- void setConversionPattern(String conversionPattern) {
- pattern = conversionPattern;
- head = createPatternParser(conversionPattern).parse();
- }
-
- /**
- Returns the value of the ConversionPattern option.
- */
- public
- String getConversionPattern() {
- return pattern;
- }
-
- /**
- Does not do anything as options become effective
- */
- public
- void activateOptions() {
- // nothing to do.
- }
-
- /**
- The PatternLayout does not handle the throwable contained within
- {@link LoggingEvent LoggingEvents}. Thus, it returns
- true.
-
- @since 0.8.4 */
- public
- boolean ignoresThrowable() {
- return true;
- }
-
- /**
- Returns PatternParser used to parse the conversion string. Subclasses
- may override this to return a subclass of PatternParser which recognize
- custom conversion characters.
-
- @since 0.9.0
- */
- protected PatternParser createPatternParser(String pattern) {
- return new PatternParser(pattern);
- }
-
-
- /**
- Produces a formatted string as specified by the conversion pattern.
- */
- public String format(LoggingEvent event) {
- // Reset working stringbuffer
- if(sbuf.capacity() > MAX_CAPACITY) {
- sbuf = new StringBuffer(BUF_SIZE);
- } else {
- sbuf.setLength(0);
- }
-
- PatternConverter c = head;
-
- while(c != null) {
- c.format(sbuf, event);
- c = c.next;
- }
- return sbuf.toString();
- }
-}
diff --git a/java/src/org/apache/log4j/Priority.java b/java/src/org/apache/log4j/Priority.java
deleted file mode 100644
index 53e94b4..0000000
--- a/java/src/org/apache/log4j/Priority.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Kitching Simon
-
-package org.apache.log4j;
-
-/**
- Refrain from using this class directly, use
- the {@link Level} class instead.
-
- @author Ceki Gülcü */
-public class Priority {
-
- transient int level;
- transient String levelStr;
- transient int syslogEquivalent;
-
- public final static int OFF_INT = Integer.MAX_VALUE;
- public final static int FATAL_INT = 50000;
- public final static int ERROR_INT = 40000;
- public final static int WARN_INT = 30000;
- public final static int INFO_INT = 20000;
- public final static int DEBUG_INT = 10000;
- //public final static int FINE_INT = DEBUG_INT;
- public final static int ALL_INT = Integer.MIN_VALUE;
-
- /**
- * @deprecated Use {@link Level#FATAL} instead.
- */
- final static public Priority FATAL = new Level(FATAL_INT, "FATAL", 0);
-
- /**
- * @deprecated Use {@link Level#ERROR} instead.
- */
- final static public Priority ERROR = new Level(ERROR_INT, "ERROR", 3);
-
- /**
- * @deprecated Use {@link Level#WARN} instead.
- */
- final static public Priority WARN = new Level(WARN_INT, "WARN", 4);
-
- /**
- * @deprecated Use {@link Level#INFO} instead.
- */
- final static public Priority INFO = new Level(INFO_INT, "INFO", 6);
-
- /**
- * @deprecated Use {@link Level#DEBUG} instead.
- */
- final static public Priority DEBUG = new Level(DEBUG_INT, "DEBUG", 7);
-
-
- /**
- * Default constructor for deserialization.
- */
- protected Priority() {
- level = DEBUG_INT;
- levelStr = "DEBUG";
- syslogEquivalent = 7;
- }
-
- /**
- Instantiate a level object.
- */
- protected
- Priority(int level, String levelStr, int syslogEquivalent) {
- this.level = level;
- this.levelStr = levelStr;
- this.syslogEquivalent = syslogEquivalent;
- }
-
- /**
- Two priorities are equal if their level fields are equal.
- @since 1.2
- */
- public
- boolean equals(Object o) {
- if(o instanceof Priority) {
- Priority r = (Priority) o;
- return (this.level == r.level);
- } else {
- return false;
- }
- }
-
- /**
- Return the syslog equivalent of this priority as an integer.
- */
- public
- final
- int getSyslogEquivalent() {
- return syslogEquivalent;
- }
-
-
-
- /**
- Returns true if this level has a higher or equal
- level than the level passed as argument, false
- otherwise.
-
- You should think twice before overriding the default
- implementation of isGreaterOrEqual method.
-
- */
- public
- boolean isGreaterOrEqual(Priority r) {
- return level >= r.level;
- }
-
- /**
- Return all possible priorities as an array of Level objects in
- descending order.
-
- @deprecated This method will be removed with no replacement.
- */
- public
- static
- Priority[] getAllPossiblePriorities() {
- return new Priority[] {Priority.FATAL, Priority.ERROR, Level.WARN,
- Priority.INFO, Priority.DEBUG};
- }
-
-
- /**
- Returns the string representation of this priority.
- */
- final
- public
- String toString() {
- return levelStr;
- }
-
- /**
- Returns the integer representation of this level.
- */
- public
- final
- int toInt() {
- return level;
- }
-
- /**
- * @deprecated Please use the {@link Level#toLevel(String)} method instead.
- */
- public
- static
- Priority toPriority(String sArg) {
- return Level.toLevel(sArg);
- }
-
- /**
- * @deprecated Please use the {@link Level#toLevel(int)} method instead.
- */
- public
- static
- Priority toPriority(int val) {
- return toPriority(val, Priority.DEBUG);
- }
-
- /**
- * @deprecated Please use the {@link Level#toLevel(int, Level)} method instead.
- */
- public
- static
- Priority toPriority(int val, Priority defaultPriority) {
- return Level.toLevel(val, (Level) defaultPriority);
- }
-
- /**
- * @deprecated Please use the {@link Level#toLevel(String, Level)} method instead.
- */
- public
- static
- Priority toPriority(String sArg, Priority defaultPriority) {
- return Level.toLevel(sArg, (Level) defaultPriority);
- }
-}
diff --git a/java/src/org/apache/log4j/PropertyConfigurator.java b/java/src/org/apache/log4j/PropertyConfigurator.java
deleted file mode 100644
index 5672344..0000000
--- a/java/src/org/apache/log4j/PropertyConfigurator.java
+++ /dev/null
@@ -1,963 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-
-// Contibutors: "Luke Blanshard"
-// "Mark DONSZELMANN"
-// Anders Kristensen
-
-package org.apache.log4j;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.net.URLConnection;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.apache.log4j.config.PropertySetter;
-import org.apache.log4j.helpers.FileWatchdog;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.or.RendererMap;
-import org.apache.log4j.spi.Configurator;
-import org.apache.log4j.spi.Filter;
-import org.apache.log4j.spi.LoggerFactory;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.OptionHandler;
-import org.apache.log4j.spi.RendererSupport;
-import org.apache.log4j.spi.ThrowableRenderer;
-import org.apache.log4j.spi.ThrowableRendererSupport;
-import org.apache.log4j.spi.ErrorHandler;
-
-/**
- Allows the configuration of log4j from an external file. See
- {@link #doConfigure(String, LoggerRepository)} for the
- expected format.
-
- It is sometimes useful to see how log4j is reading configuration
- files. You can enable log4j internal logging by defining the
- log4j.debug variable.
-
-
As of log4j version 0.8.5, at class initialization time class,
- the file log4j.properties will be searched from the search
- path used to load classes. If the file can be found, then it will
- be fed to the {@link PropertyConfigurator#configure(java.net.URL)}
- method.
-
-
The PropertyConfigurator does not handle the
- advanced configuration features supported by the {@link
- org.apache.log4j.xml.DOMConfigurator DOMConfigurator} such as
- support custom {@link org.apache.log4j.spi.ErrorHandler ErrorHandlers},
- nested appenders such as the {@link org.apache.log4j.AsyncAppender
- AsyncAppender}, etc.
-
-
All option values admit variable substitution. The
- syntax of variable substitution is similar to that of Unix
- shells. The string between an opening "${" and
- closing "}" is interpreted as a key. The value of
- the substituted variable can be defined as a system property or in
- the configuration file itself. The value of the key is first
- searched in the system properties, and if not found there, it is
- then searched in the configuration file being parsed. The
- corresponding value replaces the ${variableName} sequence. For
- example, if java.home system property is set to
- /home/xyz, then every occurrence of the sequence
- ${java.home} will be interpreted as
- /home/xyz.
-
-
- @author Ceki Gülcü
- @author Anders Kristensen
- @since 0.8.1 */
-public class PropertyConfigurator implements Configurator {
-
- /**
- Used internally to keep track of configured appenders.
- */
- protected Hashtable registry = new Hashtable(11);
- private LoggerRepository repository;
- protected LoggerFactory loggerFactory = new DefaultCategoryFactory();
-
- static final String CATEGORY_PREFIX = "log4j.category.";
- static final String LOGGER_PREFIX = "log4j.logger.";
- static final String FACTORY_PREFIX = "log4j.factory";
- static final String ADDITIVITY_PREFIX = "log4j.additivity.";
- static final String ROOT_CATEGORY_PREFIX = "log4j.rootCategory";
- static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
- static final String APPENDER_PREFIX = "log4j.appender.";
- static final String RENDERER_PREFIX = "log4j.renderer.";
- static final String THRESHOLD_PREFIX = "log4j.threshold";
- private static final String THROWABLE_RENDERER_PREFIX = "log4j.throwableRenderer";
- private static final String LOGGER_REF = "logger-ref";
- private static final String ROOT_REF = "root-ref";
- private static final String APPENDER_REF_TAG = "appender-ref";
-
-
- /** Key for specifying the {@link org.apache.log4j.spi.LoggerFactory
- LoggerFactory}. Currently set to "log4j.loggerFactory". */
- public static final String LOGGER_FACTORY_KEY = "log4j.loggerFactory";
-
- /**
- * If property set to true, then hierarchy will be reset before configuration.
- */
- private static final String RESET_KEY = "log4j.reset";
-
- static final private String INTERNAL_ROOT_NAME = "root";
-
- /**
- Read configuration from a file. The existing configuration is
- not cleared nor reset. If you require a different behavior,
- then call {@link LogManager#resetConfiguration
- resetConfiguration} method before calling
- doConfigure.
-
-
The configuration file consists of statements in the format
- key=value. The syntax of different configuration
- elements are discussed below.
-
-
Repository-wide threshold
-
- The repository-wide threshold filters logging requests by level
- regardless of logger. The syntax is:
-
-
- log4j.threshold=[level]
-
-
- The level value can consist of the string values OFF, FATAL,
- ERROR, WARN, INFO, DEBUG, ALL or a custom level value. A
- custom level value can be specified in the form
- level#classname. By default the repository-wide threshold is set
- to the lowest possible value, namely the level ALL.
-
-
-
- Appender configuration
-
- Appender configuration syntax is:
-
- # For appender named appenderName, set its class.
- # Note: The appender name can contain dots.
- log4j.appender.appenderName=fully.qualified.name.of.appender.class
-
- # Set appender specific options.
- log4j.appender.appenderName.option1=value1
- ...
- log4j.appender.appenderName.optionN=valueN
-
-
- For each named appender you can configure its {@link Layout}. The
- syntax for configuring an appender's layout is:
-
- log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
- log4j.appender.appenderName.layout.option1=value1
- ....
- log4j.appender.appenderName.layout.optionN=valueN
-
-
- The syntax for adding {@link Filter}s to an appender is:
-
- log4j.appender.appenderName.filter.ID=fully.qualified.name.of.filter.class
- log4j.appender.appenderName.filter.ID.option1=value1
- ...
- log4j.appender.appenderName.filter.ID.optionN=valueN
-
- The first line defines the class name of the filter identified by ID;
- subsequent lines with the same ID specify filter option - value
- paris. Multiple filters are added to the appender in the lexicographic
- order of IDs.
-
- The syntax for adding an {@link ErrorHandler} to an appender is:
-
- log4j.appender.appenderName.errorhandler=fully.qualified.name.of.filter.class
- log4j.appender.appenderName.errorhandler.root-ref={true|false}
- log4j.appender.appenderName.errorhandler.logger-ref=loggerName
- log4j.appender.appenderName.errorhandler.appender-ref=appenderName
- log4j.appender.appenderName.errorhandler.option1=value1
- ...
- log4j.appender.appenderName.errorhandler.optionN=valueN
-
-
- Configuring loggers
-
- The syntax for configuring the root logger is:
-
- log4j.rootLogger=[level], appenderName, appenderName, ...
-
-
- This syntax means that an optional level can be
- supplied followed by appender names separated by commas.
-
-
The level value can consist of the string values OFF, FATAL,
- ERROR, WARN, INFO, DEBUG, ALL or a custom level value. A
- custom level value can be specified in the form
- level#classname.
-
-
If a level value is specified, then the root level is set
- to the corresponding level. If no level value is specified,
- then the root level remains untouched.
-
-
The root logger can be assigned multiple appenders.
-
-
Each appenderName (separated by commas) will be added to
- the root logger. The named appender is defined using the
- appender syntax defined above.
-
-
For non-root categories the syntax is almost the same:
-
- log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
-
-
- The meaning of the optional level value is discussed above
- in relation to the root logger. In addition however, the value
- INHERITED can be specified meaning that the named logger should
- inherit its level from the logger hierarchy.
-
-
If no level value is supplied, then the level of the
- named logger remains untouched.
-
-
By default categories inherit their level from the
- hierarchy. However, if you set the level of a logger and later
- decide that that logger should inherit its level, then you should
- specify INHERITED as the value for the level value. NULL is a
- synonym for INHERITED.
-
-
Similar to the root logger syntax, each appenderName
- (separated by commas) will be attached to the named logger.
-
-
See the appender
- additivity rule in the user manual for the meaning of the
- additivity flag.
-
-
ObjectRenderers
-
- You can customize the way message objects of a given type are
- converted to String before being logged. This is done by
- specifying an {@link org.apache.log4j.or.ObjectRenderer ObjectRenderer}
- for the object type would like to customize.
-
- The syntax is:
-
-
- log4j.renderer.fully.qualified.name.of.rendered.class=fully.qualified.name.of.rendering.class
-
-
- As in,
-
- log4j.renderer.my.Fruit=my.FruitRenderer
-
-
- ThrowableRenderer
-
- You can customize the way an instance of Throwable is
- converted to String before being logged. This is done by
- specifying an {@link org.apache.log4j.spi.ThrowableRenderer ThrowableRenderer}.
-
- The syntax is:
-
-
- log4j.throwableRenderer=fully.qualified.name.of.rendering.class
- log4j.throwableRenderer.paramName=paramValue
-
-
- As in,
-
- log4j.throwableRenderer=org.apache.log4j.EnhancedThrowableRenderer
-
-
- Logger Factories
-
- The usage of custom logger factories is discouraged and no longer
- documented.
-
- Resetting Hierarchy
-
- The hierarchy will be reset before configuration when
- log4j.reset=true is present in the properties file.
-
- Example
-
- An example configuration is given below. Other configuration
- file examples are given in the examples folder.
-
-
-
- # Set options for appender named "A1".
- # Appender "A1" will be a SyslogAppender
- log4j.appender.A1=org.apache.log4j.net.SyslogAppender
-
- # The syslog daemon resides on www.abc.net
- log4j.appender.A1.SyslogHost=www.abc.net
-
- # A1's layout is a PatternLayout, using the conversion pattern
- # %r %-5p %c{2} %M.%L %x - %m\n. Thus, the log output will
- # include # the relative time since the start of the application in
- # milliseconds, followed by the level of the log request,
- # followed by the two rightmost components of the logger name,
- # followed by the callers method name, followed by the line number,
- # the nested disgnostic context and finally the message itself.
- # Refer to the documentation of {@link PatternLayout} for further information
- # on the syntax of the ConversionPattern key.
- log4j.appender.A1.layout=org.apache.log4j.PatternLayout
- log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %c{2} %M.%L %x - %m\n
-
- # Set options for appender named "A2"
- # A2 should be a RollingFileAppender, with maximum file size of 10 MB
- # using at most one backup file. A2's layout is TTCC, using the
- # ISO8061 date format with context printing enabled.
- log4j.appender.A2=org.apache.log4j.RollingFileAppender
- log4j.appender.A2.MaxFileSize=10MB
- log4j.appender.A2.MaxBackupIndex=1
- log4j.appender.A2.layout=org.apache.log4j.TTCCLayout
- log4j.appender.A2.layout.ContextPrinting=enabled
- log4j.appender.A2.layout.DateFormat=ISO8601
-
- # Root logger set to DEBUG using the A2 appender defined above.
- log4j.rootLogger=DEBUG, A2
-
- # Logger definitions:
- # The SECURITY logger inherits is level from root. However, it's output
- # will go to A1 appender defined above. It's additivity is non-cumulative.
- log4j.logger.SECURITY=INHERIT, A1
- log4j.additivity.SECURITY=false
-
- # Only warnings or above will be logged for the logger "SECURITY.access".
- # Output will go to A1.
- log4j.logger.SECURITY.access=WARN
-
-
- # The logger "class.of.the.day" inherits its level from the
- # logger hierarchy. Output will go to the appender's of the root
- # logger, A2 in this case.
- log4j.logger.class.of.the.day=INHERIT
-
-
- Refer to the setOption method in each Appender and
- Layout for class specific options.
-
-
Use the # or ! characters at the
- beginning of a line for comments.
-
-
- @param configFileName The name of the configuration file where the
- configuration information is stored.
-
- */
- public
- void doConfigure(String configFileName, LoggerRepository hierarchy) {
- Properties props = new Properties();
- FileInputStream istream = null;
- try {
- istream = new FileInputStream(configFileName);
- props.load(istream);
- istream.close();
- }
- catch (Exception e) {
- if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not read configuration file ["+configFileName+"].", e);
- LogLog.error("Ignoring configuration file [" + configFileName+"].");
- return;
- } finally {
- if(istream != null) {
- try {
- istream.close();
- } catch(InterruptedIOException ignore) {
- Thread.currentThread().interrupt();
- } catch(Throwable ignore) {
- }
-
- }
- }
- // If we reach here, then the config file is alright.
- doConfigure(props, hierarchy);
- }
-
- /**
- */
- static
- public
- void configure(String configFilename) {
- new PropertyConfigurator().doConfigure(configFilename,
- LogManager.getLoggerRepository());
- }
-
- /**
- Read configuration options from url configURL.
-
- @since 0.8.2
- */
- public
- static
- void configure(java.net.URL configURL) {
- new PropertyConfigurator().doConfigure(configURL,
- LogManager.getLoggerRepository());
- }
-
-
- /**
- Read configuration options from properties.
-
- See {@link #doConfigure(String, LoggerRepository)} for the expected format.
- */
- static
- public
- void configure(Properties properties) {
- new PropertyConfigurator().doConfigure(properties,
- LogManager.getLoggerRepository());
- }
-
- /**
- Like {@link #configureAndWatch(String, long)} except that the
- default delay as defined by {@link FileWatchdog#DEFAULT_DELAY} is
- used.
-
- @param configFilename A file in key=value format.
-
- */
- static
- public
- void configureAndWatch(String configFilename) {
- configureAndWatch(configFilename, FileWatchdog.DEFAULT_DELAY);
- }
-
-
- /**
- Read the configuration file configFilename if it
- exists. Moreover, a thread will be created that will periodically
- check if configFilename has been created or
- modified. The period is determined by the delay
- argument. If a change or file creation is detected, then
- configFilename is read to configure log4j.
-
- @param configFilename A file in key=value format.
- @param delay The delay in milliseconds to wait between each check.
- */
- static
- public
- void configureAndWatch(String configFilename, long delay) {
- PropertyWatchdog pdog = new PropertyWatchdog(configFilename);
- pdog.setDelay(delay);
- pdog.start();
- }
-
-
- /**
- Read configuration options from properties.
-
- See {@link #doConfigure(String, LoggerRepository)} for the expected format.
- */
- public
- void doConfigure(Properties properties, LoggerRepository hierarchy) {
- repository = hierarchy;
- String value = properties.getProperty(LogLog.DEBUG_KEY);
- if(value == null) {
- value = properties.getProperty("log4j.configDebug");
- if(value != null)
- LogLog.warn("[log4j.configDebug] is deprecated. Use [log4j.debug] instead.");
- }
-
- if(value != null) {
- LogLog.setInternalDebugging(OptionConverter.toBoolean(value, true));
- }
-
- //
- // if log4j.reset=true then
- // reset hierarchy
- String reset = properties.getProperty(RESET_KEY);
- if (reset != null && OptionConverter.toBoolean(reset, false)) {
- hierarchy.resetConfiguration();
- }
-
- String thresholdStr = OptionConverter.findAndSubst(THRESHOLD_PREFIX,
- properties);
- if(thresholdStr != null) {
- hierarchy.setThreshold(OptionConverter.toLevel(thresholdStr,
- (Level) Level.ALL));
- LogLog.debug("Hierarchy threshold set to ["+hierarchy.getThreshold()+"].");
- }
-
- configureRootCategory(properties, hierarchy);
- configureLoggerFactory(properties);
- parseCatsAndRenderers(properties, hierarchy);
-
- LogLog.debug("Finished configuring.");
- // We don't want to hold references to appenders preventing their
- // garbage collection.
- registry.clear();
- }
-
- /**
- Read configuration options from url configURL.
- */
- public
- void doConfigure(java.net.URL configURL, LoggerRepository hierarchy) {
- Properties props = new Properties();
- LogLog.debug("Reading configuration from URL " + configURL);
- InputStream istream = null;
- URLConnection uConn = null;
- try {
- uConn = configURL.openConnection();
- uConn.setUseCaches(false);
- istream = uConn.getInputStream();
- props.load(istream);
- }
- catch (Exception e) {
- if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not read configuration file from URL [" + configURL
- + "].", e);
- LogLog.error("Ignoring configuration file [" + configURL +"].");
- return;
- }
- finally {
- if (istream != null) {
- try {
- istream.close();
- } catch(InterruptedIOException ignore) {
- Thread.currentThread().interrupt();
- } catch(IOException ignore) {
- } catch(RuntimeException ignore) {
- }
- }
- }
- doConfigure(props, hierarchy);
- }
-
-
- // --------------------------------------------------------------------------
- // Internal stuff
- // --------------------------------------------------------------------------
-
- /**
- Check the provided Properties object for a
- {@link org.apache.log4j.spi.LoggerFactory LoggerFactory}
- entry specified by {@link #LOGGER_FACTORY_KEY}. If such an entry
- exists, an attempt is made to create an instance using the default
- constructor. This instance is used for subsequent Category creations
- within this configurator.
-
- @see #parseCatsAndRenderers
- */
- protected void configureLoggerFactory(Properties props) {
- String factoryClassName = OptionConverter.findAndSubst(LOGGER_FACTORY_KEY,
- props);
- if(factoryClassName != null) {
- LogLog.debug("Setting category factory to ["+factoryClassName+"].");
- loggerFactory = (LoggerFactory)
- OptionConverter.instantiateByClassName(factoryClassName,
- LoggerFactory.class,
- loggerFactory);
- PropertySetter.setProperties(loggerFactory, props, FACTORY_PREFIX + ".");
- }
- }
-
- /*
- void configureOptionHandler(OptionHandler oh, String prefix,
- Properties props) {
- String[] options = oh.getOptionStrings();
- if(options == null)
- return;
-
- String value;
- for(int i = 0; i < options.length; i++) {
- value = OptionConverter.findAndSubst(prefix + options[i], props);
- LogLog.debug(
- "Option " + options[i] + "=[" + (value == null? "N/A" : value)+"].");
- // Some option handlers assume that null value are not passed to them.
- // So don't remove this check
- if(value != null) {
- oh.setOption(options[i], value);
- }
- }
- oh.activateOptions();
- }
- */
-
-
- void configureRootCategory(Properties props, LoggerRepository hierarchy) {
- String effectiveFrefix = ROOT_LOGGER_PREFIX;
- String value = OptionConverter.findAndSubst(ROOT_LOGGER_PREFIX, props);
-
- if(value == null) {
- value = OptionConverter.findAndSubst(ROOT_CATEGORY_PREFIX, props);
- effectiveFrefix = ROOT_CATEGORY_PREFIX;
- }
-
- if(value == null)
- LogLog.debug("Could not find root logger information. Is this OK?");
- else {
- Logger root = hierarchy.getRootLogger();
- synchronized(root) {
- parseCategory(props, root, effectiveFrefix, INTERNAL_ROOT_NAME, value);
- }
- }
- }
-
-
- /**
- Parse non-root elements, such non-root categories and renderers.
- */
- protected
- void parseCatsAndRenderers(Properties props, LoggerRepository hierarchy) {
- Enumeration enumeration = props.propertyNames();
- while(enumeration.hasMoreElements()) {
- String key = (String) enumeration.nextElement();
- if(key.startsWith(CATEGORY_PREFIX) || key.startsWith(LOGGER_PREFIX)) {
- String loggerName = null;
- if(key.startsWith(CATEGORY_PREFIX)) {
- loggerName = key.substring(CATEGORY_PREFIX.length());
- } else if(key.startsWith(LOGGER_PREFIX)) {
- loggerName = key.substring(LOGGER_PREFIX.length());
- }
- String value = OptionConverter.findAndSubst(key, props);
- Logger logger = hierarchy.getLogger(loggerName, loggerFactory);
- synchronized(logger) {
- parseCategory(props, logger, key, loggerName, value);
- parseAdditivityForLogger(props, logger, loggerName);
- }
- } else if(key.startsWith(RENDERER_PREFIX)) {
- String renderedClass = key.substring(RENDERER_PREFIX.length());
- String renderingClass = OptionConverter.findAndSubst(key, props);
- if(hierarchy instanceof RendererSupport) {
- RendererMap.addRenderer((RendererSupport) hierarchy, renderedClass,
- renderingClass);
- }
- } else if (key.equals(THROWABLE_RENDERER_PREFIX)) {
- if (hierarchy instanceof ThrowableRendererSupport) {
- ThrowableRenderer tr = (ThrowableRenderer)
- OptionConverter.instantiateByKey(props,
- THROWABLE_RENDERER_PREFIX,
- org.apache.log4j.spi.ThrowableRenderer.class,
- null);
- if(tr == null) {
- LogLog.error(
- "Could not instantiate throwableRenderer.");
- } else {
- PropertySetter setter = new PropertySetter(tr);
- setter.setProperties(props, THROWABLE_RENDERER_PREFIX + ".");
- ((ThrowableRendererSupport) hierarchy).setThrowableRenderer(tr);
-
- }
- }
- }
- }
- }
-
- /**
- Parse the additivity option for a non-root category.
- */
- void parseAdditivityForLogger(Properties props, Logger cat,
- String loggerName) {
- String value = OptionConverter.findAndSubst(ADDITIVITY_PREFIX + loggerName,
- props);
- LogLog.debug("Handling "+ADDITIVITY_PREFIX + loggerName+"=["+value+"]");
- // touch additivity only if necessary
- if((value != null) && (!value.equals(""))) {
- boolean additivity = OptionConverter.toBoolean(value, true);
- LogLog.debug("Setting additivity for \""+loggerName+"\" to "+
- additivity);
- cat.setAdditivity(additivity);
- }
- }
-
- /**
- This method must work for the root category as well.
- */
- void parseCategory(Properties props, Logger logger, String optionKey,
- String loggerName, String value) {
-
- LogLog.debug("Parsing for [" +loggerName +"] with value=[" + value+"].");
- // We must skip over ',' but not white space
- StringTokenizer st = new StringTokenizer(value, ",");
-
- // If value is not in the form ", appender.." or "", then we should set
- // the level of the loggeregory.
-
- if(!(value.startsWith(",") || value.equals(""))) {
-
- // just to be on the safe side...
- if(!st.hasMoreTokens())
- return;
-
- String levelStr = st.nextToken();
- LogLog.debug("Level token is [" + levelStr + "].");
-
- // If the level value is inherited, set category level value to
- // null. We also check that the user has not specified inherited for the
- // root category.
- if(INHERITED.equalsIgnoreCase(levelStr) ||
- NULL.equalsIgnoreCase(levelStr)) {
- if(loggerName.equals(INTERNAL_ROOT_NAME)) {
- LogLog.warn("The root logger cannot be set to null.");
- } else {
- logger.setLevel(null);
- }
- } else {
- logger.setLevel(OptionConverter.toLevel(levelStr, (Level) Level.DEBUG));
- }
- LogLog.debug("Category " + loggerName + " set to " + logger.getLevel());
- }
-
- // Begin by removing all existing appenders.
- logger.removeAllAppenders();
-
- Appender appender;
- String appenderName;
- while(st.hasMoreTokens()) {
- appenderName = st.nextToken().trim();
- if(appenderName == null || appenderName.equals(","))
- continue;
- LogLog.debug("Parsing appender named \"" + appenderName +"\".");
- appender = parseAppender(props, appenderName);
- if(appender != null) {
- logger.addAppender(appender);
- }
- }
- }
-
- Appender parseAppender(Properties props, String appenderName) {
- Appender appender = registryGet(appenderName);
- if((appender != null)) {
- LogLog.debug("Appender \"" + appenderName + "\" was already parsed.");
- return appender;
- }
- // Appender was not previously initialized.
- String prefix = APPENDER_PREFIX + appenderName;
- String layoutPrefix = prefix + ".layout";
-
- appender = (Appender) OptionConverter.instantiateByKey(props, prefix,
- org.apache.log4j.Appender.class,
- null);
- if(appender == null) {
- LogLog.error(
- "Could not instantiate appender named \"" + appenderName+"\".");
- return null;
- }
- appender.setName(appenderName);
-
- if(appender instanceof OptionHandler) {
- if(appender.requiresLayout()) {
- Layout layout = (Layout) OptionConverter.instantiateByKey(props,
- layoutPrefix,
- Layout.class,
- null);
- if(layout != null) {
- appender.setLayout(layout);
- LogLog.debug("Parsing layout options for \"" + appenderName +"\".");
- //configureOptionHandler(layout, layoutPrefix + ".", props);
- PropertySetter.setProperties(layout, props, layoutPrefix + ".");
- LogLog.debug("End of parsing for \"" + appenderName +"\".");
- }
- }
- final String errorHandlerPrefix = prefix + ".errorhandler";
- String errorHandlerClass = OptionConverter.findAndSubst(errorHandlerPrefix, props);
- if (errorHandlerClass != null) {
- ErrorHandler eh = (ErrorHandler) OptionConverter.instantiateByKey(props,
- errorHandlerPrefix,
- ErrorHandler.class,
- null);
- if (eh != null) {
- appender.setErrorHandler(eh);
- LogLog.debug("Parsing errorhandler options for \"" + appenderName +"\".");
- parseErrorHandler(eh, errorHandlerPrefix, props, repository);
- final Properties edited = new Properties();
- final String[] keys = new String[] {
- errorHandlerPrefix + "." + ROOT_REF,
- errorHandlerPrefix + "." + LOGGER_REF,
- errorHandlerPrefix + "." + APPENDER_REF_TAG
- };
- for(Iterator iter = props.entrySet().iterator();iter.hasNext();) {
- Map.Entry entry = (Map.Entry) iter.next();
- int i = 0;
- for(; i < keys.length; i++) {
- if(keys[i].equals(entry.getKey())) break;
- }
- if (i == keys.length) {
- edited.put(entry.getKey(), entry.getValue());
- }
- }
- PropertySetter.setProperties(eh, edited, errorHandlerPrefix + ".");
- LogLog.debug("End of errorhandler parsing for \"" + appenderName +"\".");
- }
-
- }
- //configureOptionHandler((OptionHandler) appender, prefix + ".", props);
- PropertySetter.setProperties(appender, props, prefix + ".");
- LogLog.debug("Parsed \"" + appenderName +"\" options.");
- }
- parseAppenderFilters(props, appenderName, appender);
- registryPut(appender);
- return appender;
- }
-
- private void parseErrorHandler(
- final ErrorHandler eh,
- final String errorHandlerPrefix,
- final Properties props,
- final LoggerRepository hierarchy) {
- boolean rootRef = OptionConverter.toBoolean(
- OptionConverter.findAndSubst(errorHandlerPrefix + ROOT_REF, props), false);
- if (rootRef) {
- eh.setLogger(hierarchy.getRootLogger());
- }
- String loggerName = OptionConverter.findAndSubst(errorHandlerPrefix + LOGGER_REF , props);
- if (loggerName != null) {
- Logger logger = (loggerFactory == null) ? hierarchy.getLogger(loggerName)
- : hierarchy.getLogger(loggerName, loggerFactory);
- eh.setLogger(logger);
- }
- String appenderName = OptionConverter.findAndSubst(errorHandlerPrefix + APPENDER_REF_TAG, props);
- if (appenderName != null) {
- Appender backup = parseAppender(props, appenderName);
- if (backup != null) {
- eh.setBackupAppender(backup);
- }
- }
- }
-
-
- void parseAppenderFilters(Properties props, String appenderName, Appender appender) {
- // extract filters and filter options from props into a hashtable mapping
- // the property name defining the filter class to a list of pre-parsed
- // name-value pairs associated to that filter
- final String filterPrefix = APPENDER_PREFIX + appenderName + ".filter.";
- int fIdx = filterPrefix.length();
- Hashtable filters = new Hashtable();
- Enumeration e = props.keys();
- String name = "";
- while (e.hasMoreElements()) {
- String key = (String) e.nextElement();
- if (key.startsWith(filterPrefix)) {
- int dotIdx = key.indexOf('.', fIdx);
- String filterKey = key;
- if (dotIdx != -1) {
- filterKey = key.substring(0, dotIdx);
- name = key.substring(dotIdx+1);
- }
- Vector filterOpts = (Vector) filters.get(filterKey);
- if (filterOpts == null) {
- filterOpts = new Vector();
- filters.put(filterKey, filterOpts);
- }
- if (dotIdx != -1) {
- String value = OptionConverter.findAndSubst(key, props);
- filterOpts.add(new NameValue(name, value));
- }
- }
- }
-
- // sort filters by IDs, insantiate filters, set filter options,
- // add filters to the appender
- Enumeration g = new SortedKeyEnumeration(filters);
- while (g.hasMoreElements()) {
- String key = (String) g.nextElement();
- String clazz = props.getProperty(key);
- if (clazz != null) {
- LogLog.debug("Filter key: ["+key+"] class: ["+props.getProperty(key) +"] props: "+filters.get(key));
- Filter filter = (Filter) OptionConverter.instantiateByClassName(clazz, Filter.class, null);
- if (filter != null) {
- PropertySetter propSetter = new PropertySetter(filter);
- Vector v = (Vector)filters.get(key);
- Enumeration filterProps = v.elements();
- while (filterProps.hasMoreElements()) {
- NameValue kv = (NameValue)filterProps.nextElement();
- propSetter.setProperty(kv.key, kv.value);
- }
- propSetter.activate();
- LogLog.debug("Adding filter of type ["+filter.getClass()
- +"] to appender named ["+appender.getName()+"].");
- appender.addFilter(filter);
- }
- } else {
- LogLog.warn("Missing class definition for filter: ["+key+"]");
- }
- }
- }
-
-
- void registryPut(Appender appender) {
- registry.put(appender.getName(), appender);
- }
-
- Appender registryGet(String name) {
- return (Appender) registry.get(name);
- }
-}
-
-class PropertyWatchdog extends FileWatchdog {
-
- PropertyWatchdog(String filename) {
- super(filename);
- }
-
- /**
- Call {@link PropertyConfigurator#configure(String)} with the
- filename to reconfigure log4j. */
- public
- void doOnChange() {
- new PropertyConfigurator().doConfigure(filename,
- LogManager.getLoggerRepository());
- }
-}
-
-class NameValue {
- String key, value;
- public NameValue(String key, String value) {
- this.key = key;
- this.value = value;
- }
- public String toString() {
- return key + "=" + value;
- }
-}
-
-class SortedKeyEnumeration implements Enumeration {
-
- private Enumeration e;
-
- public SortedKeyEnumeration(Hashtable ht) {
- Enumeration f = ht.keys();
- Vector keys = new Vector(ht.size());
- for (int i, last = 0; f.hasMoreElements(); ++last) {
- String key = (String) f.nextElement();
- for (i = 0; i < last; ++i) {
- String s = (String) keys.get(i);
- if (key.compareTo(s) <= 0) break;
- }
- keys.add(i, key);
- }
- e = keys.elements();
- }
-
- public boolean hasMoreElements() {
- return e.hasMoreElements();
- }
-
- public Object nextElement() {
- return e.nextElement();
- }
-}
diff --git a/java/src/org/apache/log4j/ProvisionNode.java b/java/src/org/apache/log4j/ProvisionNode.java
deleted file mode 100644
index f112682..0000000
--- a/java/src/org/apache/log4j/ProvisionNode.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.util.Vector;
-
-class ProvisionNode extends Vector {
- private static final long serialVersionUID = -4479121426311014469L;
-
- ProvisionNode(Logger logger) {
- super();
- this.addElement(logger);
- }
-}
diff --git a/java/src/org/apache/log4j/RollingFileAppender.java b/java/src/org/apache/log4j/RollingFileAppender.java
deleted file mode 100644
index 8a7c656..0000000
--- a/java/src/org/apache/log4j/RollingFileAppender.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.io.File;
-import java.io.InterruptedIOException;
-
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.CountingQuietWriter;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- RollingFileAppender extends FileAppender to backup the log files when
- they reach a certain size.
-
- The log4j extras companion includes alternatives which should be considered
- for new deployments and which are discussed in the documentation
- for org.apache.log4j.rolling.RollingFileAppender.
-
-
- @author Heinz Richter
- @author Ceki Gülcü
-
-*/
-public class RollingFileAppender extends FileAppender {
-
- /**
- The default maximum file size is 10MB.
- */
- protected long maxFileSize = 10*1024*1024;
-
- /**
- There is one backup file by default.
- */
- protected int maxBackupIndex = 1;
-
- private long nextRollover = 0;
-
- /**
- The default constructor simply calls its {@link
- FileAppender#FileAppender parents constructor}. */
- public
- RollingFileAppender() {
- super();
- }
-
- /**
- Instantiate a RollingFileAppender and open the file designated by
- filename. The opened filename will become the ouput
- destination for this appender.
-
-
If the append parameter is true, the file will be
- appended to. Otherwise, the file desginated by
- filename will be truncated before being opened.
- */
- public
- RollingFileAppender(Layout layout, String filename, boolean append)
- throws IOException {
- super(layout, filename, append);
- }
-
- /**
- Instantiate a FileAppender and open the file designated by
- filename. The opened filename will become the output
- destination for this appender.
-
-
The file will be appended to. */
- public
- RollingFileAppender(Layout layout, String filename) throws IOException {
- super(layout, filename);
- }
-
- /**
- Returns the value of the MaxBackupIndex option.
- */
- public
- int getMaxBackupIndex() {
- return maxBackupIndex;
- }
-
- /**
- Get the maximum size that the output file is allowed to reach
- before being rolled over to backup files.
-
- @since 1.1
- */
- public
- long getMaximumFileSize() {
- return maxFileSize;
- }
-
- /**
- Implements the usual roll over behaviour.
-
-
If MaxBackupIndex is positive, then files
- {File.1, ..., File.MaxBackupIndex -1}
- are renamed to {File.2, ...,
- File.MaxBackupIndex}. Moreover, File is
- renamed File.1 and closed. A new File is
- created to receive further log output.
-
-
If MaxBackupIndex is equal to zero, then the
- File is truncated with no backup files created.
-
- */
- public // synchronization not necessary since doAppend is alreasy synched
- void rollOver() {
- File target;
- File file;
-
- if (qw != null) {
- long size = ((CountingQuietWriter) qw).getCount();
- LogLog.debug("rolling over count=" + size);
- // if operation fails, do not roll again until
- // maxFileSize more bytes are written
- nextRollover = size + maxFileSize;
- }
- LogLog.debug("maxBackupIndex="+maxBackupIndex);
-
- boolean renameSucceeded = true;
- // If maxBackups <= 0, then there is no file renaming to be done.
- if(maxBackupIndex > 0) {
- // Delete the oldest file, to keep Windows happy.
- file = new File(fileName + '.' + maxBackupIndex);
- if (file.exists())
- renameSucceeded = file.delete();
-
- // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
- for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
- file = new File(fileName + "." + i);
- if (file.exists()) {
- target = new File(fileName + '.' + (i + 1));
- LogLog.debug("Renaming file " + file + " to " + target);
- renameSucceeded = file.renameTo(target);
- }
- }
-
- if(renameSucceeded) {
- // Rename fileName to fileName.1
- target = new File(fileName + "." + 1);
-
- this.closeFile(); // keep windows happy.
-
- file = new File(fileName);
- LogLog.debug("Renaming file " + file + " to " + target);
- renameSucceeded = file.renameTo(target);
- //
- // if file rename failed, reopen file with append = true
- //
- if (!renameSucceeded) {
- try {
- this.setFile(fileName, true, bufferedIO, bufferSize);
- }
- catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("setFile("+fileName+", true) call failed.", e);
- }
- }
- }
- }
-
- //
- // if all renames were successful, then
- //
- if (renameSucceeded) {
- try {
- // This will also close the file. This is OK since multiple
- // close operations are safe.
- this.setFile(fileName, false, bufferedIO, bufferSize);
- nextRollover = 0;
- }
- catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("setFile("+fileName+", false) call failed.", e);
- }
- }
- }
-
- public
- synchronized
- void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
- throws IOException {
- super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
- if(append) {
- File f = new File(fileName);
- ((CountingQuietWriter) qw).setCount(f.length());
- }
- }
-
-
- /**
- Set the maximum number of backup files to keep around.
-
-
The MaxBackupIndex option determines how many backup
- files are kept before the oldest is erased. This option takes
- a positive integer value. If set to zero, then there will be no
- backup files and the log file will be truncated when it reaches
- MaxFileSize.
- */
- public
- void setMaxBackupIndex(int maxBackups) {
- this.maxBackupIndex = maxBackups;
- }
-
- /**
- Set the maximum size that the output file is allowed to reach
- before being rolled over to backup files.
-
-
This method is equivalent to {@link #setMaxFileSize} except
- that it is required for differentiating the setter taking a
- long argument from the setter taking a
- String argument by the JavaBeans {@link
- java.beans.Introspector Introspector}.
-
- @see #setMaxFileSize(String)
- */
- public
- void setMaximumFileSize(long maxFileSize) {
- this.maxFileSize = maxFileSize;
- }
-
-
- /**
- Set the maximum size that the output file is allowed to reach
- before being rolled over to backup files.
-
-
In configuration files, the MaxFileSize option takes an
- long integer in the range 0 - 2^63. You can specify the value
- with the suffixes "KB", "MB" or "GB" so that the integer is
- interpreted being expressed respectively in kilobytes, megabytes
- or gigabytes. For example, the value "10KB" will be interpreted
- as 10240.
- */
- public
- void setMaxFileSize(String value) {
- maxFileSize = OptionConverter.toFileSize(value, maxFileSize + 1);
- }
-
- protected
- void setQWForFiles(Writer writer) {
- this.qw = new CountingQuietWriter(writer, errorHandler);
- }
-
- /**
- This method differentiates RollingFileAppender from its super
- class.
-
- @since 0.9.0
- */
- protected
- void subAppend(LoggingEvent event) {
- super.subAppend(event);
- if(fileName != null && qw != null) {
- long size = ((CountingQuietWriter) qw).getCount();
- if (size >= maxFileSize && size >= nextRollover) {
- rollOver();
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/SimpleLayout.java b/java/src/org/apache/log4j/SimpleLayout.java
deleted file mode 100644
index 5699661..0000000
--- a/java/src/org/apache/log4j/SimpleLayout.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- SimpleLayout consists of the level of the log statement,
- followed by " - " and then the log message itself. For example,
-
-
- DEBUG - Hello world
-
-
-
- @author Ceki Gülcü
- @since version 0.7.0
-
-
{@link PatternLayout} offers a much more powerful alternative.
-*/
-public class SimpleLayout extends Layout {
-
- StringBuffer sbuf = new StringBuffer(128);
-
- public SimpleLayout() {
- }
-
- public
- void activateOptions() {
- }
-
- /**
- Returns the log statement in a format consisting of the
- level, followed by " - " and then the
- message. For example,
INFO - "A message"
-
-
- The category parameter is ignored.
-
- @return A byte array in SimpleLayout format.
- */
- public
- String format(LoggingEvent event) {
-
- sbuf.setLength(0);
- sbuf.append(event.getLevel().toString());
- sbuf.append(" - ");
- sbuf.append(event.getRenderedMessage());
- sbuf.append(LINE_SEP);
- return sbuf.toString();
- }
-
-/**
- The SimpleLayout does not handle the throwable contained within
- {@link LoggingEvent LoggingEvents}. Thus, it returns
- true.
-
- @since version 0.8.4 */
- public
- boolean ignoresThrowable() {
- return true;
- }
-}
diff --git a/java/src/org/apache/log4j/TTCCLayout.java b/java/src/org/apache/log4j/TTCCLayout.java
deleted file mode 100644
index 3b0e98f..0000000
--- a/java/src/org/apache/log4j/TTCCLayout.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Christopher Williams
-// Mathias Bogaert
-
-package org.apache.log4j;
-
-import org.apache.log4j.helpers.DateLayout;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- TTCC layout format consists of time, thread, category and nested
- diagnostic context information, hence the name.
-
-
Each of the four fields can be individually enabled or
- disabled. The time format depends on the DateFormat
- used.
-
-
Here is an example TTCCLayout output with the
- {@link org.apache.log4j.helpers.RelativeTimeDateFormat}.
-
-
-176 [main] INFO org.apache.log4j.examples.Sort - Populating an array of 2 elements in reverse order.
-225 [main] INFO org.apache.log4j.examples.SortAlgo - Entered the sort method.
-262 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=1 - Outer loop.
-276 [main] DEBUG org.apache.log4j.examples.SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
-290 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=0 - Outer loop.
-304 [main] INFO org.apache.log4j.examples.SortAlgo.DUMP - Dump of interger array:
-317 [main] INFO org.apache.log4j.examples.SortAlgo.DUMP - Element [0] = 0
-331 [main] INFO org.apache.log4j.examples.SortAlgo.DUMP - Element [1] = 1
-343 [main] INFO org.apache.log4j.examples.Sort - The next log statement should be an error message.
-346 [main] ERROR org.apache.log4j.examples.SortAlgo.DUMP - Tried to dump an uninitialized array.
- at org.apache.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
- at org.apache.log4j.examples.Sort.main(Sort.java:64)
-467 [main] INFO org.apache.log4j.examples.Sort - Exiting main method.
-
-
- The first field is the number of milliseconds elapsed since the
- start of the program. The second field is the thread outputting the
- log statement. The third field is the level, the fourth field is
- the category to which the statement belongs.
-
-
The fifth field (just before the '-') is the nested diagnostic
- context. Note the nested diagnostic context may be empty as in the
- first two statements. The text after the '-' is the message of the
- statement.
-
-
WARNING Do not use the same TTCCLayout instance from
- within different appenders. The TTCCLayout is not thread safe when
- used in his way. However, it is perfectly safe to use a TTCCLayout
- instance from just one appender.
-
-
{@link PatternLayout} offers a much more flexible alternative.
-
- @author Ceki Gülcü
- @author Heinz Richter
-
-*/
-public class TTCCLayout extends DateLayout {
-
- // Internal representation of options
- private boolean threadPrinting = true;
- private boolean categoryPrefixing = true;
- private boolean contextPrinting = true;
-
-
- protected final StringBuffer buf = new StringBuffer(256);
-
-
- /**
- Instantiate a TTCCLayout object with {@link
- org.apache.log4j.helpers.RelativeTimeDateFormat} as the date
- formatter in the local time zone.
-
- @since 0.7.5 */
- public TTCCLayout() {
- this.setDateFormat(RELATIVE_TIME_DATE_FORMAT, null);
- }
-
-
- /**
- Instantiate a TTCCLayout object using the local time zone. The
- DateFormat used will depend on the dateFormatType.
-
-
This constructor just calls the {@link
- DateLayout#setDateFormat} method.
-
- */
- public TTCCLayout(String dateFormatType) {
- this.setDateFormat(dateFormatType);
- }
-
-
- /**
- The ThreadPrinting option specifies whether the name of the
- current thread is part of log output or not. This is true by default.
- */
- public
- void setThreadPrinting(boolean threadPrinting) {
- this.threadPrinting = threadPrinting;
- }
-
- /**
- Returns value of the ThreadPrinting option.
- */
- public
- boolean getThreadPrinting() {
- return threadPrinting;
- }
-
- /**
- The CategoryPrefixing option specifies whether {@link Category}
- name is part of log output or not. This is true by default.
- */
- public
- void setCategoryPrefixing(boolean categoryPrefixing) {
- this.categoryPrefixing = categoryPrefixing;
- }
-
- /**
- Returns value of the CategoryPrefixing option.
- */
- public
- boolean getCategoryPrefixing() {
- return categoryPrefixing;
- }
-
- /**
- The ContextPrinting option specifies log output will include
- the nested context information belonging to the current thread.
- This is true by default.
- */
- public
- void setContextPrinting(boolean contextPrinting) {
- this.contextPrinting = contextPrinting;
- }
-
- /**
- Returns value of the ContextPrinting option.
- */
- public
- boolean getContextPrinting() {
- return contextPrinting;
- }
-
- /**
- In addition to the level of the statement and message, the
- returned byte array includes time, thread, category and {@link NDC}
- information.
-
-
Time, thread, category and diagnostic context are printed
- depending on options.
-
- @param event The event to format
-
- */
- public
- String format(LoggingEvent event) {
-
- // Reset buf
- buf.setLength(0);
-
- dateFormat(buf, event);
-
- if(this.threadPrinting) {
- buf.append('[');
- buf.append(event.getThreadName());
- buf.append("] ");
- }
- buf.append(event.getLevel().toString());
- buf.append(' ');
-
- if(this.categoryPrefixing) {
- buf.append(event.getLoggerName());
- buf.append(' ');
- }
-
- if(this.contextPrinting) {
- String ndc = event.getNDC();
-
- if(ndc != null) {
- buf.append(ndc);
- buf.append(' ');
- }
- }
- buf.append("- ");
- buf.append(event.getRenderedMessage());
- buf.append(LINE_SEP);
- return buf.toString();
- }
-
- /**
- The TTCCLayout does not handle the throwable contained within
- {@link LoggingEvent LoggingEvents}. Thus, it returns
- true.
-
- @since version 0.8.4 */
- public
- boolean ignoresThrowable() {
- return true;
- }
-}
diff --git a/java/src/org/apache/log4j/WriterAppender.java b/java/src/org/apache/log4j/WriterAppender.java
deleted file mode 100644
index 981c02d..0000000
--- a/java/src/org/apache/log4j/WriterAppender.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.QuietWriter;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.LoggingEvent;
-
-// Contibutors: Jens Uwe Pipka
-// Ben Sandee
-
-/**
- WriterAppender appends log events to a {@link java.io.Writer} or an
- {@link java.io.OutputStream} depending on the user's choice.
-
- @author Ceki Gülcü
- @since 1.1 */
-public class WriterAppender extends AppenderSkeleton {
-
-
- /**
- Immediate flush means that the underlying writer or output stream
- will be flushed at the end of each append operation unless shouldFlush()
- is overridden. Immediate
- flush is slower but ensures that each append request is actually
- written. If immediateFlush is set to
- false, then there is a good chance that the last few
- logs events are not actually written to persistent media if and
- when the application crashes.
-
- The immediateFlush variable is set to
- true by default.
-
- */
- protected boolean immediateFlush = true;
-
- /**
- The encoding to use when writing.
The
- encoding variable is set to null by
- default which results in the utilization of the system's default
- encoding. */
- protected String encoding;
-
- /**
- This is the {@link QuietWriter quietWriter} where we will write
- to.
- */
- protected QuietWriter qw;
-
-
- /**
- This default constructor does nothing. */
- public
- WriterAppender() {
- }
-
- /**
- Instantiate a WriterAppender and set the output destination to a
- new {@link OutputStreamWriter} initialized with os
- as its {@link OutputStream}. */
- public
- WriterAppender(Layout layout, OutputStream os) {
- this(layout, new OutputStreamWriter(os));
- }
-
- /**
- Instantiate a WriterAppender and set the output destination to
- writer.
-
- The writer must have been previously opened by
- the user. */
- public
- WriterAppender(Layout layout, Writer writer) {
- this.layout = layout;
- this.setWriter(writer);
- }
-
- /**
- If the ImmediateFlush option is set to
- true, the appender will flush at the end of each
- write. This is the default behavior. If the option is set to
- false, then the underlying stream can defer writing
- to physical medium to a later time.
-
-
Avoiding the flush operation at the end of each append results in
- a performance gain of 10 to 20 percent. However, there is safety
- tradeoff involved in skipping flushing. Indeed, when flushing is
- skipped, then it is likely that the last few log events will not
- be recorded on disk when the application exits. This is a high
- price to pay even for a 20% performance gain.
- */
- public
- void setImmediateFlush(boolean value) {
- immediateFlush = value;
- }
-
- /**
- Returns value of the ImmediateFlush option.
- */
- public
- boolean getImmediateFlush() {
- return immediateFlush;
- }
-
- /**
- Does nothing.
- */
- public
- void activateOptions() {
- }
-
-
- /**
- This method is called by the {@link AppenderSkeleton#doAppend}
- method.
-
-
If the output stream exists and is writable then write a log
- statement to the output stream. Otherwise, write a single warning
- message to System.err.
-
-
The format of the output will depend on this appender's
- layout.
-
- */
- public
- void append(LoggingEvent event) {
-
- // Reminder: the nesting of calls is:
- //
- // doAppend()
- // - check threshold
- // - filter
- // - append();
- // - checkEntryConditions();
- // - subAppend();
-
- if(!checkEntryConditions()) {
- return;
- }
- subAppend(event);
- }
-
- /**
- This method determines if there is a sense in attempting to append.
-
-
It checks whether there is a set output target and also if
- there is a set layout. If these checks fail, then the boolean
- value false is returned. */
- protected
- boolean checkEntryConditions() {
- if(this.closed) {
- LogLog.warn("Not allowed to write to a closed appender.");
- return false;
- }
-
- if(this.qw == null) {
- errorHandler.error("No output stream or file set for the appender named ["+
- name+"].");
- return false;
- }
-
- if(this.layout == null) {
- errorHandler.error("No layout set for the appender named ["+ name+"].");
- return false;
- }
- return true;
- }
-
-
- /**
- Close this appender instance. The underlying stream or writer is
- also closed.
-
-
Closed appenders cannot be reused.
-
- @see #setWriter
- @since 0.8.4 */
- public
- synchronized
- void close() {
- if(this.closed)
- return;
- this.closed = true;
- writeFooter();
- reset();
- }
-
- /**
- * Close the underlying {@link java.io.Writer}.
- * */
- protected void closeWriter() {
- if(qw != null) {
- try {
- qw.close();
- } catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- // There is do need to invoke an error handler at this late
- // stage.
- LogLog.error("Could not close " + qw, e);
- }
- }
- }
-
- /**
- Returns an OutputStreamWriter when passed an OutputStream. The
- encoding used will depend on the value of the
- encoding property. If the encoding value is
- specified incorrectly the writer will be opened using the default
- system encoding (an error message will be printed to the loglog. */
- protected
- OutputStreamWriter createWriter(OutputStream os) {
- OutputStreamWriter retval = null;
-
- String enc = getEncoding();
- if(enc != null) {
- try {
- retval = new OutputStreamWriter(os, enc);
- } catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.warn("Error initializing output writer.");
- LogLog.warn("Unsupported encoding?");
- }
- }
- if(retval == null) {
- retval = new OutputStreamWriter(os);
- }
- return retval;
- }
-
- public String getEncoding() {
- return encoding;
- }
-
- public void setEncoding(String value) {
- encoding = value;
- }
-
-
-
-
- /**
- Set the {@link ErrorHandler} for this WriterAppender and also the
- underlying {@link QuietWriter} if any. */
- public synchronized void setErrorHandler(ErrorHandler eh) {
- if(eh == null) {
- LogLog.warn("You have tried to set a null error-handler.");
- } else {
- this.errorHandler = eh;
- if(this.qw != null) {
- this.qw.setErrorHandler(eh);
- }
- }
- }
-
- /**
-
Sets the Writer where the log output will go. The
- specified Writer must be opened by the user and be
- writable.
-
-
The java.io.Writer will be closed when the
- appender instance is closed.
-
-
-
WARNING: Logging to an unopened Writer will fail.
-
- @param writer An already opened Writer. */
- public synchronized void setWriter(Writer writer) {
- reset();
- this.qw = new QuietWriter(writer, errorHandler);
- //this.tp = new TracerPrintWriter(qw);
- writeHeader();
- }
-
-
- /**
- Actual writing occurs here.
-
-
Most subclasses of WriterAppender will need to
- override this method.
-
- @since 0.9.0 */
- protected
- void subAppend(LoggingEvent event) {
- this.qw.write(this.layout.format(event));
-
- if(layout.ignoresThrowable()) {
- String[] s = event.getThrowableStrRep();
- if (s != null) {
- int len = s.length;
- for(int i = 0; i < len; i++) {
- this.qw.write(s[i]);
- this.qw.write(Layout.LINE_SEP);
- }
- }
- }
-
- if(shouldFlush(event)) {
- this.qw.flush();
- }
- }
-
-
-
- /**
- The WriterAppender requires a layout. Hence, this method returns
- true.
- */
- public
- boolean requiresLayout() {
- return true;
- }
-
- /**
- Clear internal references to the writer and other variables.
-
- Subclasses can override this method for an alternate closing
- behavior. */
- protected
- void reset() {
- closeWriter();
- this.qw = null;
- //this.tp = null;
- }
-
-
- /**
- Write a footer as produced by the embedded layout's {@link
- Layout#getFooter} method. */
- protected
- void writeFooter() {
- if(layout != null) {
- String f = layout.getFooter();
- if(f != null && this.qw != null) {
- this.qw.write(f);
- this.qw.flush();
- }
- }
- }
-
- /**
- Write a header as produced by the embedded layout's {@link
- Layout#getHeader} method. */
- protected
- void writeHeader() {
- if(layout != null) {
- String h = layout.getHeader();
- if(h != null && this.qw != null)
- this.qw.write(h);
- }
- }
-
- /**
- * Determines whether the writer should be flushed after
- * this event is written.
- *
- * @since 1.2.16
- */
- protected boolean shouldFlush(final LoggingEvent event) {
- return immediateFlush;
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/ControlPanel.java b/java/src/org/apache/log4j/chainsaw/ControlPanel.java
deleted file mode 100644
index 53b0b1b..0000000
--- a/java/src/org/apache/log4j/chainsaw/ControlPanel.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import javax.swing.BorderFactory;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import org.apache.log4j.Logger;
-import org.apache.log4j.Priority;
-import org.apache.log4j.Level;
-
-/**
- * Represents the controls for filtering, pausing, exiting, etc.
- *
- * @author Oliver Burn
- */
-class ControlPanel extends JPanel {
- /** use the log messages **/
- private static final Logger LOG =
- Logger.getLogger(ControlPanel.class);
-
- /**
- * Creates a new ControlPanel instance.
- *
- * @param aModel the model to control
- */
- ControlPanel(final MyTableModel aModel) {
- setBorder(BorderFactory.createTitledBorder("Controls: "));
- final GridBagLayout gridbag = new GridBagLayout();
- final GridBagConstraints c = new GridBagConstraints();
- setLayout(gridbag);
-
- // Pad everything
- c.ipadx = 5;
- c.ipady = 5;
-
- // Add the 1st column of labels
- c.gridx = 0;
- c.anchor = GridBagConstraints.EAST;
-
- c.gridy = 0;
- JLabel label = new JLabel("Filter Level:");
- gridbag.setConstraints(label, c);
- add(label);
-
- c.gridy++;
- label = new JLabel("Filter Thread:");
- gridbag.setConstraints(label, c);
- add(label);
-
- c.gridy++;
- label = new JLabel("Filter Logger:");
- gridbag.setConstraints(label, c);
- add(label);
-
- c.gridy++;
- label = new JLabel("Filter NDC:");
- gridbag.setConstraints(label, c);
- add(label);
-
- c.gridy++;
- label = new JLabel("Filter Message:");
- gridbag.setConstraints(label, c);
- add(label);
-
- // Add the 2nd column of filters
- c.weightx = 1;
- //c.weighty = 1;
- c.gridx = 1;
- c.anchor = GridBagConstraints.WEST;
-
- c.gridy = 0;
- final Level[] allPriorities = new Level[] {Level.FATAL,
- Level.ERROR,
- Level.WARN,
- Level.INFO,
- Level.DEBUG,
- Level.TRACE };
-
- final JComboBox priorities = new JComboBox(allPriorities);
- final Level lowest = allPriorities[allPriorities.length - 1];
- priorities.setSelectedItem(lowest);
- aModel.setPriorityFilter(lowest);
- gridbag.setConstraints(priorities, c);
- add(priorities);
- priorities.setEditable(false);
- priorities.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent aEvent) {
- aModel.setPriorityFilter(
- (Priority) priorities.getSelectedItem());
- }
- });
-
-
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridy++;
- final JTextField threadField = new JTextField("");
- threadField.getDocument().addDocumentListener(new DocumentListener () {
- public void insertUpdate(DocumentEvent aEvent) {
- aModel.setThreadFilter(threadField.getText());
- }
- public void removeUpdate(DocumentEvent aEvente) {
- aModel.setThreadFilter(threadField.getText());
- }
- public void changedUpdate(DocumentEvent aEvent) {
- aModel.setThreadFilter(threadField.getText());
- }
- });
- gridbag.setConstraints(threadField, c);
- add(threadField);
-
- c.gridy++;
- final JTextField catField = new JTextField("");
- catField.getDocument().addDocumentListener(new DocumentListener () {
- public void insertUpdate(DocumentEvent aEvent) {
- aModel.setCategoryFilter(catField.getText());
- }
- public void removeUpdate(DocumentEvent aEvent) {
- aModel.setCategoryFilter(catField.getText());
- }
- public void changedUpdate(DocumentEvent aEvent) {
- aModel.setCategoryFilter(catField.getText());
- }
- });
- gridbag.setConstraints(catField, c);
- add(catField);
-
- c.gridy++;
- final JTextField ndcField = new JTextField("");
- ndcField.getDocument().addDocumentListener(new DocumentListener () {
- public void insertUpdate(DocumentEvent aEvent) {
- aModel.setNDCFilter(ndcField.getText());
- }
- public void removeUpdate(DocumentEvent aEvent) {
- aModel.setNDCFilter(ndcField.getText());
- }
- public void changedUpdate(DocumentEvent aEvent) {
- aModel.setNDCFilter(ndcField.getText());
- }
- });
- gridbag.setConstraints(ndcField, c);
- add(ndcField);
-
- c.gridy++;
- final JTextField msgField = new JTextField("");
- msgField.getDocument().addDocumentListener(new DocumentListener () {
- public void insertUpdate(DocumentEvent aEvent) {
- aModel.setMessageFilter(msgField.getText());
- }
- public void removeUpdate(DocumentEvent aEvent) {
- aModel.setMessageFilter(msgField.getText());
- }
- public void changedUpdate(DocumentEvent aEvent) {
- aModel.setMessageFilter(msgField.getText());
- }
- });
-
-
- gridbag.setConstraints(msgField, c);
- add(msgField);
-
- // Add the 3rd column of buttons
- c.weightx = 0;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.EAST;
- c.gridx = 2;
-
- c.gridy = 0;
- final JButton exitButton = new JButton("Exit");
- exitButton.setMnemonic('x');
- exitButton.addActionListener(ExitAction.INSTANCE);
- gridbag.setConstraints(exitButton, c);
- add(exitButton);
-
- c.gridy++;
- final JButton clearButton = new JButton("Clear");
- clearButton.setMnemonic('c');
- clearButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent aEvent) {
- aModel.clear();
- }
- });
- gridbag.setConstraints(clearButton, c);
- add(clearButton);
-
- c.gridy++;
- final JButton toggleButton = new JButton("Pause");
- toggleButton.setMnemonic('p');
- toggleButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent aEvent) {
- aModel.toggle();
- toggleButton.setText(
- aModel.isPaused() ? "Resume" : "Pause");
- }
- });
- gridbag.setConstraints(toggleButton, c);
- add(toggleButton);
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/DetailPanel.java b/java/src/org/apache/log4j/chainsaw/DetailPanel.java
deleted file mode 100644
index 1f5dfe2..0000000
--- a/java/src/org/apache/log4j/chainsaw/DetailPanel.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.awt.BorderLayout;
-import java.text.MessageFormat;
-import java.util.Date;
-import javax.swing.BorderFactory;
-import javax.swing.JEditorPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import org.apache.log4j.Logger;
-
-/**
- * A panel for showing a stack trace.
- *
- * @author Oliver Burn
- */
-class DetailPanel
- extends JPanel
- implements ListSelectionListener
-{
- /** used to log events **/
- private static final Logger LOG =
- Logger.getLogger(DetailPanel.class);
-
- /** used to format the logging event **/
- private static final MessageFormat FORMATTER = new MessageFormat(
- "Time: {0,time,medium}" +
- " Priority: {1}" +
- " Thread: {2}" +
- " NDC: {3}" +
- "
Logger: {4}" +
- "
Location: {5}" +
- "
Message:" +
- "
{6}" +
- "Throwable:" +
- "{7}");
-
- /** the model for the data to render **/
- private final MyTableModel mModel;
- /** pane for rendering detail **/
- private final JEditorPane mDetails;
-
- /**
- * Creates a new DetailPanel instance.
- *
- * @param aTable the table to listen for selections on
- * @param aModel the model backing the table
- */
- DetailPanel(JTable aTable, final MyTableModel aModel) {
- mModel = aModel;
- setLayout(new BorderLayout());
- setBorder(BorderFactory.createTitledBorder("Details: "));
-
- mDetails = new JEditorPane();
- mDetails.setEditable(false);
- mDetails.setContentType("text/html");
- add(new JScrollPane(mDetails), BorderLayout.CENTER);
-
- final ListSelectionModel rowSM = aTable.getSelectionModel();
- rowSM.addListSelectionListener(this);
- }
-
- /** @see ListSelectionListener **/
- public void valueChanged(ListSelectionEvent aEvent) {
- //Ignore extra messages.
- if (aEvent.getValueIsAdjusting()) {
- return;
- }
-
- final ListSelectionModel lsm = (ListSelectionModel) aEvent.getSource();
- if (lsm.isSelectionEmpty()) {
- mDetails.setText("Nothing selected");
- } else {
- final int selectedRow = lsm.getMinSelectionIndex();
- final EventDetails e = mModel.getEventDetails(selectedRow);
- final Object[] args =
- {
- new Date(e.getTimeStamp()),
- e.getPriority(),
- escape(e.getThreadName()),
- escape(e.getNDC()),
- escape(e.getCategoryName()),
- escape(e.getLocationDetails()),
- escape(e.getMessage()),
- escape(getThrowableStrRep(e))
- };
- mDetails.setText(FORMATTER.format(args));
- mDetails.setCaretPosition(0);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // Private methods
- ////////////////////////////////////////////////////////////////////////////
-
- /**
- * Returns a string representation of a throwable.
- *
- * @param aEvent contains the throwable information
- * @return a String value
- */
- private static String getThrowableStrRep(EventDetails aEvent) {
- final String[] strs = aEvent.getThrowableStrRep();
- if (strs == null) {
- return null;
- }
-
- final StringBuffer sb = new StringBuffer();
- for (int i = 0; i < strs.length; i++) {
- sb.append(strs[i]).append("\n");
- }
-
- return sb.toString();
- }
-
- /**
- * Escape <, > & and " as their entities. It is very
- * dumb about & handling.
- * @param aStr the String to escape.
- * @return the escaped String
- */
- private String escape(String aStr) {
- if (aStr == null) {
- return null;
- }
-
- final StringBuffer buf = new StringBuffer();
- for (int i = 0; i < aStr.length(); i++) {
- char c = aStr.charAt(i);
- switch (c) {
- case '<':
- buf.append("<");
- break;
- case '>':
- buf.append(">");
- break;
- case '\"':
- buf.append(""");
- break;
- case '&':
- buf.append("&");
- break;
- default:
- buf.append(c);
- break;
- }
- }
- return buf.toString();
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/EventDetails.java b/java/src/org/apache/log4j/chainsaw/EventDetails.java
deleted file mode 100644
index 4b3ad94..0000000
--- a/java/src/org/apache/log4j/chainsaw/EventDetails.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import org.apache.log4j.Priority;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * Represents the details of a logging event. It is intended to overcome the
- * problem that a LoggingEvent cannot be constructed with purely fake data.
- *
- * @author Oliver Burn
- * @version 1.0
- */
-class EventDetails {
-
- /** the time of the event **/
- private final long mTimeStamp;
- /** the priority of the event **/
- private final Priority mPriority;
- /** the category of the event **/
- private final String mCategoryName;
- /** the NDC for the event **/
- private final String mNDC;
- /** the thread for the event **/
- private final String mThreadName;
- /** the msg for the event **/
- private final String mMessage;
- /** the throwable details the event **/
- private final String[] mThrowableStrRep;
- /** the location details for the event **/
- private final String mLocationDetails;
-
- /**
- * Creates a new EventDetails instance.
- * @param aTimeStamp a long value
- * @param aPriority a Priority value
- * @param aCategoryName a String value
- * @param aNDC a String value
- * @param aThreadName a String value
- * @param aMessage a String value
- * @param aThrowableStrRep a String[] value
- * @param aLocationDetails a String value
- */
- EventDetails(long aTimeStamp,
- Priority aPriority,
- String aCategoryName,
- String aNDC,
- String aThreadName,
- String aMessage,
- String[] aThrowableStrRep,
- String aLocationDetails)
- {
- mTimeStamp = aTimeStamp;
- mPriority = aPriority;
- mCategoryName = aCategoryName;
- mNDC = aNDC;
- mThreadName = aThreadName;
- mMessage = aMessage;
- mThrowableStrRep = aThrowableStrRep;
- mLocationDetails = aLocationDetails;
- }
-
- /**
- * Creates a new EventDetails instance.
- *
- * @param aEvent a LoggingEvent value
- */
- EventDetails(LoggingEvent aEvent) {
-
- this(aEvent.timeStamp,
- aEvent.getLevel(),
- aEvent.getLoggerName(),
- aEvent.getNDC(),
- aEvent.getThreadName(),
- aEvent.getRenderedMessage(),
- aEvent.getThrowableStrRep(),
- (aEvent.getLocationInformation() == null)
- ? null : aEvent.getLocationInformation().fullInfo);
- }
-
- /** @see #mTimeStamp **/
- long getTimeStamp() {
- return mTimeStamp;
- }
-
- /** @see #mPriority **/
- Priority getPriority() {
- return mPriority;
- }
-
- /** @see #mCategoryName **/
- String getCategoryName() {
- return mCategoryName;
- }
-
- /** @see #mNDC **/
- String getNDC() {
- return mNDC;
- }
-
- /** @see #mThreadName **/
- String getThreadName() {
- return mThreadName;
- }
-
- /** @see #mMessage **/
- String getMessage() {
- return mMessage;
- }
-
- /** @see #mLocationDetails **/
- String getLocationDetails(){
- return mLocationDetails;
- }
-
- /** @see #mThrowableStrRep **/
- String[] getThrowableStrRep() {
- return mThrowableStrRep;
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/ExitAction.java b/java/src/org/apache/log4j/chainsaw/ExitAction.java
deleted file mode 100644
index 55a100e..0000000
--- a/java/src/org/apache/log4j/chainsaw/ExitAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.awt.event.ActionEvent;
-import javax.swing.AbstractAction;
-import org.apache.log4j.Logger;
-
-/**
- * Encapsulates the action to exit.
- *
- * @author Oliver Burn
- * @version 1.0
- */
-class ExitAction
- extends AbstractAction
-{
- /** use to log messages **/
- private static final Logger LOG = Logger.getLogger(ExitAction.class);
- /** The instance to share **/
- public static final ExitAction INSTANCE = new ExitAction();
-
- /** Stop people creating instances **/
- private ExitAction() {}
-
- /**
- * Will shutdown the application.
- * @param aIgnore ignored
- */
- public void actionPerformed(ActionEvent aIgnore) {
- LOG.info("shutting down");
- System.exit(0);
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/LoadXMLAction.java b/java/src/org/apache/log4j/chainsaw/LoadXMLAction.java
deleted file mode 100644
index 33e5d13..0000000
--- a/java/src/org/apache/log4j/chainsaw/LoadXMLAction.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import javax.swing.AbstractAction;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JOptionPane;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-import org.apache.log4j.Logger;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-/**
- * Encapsulates the action to load an XML file.
- *
- * @author Oliver Burn
- * @version 1.0
- */
-class LoadXMLAction
- extends AbstractAction
-{
- /** use to log messages **/
- private static final Logger LOG = Logger.getLogger(LoadXMLAction.class);
-
- /** the parent frame **/
- private final JFrame mParent;
-
- /**
- * the file chooser - configured to allow only the selection of a
- * single file.
- */
- private final JFileChooser mChooser = new JFileChooser();
- {
- mChooser.setMultiSelectionEnabled(false);
- mChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
- }
-
- /** parser to read XML files **/
- private final XMLReader mParser;
- /** the content handler **/
- private final XMLFileHandler mHandler;
-
-
- /**
- * Creates a new LoadXMLAction instance.
- *
- * @param aParent the parent frame
- * @param aModel the model to add events to
- * @exception SAXException if an error occurs
- * @throws ParserConfigurationException if an error occurs
- */
- LoadXMLAction(JFrame aParent, MyTableModel aModel)
- throws SAXException, ParserConfigurationException
- {
- mParent = aParent;
- mHandler = new XMLFileHandler(aModel);
- mParser = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
- mParser.setContentHandler(mHandler);
- }
-
- /**
- * Prompts the user for a file to load events from.
- * @param aIgnore an ActionEvent value
- */
- public void actionPerformed(ActionEvent aIgnore) {
- LOG.info("load file called");
- if (mChooser.showOpenDialog(mParent) == JFileChooser.APPROVE_OPTION) {
- LOG.info("Need to load a file");
- final File chosen = mChooser.getSelectedFile();
- LOG.info("loading the contents of " + chosen.getAbsolutePath());
- try {
- final int num = loadFile(chosen.getAbsolutePath());
- JOptionPane.showMessageDialog(
- mParent,
- "Loaded " + num + " events.",
- "CHAINSAW",
- JOptionPane.INFORMATION_MESSAGE);
- } catch (Exception e) {
- LOG.warn("caught an exception loading the file", e);
- JOptionPane.showMessageDialog(
- mParent,
- "Error parsing file - " + e.getMessage(),
- "CHAINSAW",
- JOptionPane.ERROR_MESSAGE);
- }
- }
- }
-
- /**
- * Loads the contents of file into the model
- *
- * @param aFile the file to extract events from
- * @return the number of events loaded
- * @throws SAXException if an error occurs
- * @throws IOException if an error occurs
- */
- private int loadFile(String aFile)
- throws SAXException, IOException
- {
- synchronized (mParser) {
- // Create a dummy document to parse the file
- final StringBuffer buf = new StringBuffer();
- buf.append("\n");
- buf.append("]>\n");
- buf.append("\n");
- buf.append("&data;\n");
- buf.append("\n");
-
- final InputSource is =
- new InputSource(new StringReader(buf.toString()));
- mParser.parse(is);
- return mHandler.getNumEvents();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/LoggingReceiver.java b/java/src/org/apache/log4j/chainsaw/LoggingReceiver.java
deleted file mode 100644
index ca087ad..0000000
--- a/java/src/org/apache/log4j/chainsaw/LoggingReceiver.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * A daemon thread the processes connections from a
- * org.apache.log4j.net.SocketAppender.html.
- *
- * @author Oliver Burn
- */
-class LoggingReceiver extends Thread {
- /** used to log messages **/
- private static final Logger LOG = Logger.getLogger(LoggingReceiver.class);
-
- /**
- * Helper that actually processes a client connection. It receives events
- * and adds them to the supplied model.
- *
- * @author Oliver Burn
- */
- private class Slurper implements Runnable {
- /** socket connection to read events from **/
- private final Socket mClient;
-
- /**
- * Creates a new Slurper instance.
- *
- * @param aClient socket to receive events from
- */
- Slurper(Socket aClient) {
- mClient = aClient;
- }
-
- /** loops getting the events **/
- public void run() {
- LOG.debug("Starting to get data");
- try {
- final ObjectInputStream ois =
- new ObjectInputStream(mClient.getInputStream());
- while (true) {
- final LoggingEvent event = (LoggingEvent) ois.readObject();
- mModel.addEvent(new EventDetails(event));
- }
- } catch (EOFException e) {
- LOG.info("Reached EOF, closing connection");
- } catch (SocketException e) {
- LOG.info("Caught SocketException, closing connection");
- } catch (IOException e) {
- LOG.warn("Got IOException, closing connection", e);
- } catch (ClassNotFoundException e) {
- LOG.warn("Got ClassNotFoundException, closing connection", e);
- }
-
- try {
- mClient.close();
- } catch (IOException e) {
- LOG.warn("Error closing connection", e);
- }
- }
- }
-
- /** where to put the events **/
- private MyTableModel mModel;
-
- /** server for listening for connections **/
- private ServerSocket mSvrSock;
-
- /**
- * Creates a new LoggingReceiver instance.
- *
- * @param aModel model to place put received into
- * @param aPort port to listen on
- * @throws IOException if an error occurs
- */
- LoggingReceiver(MyTableModel aModel, int aPort) throws IOException {
- setDaemon(true);
- mModel = aModel;
- mSvrSock = new ServerSocket(aPort);
- }
-
- /** Listens for client connections **/
- public void run() {
- LOG.info("Thread started");
- try {
- while (true) {
- LOG.debug("Waiting for a connection");
- final Socket client = mSvrSock.accept();
- LOG.debug("Got a connection from " +
- client.getInetAddress().getHostName());
- final Thread t = new Thread(new Slurper(client));
- t.setDaemon(true);
- t.start();
- }
- } catch (IOException e) {
- LOG.error("Error in accepting connections, stopping.", e);
- }
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/Main.java b/java/src/org/apache/log4j/chainsaw/Main.java
deleted file mode 100644
index 5a69351..0000000
--- a/java/src/org/apache/log4j/chainsaw/Main.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.IOException;
-import java.util.Properties;
-import javax.swing.BorderFactory;
-import javax.swing.JFrame;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-
-/**
- * The main application.
- *
- * @author Oliver Burn
- */
-public class Main
- extends JFrame
-{
- /** the default port number to listen on **/
- private static final int DEFAULT_PORT = 4445;
-
- /** name of property for port name **/
- public static final String PORT_PROP_NAME = "chainsaw.port";
-
- /** use to log messages **/
- private static final Logger LOG = Logger.getLogger(Main.class);
-
-
- /**
- * Creates a new NetworkClient instance.
- */
- private Main() {
- super("CHAINSAW - Log4J Log Viewer");
- // create the all important model
- final MyTableModel model = new MyTableModel();
-
- //Create the menu bar.
- final JMenuBar menuBar = new JMenuBar();
- setJMenuBar(menuBar);
- final JMenu menu = new JMenu("File");
- menuBar.add(menu);
-
- try {
- final LoadXMLAction lxa = new LoadXMLAction(this, model);
- final JMenuItem loadMenuItem = new JMenuItem("Load file...");
- menu.add(loadMenuItem);
- loadMenuItem.addActionListener(lxa);
- } catch (NoClassDefFoundError e) {
- LOG.info("Missing classes for XML parser", e);
- JOptionPane.showMessageDialog(
- this,
- "XML parser not in classpath - unable to load XML events.",
- "CHAINSAW",
- JOptionPane.ERROR_MESSAGE);
- } catch (Exception e) {
- LOG.info("Unable to create the action to load XML files", e);
- JOptionPane.showMessageDialog(
- this,
- "Unable to create a XML parser - unable to load XML events.",
- "CHAINSAW",
- JOptionPane.ERROR_MESSAGE);
- }
-
- final JMenuItem exitMenuItem = new JMenuItem("Exit");
- menu.add(exitMenuItem);
- exitMenuItem.addActionListener(ExitAction.INSTANCE);
-
- // Add control panel
- final ControlPanel cp = new ControlPanel(model);
- getContentPane().add(cp, BorderLayout.NORTH);
-
- // Create the table
- final JTable table = new JTable(model);
- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- final JScrollPane scrollPane = new JScrollPane(table);
- scrollPane.setBorder(BorderFactory.createTitledBorder("Events: "));
- scrollPane.setPreferredSize(new Dimension(900, 300));
-
- // Create the details
- final JPanel details = new DetailPanel(table, model);
- details.setPreferredSize(new Dimension(900, 300));
-
- // Add the table and stack trace into a splitter
- final JSplitPane jsp =
- new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, details);
- getContentPane().add(jsp, BorderLayout.CENTER);
-
- addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent aEvent) {
- ExitAction.INSTANCE.actionPerformed(null);
- }
- });
-
- pack();
- setVisible(true);
-
- setupReceiver(model);
- }
-
- /**
- * Setup recieving messages.
- *
- * @param aModel a MyTableModel value
- */
- private void setupReceiver(MyTableModel aModel) {
- int port = DEFAULT_PORT;
- final String strRep = System.getProperty(PORT_PROP_NAME);
- if (strRep != null) {
- try {
- port = Integer.parseInt(strRep);
- } catch (NumberFormatException nfe) {
- LOG.fatal("Unable to parse " + PORT_PROP_NAME +
- " property with value " + strRep + ".");
- JOptionPane.showMessageDialog(
- this,
- "Unable to parse port number from '" + strRep +
- "', quitting.",
- "CHAINSAW",
- JOptionPane.ERROR_MESSAGE);
- System.exit(1);
- }
- }
-
- try {
- final LoggingReceiver lr = new LoggingReceiver(aModel, port);
- lr.start();
- } catch (IOException e) {
- LOG.fatal("Unable to connect to socket server, quiting", e);
- JOptionPane.showMessageDialog(
- this,
- "Unable to create socket on port " + port + ", quitting.",
- "CHAINSAW",
- JOptionPane.ERROR_MESSAGE);
- System.exit(1);
- }
- }
-
-
- ////////////////////////////////////////////////////////////////////////////
- // static methods
- ////////////////////////////////////////////////////////////////////////////
-
-
- /** initialise log4j **/
- private static void initLog4J() {
- final Properties props = new Properties();
- props.setProperty("log4j.rootLogger", "DEBUG, A1");
- props.setProperty("log4j.appender.A1",
- "org.apache.log4j.ConsoleAppender");
- props.setProperty("log4j.appender.A1.layout",
- "org.apache.log4j.TTCCLayout");
- PropertyConfigurator.configure(props);
- }
-
- /**
- * The main method.
- *
- * @param aArgs ignored
- */
- public static void main(String[] aArgs) {
- initLog4J();
- new Main();
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/MyTableModel.java b/java/src/org/apache/log4j/chainsaw/MyTableModel.java
deleted file mode 100644
index 0d43272..0000000
--- a/java/src/org/apache/log4j/chainsaw/MyTableModel.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import javax.swing.table.AbstractTableModel;
-import org.apache.log4j.Priority;
-import org.apache.log4j.Logger;
-
-/**
- * Represents a list of EventDetails objects that are sorted on
- * logging time. Methods are provided to filter the events that are visible.
- *
- * @author Oliver Burn
- */
-class MyTableModel
- extends AbstractTableModel
-{
-
- /** used to log messages **/
- private static final Logger LOG = Logger.getLogger(MyTableModel.class);
-
- /** use the compare logging events **/
- private static final Comparator MY_COMP = new Comparator()
- {
- /** @see Comparator **/
- public int compare(Object aObj1, Object aObj2) {
- if ((aObj1 == null) && (aObj2 == null)) {
- return 0; // treat as equal
- } else if (aObj1 == null) {
- return -1; // null less than everything
- } else if (aObj2 == null) {
- return 1; // think about it. :->
- }
-
- // will assume only have LoggingEvent
- final EventDetails le1 = (EventDetails) aObj1;
- final EventDetails le2 = (EventDetails) aObj2;
-
- if (le1.getTimeStamp() < le2.getTimeStamp()) {
- return 1;
- }
- // assume not two events are logged at exactly the same time
- return -1;
- }
- };
-
- /**
- * Helper that actually processes incoming events.
- * @author Oliver Burn
- */
- private class Processor
- implements Runnable
- {
- /** loops getting the events **/
- public void run() {
- while (true) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- // ignore
- }
-
- synchronized (mLock) {
- if (mPaused) {
- continue;
- }
-
- boolean toHead = true; // were events added to head
- boolean needUpdate = false;
- final Iterator it = mPendingEvents.iterator();
- while (it.hasNext()) {
- final EventDetails event = (EventDetails) it.next();
- mAllEvents.add(event);
- toHead = toHead && (event == mAllEvents.first());
- needUpdate = needUpdate || matchFilter(event);
- }
- mPendingEvents.clear();
-
- if (needUpdate) {
- updateFilteredEvents(toHead);
- }
- }
- }
-
- }
- }
-
-
- /** names of the columns in the table **/
- private static final String[] COL_NAMES = {
- "Time", "Priority", "Trace", "Category", "NDC", "Message"};
-
- /** definition of an empty list **/
- private static final EventDetails[] EMPTY_LIST = new EventDetails[] {};
-
- /** used to format dates **/
- private static final DateFormat DATE_FORMATTER =
- DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
-
- /** the lock to control access **/
- private final Object mLock = new Object();
- /** set of all logged events - not filtered **/
- private final SortedSet mAllEvents = new TreeSet(MY_COMP);
- /** events that are visible after filtering **/
- private EventDetails[] mFilteredEvents = EMPTY_LIST;
- /** list of events that are buffered for processing **/
- private final List mPendingEvents = new ArrayList();
- /** indicates whether event collection is paused to the UI **/
- private boolean mPaused = false;
-
- /** filter for the thread **/
- private String mThreadFilter = "";
- /** filter for the message **/
- private String mMessageFilter = "";
- /** filter for the NDC **/
- private String mNDCFilter = "";
- /** filter for the category **/
- private String mCategoryFilter = "";
- /** filter for the priority **/
- private Priority mPriorityFilter = Priority.DEBUG;
-
-
- /**
- * Creates a new MyTableModel instance.
- *
- */
- MyTableModel() {
- final Thread t = new Thread(new Processor());
- t.setDaemon(true);
- t.start();
- }
-
-
- ////////////////////////////////////////////////////////////////////////////
- // Table Methods
- ////////////////////////////////////////////////////////////////////////////
-
- /** @see javax.swing.table.TableModel **/
- public int getRowCount() {
- synchronized (mLock) {
- return mFilteredEvents.length;
- }
- }
-
- /** @see javax.swing.table.TableModel **/
- public int getColumnCount() {
- // does not need to be synchronized
- return COL_NAMES.length;
- }
-
- /** @see javax.swing.table.TableModel **/
- public String getColumnName(int aCol) {
- // does not need to be synchronized
- return COL_NAMES[aCol];
- }
-
- /** @see javax.swing.table.TableModel **/
- public Class getColumnClass(int aCol) {
- // does not need to be synchronized
- return (aCol == 2) ? Boolean.class : Object.class;
- }
-
- /** @see javax.swing.table.TableModel **/
- public Object getValueAt(int aRow, int aCol) {
- synchronized (mLock) {
- final EventDetails event = mFilteredEvents[aRow];
-
- if (aCol == 0) {
- return DATE_FORMATTER.format(new Date(event.getTimeStamp()));
- } else if (aCol == 1) {
- return event.getPriority();
- } else if (aCol == 2) {
- return (event.getThrowableStrRep() == null)
- ? Boolean.FALSE : Boolean.TRUE;
- } else if (aCol == 3) {
- return event.getCategoryName();
- } else if (aCol == 4) {
- return event.getNDC();
- }
- return event.getMessage();
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // Public Methods
- ////////////////////////////////////////////////////////////////////////////
-
- /**
- * Sets the priority to filter events on. Only events of equal or higher
- * property are now displayed.
- *
- * @param aPriority the priority to filter on
- */
- public void setPriorityFilter(Priority aPriority) {
- synchronized (mLock) {
- mPriorityFilter = aPriority;
- updateFilteredEvents(false);
- }
- }
-
- /**
- * Set the filter for the thread field.
- *
- * @param aStr the string to match
- */
- public void setThreadFilter(String aStr) {
- synchronized (mLock) {
- mThreadFilter = aStr.trim();
- updateFilteredEvents(false);
- }
- }
-
- /**
- * Set the filter for the message field.
- *
- * @param aStr the string to match
- */
- public void setMessageFilter(String aStr) {
- synchronized (mLock) {
- mMessageFilter = aStr.trim();
- updateFilteredEvents(false);
- }
- }
-
- /**
- * Set the filter for the NDC field.
- *
- * @param aStr the string to match
- */
- public void setNDCFilter(String aStr) {
- synchronized (mLock) {
- mNDCFilter = aStr.trim();
- updateFilteredEvents(false);
- }
- }
-
- /**
- * Set the filter for the category field.
- *
- * @param aStr the string to match
- */
- public void setCategoryFilter(String aStr) {
- synchronized (mLock) {
- mCategoryFilter = aStr.trim();
- updateFilteredEvents(false);
- }
- }
-
- /**
- * Add an event to the list.
- *
- * @param aEvent a EventDetails value
- */
- public void addEvent(EventDetails aEvent) {
- synchronized (mLock) {
- mPendingEvents.add(aEvent);
- }
- }
-
- /**
- * Clear the list of all events.
- */
- public void clear() {
- synchronized (mLock) {
- mAllEvents.clear();
- mFilteredEvents = new EventDetails[0];
- mPendingEvents.clear();
- fireTableDataChanged();
- }
- }
-
- /** Toggle whether collecting events **/
- public void toggle() {
- synchronized (mLock) {
- mPaused = !mPaused;
- }
- }
-
- /** @return whether currently paused collecting events **/
- public boolean isPaused() {
- synchronized (mLock) {
- return mPaused;
- }
- }
-
- /**
- * Get the throwable information at a specified row in the filtered events.
- *
- * @param aRow the row index of the event
- * @return the throwable information
- */
- public EventDetails getEventDetails(int aRow) {
- synchronized (mLock) {
- return mFilteredEvents[aRow];
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // Private methods
- ////////////////////////////////////////////////////////////////////////////
-
- /**
- * Update the filtered events data structure.
- * @param aInsertedToFront indicates whether events were added to front of
- * the events. If true, then the current first event must still exist
- * in the list after the filter is applied.
- */
- private void updateFilteredEvents(boolean aInsertedToFront) {
- final long start = System.currentTimeMillis();
- final List filtered = new ArrayList();
- final int size = mAllEvents.size();
- final Iterator it = mAllEvents.iterator();
-
- while (it.hasNext()) {
- final EventDetails event = (EventDetails) it.next();
- if (matchFilter(event)) {
- filtered.add(event);
- }
- }
-
- final EventDetails lastFirst = (mFilteredEvents.length == 0)
- ? null
- : mFilteredEvents[0];
- mFilteredEvents = (EventDetails[]) filtered.toArray(EMPTY_LIST);
-
- if (aInsertedToFront && (lastFirst != null)) {
- final int index = filtered.indexOf(lastFirst);
- if (index < 1) {
- LOG.warn("In strange state");
- fireTableDataChanged();
- } else {
- fireTableRowsInserted(0, index - 1);
- }
- } else {
- fireTableDataChanged();
- }
-
- final long end = System.currentTimeMillis();
- LOG.debug("Total time [ms]: " + (end - start)
- + " in update, size: " + size);
- }
-
- /**
- * Returns whether an event matches the filters.
- *
- * @param aEvent the event to check for a match
- * @return whether the event matches
- */
- private boolean matchFilter(EventDetails aEvent) {
- if (aEvent.getPriority().isGreaterOrEqual(mPriorityFilter) &&
- (aEvent.getThreadName().indexOf(mThreadFilter) >= 0) &&
- (aEvent.getCategoryName().indexOf(mCategoryFilter) >= 0) &&
- ((mNDCFilter.length() == 0) ||
- ((aEvent.getNDC() != null) &&
- (aEvent.getNDC().indexOf(mNDCFilter) >= 0))))
- {
- final String rm = aEvent.getMessage();
- if (rm == null) {
- // only match if we have not filtering in place
- return (mMessageFilter.length() == 0);
- } else {
- return (rm.indexOf(mMessageFilter) >= 0);
- }
- }
-
- return false; // by default not match
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/XMLFileHandler.java b/java/src/org/apache/log4j/chainsaw/XMLFileHandler.java
deleted file mode 100644
index 2f9af51..0000000
--- a/java/src/org/apache/log4j/chainsaw/XMLFileHandler.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.chainsaw;
-
-import java.util.StringTokenizer;
-import org.apache.log4j.Level;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * A content handler for document containing Log4J events logged using the
- * XMLLayout class. It will create events and add them to a supplied model.
- *
- * @author Oliver Burn
- * @version 1.0
- */
-class XMLFileHandler
- extends DefaultHandler
-{
- /** represents the event tag **/
- private static final String TAG_EVENT = "log4j:event";
- /** represents the message tag **/
- private static final String TAG_MESSAGE = "log4j:message";
- /** represents the ndc tag **/
- private static final String TAG_NDC = "log4j:NDC";
- /** represents the throwable tag **/
- private static final String TAG_THROWABLE = "log4j:throwable";
- /** represents the location info tag **/
- private static final String TAG_LOCATION_INFO = "log4j:locationInfo";
-
- /** where to put the events **/
- private final MyTableModel mModel;
- /** the number of events in the document **/
- private int mNumEvents;
-
- /** the time of the event **/
- private long mTimeStamp;
- /** the priority (level) of the event **/
- private Level mLevel;
- /** the category of the event **/
- private String mCategoryName;
- /** the NDC for the event **/
- private String mNDC;
- /** the thread for the event **/
- private String mThreadName;
- /** the msg for the event **/
- private String mMessage;
- /** the throwable details the event **/
- private String[] mThrowableStrRep;
- /** the location details for the event **/
- private String mLocationDetails;
- /** buffer for collecting text **/
- private final StringBuffer mBuf = new StringBuffer();
-
- /**
- * Creates a new XMLFileHandler instance.
- *
- * @param aModel where to add the events
- */
- XMLFileHandler(MyTableModel aModel) {
- mModel = aModel;
- }
-
- /** @see DefaultHandler **/
- public void startDocument()
- throws SAXException
- {
- mNumEvents = 0;
- }
-
- /** @see DefaultHandler **/
- public void characters(char[] aChars, int aStart, int aLength) {
- mBuf.append(String.valueOf(aChars, aStart, aLength));
- }
-
- /** @see DefaultHandler **/
- public void endElement(String aNamespaceURI,
- String aLocalName,
- String aQName)
- {
- if (TAG_EVENT.equals(aQName)) {
- addEvent();
- resetData();
- } else if (TAG_NDC.equals(aQName)) {
- mNDC = mBuf.toString();
- } else if (TAG_MESSAGE.equals(aQName)) {
- mMessage = mBuf.toString();
- } else if (TAG_THROWABLE.equals(aQName)) {
- final StringTokenizer st =
- new StringTokenizer(mBuf.toString(), "\n\t");
- mThrowableStrRep = new String[st.countTokens()];
- if (mThrowableStrRep.length > 0) {
- mThrowableStrRep[0] = st.nextToken();
- for (int i = 1; i < mThrowableStrRep.length; i++) {
- mThrowableStrRep[i] = "\t" + st.nextToken();
- }
- }
- }
- }
-
- /** @see DefaultHandler **/
- public void startElement(String aNamespaceURI,
- String aLocalName,
- String aQName,
- Attributes aAtts)
- {
- mBuf.setLength(0);
-
- if (TAG_EVENT.equals(aQName)) {
- mThreadName = aAtts.getValue("thread");
- mTimeStamp = Long.parseLong(aAtts.getValue("timestamp"));
- mCategoryName = aAtts.getValue("logger");
- mLevel = Level.toLevel(aAtts.getValue("level"));
- } else if (TAG_LOCATION_INFO.equals(aQName)) {
- mLocationDetails = aAtts.getValue("class") + "."
- + aAtts.getValue("method")
- + "(" + aAtts.getValue("file") + ":" + aAtts.getValue("line")
- + ")";
- }
- }
-
- /** @return the number of events in the document **/
- int getNumEvents() {
- return mNumEvents;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // Private methods
- ////////////////////////////////////////////////////////////////////////////
-
- /** Add an event to the model **/
- private void addEvent() {
- mModel.addEvent(new EventDetails(mTimeStamp,
- mLevel,
- mCategoryName,
- mNDC,
- mThreadName,
- mMessage,
- mThrowableStrRep,
- mLocationDetails));
- mNumEvents++;
- }
-
- /** Reset the data for an event **/
- private void resetData() {
- mTimeStamp = 0;
- mLevel = null;
- mCategoryName = null;
- mNDC = null;
- mThreadName = null;
- mMessage = null;
- mThrowableStrRep = null;
- mLocationDetails = null;
- }
-}
diff --git a/java/src/org/apache/log4j/chainsaw/doc-files/screen_01.png b/java/src/org/apache/log4j/chainsaw/doc-files/screen_01.png
deleted file mode 100644
index 1a9c26d..0000000
Binary files a/java/src/org/apache/log4j/chainsaw/doc-files/screen_01.png and /dev/null differ
diff --git a/java/src/org/apache/log4j/chainsaw/package.html b/java/src/org/apache/log4j/chainsaw/package.html
deleted file mode 100644
index 5b01480..0000000
--- a/java/src/org/apache/log4j/chainsaw/package.html
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
-
- Chainsaw Tool
-
-
-
-
- Chainsaw is a GUI log viewer and filter for the log4j
-package. By default it listens for LoggingEvent objects sent using
-the SocketAppender and
-displays them in a table. The events can be filtered based on:
-
-
- - Level
-
- - Thread name
-
- - Logger
- - Message
-
- - NDC
-
-
- All the details for each event can be displayed by selecting
- the event in the table.
-
- Chainsaw also supports loading a events logged to a file using
- the XMLLayout format. This
- is great for analysing log files, and means you do not need to
- keep Chainsaw running continously. It is easy to add support
- for loading events from other sources like JDBC.
-
- A picture is worth a thousand words:
-
-
.
-
- Finally, why is it called chainsaw?
- Because it cuts your log (file) down to size. :-)
-
-
-
- Requirements
-
- Chainsaw is based on the Swing API which requires JDK 1.2 or later.
-
-
- Running chainsaw
-
- Setup
- You need to include the log4j.jar in the classpath.
-
-
Usage
-
- The command line usage is:
-
- java -D<property>=<value> org.apache.log4j.chainsaw.Main
-
- The default behaviour of chainsaw can be changed by setting system properties
- using the -D<property>=<value> arguments to java. The
- following table describes what properties can be set:
-
-
-
-
- | Property |
- Description |
-
- | chainsaw.port |
- Indicates which port to listen for connections on. Defaults
- to "4445".
- |
-
-
-
-
- Configuring Log4J
-
- You will need to configure log4j to send logging events to
- Chainsaw. Here is a sample log4j.properties file
- for sending logging events to Chainsaw.
-
-
-log4j.rootLogger=DEBUG, CHAINSAW_CLIENT
-
-log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender
-log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost
-log4j.appender.CHAINSAW_CLIENT.Port=4445
-log4j.appender.CHAINSAW_CLIENT.LocationInfo=true
-
-
-
-
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/config/PropertyGetter.java b/java/src/org/apache/log4j/config/PropertyGetter.java
deleted file mode 100644
index 5233699..0000000
--- a/java/src/org/apache/log4j/config/PropertyGetter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.config;
-
-import org.apache.log4j.Priority;
-import org.apache.log4j.helpers.LogLog;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.InterruptedIOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-
-/**
- Used for inferring configuration information for a log4j's component.
-
- @author Anders Kristensen
- */
-public class PropertyGetter {
- protected static final Object[] NULL_ARG = new Object[] {};
- protected Object obj;
- protected PropertyDescriptor[] props;
-
- public interface PropertyCallback {
- void foundProperty(Object obj, String prefix, String name, Object value);
- }
-
- /**
- Create a new PropertyGetter for the specified Object. This is done
- in prepartion for invoking {@link
- #getProperties(PropertyGetter.PropertyCallback, String)} one or
- more times.
-
- @param obj the object for which to set properties */
- public
- PropertyGetter(Object obj) throws IntrospectionException {
- BeanInfo bi = Introspector.getBeanInfo(obj.getClass());
- props = bi.getPropertyDescriptors();
- this.obj = obj;
- }
-
- public
- static
- void getProperties(Object obj, PropertyCallback callback, String prefix) {
- try {
- new PropertyGetter(obj).getProperties(callback, prefix);
- } catch (IntrospectionException ex) {
- LogLog.error("Failed to introspect object " + obj, ex);
- }
- }
-
- public
- void getProperties(PropertyCallback callback, String prefix) {
- for (int i = 0; i < props.length; i++) {
- Method getter = props[i].getReadMethod();
- if (getter == null) continue;
- if (!isHandledType(getter.getReturnType())) {
- //System.err.println("Ignoring " + props[i].getName() +" " + getter.getReturnType());
- continue;
- }
- String name = props[i].getName();
- try {
- Object result = getter.invoke(obj, NULL_ARG);
- //System.err.println("PROP " + name +": " + result);
- if (result != null) {
- callback.foundProperty(obj, prefix, name, result);
- }
- } catch (IllegalAccessException ex) {
- LogLog.warn("Failed to get value of property " + name);
- } catch (InvocationTargetException ex) {
- if (ex.getTargetException() instanceof InterruptedException
- || ex.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.warn("Failed to get value of property " + name);
- } catch (RuntimeException ex) {
- LogLog.warn("Failed to get value of property " + name);
- }
- }
- }
-
- protected
- boolean isHandledType(Class type) {
- return String.class.isAssignableFrom(type) ||
- Integer.TYPE.isAssignableFrom(type) ||
- Long.TYPE.isAssignableFrom(type) ||
- Boolean.TYPE.isAssignableFrom(type) ||
- Priority.class.isAssignableFrom(type);
- }
-}
diff --git a/java/src/org/apache/log4j/config/PropertyPrinter.java b/java/src/org/apache/log4j/config/PropertyPrinter.java
deleted file mode 100644
index 517079f..0000000
--- a/java/src/org/apache/log4j/config/PropertyPrinter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.config;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Category;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-
-import java.io.PrintWriter;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-/**
- Prints the configuration of the log4j default hierarchy
- (which needs to be auto-initialized) as a propoperties file
- on a {@link PrintWriter}.
-
- @author Anders Kristensen
- */
-public class PropertyPrinter implements PropertyGetter.PropertyCallback {
- protected int numAppenders = 0;
- protected Hashtable appenderNames = new Hashtable();
- protected Hashtable layoutNames = new Hashtable();
- protected PrintWriter out;
- protected boolean doCapitalize;
-
- public
- PropertyPrinter(PrintWriter out) {
- this(out, false);
- }
-
- public
- PropertyPrinter(PrintWriter out, boolean doCapitalize) {
- this.out = out;
- this.doCapitalize = doCapitalize;
-
- print(out);
- out.flush();
- }
-
- protected
- String genAppName() {
- return "A" + numAppenders++;
- }
-
- /**
- * Returns true if the specified appender name is considered to have
- * been generated, that is, if it is of the form A[0-9]+.
- */
- protected
- boolean isGenAppName(String name) {
- if (name.length() < 2 || name.charAt(0) != 'A') return false;
-
- for (int i = 0; i < name.length(); i++) {
- if (name.charAt(i) < '0' || name.charAt(i) > '9') return false;
- }
- return true;
- }
-
- /**
- * Prints the configuration of the default log4j hierarchy as a Java
- * properties file on the specified Writer.
- *
- * N.B. print() can be invoked only once!
- */
- public
- void print(PrintWriter out) {
- printOptions(out, Logger.getRootLogger());
-
- Enumeration cats = LogManager.getCurrentLoggers();
- while (cats.hasMoreElements()) {
- printOptions(out, (Logger) cats.nextElement());
- }
- }
-
- /**
- * @since 1.2.15
- */
- protected
- void printOptions(PrintWriter out, Category cat) {
- Enumeration appenders = cat.getAllAppenders();
- Level prio = cat.getLevel();
- String appenderString = (prio == null ? "" : prio.toString());
-
- while (appenders.hasMoreElements()) {
- Appender app = (Appender) appenders.nextElement();
- String name;
-
- if ((name = (String) appenderNames.get(app)) == null) {
-
- // first assign name to the appender
- if ((name = app.getName()) == null || isGenAppName(name)) {
- name = genAppName();
- }
- appenderNames.put(app, name);
-
- printOptions(out, app, "log4j.appender."+name);
- if (app.getLayout() != null) {
- printOptions(out, app.getLayout(), "log4j.appender."+name+".layout");
- }
- }
- appenderString += ", " + name;
- }
- String catKey = (cat == Logger.getRootLogger())
- ? "log4j.rootLogger"
- : "log4j.logger." + cat.getName();
- if (appenderString != "") {
- out.println(catKey + "=" + appenderString);
- }
- if (!cat.getAdditivity() && cat != Logger.getRootLogger()) {
- out.println("log4j.additivity." + cat.getName() + "=false");
- }
- }
-
- protected void printOptions(PrintWriter out, Logger cat) {
- printOptions(out, (Category) cat);
- }
-
- protected
- void printOptions(PrintWriter out, Object obj, String fullname) {
- out.println(fullname + "=" + obj.getClass().getName());
- PropertyGetter.getProperties(obj, this, fullname + ".");
- }
-
- public void foundProperty(Object obj, String prefix, String name, Object value) {
- // XXX: Properties encode value.toString()
- if (obj instanceof Appender && "name".equals(name)) {
- return;
- }
- if (doCapitalize) {
- name = capitalize(name);
- }
- out.println(prefix + name + "=" + value.toString());
- }
-
- public static String capitalize(String name) {
- if (Character.isLowerCase(name.charAt(0))) {
- if (name.length() == 1 || Character.isLowerCase(name.charAt(1))) {
- StringBuffer newname = new StringBuffer(name);
- newname.setCharAt(0, Character.toUpperCase(name.charAt(0)));
- return newname.toString();
- }
- }
- return name;
- }
-
- // for testing
- public static void main(String[] args) {
- new PropertyPrinter(new PrintWriter(System.out));
- }
-}
diff --git a/java/src/org/apache/log4j/config/PropertySetter.java b/java/src/org/apache/log4j/config/PropertySetter.java
deleted file mode 100644
index 61d36ef..0000000
--- a/java/src/org/apache/log4j/config/PropertySetter.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Georg Lundesgaard
-
-package org.apache.log4j.config;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Priority;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.spi.OptionHandler;
-import org.apache.log4j.spi.ErrorHandler;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.InterruptedIOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Enumeration;
-import java.util.Properties;
-
-/**
- General purpose Object property setter. Clients repeatedly invokes
- {@link #setProperty setProperty(name,value)} in order to invoke setters
- on the Object specified in the constructor. This class relies on the
- JavaBeans {@link Introspector} to analyze the given Object Class using
- reflection.
-
-
Usage:
-
- PropertySetter ps = new PropertySetter(anObject);
- ps.set("name", "Joe");
- ps.set("age", "32");
- ps.set("isMale", "true");
-
- will cause the invocations anObject.setName("Joe"), anObject.setAge(32),
- and setMale(true) if such methods exist with those signatures.
- Otherwise an {@link IntrospectionException} are thrown.
-
- @author Anders Kristensen
- @since 1.1
- */
-public class PropertySetter {
- protected Object obj;
- protected PropertyDescriptor[] props;
-
- /**
- Create a new PropertySetter for the specified Object. This is done
- in prepartion for invoking {@link #setProperty} one or more times.
-
- @param obj the object for which to set properties
- */
- public
- PropertySetter(Object obj) {
- this.obj = obj;
- }
-
- /**
- Uses JavaBeans {@link Introspector} to computer setters of object to be
- configured.
- */
- protected
- void introspect() {
- try {
- BeanInfo bi = Introspector.getBeanInfo(obj.getClass());
- props = bi.getPropertyDescriptors();
- } catch (IntrospectionException ex) {
- LogLog.error("Failed to introspect "+obj+": " + ex.getMessage());
- props = new PropertyDescriptor[0];
- }
- }
-
-
- /**
- Set the properties of an object passed as a parameter in one
- go. The properties are parsed relative to a
- prefix.
-
- @param obj The object to configure.
- @param properties A java.util.Properties containing keys and values.
- @param prefix Only keys having the specified prefix will be set.
- */
- public
- static
- void setProperties(Object obj, Properties properties, String prefix) {
- new PropertySetter(obj).setProperties(properties, prefix);
- }
-
-
- /**
- Set the properites for the object that match the
- prefix passed as parameter.
-
-
- */
- public
- void setProperties(Properties properties, String prefix) {
- int len = prefix.length();
-
- for (Enumeration e = properties.propertyNames(); e.hasMoreElements(); ) {
- String key = (String) e.nextElement();
-
- // handle only properties that start with the desired frefix.
- if (key.startsWith(prefix)) {
-
-
- // ignore key if it contains dots after the prefix
- if (key.indexOf('.', len + 1) > 0) {
- //System.err.println("----------Ignoring---["+key
- // +"], prefix=["+prefix+"].");
- continue;
- }
-
- String value = OptionConverter.findAndSubst(key, properties);
- key = key.substring(len);
- if (("layout".equals(key) || "errorhandler".equals(key)) && obj instanceof Appender) {
- continue;
- }
- //
- // if the property type is an OptionHandler
- // (for example, triggeringPolicy of org.apache.log4j.rolling.RollingFileAppender)
- PropertyDescriptor prop = getPropertyDescriptor(Introspector.decapitalize(key));
- if (prop != null
- && OptionHandler.class.isAssignableFrom(prop.getPropertyType())
- && prop.getWriteMethod() != null) {
- OptionHandler opt = (OptionHandler)
- OptionConverter.instantiateByKey(properties, prefix + key,
- prop.getPropertyType(),
- null);
- PropertySetter setter = new PropertySetter(opt);
- setter.setProperties(properties, prefix + key + ".");
- try {
- prop.getWriteMethod().invoke(this.obj, new Object[] { opt });
- } catch(IllegalAccessException ex) {
- LogLog.warn("Failed to set property [" + key +
- "] to value \"" + value + "\". ", ex);
- } catch(InvocationTargetException ex) {
- if (ex.getTargetException() instanceof InterruptedException
- || ex.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.warn("Failed to set property [" + key +
- "] to value \"" + value + "\". ", ex);
- } catch(RuntimeException ex) {
- LogLog.warn("Failed to set property [" + key +
- "] to value \"" + value + "\". ", ex);
- }
- continue;
- }
-
- setProperty(key, value);
- }
- }
- activate();
- }
-
- /**
- Set a property on this PropertySetter's Object. If successful, this
- method will invoke a setter method on the underlying Object. The
- setter is the one for the specified property name and the value is
- determined partly from the setter argument type and partly from the
- value specified in the call to this method.
-
- If the setter expects a String no conversion is necessary.
- If it expects an int, then an attempt is made to convert 'value'
- to an int using new Integer(value). If the setter expects a boolean,
- the conversion is by new Boolean(value).
-
- @param name name of the property
- @param value String value of the property
- */
- public
- void setProperty(String name, String value) {
- if (value == null) return;
-
- name = Introspector.decapitalize(name);
- PropertyDescriptor prop = getPropertyDescriptor(name);
-
- //LogLog.debug("---------Key: "+name+", type="+prop.getPropertyType());
-
- if (prop == null) {
- LogLog.warn("No such property [" + name + "] in "+
- obj.getClass().getName()+"." );
- } else {
- try {
- setProperty(prop, name, value);
- } catch (PropertySetterException ex) {
- LogLog.warn("Failed to set property [" + name +
- "] to value \"" + value + "\". ", ex.rootCause);
- }
- }
- }
-
- /**
- Set the named property given a {@link PropertyDescriptor}.
-
- @param prop A PropertyDescriptor describing the characteristics
- of the property to set.
- @param name The named of the property to set.
- @param value The value of the property.
- */
- public
- void setProperty(PropertyDescriptor prop, String name, String value)
- throws PropertySetterException {
- Method setter = prop.getWriteMethod();
- if (setter == null) {
- throw new PropertySetterException("No setter for property ["+name+"].");
- }
- Class[] paramTypes = setter.getParameterTypes();
- if (paramTypes.length != 1) {
- throw new PropertySetterException("#params for setter != 1");
- }
-
- Object arg;
- try {
- arg = convertArg(value, paramTypes[0]);
- } catch (Throwable t) {
- throw new PropertySetterException("Conversion to type ["+paramTypes[0]+
- "] failed. Reason: "+t);
- }
- if (arg == null) {
- throw new PropertySetterException(
- "Conversion to type ["+paramTypes[0]+"] failed.");
- }
- LogLog.debug("Setting property [" + name + "] to [" +arg+"].");
- try {
- setter.invoke(obj, new Object[] { arg });
- } catch (IllegalAccessException ex) {
- throw new PropertySetterException(ex);
- } catch (InvocationTargetException ex) {
- if (ex.getTargetException() instanceof InterruptedException
- || ex.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- throw new PropertySetterException(ex);
- } catch (RuntimeException ex) {
- throw new PropertySetterException(ex);
- }
- }
-
-
- /**
- Convert val a String parameter to an object of a
- given type.
- */
- protected
- Object convertArg(String val, Class type) {
- if(val == null)
- return null;
-
- String v = val.trim();
- if (String.class.isAssignableFrom(type)) {
- return val;
- } else if (Integer.TYPE.isAssignableFrom(type)) {
- return new Integer(v);
- } else if (Long.TYPE.isAssignableFrom(type)) {
- return new Long(v);
- } else if (Boolean.TYPE.isAssignableFrom(type)) {
- if ("true".equalsIgnoreCase(v)) {
- return Boolean.TRUE;
- } else if ("false".equalsIgnoreCase(v)) {
- return Boolean.FALSE;
- }
- } else if (Priority.class.isAssignableFrom(type)) {
- return OptionConverter.toLevel(v, (Level) Level.DEBUG);
- } else if (ErrorHandler.class.isAssignableFrom(type)) {
- return OptionConverter.instantiateByClassName(v,
- ErrorHandler.class, null);
- }
- return null;
- }
-
-
- protected
- PropertyDescriptor getPropertyDescriptor(String name) {
- if (props == null) introspect();
-
- for (int i = 0; i < props.length; i++) {
- if (name.equals(props[i].getName())) {
- return props[i];
- }
- }
- return null;
- }
-
- public
- void activate() {
- if (obj instanceof OptionHandler) {
- ((OptionHandler) obj).activateOptions();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/config/PropertySetterException.java b/java/src/org/apache/log4j/config/PropertySetterException.java
deleted file mode 100644
index c6314cc..0000000
--- a/java/src/org/apache/log4j/config/PropertySetterException.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.config;
-
-/**
- * Thrown when an error is encountered whilst attempting to set a property
- * using the {@link PropertySetter} utility class.
- *
- * @author Anders Kristensen
- * @since 1.1
- */
-public class PropertySetterException extends Exception {
- private static final long serialVersionUID = -1352613734254235861L;
- protected Throwable rootCause;
-
- public
- PropertySetterException(String msg) {
- super(msg);
- }
-
- public
- PropertySetterException(Throwable rootCause)
- {
- super();
- this.rootCause = rootCause;
- }
-
- /**
- Returns descriptive text on the cause of this exception.
- */
- public
- String getMessage() {
- String msg = super.getMessage();
- if (msg == null && rootCause != null) {
- msg = rootCause.getMessage();
- }
- return msg;
- }
-}
diff --git a/java/src/org/apache/log4j/config/package.html b/java/src/org/apache/log4j/config/package.html
deleted file mode 100644
index 973dce4..0000000
--- a/java/src/org/apache/log4j/config/package.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-Package used in getting/setting component properties.
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java b/java/src/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java
deleted file mode 100644
index 737ee85..0000000
--- a/java/src/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Date;
-import java.util.Calendar;
-import java.util.TimeZone;
-import java.text.FieldPosition;
-import java.text.ParsePosition;
-import java.text.DateFormat;
-
-
-/**
- Formats a {@link Date} in the format "HH:mm:ss,SSS" for example,
- "15:49:37,459".
-
- @author Ceki Gülcü
- @author Andrew Vajoczki
-
- @since 0.7.5
-*/
-public class AbsoluteTimeDateFormat extends DateFormat {
- private static final long serialVersionUID = -388856345976723342L;
-
- /**
- String constant used to specify {@link
- org.apache.log4j.helpers.AbsoluteTimeDateFormat} in layouts. Current
- value is ABSOLUTE. */
- public final static String ABS_TIME_DATE_FORMAT = "ABSOLUTE";
-
- /**
- String constant used to specify {@link
- org.apache.log4j.helpers.DateTimeDateFormat} in layouts. Current
- value is DATE.
- */
- public final static String DATE_AND_TIME_DATE_FORMAT = "DATE";
-
- /**
- String constant used to specify {@link
- org.apache.log4j.helpers.ISO8601DateFormat} in layouts. Current
- value is ISO8601.
- */
- public final static String ISO8601_DATE_FORMAT = "ISO8601";
-
- public
- AbsoluteTimeDateFormat() {
- setCalendar(Calendar.getInstance());
- }
-
- public
- AbsoluteTimeDateFormat(TimeZone timeZone) {
- setCalendar(Calendar.getInstance(timeZone));
- }
-
- private static long previousTime;
- private static char[] previousTimeWithoutMillis = new char[9]; // "HH:mm:ss."
-
- /**
- Appends to sbuf the time in the format
- "HH:mm:ss,SSS" for example, "15:49:37,459"
-
- @param date the date to format
- @param sbuf the string buffer to write to
- @param fieldPosition remains untouched
- */
- public
- StringBuffer format(Date date, StringBuffer sbuf,
- FieldPosition fieldPosition) {
-
- long now = date.getTime();
- int millis = (int)(now % 1000);
-
- if ((now - millis) != previousTime || previousTimeWithoutMillis[0] == 0) {
- // We reach this point at most once per second
- // across all threads instead of each time format()
- // is called. This saves considerable CPU time.
-
- calendar.setTime(date);
-
- int start = sbuf.length();
-
- int hour = calendar.get(Calendar.HOUR_OF_DAY);
- if(hour < 10) {
- sbuf.append('0');
- }
- sbuf.append(hour);
- sbuf.append(':');
-
- int mins = calendar.get(Calendar.MINUTE);
- if(mins < 10) {
- sbuf.append('0');
- }
- sbuf.append(mins);
- sbuf.append(':');
-
- int secs = calendar.get(Calendar.SECOND);
- if(secs < 10) {
- sbuf.append('0');
- }
- sbuf.append(secs);
- sbuf.append(',');
-
- // store the time string for next time to avoid recomputation
- sbuf.getChars(start, sbuf.length(), previousTimeWithoutMillis, 0);
-
- previousTime = now - millis;
- }
- else {
- sbuf.append(previousTimeWithoutMillis);
- }
-
-
-
- if(millis < 100)
- sbuf.append('0');
- if(millis < 10)
- sbuf.append('0');
-
- sbuf.append(millis);
- return sbuf;
- }
-
- /**
- This method does not do anything but return null.
- */
- public
- Date parse(String s, ParsePosition pos) {
- return null;
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/AppenderAttachableImpl.java b/java/src/org/apache/log4j/helpers/AppenderAttachableImpl.java
deleted file mode 100644
index 0e8cd38..0000000
--- a/java/src/org/apache/log4j/helpers/AppenderAttachableImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import org.apache.log4j.spi.AppenderAttachable;
-import org.apache.log4j.spi.LoggingEvent;
-
-import org.apache.log4j.Appender;
-import java.util.Vector;
-import java.util.Enumeration;
-
-/**
- A straightforward implementation of the {@link AppenderAttachable}
- interface.
-
- @author Ceki Gülcü
- @since version 0.9.1 */
-public class AppenderAttachableImpl implements AppenderAttachable {
-
- /** Array of appenders. */
- protected Vector appenderList;
-
- /**
- Attach an appender. If the appender is already in the list in
- won't be added again.
- */
- public
- void addAppender(Appender newAppender) {
- // Null values for newAppender parameter are strictly forbidden.
- if(newAppender == null)
- return;
-
- if(appenderList == null) {
- appenderList = new Vector(1);
- }
- if(!appenderList.contains(newAppender))
- appenderList.addElement(newAppender);
- }
-
- /**
- Call the doAppend method on all attached appenders. */
- public
- int appendLoopOnAppenders(LoggingEvent event) {
- int size = 0;
- Appender appender;
-
- if(appenderList != null) {
- size = appenderList.size();
- for(int i = 0; i < size; i++) {
- appender = (Appender) appenderList.elementAt(i);
- appender.doAppend(event);
- }
- }
- return size;
- }
-
-
- /**
- Get all attached appenders as an Enumeration. If there are no
- attached appenders null is returned.
-
- @return Enumeration An enumeration of attached appenders.
- */
- public
- Enumeration getAllAppenders() {
- if(appenderList == null)
- return null;
- else
- return appenderList.elements();
- }
-
- /**
- Look for an attached appender named as name.
-
- Return the appender with that name if in the list. Return null
- otherwise.
-
- */
- public
- Appender getAppender(String name) {
- if(appenderList == null || name == null)
- return null;
-
- int size = appenderList.size();
- Appender appender;
- for(int i = 0; i < size; i++) {
- appender = (Appender) appenderList.elementAt(i);
- if(name.equals(appender.getName()))
- return appender;
- }
- return null;
- }
-
-
- /**
- Returns true if the specified appender is in the
- list of attached appenders, false otherwise.
-
- @since 1.2 */
- public
- boolean isAttached(Appender appender) {
- if(appenderList == null || appender == null)
- return false;
-
- int size = appenderList.size();
- Appender a;
- for(int i = 0; i < size; i++) {
- a = (Appender) appenderList.elementAt(i);
- if(a == appender)
- return true;
- }
- return false;
- }
-
-
-
- /**
- * Remove and close all previously attached appenders.
- * */
- public
- void removeAllAppenders() {
- if(appenderList != null) {
- int len = appenderList.size();
- for(int i = 0; i < len; i++) {
- Appender a = (Appender) appenderList.elementAt(i);
- a.close();
- }
- appenderList.removeAllElements();
- appenderList = null;
- }
- }
-
-
- /**
- Remove the appender passed as parameter form the list of attached
- appenders. */
- public
- void removeAppender(Appender appender) {
- if(appender == null || appenderList == null)
- return;
- appenderList.removeElement(appender);
- }
-
-
- /**
- Remove the appender with the name passed as parameter form the
- list of appenders.
- */
- public
- void removeAppender(String name) {
- if(name == null || appenderList == null) return;
- int size = appenderList.size();
- for(int i = 0; i < size; i++) {
- if(name.equals(((Appender)appenderList.elementAt(i)).getName())) {
- appenderList.removeElementAt(i);
- break;
- }
- }
- }
-
-}
diff --git a/java/src/org/apache/log4j/helpers/BoundedFIFO.java b/java/src/org/apache/log4j/helpers/BoundedFIFO.java
deleted file mode 100644
index e5ce96c..0000000
--- a/java/src/org/apache/log4j/helpers/BoundedFIFO.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Mathias Bogaert
-// joelr@viair.com
-
-package org.apache.log4j.helpers;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- BoundedFIFO serves as the bounded first-in-first-out
- buffer heavily used by the {@link org.apache.log4j.AsyncAppender}.
-
- @author Ceki Gülcü
- @since version 0.9.1 */
-public class BoundedFIFO {
-
- LoggingEvent[] buf;
- int numElements = 0;
- int first = 0;
- int next = 0;
- int maxSize;
-
- /**
- Instantiate a new BoundedFIFO with a maximum size passed as argument.
- */
- public
- BoundedFIFO(int maxSize) {
- if(maxSize < 1) {
- throw new IllegalArgumentException("The maxSize argument ("+maxSize+
- ") is not a positive integer.");
- }
- this.maxSize = maxSize;
- buf = new LoggingEvent[maxSize];
- }
-
- /**
- Get the first element in the buffer. Returns null if
- there are no elements in the buffer. */
- public
- LoggingEvent get() {
- if(numElements == 0)
- return null;
-
- LoggingEvent r = buf[first];
- buf[first] = null; // help garbage collection
-
- if(++first == maxSize) {
- first = 0;
- }
- numElements--;
- return r;
- }
-
- /**
- Place a {@link LoggingEvent} in the buffer. If the buffer is full
- then the event is silently dropped. It is the caller's
- responsability to make sure that the buffer has free space. */
- public
- void put(LoggingEvent o) {
- if(numElements != maxSize) {
- buf[next] = o;
- if(++next == maxSize) {
- next = 0;
- }
- numElements++;
- }
- }
-
- /**
- Get the maximum size of the buffer.
- */
- public
- int getMaxSize() {
- return maxSize;
- }
-
- /**
- Return true if the buffer is full, that is, whether
- the number of elements in the buffer equals the buffer size. */
- public
- boolean isFull() {
- return numElements == maxSize;
- }
-
- /**
- Get the number of elements in the buffer. This number is
- guaranteed to be in the range 0 to maxSize
- (inclusive).
- */
- public
- int length() {
- return numElements;
- }
-
-
- int min(int a, int b) {
- return a < b ? a : b;
- }
-
-
- /**
- Resize the buffer to a new size. If the new size is smaller than
- the old size events might be lost.
-
- @since 1.1
- */
- synchronized
- public
- void resize(int newSize) {
- if(newSize == maxSize)
- return;
-
-
- LoggingEvent[] tmp = new LoggingEvent[newSize];
-
- // we should not copy beyond the buf array
- int len1 = maxSize - first;
-
- // we should not copy beyond the tmp array
- len1 = min(len1, newSize);
-
- // er.. how much do we actually need to copy?
- // We should not copy more than the actual number of elements.
- len1 = min(len1, numElements);
-
- // Copy from buf starting a first, to tmp, starting at position 0, len1 elements.
- System.arraycopy(buf, first, tmp, 0, len1);
-
- // Are there any uncopied elements and is there still space in the new array?
- int len2 = 0;
- if((len1 < numElements) && (len1 < newSize)) {
- len2 = numElements - len1;
- len2 = min(len2, newSize - len1);
- System.arraycopy(buf, 0, tmp, len1, len2);
- }
-
- this.buf = tmp;
- this.maxSize = newSize;
- this.first=0;
- this.numElements = len1+len2;
- this.next = this.numElements;
- if(this.next == this.maxSize) // this should never happen, but again, it just might.
- this.next = 0;
- }
-
-
- /**
- Returns true if there is just one element in the
- buffer. In other words, if there were no elements before the last
- {@link #put} operation completed. */
- public
- boolean wasEmpty() {
- return numElements == 1;
- }
-
- /**
- Returns true if the number of elements in the
- buffer plus 1 equals the maximum buffer size, returns
- false otherwise. */
- public
- boolean wasFull() {
- return (numElements+1 == maxSize);
- }
-
-}
diff --git a/java/src/org/apache/log4j/helpers/CountingQuietWriter.java b/java/src/org/apache/log4j/helpers/CountingQuietWriter.java
deleted file mode 100644
index 55199e4..0000000
--- a/java/src/org/apache/log4j/helpers/CountingQuietWriter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.io.Writer;
-import java.io.IOException;
-
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.ErrorCode;
-
-/**
- Counts the number of bytes written.
-
- @author Heinz Richter, heinz.richter@frogdot.com
- @since 0.8.1
-
- */
-public class CountingQuietWriter extends QuietWriter {
-
- protected long count;
-
- public
- CountingQuietWriter(Writer writer, ErrorHandler eh) {
- super(writer, eh);
- }
-
- public
- void write(String string) {
- try {
- out.write(string);
- count += string.length();
- }
- catch(IOException e) {
- errorHandler.error("Write failure.", e, ErrorCode.WRITE_FAILURE);
- }
- }
-
- public
- long getCount() {
- return count;
- }
-
- public
- void setCount(long count) {
- this.count = count;
- }
-
-}
diff --git a/java/src/org/apache/log4j/helpers/CyclicBuffer.java b/java/src/org/apache/log4j/helpers/CyclicBuffer.java
deleted file mode 100644
index 9077847..0000000
--- a/java/src/org/apache/log4j/helpers/CyclicBuffer.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
-
- CyclicBuffer is used by other appenders to hold {@link LoggingEvent
- LoggingEvents} for immediate or differed display.
-
-
This buffer gives read access to any element in the buffer not
- just the first or last element.
-
- @author Ceki Gülcü
- @since 0.9.0
-
- */
-public class CyclicBuffer {
-
- LoggingEvent[] ea;
- int first;
- int last;
- int numElems;
- int maxSize;
-
- /**
- Instantiate a new CyclicBuffer of at most maxSize events.
-
- The maxSize argument must a positive integer.
-
- @param maxSize The maximum number of elements in the buffer.
- */
- public CyclicBuffer(int maxSize) throws IllegalArgumentException {
- if(maxSize < 1) {
- throw new IllegalArgumentException("The maxSize argument ("+maxSize+
- ") is not a positive integer.");
- }
- this.maxSize = maxSize;
- ea = new LoggingEvent[maxSize];
- first = 0;
- last = 0;
- numElems = 0;
- }
-
- /**
- Add an event as the last event in the buffer.
-
- */
- public
- void add(LoggingEvent event) {
- ea[last] = event;
- if(++last == maxSize)
- last = 0;
-
- if(numElems < maxSize)
- numElems++;
- else if(++first == maxSize)
- first = 0;
- }
-
-
- /**
- Get the ith oldest event currently in the buffer. If
- i is outside the range 0 to the number of elements
- currently in the buffer, then null is returned.
-
-
- */
- public
- LoggingEvent get(int i) {
- if(i < 0 || i >= numElems)
- return null;
-
- return ea[(first + i) % maxSize];
- }
-
- public
- int getMaxSize() {
- return maxSize;
- }
-
- /**
- Get the oldest (first) element in the buffer. The oldest element
- is removed from the buffer.
- */
- public
- LoggingEvent get() {
- LoggingEvent r = null;
- if(numElems > 0) {
- numElems--;
- r = ea[first];
- ea[first] = null;
- if(++first == maxSize)
- first = 0;
- }
- return r;
- }
-
- /**
- Get the number of elements in the buffer. This number is
- guaranteed to be in the range 0 to maxSize
- (inclusive).
- */
- public
- int length() {
- return numElems;
- }
-
- /**
- Resize the cyclic buffer to newSize.
-
- @throws IllegalArgumentException if newSize is negative.
- */
- public
- void resize(int newSize) {
- if(newSize < 0) {
- throw new IllegalArgumentException("Negative array size ["+newSize+
- "] not allowed.");
- }
- if(newSize == numElems)
- return; // nothing to do
-
- LoggingEvent[] temp = new LoggingEvent[newSize];
-
- int loopLen = newSize < numElems ? newSize : numElems;
-
- for(int i = 0; i < loopLen; i++) {
- temp[i] = ea[first];
- ea[first] = null;
- if(++first == numElems)
- first = 0;
- }
- ea = temp;
- first = 0;
- numElems = loopLen;
- maxSize = newSize;
- if (loopLen == newSize) {
- last = 0;
- } else {
- last = loopLen;
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/DateLayout.java b/java/src/org/apache/log4j/helpers/DateLayout.java
deleted file mode 100644
index 383ef38..0000000
--- a/java/src/org/apache/log4j/helpers/DateLayout.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import org.apache.log4j.Layout;
-import org.apache.log4j.spi.LoggingEvent;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.TimeZone;
-import java.text.FieldPosition;
-
-
-/**
- This abstract layout takes care of all the date related options and
- formatting work.
-
-
- @author Ceki Gülcü
- */
-abstract public class DateLayout extends Layout {
-
- /**
- String constant designating no time information. Current value of
- this constant is NULL.
-
- */
- public final static String NULL_DATE_FORMAT = "NULL";
-
- /**
- String constant designating relative time. Current value of
- this constant is RELATIVE.
- */
- public final static String RELATIVE_TIME_DATE_FORMAT = "RELATIVE";
-
- protected FieldPosition pos = new FieldPosition(0);
-
- /**
- @deprecated Options are now handled using the JavaBeans paradigm.
- This constant is not longer needed and will be removed in the
- near term.
- */
- final static public String DATE_FORMAT_OPTION = "DateFormat";
-
- /**
- @deprecated Options are now handled using the JavaBeans paradigm.
- This constant is not longer needed and will be removed in the
- near term.
- */
- final static public String TIMEZONE_OPTION = "TimeZone";
-
- private String timeZoneID;
- private String dateFormatOption;
-
- protected DateFormat dateFormat;
- protected Date date = new Date();
-
- /**
- @deprecated Use the setter method for the option directly instead
- of the generic setOption method.
- */
- public
- String[] getOptionStrings() {
- return new String[] {DATE_FORMAT_OPTION, TIMEZONE_OPTION};
- }
-
- /**
- @deprecated Use the setter method for the option directly instead
- of the generic setOption method.
- */
- public
- void setOption(String option, String value) {
- if(option.equalsIgnoreCase(DATE_FORMAT_OPTION)) {
- dateFormatOption = value.toUpperCase();
- } else if(option.equalsIgnoreCase(TIMEZONE_OPTION)) {
- timeZoneID = value;
- }
- }
-
-
- /**
- The value of the DateFormat option should be either an
- argument to the constructor of {@link SimpleDateFormat} or one of
- the srings "NULL", "RELATIVE", "ABSOLUTE", "DATE" or "ISO8601.
- */
- public
- void setDateFormat(String dateFormat) {
- if (dateFormat != null) {
- dateFormatOption = dateFormat;
- }
- setDateFormat(dateFormatOption, TimeZone.getDefault());
- }
-
- /**
- Returns value of the DateFormat option.
- */
- public
- String getDateFormat() {
- return dateFormatOption;
- }
-
- /**
- The TimeZoneID option is a time zone ID string in the format
- expected by the {@link TimeZone#getTimeZone} method.
- */
- public
- void setTimeZone(String timeZone) {
- this.timeZoneID = timeZone;
- }
-
- /**
- Returns value of the TimeZone option.
- */
- public
- String getTimeZone() {
- return timeZoneID;
- }
-
- public
- void activateOptions() {
- setDateFormat(dateFormatOption);
- if(timeZoneID != null && dateFormat != null) {
- dateFormat.setTimeZone(TimeZone.getTimeZone(timeZoneID));
- }
- }
-
- public
- void dateFormat(StringBuffer buf, LoggingEvent event) {
- if(dateFormat != null) {
- date.setTime(event.timeStamp);
- dateFormat.format(date, buf, this.pos);
- buf.append(' ');
- }
- }
-
- /**
- Sets the {@link DateFormat} used to format time and date in the
- zone determined by timeZone.
- */
- public
- void setDateFormat(DateFormat dateFormat, TimeZone timeZone) {
- this.dateFormat = dateFormat;
- this.dateFormat.setTimeZone(timeZone);
- }
-
- /**
- Sets the DateFormat used to format date and time in the time zone
- determined by timeZone parameter. The {@link DateFormat} used
- will depend on the dateFormatType.
-
-
The recognized types are {@link #NULL_DATE_FORMAT}, {@link
- #RELATIVE_TIME_DATE_FORMAT} {@link
- AbsoluteTimeDateFormat#ABS_TIME_DATE_FORMAT}, {@link
- AbsoluteTimeDateFormat#DATE_AND_TIME_DATE_FORMAT} and {@link
- AbsoluteTimeDateFormat#ISO8601_DATE_FORMAT}. If the
- dateFormatType is not one of the above, then the
- argument is assumed to be a date pattern for {@link
- SimpleDateFormat}.
- */
- public
- void setDateFormat(String dateFormatType, TimeZone timeZone) {
- if(dateFormatType == null) {
- this.dateFormat = null;
- return;
- }
-
- if(dateFormatType.equalsIgnoreCase(NULL_DATE_FORMAT)) {
- this.dateFormat = null;
- } else if (dateFormatType.equalsIgnoreCase(RELATIVE_TIME_DATE_FORMAT)) {
- this.dateFormat = new RelativeTimeDateFormat();
- } else if(dateFormatType.equalsIgnoreCase(
- AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT)) {
- this.dateFormat = new AbsoluteTimeDateFormat(timeZone);
- } else if(dateFormatType.equalsIgnoreCase(
- AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT)) {
- this.dateFormat = new DateTimeDateFormat(timeZone);
- } else if(dateFormatType.equalsIgnoreCase(
- AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT)) {
- this.dateFormat = new ISO8601DateFormat(timeZone);
- } else {
- this.dateFormat = new SimpleDateFormat(dateFormatType);
- this.dateFormat.setTimeZone(timeZone);
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/DateTimeDateFormat.java b/java/src/org/apache/log4j/helpers/DateTimeDateFormat.java
deleted file mode 100644
index 559f731..0000000
--- a/java/src/org/apache/log4j/helpers/DateTimeDateFormat.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Calendar;
-import java.util.TimeZone;
-import java.util.Date;
-import java.text.FieldPosition;
-import java.text.ParsePosition;
-import java.text.DateFormatSymbols;
-
-/**
- Formats a {@link Date} in the format "dd MMM yyyy HH:mm:ss,SSS" for example,
- "06 Nov 1994 15:49:37,459".
-
- @author Ceki Gülcü
- @since 0.7.5
-*/
-public class DateTimeDateFormat extends AbsoluteTimeDateFormat {
- private static final long serialVersionUID = 5547637772208514971L;
-
- String[] shortMonths;
-
- public
- DateTimeDateFormat() {
- super();
- shortMonths = new DateFormatSymbols().getShortMonths();
- }
-
- public
- DateTimeDateFormat(TimeZone timeZone) {
- this();
- setCalendar(Calendar.getInstance(timeZone));
- }
-
- /**
- Appends to sbuf the date in the format "dd MMM yyyy
- HH:mm:ss,SSS" for example, "06 Nov 1994 08:49:37,459".
-
- @param sbuf the string buffer to write to
- */
- public
- StringBuffer format(Date date, StringBuffer sbuf,
- FieldPosition fieldPosition) {
-
- calendar.setTime(date);
-
- int day = calendar.get(Calendar.DAY_OF_MONTH);
- if(day < 10)
- sbuf.append('0');
- sbuf.append(day);
- sbuf.append(' ');
- sbuf.append(shortMonths[calendar.get(Calendar.MONTH)]);
- sbuf.append(' ');
-
- int year = calendar.get(Calendar.YEAR);
- sbuf.append(year);
- sbuf.append(' ');
-
- return super.format(date, sbuf, fieldPosition);
- }
-
- /**
- This method does not do anything but return null.
- */
- public
- Date parse(java.lang.String s, ParsePosition pos) {
- return null;
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/FileWatchdog.java b/java/src/org/apache/log4j/helpers/FileWatchdog.java
deleted file mode 100644
index b78a4af..0000000
--- a/java/src/org/apache/log4j/helpers/FileWatchdog.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Mathias Bogaert
-
-package org.apache.log4j.helpers;
-
-import java.io.File;
-
-/**
- Check every now and then that a certain file has not changed. If it
- has, then call the {@link #doOnChange} method.
-
-
- @author Ceki Gülcü
- @since version 0.9.1 */
-public abstract class FileWatchdog extends Thread {
-
- /**
- The default delay between every file modification check, set to 60
- seconds. */
- static final public long DEFAULT_DELAY = 60000;
- /**
- The name of the file to observe for changes.
- */
- protected String filename;
-
- /**
- The delay to observe between every check. By default set {@link
- #DEFAULT_DELAY}. */
- protected long delay = DEFAULT_DELAY;
-
- File file;
- long lastModif = 0;
- boolean warnedAlready = false;
- boolean interrupted = false;
-
- protected
- FileWatchdog(String filename) {
- super("FileWatchdog");
- this.filename = filename;
- file = new File(filename);
- setDaemon(true);
- checkAndConfigure();
- }
-
- /**
- Set the delay to observe between each check of the file changes.
- */
- public
- void setDelay(long delay) {
- this.delay = delay;
- }
-
- abstract
- protected
- void doOnChange();
-
- protected
- void checkAndConfigure() {
- boolean fileExists;
- try {
- fileExists = file.exists();
- } catch(SecurityException e) {
- LogLog.warn("Was not allowed to read check file existance, file:["+
- filename+"].");
- interrupted = true; // there is no point in continuing
- return;
- }
-
- if(fileExists) {
- long l = file.lastModified(); // this can also throw a SecurityException
- if(l > lastModif) { // however, if we reached this point this
- lastModif = l; // is very unlikely.
- doOnChange();
- warnedAlready = false;
- }
- } else {
- if(!warnedAlready) {
- LogLog.debug("["+filename+"] does not exist.");
- warnedAlready = true;
- }
- }
- }
-
- public
- void run() {
- while(!interrupted) {
- try {
- Thread.sleep(delay);
- } catch(InterruptedException e) {
- // no interruption expected
- }
- checkAndConfigure();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/FormattingInfo.java b/java/src/org/apache/log4j/helpers/FormattingInfo.java
deleted file mode 100644
index e158243..0000000
--- a/java/src/org/apache/log4j/helpers/FormattingInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-
-/**
- FormattingInfo instances contain the information obtained when parsing
- formatting modifiers in conversion modifiers.
-
- @author Jim Cakalic
- @author Ceki Gülcü
-
- @since 0.8.2
- */
-public class FormattingInfo {
- int min = -1;
- int max = 0x7FFFFFFF;
- boolean leftAlign = false;
-
- void reset() {
- min = -1;
- max = 0x7FFFFFFF;
- leftAlign = false;
- }
-
- void dump() {
- LogLog.debug("min="+min+", max="+max+", leftAlign="+leftAlign);
- }
-}
-
diff --git a/java/src/org/apache/log4j/helpers/ISO8601DateFormat.java b/java/src/org/apache/log4j/helpers/ISO8601DateFormat.java
deleted file mode 100644
index 47b17d9..0000000
--- a/java/src/org/apache/log4j/helpers/ISO8601DateFormat.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Calendar;
-import java.util.TimeZone;
-import java.util.Date;
-import java.text.FieldPosition;
-import java.text.ParsePosition;
-
-// Contributors: Arndt Schoenewald
-
-/**
- Formats a {@link Date} in the format "yyyy-MM-dd HH:mm:ss,SSS" for example
- "1999-11-27 15:49:37,459".
-
- Refer to the summary of the
- International Standard Date and Time Notation for more
- information on this format.
-
- @author Ceki Gülcü
- @author Andrew Vajoczki
-
- @since 0.7.5
-*/
-public class ISO8601DateFormat extends AbsoluteTimeDateFormat {
- private static final long serialVersionUID = -759840745298755296L;
-
- public
- ISO8601DateFormat() {
- }
-
- public
- ISO8601DateFormat(TimeZone timeZone) {
- super(timeZone);
- }
-
- static private long lastTime;
- static private char[] lastTimeString = new char[20];
-
- /**
- Appends a date in the format "YYYY-mm-dd HH:mm:ss,SSS"
- to sbuf. For example: "1999-11-27 15:49:37,459".
-
- @param sbuf the StringBuffer to write to
- */
- public
- StringBuffer format(Date date, StringBuffer sbuf,
- FieldPosition fieldPosition) {
-
- long now = date.getTime();
- int millis = (int)(now % 1000);
-
- if ((now - millis) != lastTime || lastTimeString[0] == 0) {
- // We reach this point at most once per second
- // across all threads instead of each time format()
- // is called. This saves considerable CPU time.
-
- calendar.setTime(date);
-
- int start = sbuf.length();
-
- int year = calendar.get(Calendar.YEAR);
- sbuf.append(year);
-
- String month;
- switch(calendar.get(Calendar.MONTH)) {
- case Calendar.JANUARY: month = "-01-"; break;
- case Calendar.FEBRUARY: month = "-02-"; break;
- case Calendar.MARCH: month = "-03-"; break;
- case Calendar.APRIL: month = "-04-"; break;
- case Calendar.MAY: month = "-05-"; break;
- case Calendar.JUNE: month = "-06-"; break;
- case Calendar.JULY: month = "-07-"; break;
- case Calendar.AUGUST: month = "-08-"; break;
- case Calendar.SEPTEMBER: month = "-09-"; break;
- case Calendar.OCTOBER: month = "-10-"; break;
- case Calendar.NOVEMBER: month = "-11-"; break;
- case Calendar.DECEMBER: month = "-12-"; break;
- default: month = "-NA-"; break;
- }
- sbuf.append(month);
-
- int day = calendar.get(Calendar.DAY_OF_MONTH);
- if(day < 10)
- sbuf.append('0');
- sbuf.append(day);
-
- sbuf.append(' ');
-
- int hour = calendar.get(Calendar.HOUR_OF_DAY);
- if(hour < 10) {
- sbuf.append('0');
- }
- sbuf.append(hour);
- sbuf.append(':');
-
- int mins = calendar.get(Calendar.MINUTE);
- if(mins < 10) {
- sbuf.append('0');
- }
- sbuf.append(mins);
- sbuf.append(':');
-
- int secs = calendar.get(Calendar.SECOND);
- if(secs < 10) {
- sbuf.append('0');
- }
- sbuf.append(secs);
-
- sbuf.append(',');
-
- // store the time string for next time to avoid recomputation
- sbuf.getChars(start, sbuf.length(), lastTimeString, 0);
- lastTime = now - millis;
- }
- else {
- sbuf.append(lastTimeString);
- }
-
-
- if (millis < 100)
- sbuf.append('0');
- if (millis < 10)
- sbuf.append('0');
-
- sbuf.append(millis);
- return sbuf;
- }
-
- /**
- This method does not do anything but return null.
- */
- public
- Date parse(java.lang.String s, ParsePosition pos) {
- return null;
- }
-}
-
diff --git a/java/src/org/apache/log4j/helpers/Loader.java b/java/src/org/apache/log4j/helpers/Loader.java
deleted file mode 100644
index 207bfdf..0000000
--- a/java/src/org/apache/log4j/helpers/Loader.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.net.URL;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import java.io.InterruptedIOException;
-
-
-/**
- Load resources (or images) from various sources.
-
- @author Ceki Gülcü
- */
-
-public class Loader {
-
- static final String TSTR = "Caught Exception while in Loader.getResource. This may be innocuous.";
-
- // We conservatively assume that we are running under Java 1.x
- static private boolean java1 = true;
-
- static private boolean ignoreTCL = false;
-
- static {
- String prop = OptionConverter.getSystemProperty("java.version", null);
-
- if(prop != null) {
- int i = prop.indexOf('.');
- if(i != -1) {
- if(prop.charAt(i+1) != '1')
- java1 = false;
- }
- }
- String ignoreTCLProp = OptionConverter.getSystemProperty("log4j.ignoreTCL", null);
- if(ignoreTCLProp != null) {
- ignoreTCL = OptionConverter.toBoolean(ignoreTCLProp, true);
- }
- }
-
- /**
- * Get a resource by delegating to getResource(String).
- * @param resource resource name
- * @param clazz class, ignored.
- * @return URL to resource or null.
- * @deprecated as of 1.2.
- */
- public static URL getResource(String resource, Class clazz) {
- return getResource(resource);
- }
-
- /**
- This method will search for resource in different
- places. The search order is as follows:
-
-
-
- - Search for
resource using the thread context
- class loader under Java2. If that fails, search for
- resource using the class loader that loaded this
- class (Loader). Under JDK 1.1, only the the class
- loader that loaded this class (Loader) is used.
-
- - Try one last time with
-
ClassLoader.getSystemResource(resource), that is is
- using the system class loader in JDK 1.2 and virtual machine's
- built-in class loader in JDK 1.1.
-
-
- */
- static public URL getResource(String resource) {
- ClassLoader classLoader = null;
- URL url = null;
-
- try {
- if(!java1 && !ignoreTCL) {
- classLoader = getTCL();
- if(classLoader != null) {
- LogLog.debug("Trying to find ["+resource+"] using context classloader "
- +classLoader+".");
- url = classLoader.getResource(resource);
- if(url != null) {
- return url;
- }
- }
- }
-
- // We could not find resource. Ler us now try with the
- // classloader that loaded this class.
- classLoader = Loader.class.getClassLoader();
- if(classLoader != null) {
- LogLog.debug("Trying to find ["+resource+"] using "+classLoader
- +" class loader.");
- url = classLoader.getResource(resource);
- if(url != null) {
- return url;
- }
- }
- } catch(IllegalAccessException t) {
- LogLog.warn(TSTR, t);
- } catch(InvocationTargetException t) {
- if (t.getTargetException() instanceof InterruptedException
- || t.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.warn(TSTR, t);
- } catch(Throwable t) {
- //
- // can't be InterruptedException or InterruptedIOException
- // since not declared, must be error or RuntimeError.
- LogLog.warn(TSTR, t);
- }
-
- // Last ditch attempt: get the resource from the class path. It
- // may be the case that clazz was loaded by the Extentsion class
- // loader which the parent of the system class loader. Hence the
- // code below.
- LogLog.debug("Trying to find ["+resource+
- "] using ClassLoader.getSystemResource().");
- return ClassLoader.getSystemResource(resource);
- }
-
- /**
- Are we running under JDK 1.x?
- */
- public
- static
- boolean isJava1() {
- return java1;
- }
-
- /**
- * Get the Thread Context Loader which is a JDK 1.2 feature. If we
- * are running under JDK 1.1 or anything else goes wrong the method
- * returns null.
- *
- * */
- private static ClassLoader getTCL() throws IllegalAccessException,
- InvocationTargetException {
-
- // Are we running on a JDK 1.2 or later system?
- Method method = null;
- try {
- method = Thread.class.getMethod("getContextClassLoader", null);
- } catch (NoSuchMethodException e) {
- // We are running on JDK 1.1
- return null;
- }
-
- return (ClassLoader) method.invoke(Thread.currentThread(), null);
- }
-
-
-
- /**
- * If running under JDK 1.2 load the specified class using the
- * Thread contextClassLoader if that
- * fails try Class.forname. Under JDK 1.1 only Class.forName is
- * used.
- *
- */
- static public Class loadClass (String clazz) throws ClassNotFoundException {
- // Just call Class.forName(clazz) if we are running under JDK 1.1
- // or if we are instructed to ignore the TCL.
- if(java1 || ignoreTCL) {
- return Class.forName(clazz);
- } else {
- try {
- return getTCL().loadClass(clazz);
- }
- // we reached here because tcl was null or because of a
- // security exception, or because clazz could not be loaded...
- // In any case we now try one more time
- catch(InvocationTargetException e) {
- if (e.getTargetException() instanceof InterruptedException
- || e.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- } catch(Throwable t) {
- }
- }
- return Class.forName(clazz);
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/LogLog.java b/java/src/org/apache/log4j/helpers/LogLog.java
deleted file mode 100644
index a7bd588..0000000
--- a/java/src/org/apache/log4j/helpers/LogLog.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-/**
- This class used to output log statements from within the log4j package.
-
- Log4j components cannot make log4j logging calls. However, it is
- sometimes useful for the user to learn about what log4j is
- doing. You can enable log4j internal logging by defining the
- log4j.configDebug variable.
-
-
All log4j internal debug calls go to System.out
- where as internal error messages are sent to
- System.err. All internal messages are prepended with
- the string "log4j: ".
-
- @since 0.8.2
- @author Ceki Gülcü
-*/
-public class LogLog {
-
- /**
- Defining this value makes log4j print log4j-internal debug
- statements to System.out.
-
-
The value of this string is log4j.debug.
-
-
Note that the search for all option names is case sensitive. */
- public static final String DEBUG_KEY="log4j.debug";
-
-
- /**
- Defining this value makes log4j components print log4j-internal
- debug statements to System.out.
-
-
The value of this string is log4j.configDebug.
-
-
Note that the search for all option names is case sensitive.
-
- @deprecated Use {@link #DEBUG_KEY} instead.
- */
- public static final String CONFIG_DEBUG_KEY="log4j.configDebug";
-
- protected static boolean debugEnabled = false;
-
- /**
- In quietMode not even errors generate any output.
- */
- private static boolean quietMode = false;
-
- private static final String PREFIX = "log4j: ";
- private static final String ERR_PREFIX = "log4j:ERROR ";
- private static final String WARN_PREFIX = "log4j:WARN ";
-
- static {
- String key = OptionConverter.getSystemProperty(DEBUG_KEY, null);
-
- if(key == null) {
- key = OptionConverter.getSystemProperty(CONFIG_DEBUG_KEY, null);
- }
-
- if(key != null) {
- debugEnabled = OptionConverter.toBoolean(key, true);
- }
- }
-
- /**
- Allows to enable/disable log4j internal logging.
- */
- static
- public
- void setInternalDebugging(boolean enabled) {
- debugEnabled = enabled;
- }
-
- /**
- This method is used to output log4j internal debug
- statements. Output goes to System.out.
- */
- public
- static
- void debug(String msg) {
- if(debugEnabled && !quietMode) {
- System.out.println(PREFIX+msg);
- }
- }
-
- /**
- This method is used to output log4j internal debug
- statements. Output goes to System.out.
- */
- public
- static
- void debug(String msg, Throwable t) {
- if(debugEnabled && !quietMode) {
- System.out.println(PREFIX+msg);
- if(t != null)
- t.printStackTrace(System.out);
- }
- }
-
-
- /**
- This method is used to output log4j internal error
- statements. There is no way to disable error statements.
- Output goes to System.err.
- */
- public
- static
- void error(String msg) {
- if(quietMode)
- return;
- System.err.println(ERR_PREFIX+msg);
- }
-
- /**
- This method is used to output log4j internal error
- statements. There is no way to disable error statements.
- Output goes to System.err.
- */
- public
- static
- void error(String msg, Throwable t) {
- if(quietMode)
- return;
-
- System.err.println(ERR_PREFIX+msg);
- if(t != null) {
- t.printStackTrace();
- }
- }
-
- /**
- In quite mode no LogLog generates strictly no output, not even
- for errors.
-
- @param quietMode A true for not
- */
- public
- static
- void setQuietMode(boolean quietMode) {
- LogLog.quietMode = quietMode;
- }
-
- /**
- This method is used to output log4j internal warning
- statements. There is no way to disable warning statements.
- Output goes to System.err. */
- public
- static
- void warn(String msg) {
- if(quietMode)
- return;
-
- System.err.println(WARN_PREFIX+msg);
- }
-
- /**
- This method is used to output log4j internal warnings. There is
- no way to disable warning statements. Output goes to
- System.err. */
- public
- static
- void warn(String msg, Throwable t) {
- if(quietMode)
- return;
-
- System.err.println(WARN_PREFIX+msg);
- if(t != null) {
- t.printStackTrace();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/MDCKeySetExtractor.java b/java/src/org/apache/log4j/helpers/MDCKeySetExtractor.java
deleted file mode 100644
index 2d2a539..0000000
--- a/java/src/org/apache/log4j/helpers/MDCKeySetExtractor.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.pattern.LogEvent;
-
-import java.lang.reflect.Method;
-import java.util.Set;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ObjectInputStream;
-
-
-public final class MDCKeySetExtractor {
- private final Method getKeySetMethod;
- public static final MDCKeySetExtractor INSTANCE =
- new MDCKeySetExtractor();
-
-
- private MDCKeySetExtractor() {
- //
- // log4j 1.2.15 and later will have method to get names
- // of all keys in MDC
- //
- Method getMethod = null;
-
- try {
- getMethod = LoggingEvent.class.getMethod(
- "getPropertyKeySet", null);
- } catch(Exception ex) {
- getMethod = null;
- }
- getKeySetMethod = getMethod;
-
- }
-
- public Set getPropertyKeySet(final LoggingEvent event) throws Exception {
- //
- // MDC keys are not visible prior to log4j 1.2.15
- //
- Set keySet = null;
- if (getKeySetMethod != null) {
- keySet = (Set) getKeySetMethod.invoke(event, null);
- } else {
- //
- // for 1.2.14 and earlier could serialize and
- // extract MDC content
- ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
- ObjectOutputStream os = new ObjectOutputStream(outBytes);
- os.writeObject(event);
- os.close();
-
- byte[] raw = outBytes.toByteArray();
- //
- // bytes 6 and 7 should be the length of the original classname
- // should be the same as our substitute class name
- final String subClassName = LogEvent.class.getName();
- if (raw[6] == 0 || raw[7] == subClassName.length()) {
- //
- // manipulate stream to use our class name
- //
- for (int i = 0; i < subClassName.length(); i++) {
- raw[8 + i] = (byte) subClassName.charAt(i);
- }
- ByteArrayInputStream inBytes = new ByteArrayInputStream(raw);
- ObjectInputStream is = new ObjectInputStream(inBytes);
- Object cracked = is.readObject();
- if (cracked instanceof LogEvent) {
- keySet = ((LogEvent) cracked).getPropertyKeySet();
- }
- is.close();
- }
- }
- return keySet;
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/NullEnumeration.java b/java/src/org/apache/log4j/helpers/NullEnumeration.java
deleted file mode 100644
index 0f4310d..0000000
--- a/java/src/org/apache/log4j/helpers/NullEnumeration.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-/**
-
- An always-empty Enumerator.
-
- @author Anders Kristensen
- @since version 1.0
- */
-public class NullEnumeration implements Enumeration {
- private static final NullEnumeration instance = new NullEnumeration();
-
- private
- NullEnumeration() {
- }
-
- public static NullEnumeration getInstance() {
- return instance;
- }
-
- public
- boolean hasMoreElements() {
- return false;
- }
-
- public
- Object nextElement() {
- throw new NoSuchElementException();
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/OnlyOnceErrorHandler.java b/java/src/org/apache/log4j/helpers/OnlyOnceErrorHandler.java
deleted file mode 100644
index 950778d..0000000
--- a/java/src/org/apache/log4j/helpers/OnlyOnceErrorHandler.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.Logger;
-import org.apache.log4j.Appender;
-
-import java.io.InterruptedIOException;
-
-/**
-
- The OnlyOnceErrorHandler implements log4j's default
- error handling policy which consists of emitting a message for the
- first error in an appender and ignoring all following errors.
-
-
The error message is printed on System.err.
-
-
This policy aims at protecting an otherwise working application
- from being flooded with error messages when logging fails.
-
- @author Ceki Gülcü
- @since 0.9.0 */
-public class OnlyOnceErrorHandler implements ErrorHandler {
-
-
- final String WARN_PREFIX = "log4j warning: ";
- final String ERROR_PREFIX = "log4j error: ";
-
- boolean firstTime = true;
-
-
- /**
- Does not do anything.
- */
- public
- void setLogger(Logger logger) {
- }
-
-
- /**
- No options to activate.
- */
- public
- void activateOptions() {
- }
-
-
- /**
- Prints the message and the stack trace of the exception on
- System.err. */
- public
- void error(String message, Exception e, int errorCode) {
- error(message, e, errorCode, null);
- }
-
- /**
- Prints the message and the stack trace of the exception on
- System.err.
- */
- public
- void error(String message, Exception e, int errorCode, LoggingEvent event) {
- if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- if(firstTime) {
- LogLog.error(message, e);
- firstTime = false;
- }
- }
-
-
- /**
- Print a the error message passed as parameter on
- System.err.
- */
- public
- void error(String message) {
- if(firstTime) {
- LogLog.error(message);
- firstTime = false;
- }
- }
-
- /**
- Does not do anything.
- */
- public
- void setAppender(Appender appender) {
- }
-
- /**
- Does not do anything.
- */
- public
- void setBackupAppender(Appender appender) {
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/OptionConverter.java b/java/src/org/apache/log4j/helpers/OptionConverter.java
deleted file mode 100644
index 9291774..0000000
--- a/java/src/org/apache/log4j/helpers/OptionConverter.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Properties;
-import java.net.URL;
-import java.io.InterruptedIOException;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.Configurator;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.PropertyConfigurator;
-
-// Contributors: Avy Sharell (sharell@online.fr)
-// Matthieu Verbert (mve@zurich.ibm.com)
-// Colin Sampaleanu
-
-/**
- A convenience class to convert property values to specific types.
-
- @author Ceki Gülcü
- @author Simon Kitching;
- @author Anders Kristensen
-*/
-public class OptionConverter {
-
- static String DELIM_START = "${";
- static char DELIM_STOP = '}';
- static int DELIM_START_LEN = 2;
- static int DELIM_STOP_LEN = 1;
-
- /** OptionConverter is a static class. */
- private OptionConverter() {}
-
- public
- static
- String[] concatanateArrays(String[] l, String[] r) {
- int len = l.length + r.length;
- String[] a = new String[len];
-
- System.arraycopy(l, 0, a, 0, l.length);
- System.arraycopy(r, 0, a, l.length, r.length);
-
- return a;
- }
-
- public
- static
- String convertSpecialChars(String s) {
- char c;
- int len = s.length();
- StringBuffer sbuf = new StringBuffer(len);
-
- int i = 0;
- while(i < len) {
- c = s.charAt(i++);
- if (c == '\\') {
- c = s.charAt(i++);
- if(c == 'n') c = '\n';
- else if(c == 'r') c = '\r';
- else if(c == 't') c = '\t';
- else if(c == 'f') c = '\f';
- else if(c == '\b') c = '\b';
- else if(c == '\"') c = '\"';
- else if(c == '\'') c = '\'';
- else if(c == '\\') c = '\\';
- }
- sbuf.append(c);
- }
- return sbuf.toString();
- }
-
-
- /**
- Very similar to System.getProperty except
- that the {@link SecurityException} is hidden.
-
- @param key The key to search for.
- @param def The default value to return.
- @return the string value of the system property, or the default
- value if there is no property with that key.
-
- @since 1.1 */
- public
- static
- String getSystemProperty(String key, String def) {
- try {
- return System.getProperty(key, def);
- } catch(Throwable e) { // MS-Java throws com.ms.security.SecurityExceptionEx
- LogLog.debug("Was not allowed to read system property \""+key+"\".");
- return def;
- }
- }
-
-
- public
- static
- Object instantiateByKey(Properties props, String key, Class superClass,
- Object defaultValue) {
-
- // Get the value of the property in string form
- String className = findAndSubst(key, props);
- if(className == null) {
- LogLog.error("Could not find value for key " + key);
- return defaultValue;
- }
- // Trim className to avoid trailing spaces that cause problems.
- return OptionConverter.instantiateByClassName(className.trim(), superClass,
- defaultValue);
- }
-
- /**
- If value is "true", then true is
- returned. If value is "false", then
- true is returned. Otherwise, default is
- returned.
-
-
Case of value is unimportant. */
- public
- static
- boolean toBoolean(String value, boolean dEfault) {
- if(value == null)
- return dEfault;
- String trimmedVal = value.trim();
- if("true".equalsIgnoreCase(trimmedVal))
- return true;
- if("false".equalsIgnoreCase(trimmedVal))
- return false;
- return dEfault;
- }
-
- public
- static
- int toInt(String value, int dEfault) {
- if(value != null) {
- String s = value.trim();
- try {
- return Integer.valueOf(s).intValue();
- }
- catch (NumberFormatException e) {
- LogLog.error("[" + s + "] is not in proper int form.");
- e.printStackTrace();
- }
- }
- return dEfault;
- }
-
- /**
- Converts a standard or custom priority level to a Level
- object.
If value is of form
- "level#classname", then the specified class' toLevel method
- is called to process the specified level string; if no '#'
- character is present, then the default {@link org.apache.log4j.Level}
- class is used to process the level value.
-
-
As a special case, if the value parameter is
- equal to the string "NULL", then the value null will
- be returned.
-
-
If any error occurs while converting the value to a level,
- the defaultValue parameter, which may be
- null, is returned.
-
-
Case of value is insignificant for the level level, but is
- significant for the class name part, if present.
-
- @since 1.1 */
- public
- static
- Level toLevel(String value, Level defaultValue) {
- if(value == null)
- return defaultValue;
-
- value = value.trim();
-
- int hashIndex = value.indexOf('#');
- if (hashIndex == -1) {
- if("NULL".equalsIgnoreCase(value)) {
- return null;
- } else {
- // no class name specified : use standard Level class
- return(Level) Level.toLevel(value, defaultValue);
- }
- }
-
- Level result = defaultValue;
-
- String clazz = value.substring(hashIndex+1);
- String levelName = value.substring(0, hashIndex);
-
- // This is degenerate case but you never know.
- if("NULL".equalsIgnoreCase(levelName)) {
- return null;
- }
-
- LogLog.debug("toLevel" + ":class=[" + clazz + "]"
- + ":pri=[" + levelName + "]");
-
- try {
- Class customLevel = Loader.loadClass(clazz);
-
- // get a ref to the specified class' static method
- // toLevel(String, org.apache.log4j.Level)
- Class[] paramTypes = new Class[] { String.class,
- org.apache.log4j.Level.class
- };
- java.lang.reflect.Method toLevelMethod =
- customLevel.getMethod("toLevel", paramTypes);
-
- // now call the toLevel method, passing level string + default
- Object[] params = new Object[] {levelName, defaultValue};
- Object o = toLevelMethod.invoke(null, params);
-
- result = (Level) o;
- } catch(ClassNotFoundException e) {
- LogLog.warn("custom level class [" + clazz + "] not found.");
- } catch(NoSuchMethodException e) {
- LogLog.warn("custom level class [" + clazz + "]"
- + " does not have a class function toLevel(String, Level)", e);
- } catch(java.lang.reflect.InvocationTargetException e) {
- if (e.getTargetException() instanceof InterruptedException
- || e.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.warn("custom level class [" + clazz + "]"
- + " could not be instantiated", e);
- } catch(ClassCastException e) {
- LogLog.warn("class [" + clazz
- + "] is not a subclass of org.apache.log4j.Level", e);
- } catch(IllegalAccessException e) {
- LogLog.warn("class ["+clazz+
- "] cannot be instantiated due to access restrictions", e);
- } catch(RuntimeException e) {
- LogLog.warn("class ["+clazz+"], level ["+levelName+
- "] conversion failed.", e);
- }
- return result;
- }
-
- public
- static
- long toFileSize(String value, long dEfault) {
- if(value == null)
- return dEfault;
-
- String s = value.trim().toUpperCase();
- long multiplier = 1;
- int index;
-
- if((index = s.indexOf("KB")) != -1) {
- multiplier = 1024;
- s = s.substring(0, index);
- }
- else if((index = s.indexOf("MB")) != -1) {
- multiplier = 1024*1024;
- s = s.substring(0, index);
- }
- else if((index = s.indexOf("GB")) != -1) {
- multiplier = 1024*1024*1024;
- s = s.substring(0, index);
- }
- if(s != null) {
- try {
- return Long.valueOf(s).longValue() * multiplier;
- }
- catch (NumberFormatException e) {
- LogLog.error("[" + s + "] is not in proper int form.");
- LogLog.error("[" + value + "] not in expected format.", e);
- }
- }
- return dEfault;
- }
-
- /**
- Find the value corresponding to key in
- props. Then perform variable substitution on the
- found value.
-
- */
- public
- static
- String findAndSubst(String key, Properties props) {
- String value = props.getProperty(key);
- if(value == null)
- return null;
-
- try {
- return substVars(value, props);
- } catch(IllegalArgumentException e) {
- LogLog.error("Bad option value ["+value+"].", e);
- return value;
- }
- }
-
- /**
- Instantiate an object given a class name. Check that the
- className is a subclass of
- superClass. If that test fails or the object could
- not be instantiated, then defaultValue is returned.
-
- @param className The fully qualified class name of the object to instantiate.
- @param superClass The class to which the new object should belong.
- @param defaultValue The object to return in case of non-fulfillment
- */
- public
- static
- Object instantiateByClassName(String className, Class superClass,
- Object defaultValue) {
- if(className != null) {
- try {
- Class classObj = Loader.loadClass(className);
- if(!superClass.isAssignableFrom(classObj)) {
- LogLog.error("A \""+className+"\" object is not assignable to a \""+
- superClass.getName() + "\" variable.");
- LogLog.error("The class \""+ superClass.getName()+"\" was loaded by ");
- LogLog.error("["+superClass.getClassLoader()+"] whereas object of type ");
- LogLog.error("\"" +classObj.getName()+"\" was loaded by ["
- +classObj.getClassLoader()+"].");
- return defaultValue;
- }
- return classObj.newInstance();
- } catch (ClassNotFoundException e) {
- LogLog.error("Could not instantiate class [" + className + "].", e);
- } catch (IllegalAccessException e) {
- LogLog.error("Could not instantiate class [" + className + "].", e);
- } catch (InstantiationException e) {
- LogLog.error("Could not instantiate class [" + className + "].", e);
- } catch (RuntimeException e) {
- LogLog.error("Could not instantiate class [" + className + "].", e);
- }
- }
- return defaultValue;
- }
-
-
- /**
- Perform variable substitution in string val from the
- values of keys found in the system propeties.
-
-
The variable substitution delimeters are ${ and }.
-
-
For example, if the System properties contains "key=value", then
- the call
-
- String s = OptionConverter.substituteVars("Value of key is ${key}.");
-
-
- will set the variable s to "Value of key is value.".
-
- If no value could be found for the specified key, then the
- props parameter is searched, if the value could not
- be found there, then substitution defaults to the empty string.
-
-
For example, if system propeties contains no value for the key
- "inexistentKey", then the call
-
-
- String s = OptionConverter.subsVars("Value of inexistentKey is [${inexistentKey}]");
-
- will set s to "Value of inexistentKey is []"
-
- An {@link java.lang.IllegalArgumentException} is thrown if
- val contains a start delimeter "${" which is not
- balanced by a stop delimeter "}".
-
- Author Avy Sharell
-
- @param val The string on which variable substitution is performed.
- @throws IllegalArgumentException if val is malformed.
-
- */
- public static
- String substVars(String val, Properties props) throws
- IllegalArgumentException {
-
- StringBuffer sbuf = new StringBuffer();
-
- int i = 0;
- int j, k;
-
- while(true) {
- j=val.indexOf(DELIM_START, i);
- if(j == -1) {
- // no more variables
- if(i==0) { // this is a simple string
- return val;
- } else { // add the tail string which contails no variables and return the result.
- sbuf.append(val.substring(i, val.length()));
- return sbuf.toString();
- }
- } else {
- sbuf.append(val.substring(i, j));
- k = val.indexOf(DELIM_STOP, j);
- if(k == -1) {
- throw new IllegalArgumentException('"'+val+
- "\" has no closing brace. Opening brace at position " + j
- + '.');
- } else {
- j += DELIM_START_LEN;
- String key = val.substring(j, k);
- // first try in System properties
- String replacement = getSystemProperty(key, null);
- // then try props parameter
- if(replacement == null && props != null) {
- replacement = props.getProperty(key);
- }
-
- if(replacement != null) {
- // Do variable substitution on the replacement string
- // such that we can solve "Hello ${x2}" as "Hello p1"
- // the where the properties are
- // x1=p1
- // x2=${x1}
- String recursiveReplacement = substVars(replacement, props);
- sbuf.append(recursiveReplacement);
- }
- i = k + DELIM_STOP_LEN;
- }
- }
- }
- }
-
-
- /**
- Configure log4j given a URL.
-
- The url must point to a file or resource which will be interpreted by
- a new instance of a log4j configurator.
-
-
All configurations steps are taken on the
- hierarchy passed as a parameter.
-
-
- @param url The location of the configuration file or resource.
- @param clazz The classname, of the log4j configurator which will parse
- the file or resource at url. This must be a subclass of
- {@link Configurator}, or null. If this value is null then a default
- configurator of {@link PropertyConfigurator} is used, unless the
- filename pointed to by url ends in '.xml', in which case
- {@link org.apache.log4j.xml.DOMConfigurator} is used.
- @param hierarchy The {@link org.apache.log4j.Hierarchy} to act on.
-
- @since 1.1.4 */
-
- static
- public
- void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy) {
- Configurator configurator = null;
- String filename = url.getFile();
-
- if(clazz == null && filename != null && filename.endsWith(".xml")) {
- clazz = "org.apache.log4j.xml.DOMConfigurator";
- }
-
- if(clazz != null) {
- LogLog.debug("Preferred configurator class: " + clazz);
- configurator = (Configurator) instantiateByClassName(clazz,
- Configurator.class,
- null);
- if(configurator == null) {
- LogLog.error("Could not instantiate configurator ["+clazz+"].");
- return;
- }
- } else {
- configurator = new PropertyConfigurator();
- }
-
- configurator.doConfigure(url, hierarchy);
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/PatternConverter.java b/java/src/org/apache/log4j/helpers/PatternConverter.java
deleted file mode 100644
index 2b46db7..0000000
--- a/java/src/org/apache/log4j/helpers/PatternConverter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
-
-
PatternConverter is an abtract class that provides the
- formatting functionality that derived classes need.
-
-
Conversion specifiers in a conversion patterns are parsed to
- individual PatternConverters. Each of which is responsible for
- converting a logging event in a converter specific manner.
-
- @author James P. Cakalic
- @author Ceki Gülcü
-
- @since 0.8.2
- */
-public abstract class PatternConverter {
- public PatternConverter next;
- int min = -1;
- int max = 0x7FFFFFFF;
- boolean leftAlign = false;
-
- protected
- PatternConverter() { }
-
- protected
- PatternConverter(FormattingInfo fi) {
- min = fi.min;
- max = fi.max;
- leftAlign = fi.leftAlign;
- }
-
- /**
- Derived pattern converters must override this method in order to
- convert conversion specifiers in the correct way.
- */
- abstract
- protected
- String convert(LoggingEvent event);
-
- /**
- A template method for formatting in a converter specific way.
- */
- public
- void format(StringBuffer sbuf, LoggingEvent e) {
- String s = convert(e);
-
- if(s == null) {
- if(0 < min)
- spacePad(sbuf, min);
- return;
- }
-
- int len = s.length();
-
- if(len > max)
- sbuf.append(s.substring(len-max));
- else if(len < min) {
- if(leftAlign) {
- sbuf.append(s);
- spacePad(sbuf, min-len);
- }
- else {
- spacePad(sbuf, min-len);
- sbuf.append(s);
- }
- }
- else
- sbuf.append(s);
- }
-
- static String[] SPACES = {" ", " ", " ", " ", //1,2,4,8 spaces
- " ", // 16 spaces
- " " }; // 32 spaces
-
- /**
- Fast space padding method.
- */
- public
- void spacePad(StringBuffer sbuf, int length) {
- while(length >= 32) {
- sbuf.append(SPACES[5]);
- length -= 32;
- }
-
- for(int i = 4; i >= 0; i--) {
- if((length & (1<
-// Igor E. Poteryaev
-// Reinhard Deschler
-
-/**
- Most of the work of the {@link org.apache.log4j.PatternLayout} class
- is delegated to the PatternParser class.
-
- It is this class that parses conversion patterns and creates
- a chained list of {@link OptionConverter OptionConverters}.
-
- @author James P. Cakalic
- @author Ceki Gülcü
- @author Anders Kristensen
-
- @since 0.8.2
-*/
-public class PatternParser {
-
- private static final char ESCAPE_CHAR = '%';
-
- private static final int LITERAL_STATE = 0;
- private static final int CONVERTER_STATE = 1;
- private static final int DOT_STATE = 3;
- private static final int MIN_STATE = 4;
- private static final int MAX_STATE = 5;
-
- static final int FULL_LOCATION_CONVERTER = 1000;
- static final int METHOD_LOCATION_CONVERTER = 1001;
- static final int CLASS_LOCATION_CONVERTER = 1002;
- static final int LINE_LOCATION_CONVERTER = 1003;
- static final int FILE_LOCATION_CONVERTER = 1004;
-
- static final int RELATIVE_TIME_CONVERTER = 2000;
- static final int THREAD_CONVERTER = 2001;
- static final int LEVEL_CONVERTER = 2002;
- static final int NDC_CONVERTER = 2003;
- static final int MESSAGE_CONVERTER = 2004;
-
- int state;
- protected StringBuffer currentLiteral = new StringBuffer(32);
- protected int patternLength;
- protected int i;
- PatternConverter head;
- PatternConverter tail;
- protected FormattingInfo formattingInfo = new FormattingInfo();
- protected String pattern;
-
- public
- PatternParser(String pattern) {
- this.pattern = pattern;
- patternLength = pattern.length();
- state = LITERAL_STATE;
- }
-
- private
- void addToList(PatternConverter pc) {
- if(head == null) {
- head = tail = pc;
- } else {
- tail.next = pc;
- tail = pc;
- }
- }
-
- protected
- String extractOption() {
- if((i < patternLength) && (pattern.charAt(i) == '{')) {
- int end = pattern.indexOf('}', i);
- if (end > i) {
- String r = pattern.substring(i + 1, end);
- i = end+1;
- return r;
- }
- }
- return null;
- }
-
-
- /**
- The option is expected to be in decimal and positive. In case of
- error, zero is returned. */
- protected
- int extractPrecisionOption() {
- String opt = extractOption();
- int r = 0;
- if(opt != null) {
- try {
- r = Integer.parseInt(opt);
- if(r <= 0) {
- LogLog.error(
- "Precision option (" + opt + ") isn't a positive integer.");
- r = 0;
- }
- }
- catch (NumberFormatException e) {
- LogLog.error("Category option \""+opt+"\" not a decimal integer.", e);
- }
- }
- return r;
- }
-
- public
- PatternConverter parse() {
- char c;
- i = 0;
- while(i < patternLength) {
- c = pattern.charAt(i++);
- switch(state) {
- case LITERAL_STATE:
- // In literal state, the last char is always a literal.
- if(i == patternLength) {
- currentLiteral.append(c);
- continue;
- }
- if(c == ESCAPE_CHAR) {
- // peek at the next char.
- switch(pattern.charAt(i)) {
- case ESCAPE_CHAR:
- currentLiteral.append(c);
- i++; // move pointer
- break;
- case 'n':
- currentLiteral.append(Layout.LINE_SEP);
- i++; // move pointer
- break;
- default:
- if(currentLiteral.length() != 0) {
- addToList(new LiteralPatternConverter(
- currentLiteral.toString()));
- //LogLog.debug("Parsed LITERAL converter: \""
- // +currentLiteral+"\".");
- }
- currentLiteral.setLength(0);
- currentLiteral.append(c); // append %
- state = CONVERTER_STATE;
- formattingInfo.reset();
- }
- }
- else {
- currentLiteral.append(c);
- }
- break;
- case CONVERTER_STATE:
- currentLiteral.append(c);
- switch(c) {
- case '-':
- formattingInfo.leftAlign = true;
- break;
- case '.':
- state = DOT_STATE;
- break;
- default:
- if(c >= '0' && c <= '9') {
- formattingInfo.min = c - '0';
- state = MIN_STATE;
- }
- else
- finalizeConverter(c);
- } // switch
- break;
- case MIN_STATE:
- currentLiteral.append(c);
- if(c >= '0' && c <= '9')
- formattingInfo.min = formattingInfo.min*10 + (c - '0');
- else if(c == '.')
- state = DOT_STATE;
- else {
- finalizeConverter(c);
- }
- break;
- case DOT_STATE:
- currentLiteral.append(c);
- if(c >= '0' && c <= '9') {
- formattingInfo.max = c - '0';
- state = MAX_STATE;
- }
- else {
- LogLog.error("Error occured in position "+i
- +".\n Was expecting digit, instead got char \""+c+"\".");
- state = LITERAL_STATE;
- }
- break;
- case MAX_STATE:
- currentLiteral.append(c);
- if(c >= '0' && c <= '9')
- formattingInfo.max = formattingInfo.max*10 + (c - '0');
- else {
- finalizeConverter(c);
- state = LITERAL_STATE;
- }
- break;
- } // switch
- } // while
- if(currentLiteral.length() != 0) {
- addToList(new LiteralPatternConverter(currentLiteral.toString()));
- //LogLog.debug("Parsed LITERAL converter: \""+currentLiteral+"\".");
- }
- return head;
- }
-
- protected
- void finalizeConverter(char c) {
- PatternConverter pc = null;
- switch(c) {
- case 'c':
- pc = new CategoryPatternConverter(formattingInfo,
- extractPrecisionOption());
- //LogLog.debug("CATEGORY converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'C':
- pc = new ClassNamePatternConverter(formattingInfo,
- extractPrecisionOption());
- //LogLog.debug("CLASS_NAME converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'd':
- String dateFormatStr = AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT;
- DateFormat df;
- String dOpt = extractOption();
- if(dOpt != null)
- dateFormatStr = dOpt;
-
- if(dateFormatStr.equalsIgnoreCase(
- AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT))
- df = new ISO8601DateFormat();
- else if(dateFormatStr.equalsIgnoreCase(
- AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT))
- df = new AbsoluteTimeDateFormat();
- else if(dateFormatStr.equalsIgnoreCase(
- AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT))
- df = new DateTimeDateFormat();
- else {
- try {
- df = new SimpleDateFormat(dateFormatStr);
- }
- catch (IllegalArgumentException e) {
- LogLog.error("Could not instantiate SimpleDateFormat with " +
- dateFormatStr, e);
- df = (DateFormat) OptionConverter.instantiateByClassName(
- "org.apache.log4j.helpers.ISO8601DateFormat",
- DateFormat.class, null);
- }
- }
- pc = new DatePatternConverter(formattingInfo, df);
- //LogLog.debug("DATE converter {"+dateFormatStr+"}.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'F':
- pc = new LocationPatternConverter(formattingInfo,
- FILE_LOCATION_CONVERTER);
- //LogLog.debug("File name converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'l':
- pc = new LocationPatternConverter(formattingInfo,
- FULL_LOCATION_CONVERTER);
- //LogLog.debug("Location converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'L':
- pc = new LocationPatternConverter(formattingInfo,
- LINE_LOCATION_CONVERTER);
- //LogLog.debug("LINE NUMBER converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'm':
- pc = new BasicPatternConverter(formattingInfo, MESSAGE_CONVERTER);
- //LogLog.debug("MESSAGE converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'M':
- pc = new LocationPatternConverter(formattingInfo,
- METHOD_LOCATION_CONVERTER);
- //LogLog.debug("METHOD converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'p':
- pc = new BasicPatternConverter(formattingInfo, LEVEL_CONVERTER);
- //LogLog.debug("LEVEL converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 'r':
- pc = new BasicPatternConverter(formattingInfo,
- RELATIVE_TIME_CONVERTER);
- //LogLog.debug("RELATIVE time converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- case 't':
- pc = new BasicPatternConverter(formattingInfo, THREAD_CONVERTER);
- //LogLog.debug("THREAD converter.");
- //formattingInfo.dump();
- currentLiteral.setLength(0);
- break;
- /*case 'u':
- if(i < patternLength) {
- char cNext = pattern.charAt(i);
- if(cNext >= '0' && cNext <= '9') {
- pc = new UserFieldPatternConverter(formattingInfo, cNext - '0');
- LogLog.debug("USER converter ["+cNext+"].");
- formattingInfo.dump();
- currentLiteral.setLength(0);
- i++;
- }
- else
- LogLog.error("Unexpected char" +cNext+" at position "+i);
- }
- break;*/
- case 'x':
- pc = new BasicPatternConverter(formattingInfo, NDC_CONVERTER);
- //LogLog.debug("NDC converter.");
- currentLiteral.setLength(0);
- break;
- case 'X':
- String xOpt = extractOption();
- pc = new MDCPatternConverter(formattingInfo, xOpt);
- currentLiteral.setLength(0);
- break;
- default:
- LogLog.error("Unexpected char [" +c+"] at position "+i
- +" in conversion patterrn.");
- pc = new LiteralPatternConverter(currentLiteral.toString());
- currentLiteral.setLength(0);
- }
-
- addConverter(pc);
- }
-
- protected
- void addConverter(PatternConverter pc) {
- currentLiteral.setLength(0);
- // Add the pattern converter to the list.
- addToList(pc);
- // Next pattern is assumed to be a literal.
- state = LITERAL_STATE;
- // Reset formatting info
- formattingInfo.reset();
- }
-
- // ---------------------------------------------------------------------
- // PatternConverters
- // ---------------------------------------------------------------------
-
- private static class BasicPatternConverter extends PatternConverter {
- int type;
-
- BasicPatternConverter(FormattingInfo formattingInfo, int type) {
- super(formattingInfo);
- this.type = type;
- }
-
- public
- String convert(LoggingEvent event) {
- switch(type) {
- case RELATIVE_TIME_CONVERTER:
- return (Long.toString(event.timeStamp - LoggingEvent.getStartTime()));
- case THREAD_CONVERTER:
- return event.getThreadName();
- case LEVEL_CONVERTER:
- return event.getLevel().toString();
- case NDC_CONVERTER:
- return event.getNDC();
- case MESSAGE_CONVERTER: {
- return event.getRenderedMessage();
- }
- default: return null;
- }
- }
- }
-
- private static class LiteralPatternConverter extends PatternConverter {
- private String literal;
-
- LiteralPatternConverter(String value) {
- literal = value;
- }
-
- public
- final
- void format(StringBuffer sbuf, LoggingEvent event) {
- sbuf.append(literal);
- }
-
- public
- String convert(LoggingEvent event) {
- return literal;
- }
- }
-
- private static class DatePatternConverter extends PatternConverter {
- private DateFormat df;
- private Date date;
-
- DatePatternConverter(FormattingInfo formattingInfo, DateFormat df) {
- super(formattingInfo);
- date = new Date();
- this.df = df;
- }
-
- public
- String convert(LoggingEvent event) {
- date.setTime(event.timeStamp);
- String converted = null;
- try {
- converted = df.format(date);
- }
- catch (Exception ex) {
- LogLog.error("Error occured while converting date.", ex);
- }
- return converted;
- }
- }
-
- private static class MDCPatternConverter extends PatternConverter {
- private String key;
-
- MDCPatternConverter(FormattingInfo formattingInfo, String key) {
- super(formattingInfo);
- this.key = key;
- }
-
- public
- String convert(LoggingEvent event) {
- if (key == null) {
- StringBuffer buf = new StringBuffer("{");
- Map properties = event.getProperties();
- if (properties.size() > 0) {
- Object[] keys = properties.keySet().toArray();
- Arrays.sort(keys);
- for (int i = 0; i < keys.length; i++) {
- buf.append('{');
- buf.append(keys[i]);
- buf.append(',');
- buf.append(properties.get(keys[i]));
- buf.append('}');
- }
- }
- buf.append('}');
- return buf.toString();
- } else {
- Object val = event.getMDC(key);
- if(val == null) {
- return null;
- } else {
- return val.toString();
- }
- }
- }
- }
-
-
- private class LocationPatternConverter extends PatternConverter {
- int type;
-
- LocationPatternConverter(FormattingInfo formattingInfo, int type) {
- super(formattingInfo);
- this.type = type;
- }
-
- public
- String convert(LoggingEvent event) {
- LocationInfo locationInfo = event.getLocationInformation();
- switch(type) {
- case FULL_LOCATION_CONVERTER:
- return locationInfo.fullInfo;
- case METHOD_LOCATION_CONVERTER:
- return locationInfo.getMethodName();
- case LINE_LOCATION_CONVERTER:
- return locationInfo.getLineNumber();
- case FILE_LOCATION_CONVERTER:
- return locationInfo.getFileName();
- default: return null;
- }
- }
- }
-
- private static abstract class NamedPatternConverter extends PatternConverter {
- int precision;
-
- NamedPatternConverter(FormattingInfo formattingInfo, int precision) {
- super(formattingInfo);
- this.precision = precision;
- }
-
- abstract
- String getFullyQualifiedName(LoggingEvent event);
-
- public
- String convert(LoggingEvent event) {
- String n = getFullyQualifiedName(event);
- if(precision <= 0)
- return n;
- else {
- int len = n.length();
-
- // We substract 1 from 'len' when assigning to 'end' to avoid out of
- // bounds exception in return r.substring(end+1, len). This can happen if
- // precision is 1 and the category name ends with a dot.
- int end = len -1 ;
- for(int i = precision; i > 0; i--) {
- end = n.lastIndexOf('.', end-1);
- if(end == -1)
- return n;
- }
- return n.substring(end+1, len);
- }
- }
- }
-
- private class ClassNamePatternConverter extends NamedPatternConverter {
-
- ClassNamePatternConverter(FormattingInfo formattingInfo, int precision) {
- super(formattingInfo, precision);
- }
-
- String getFullyQualifiedName(LoggingEvent event) {
- return event.getLocationInformation().getClassName();
- }
- }
-
- private class CategoryPatternConverter extends NamedPatternConverter {
-
- CategoryPatternConverter(FormattingInfo formattingInfo, int precision) {
- super(formattingInfo, precision);
- }
-
- String getFullyQualifiedName(LoggingEvent event) {
- return event.getLoggerName();
- }
- }
-}
-
diff --git a/java/src/org/apache/log4j/helpers/QuietWriter.java b/java/src/org/apache/log4j/helpers/QuietWriter.java
deleted file mode 100644
index 778f091..0000000
--- a/java/src/org/apache/log4j/helpers/QuietWriter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.io.Writer;
-import java.io.FilterWriter;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.ErrorCode;
-
-
-/**
- QuietWriter does not throw exceptions when things go
- wrong. Instead, it delegates error handling to its {@link ErrorHandler}.
-
- @author Ceki Gülcü
-
- @since 0.7.3
-*/
-public class QuietWriter extends FilterWriter {
-
- protected ErrorHandler errorHandler;
-
- public
- QuietWriter(Writer writer, ErrorHandler errorHandler) {
- super(writer);
- setErrorHandler(errorHandler);
- }
-
- public
- void write(String string) {
- if (string != null) {
- try {
- out.write(string);
- } catch(Exception e) {
- errorHandler.error("Failed to write ["+string+"].", e,
- ErrorCode.WRITE_FAILURE);
- }
- }
- }
-
- public
- void flush() {
- try {
- out.flush();
- } catch(Exception e) {
- errorHandler.error("Failed to flush writer,", e,
- ErrorCode.FLUSH_FAILURE);
- }
- }
-
-
- public
- void setErrorHandler(ErrorHandler eh) {
- if(eh == null) {
- // This is a programming error on the part of the enclosing appender.
- throw new IllegalArgumentException("Attempted to set null ErrorHandler.");
- } else {
- this.errorHandler = eh;
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/RelativeTimeDateFormat.java b/java/src/org/apache/log4j/helpers/RelativeTimeDateFormat.java
deleted file mode 100644
index ab81a34..0000000
--- a/java/src/org/apache/log4j/helpers/RelativeTimeDateFormat.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Date;
-import java.text.FieldPosition;
-import java.text.ParsePosition;
-import java.text.DateFormat;
-
-/**
- Formats a {@link Date} by printing the number of milliseconds
- elapsed since construction of the format. This is the fastest
- printing DateFormat in the package.
-
- @author Ceki Gülcü
-
- @since 0.7.5
-*/
-public class RelativeTimeDateFormat extends DateFormat {
- private static final long serialVersionUID = 7055751607085611984L;
-
-
- protected final long startTime;
-
- public
- RelativeTimeDateFormat() {
- this.startTime = System.currentTimeMillis();
- }
-
- /**
- Appends to sbuf the number of milliseconds elapsed
- since the start of the application.
-
- @since 0.7.5
- */
- public
- StringBuffer format(Date date, StringBuffer sbuf,
- FieldPosition fieldPosition) {
- //System.err.println(":"+ date.getTime() + " - " + startTime);
- return sbuf.append((date.getTime() - startTime));
- }
-
- /**
- This method does not do anything but return null.
- */
- public
- Date parse(java.lang.String s, ParsePosition pos) {
- return null;
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/SyslogQuietWriter.java b/java/src/org/apache/log4j/helpers/SyslogQuietWriter.java
deleted file mode 100644
index 62e933e..0000000
--- a/java/src/org/apache/log4j/helpers/SyslogQuietWriter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-
-
-import java.io.Writer;
-import org.apache.log4j.spi.ErrorHandler;
-
-/**
- SyslogQuietWriter extends QuietWriter by prepending the syslog
- level code before each printed String.
-
- @since 0.7.3
-*/
-public class SyslogQuietWriter extends QuietWriter {
-
- int syslogFacility;
- int level;
-
- public
- SyslogQuietWriter(Writer writer, int syslogFacility, ErrorHandler eh) {
- super(writer, eh);
- this.syslogFacility = syslogFacility;
- }
-
- public
- void setLevel(int level) {
- this.level = level;
- }
-
- public
- void setSyslogFacility(int syslogFacility) {
- this.syslogFacility = syslogFacility;
- }
-
- public
- void write(String string) {
- super.write("<"+(syslogFacility | level)+">" + string);
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/SyslogWriter.java b/java/src/org/apache/log4j/helpers/SyslogWriter.java
deleted file mode 100644
index d6ce4bf..0000000
--- a/java/src/org/apache/log4j/helpers/SyslogWriter.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-
-import java.io.Writer;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.DatagramPacket;
-import java.net.UnknownHostException;
-import java.net.SocketException;
-import java.io.IOException;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-/**
- SyslogWriter is a wrapper around the java.net.DatagramSocket class
- so that it behaves like a java.io.Writer.
-
- @since 0.7.3
-*/
-public class SyslogWriter extends Writer {
-
- final int SYSLOG_PORT = 514;
- /**
- * Host string from last constructed SyslogWriter.
- * @deprecated
- */
- static String syslogHost;
-
- private InetAddress address;
- private final int port;
- private DatagramSocket ds;
-
- /**
- * Constructs a new instance of SyslogWriter.
- * @param syslogHost host name, may not be null. A port
- * may be specified by following the name or IPv4 literal address with
- * a colon and a decimal port number. To specify a port with an IPv6
- * address, enclose the IPv6 address in square brackets before appending
- * the colon and decimal port number.
- */
- public
- SyslogWriter(final String syslogHost) {
- SyslogWriter.syslogHost = syslogHost;
- if (syslogHost == null) {
- throw new NullPointerException("syslogHost");
- }
-
- String host = syslogHost;
- int urlPort = -1;
-
- //
- // If not an unbracketed IPv6 address then
- // parse as a URL
- //
- if (host.indexOf("[") != -1 || host.indexOf(':') == host.lastIndexOf(':')) {
- try {
- URL url = new URL("http://" + host);
- if (url.getHost() != null) {
- host = url.getHost();
- // if host is a IPv6 literal, strip off the brackets
- if(host.startsWith("[") && host.charAt(host.length() - 1) == ']') {
- host = host.substring(1, host.length() - 1);
- }
- urlPort = url.getPort();
- }
- } catch(MalformedURLException e) {
- LogLog.error("Malformed URL: will attempt to interpret as InetAddress.", e);
- }
- }
-
- if (urlPort == -1) {
- urlPort = SYSLOG_PORT;
- }
- port = urlPort;
-
- try {
- this.address = InetAddress.getByName(host);
- }
- catch (UnknownHostException e) {
- LogLog.error("Could not find " + host +
- ". All logging will FAIL.", e);
- }
-
- try {
- this.ds = new DatagramSocket();
- }
- catch (SocketException e) {
- e.printStackTrace();
- LogLog.error("Could not instantiate DatagramSocket to " + host +
- ". All logging will FAIL.", e);
- }
-
- }
-
-
- public
- void write(char[] buf, int off, int len) throws IOException {
- this.write(new String(buf, off, len));
- }
-
- public
- void write(final String string) throws IOException {
-
- if(this.ds != null && this.address != null) {
- byte[] bytes = string.getBytes();
- //
- // syslog packets must be less than 1024 bytes
- //
- int bytesLength = bytes.length;
- if (bytesLength >= 1024) {
- bytesLength = 1024;
- }
- DatagramPacket packet = new DatagramPacket(bytes, bytesLength,
- address, port);
- ds.send(packet);
- }
-
- }
-
- public
- void flush() {}
-
- public void close() {
- if (ds != null) {
- ds.close();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/ThreadLocalMap.java b/java/src/org/apache/log4j/helpers/ThreadLocalMap.java
deleted file mode 100644
index da60c86..0000000
--- a/java/src/org/apache/log4j/helpers/ThreadLocalMap.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-import java.util.Hashtable;
-
-/**
- ThreadLocalMap extends {@link InheritableThreadLocal}
- to bequeath a copy of the hashtable of the MDC of the parent
- thread.
-
- @author Ceki Gülcü
- @since 1.2
-*/
-final public class ThreadLocalMap extends InheritableThreadLocal {
-
- public
- final
- Object childValue(Object parentValue) {
- Hashtable ht = (Hashtable) parentValue;
- if(ht != null) {
- return ht.clone();
- } else {
- return null;
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/Transform.java b/java/src/org/apache/log4j/helpers/Transform.java
deleted file mode 100644
index 7626e71..0000000
--- a/java/src/org/apache/log4j/helpers/Transform.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.helpers;
-
-/**
- Utility class for transforming strings.
-
- @author Ceki Gülcü
- @author Michael A. McAngus
- */
-public class Transform {
-
- private static final String CDATA_START = "";
- private static final String CDATA_PSEUDO_END = "]]>";
- private static final String CDATA_EMBEDED_END = CDATA_END + CDATA_PSEUDO_END + CDATA_START;
- private static final int CDATA_END_LEN = CDATA_END.length();
-
- /**
- * This method takes a string which may contain HTML tags (ie,
- * <b>, <table>, etc) and replaces any
- * '<', '>' , '&' or '"'
- * characters with respective predefined entity references.
- *
- * @param input The text to be converted.
- * @return The input string with the special characters replaced.
- * */
- static public String escapeTags(final String input) {
- //Check if the string is null, zero length or devoid of special characters
- // if so, return what was sent in.
-
- if(input == null
- || input.length() == 0
- || (input.indexOf('"') == -1 &&
- input.indexOf('&') == -1 &&
- input.indexOf('<') == -1 &&
- input.indexOf('>') == -1)) {
- return input;
- }
-
- //Use a StringBuffer in lieu of String concatenation -- it is
- //much more efficient this way.
-
- StringBuffer buf = new StringBuffer(input.length() + 6);
- char ch = ' ';
-
- int len = input.length();
- for(int i=0; i < len; i++) {
- ch = input.charAt(i);
- if (ch > '>') {
- buf.append(ch);
- } else if(ch == '<') {
- buf.append("<");
- } else if(ch == '>') {
- buf.append(">");
- } else if(ch == '&') {
- buf.append("&");
- } else if(ch == '"') {
- buf.append(""");
- } else {
- buf.append(ch);
- }
- }
- return buf.toString();
- }
-
- /**
- * Ensures that embeded CDEnd strings (]]>) are handled properly
- * within message, NDC and throwable tag text.
- *
- * @param buf StringBuffer holding the XML data to this point. The
- * initial CDStart () of the CDATA
- * section are the responsibility of the calling method.
- * @param str The String that is inserted into an existing CDATA Section within buf.
- * */
- static public void appendEscapingCDATA(final StringBuffer buf,
- final String str) {
- if (str != null) {
- int end = str.indexOf(CDATA_END);
- if (end < 0) {
- buf.append(str);
- } else {
- int start = 0;
- while (end > -1) {
- buf.append(str.substring(start, end));
- buf.append(CDATA_EMBEDED_END);
- start = end + CDATA_END_LEN;
- if (start < str.length()) {
- end = str.indexOf(CDATA_END, start);
- } else {
- return;
- }
- }
- buf.append(str.substring(start));
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/helpers/package.html b/java/src/org/apache/log4j/helpers/package.html
deleted file mode 100644
index ab75bf3..0000000
--- a/java/src/org/apache/log4j/helpers/package.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-This package is used internally.
-
-
-
-
-
-Last modified: Sat Jul 3 15:12:58 MDT 1999
-
-
diff --git a/java/src/org/apache/log4j/jdbc/JDBCAppender.java b/java/src/org/apache/log4j/jdbc/JDBCAppender.java
deleted file mode 100644
index f18974a..0000000
--- a/java/src/org/apache/log4j/jdbc/JDBCAppender.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.jdbc;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- The JDBCAppender provides for sending log events to a database.
-
- WARNING: This version of JDBCAppender
- is very likely to be completely replaced in the future. Moreoever,
- it does not log exceptions.
-
-
Each append call adds to an ArrayList buffer. When
- the buffer is filled each log event is placed in a sql statement
- (configurable) and executed.
-
- BufferSize, db URL, User, & Password are
- configurable options in the standard log4j ways.
-
-
The setSql(String sql) sets the SQL statement to be
- used for logging -- this statement is sent to a
- PatternLayout (either created automaticly by the
- appender or added by the user). Therefore by default all the
- conversion patterns in PatternLayout can be used
- inside of the statement. (see the test cases for examples)
-
-
Overriding the {@link #getLogStatement} method allows more
- explicit control of the statement used for logging.
-
-
For use as a base class:
-
-
-
- - Override
getConnection() to pass any connection
- you want. Typically this is used to enable application wide
- connection pooling.
-
- - Override
closeConnection(Connection con) -- if
- you override getConnection make sure to implement
- closeConnection to handle the connection you
- generated. Typically this would return the connection to the
- pool it came from.
-
- - Override
getLogStatement(LoggingEvent event) to
- produce specialized or dynamic statements. The default uses the
- sql option value.
-
-
-
- @author Kevin Steppe (ksteppe@pacbell.net)
-
-*/
-public class JDBCAppender extends org.apache.log4j.AppenderSkeleton
- implements org.apache.log4j.Appender {
-
- /**
- * URL of the DB for default connection handling
- */
- protected String databaseURL = "jdbc:odbc:myDB";
-
- /**
- * User to connect as for default connection handling
- */
- protected String databaseUser = "me";
-
- /**
- * User to use for default connection handling
- */
- protected String databasePassword = "mypassword";
-
- /**
- * Connection used by default. The connection is opened the first time it
- * is needed and then held open until the appender is closed (usually at
- * garbage collection). This behavior is best modified by creating a
- * sub-class and overriding the getConnection and
- * closeConnection methods.
- */
- protected Connection connection = null;
-
- /**
- * Stores the string given to the pattern layout for conversion into a SQL
- * statement, eg: insert into LogTable (Thread, Class, Message) values
- * ("%t", "%c", "%m").
- *
- * Be careful of quotes in your messages!
- *
- * Also see PatternLayout.
- */
- protected String sqlStatement = "";
-
- /**
- * size of LoggingEvent buffer before writting to the database.
- * Default is 1.
- */
- protected int bufferSize = 1;
-
- /**
- * ArrayList holding the buffer of Logging Events.
- */
- protected ArrayList buffer;
-
- /**
- * Helper object for clearing out the buffer
- */
- protected ArrayList removes;
-
- private boolean locationInfo = false;
-
- public JDBCAppender() {
- super();
- buffer = new ArrayList(bufferSize);
- removes = new ArrayList(bufferSize);
- }
-
- /**
- * Gets whether the location of the logging request call
- * should be captured.
- *
- * @since 1.2.16
- * @return the current value of the LocationInfo option.
- */
- public boolean getLocationInfo() {
- return locationInfo;
- }
-
- /**
- * The LocationInfo option takes a boolean value. By default, it is
- * set to false which means there will be no effort to extract the location
- * information related to the event. As a result, the event that will be
- * ultimately logged will likely to contain the wrong location information
- * (if present in the log format).
- *
- *
- * Location information extraction is comparatively very slow and should be
- * avoided unless performance is not a concern.
- *
- * @since 1.2.16
- * @param flag true if location information should be extracted.
- */
- public void setLocationInfo(final boolean flag) {
- locationInfo = flag;
- }
-
-
- /**
- * Adds the event to the buffer. When full the buffer is flushed.
- */
- public void append(LoggingEvent event) {
- event.getNDC();
- event.getThreadName();
- // Get a copy of this thread's MDC.
- event.getMDCCopy();
- if (locationInfo) {
- event.getLocationInformation();
- }
- event.getRenderedMessage();
- event.getThrowableStrRep();
- buffer.add(event);
-
- if (buffer.size() >= bufferSize)
- flushBuffer();
- }
-
- /**
- * By default getLogStatement sends the event to the required Layout object.
- * The layout will format the given pattern into a workable SQL string.
- *
- * Overriding this provides direct access to the LoggingEvent
- * when constructing the logging statement.
- *
- */
- protected String getLogStatement(LoggingEvent event) {
- return getLayout().format(event);
- }
-
- /**
- *
- * Override this to provide an alertnate method of getting
- * connections (such as caching). One method to fix this is to open
- * connections at the start of flushBuffer() and close them at the
- * end. I use a connection pool outside of JDBCAppender which is
- * accessed in an override of this method.
- * */
- protected void execute(String sql) throws SQLException {
-
- Connection con = null;
- Statement stmt = null;
-
- try {
- con = getConnection();
-
- stmt = con.createStatement();
- stmt.executeUpdate(sql);
- } catch (SQLException e) {
- if (stmt != null)
- stmt.close();
- throw e;
- }
- stmt.close();
- closeConnection(con);
-
- //System.out.println("Execute: " + sql);
- }
-
-
- /**
- * Override this to return the connection to a pool, or to clean up the
- * resource.
- *
- * The default behavior holds a single connection open until the appender
- * is closed (typically when garbage collected).
- */
- protected void closeConnection(Connection con) {
- }
-
- /**
- * Override this to link with your connection pooling system.
- *
- * By default this creates a single connection which is held open
- * until the object is garbage collected.
- */
- protected Connection getConnection() throws SQLException {
- if (!DriverManager.getDrivers().hasMoreElements())
- setDriver("sun.jdbc.odbc.JdbcOdbcDriver");
-
- if (connection == null) {
- connection = DriverManager.getConnection(databaseURL, databaseUser,
- databasePassword);
- }
-
- return connection;
- }
-
- /**
- * Closes the appender, flushing the buffer first then closing the default
- * connection if it is open.
- */
- public void close()
- {
- flushBuffer();
-
- try {
- if (connection != null && !connection.isClosed())
- connection.close();
- } catch (SQLException e) {
- errorHandler.error("Error closing connection", e, ErrorCode.GENERIC_FAILURE);
- }
- this.closed = true;
- }
-
- /**
- * loops through the buffer of LoggingEvents, gets a
- * sql string from getLogStatement() and sends it to execute().
- * Errors are sent to the errorHandler.
- *
- * If a statement fails the LoggingEvent stays in the buffer!
- */
- public void flushBuffer() {
- //Do the actual logging
- removes.ensureCapacity(buffer.size());
- for (Iterator i = buffer.iterator(); i.hasNext();) {
- try {
- LoggingEvent logEvent = (LoggingEvent)i.next();
- String sql = getLogStatement(logEvent);
- execute(sql);
- removes.add(logEvent);
- }
- catch (SQLException e) {
- errorHandler.error("Failed to excute sql", e,
- ErrorCode.FLUSH_FAILURE);
- }
- }
-
- // remove from the buffer any events that were reported
- buffer.removeAll(removes);
-
- // clear the buffer of reported events
- removes.clear();
- }
-
-
- /** closes the appender before disposal */
- public void finalize() {
- close();
- }
-
-
- /**
- * JDBCAppender requires a layout.
- * */
- public boolean requiresLayout() {
- return true;
- }
-
-
- /**
- *
- */
- public void setSql(String s) {
- sqlStatement = s;
- if (getLayout() == null) {
- this.setLayout(new PatternLayout(s));
- }
- else {
- ((PatternLayout)getLayout()).setConversionPattern(s);
- }
- }
-
-
- /**
- * Returns pre-formated statement eg: insert into LogTable (msg) values ("%m")
- */
- public String getSql() {
- return sqlStatement;
- }
-
-
- public void setUser(String user) {
- databaseUser = user;
- }
-
-
- public void setURL(String url) {
- databaseURL = url;
- }
-
-
- public void setPassword(String password) {
- databasePassword = password;
- }
-
-
- public void setBufferSize(int newBufferSize) {
- bufferSize = newBufferSize;
- buffer.ensureCapacity(bufferSize);
- removes.ensureCapacity(bufferSize);
- }
-
-
- public String getUser() {
- return databaseUser;
- }
-
-
- public String getURL() {
- return databaseURL;
- }
-
-
- public String getPassword() {
- return databasePassword;
- }
-
-
- public int getBufferSize() {
- return bufferSize;
- }
-
-
- /**
- * Ensures that the given driver class has been loaded for sql connection
- * creation.
- */
- public void setDriver(String driverClass) {
- try {
- Class.forName(driverClass);
- } catch (Exception e) {
- errorHandler.error("Failed to load driver", e,
- ErrorCode.GENERIC_FAILURE);
- }
- }
-}
-
diff --git a/java/src/org/apache/log4j/jdbc/package.html b/java/src/org/apache/log4j/jdbc/package.html
deleted file mode 100644
index e57e3a5..0000000
--- a/java/src/org/apache/log4j/jdbc/package.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
- The JDBCAppender provides for sending log events to a database.
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/jmx/AbstractDynamicMBean.java b/java/src/org/apache/log4j/jmx/AbstractDynamicMBean.java
deleted file mode 100644
index a5a6574..0000000
--- a/java/src/org/apache/log4j/jmx/AbstractDynamicMBean.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.jmx;
-
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.Vector;
-
-import javax.management.Attribute;
-import javax.management.AttributeList;
-import javax.management.DynamicMBean;
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.JMException;
-import javax.management.MBeanRegistration;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.NotCompliantMBeanException;
-import javax.management.ObjectName;
-import javax.management.RuntimeOperationsException;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.Appender;
-
-public abstract class AbstractDynamicMBean implements DynamicMBean,
- MBeanRegistration {
-
- String dClassName;
- MBeanServer server;
- private final Vector mbeanList = new Vector();
-
- /**
- * Get MBean name.
- * @param appender appender, may not be null.
- * @return name.
- * @since 1.2.16
- */
- static protected String getAppenderName(final Appender appender){
- String name = appender.getName();
- if (name == null || name.trim().length() == 0) {
- // try to get some form of a name, because null is not allowed (exception), and empty string certainly isn't useful in JMX..
- name = appender.toString();
- }
- return name;
- }
-
-
- /**
- * Enables the to get the values of several attributes of the Dynamic MBean.
- */
- public
- AttributeList getAttributes(String[] attributeNames) {
-
- // Check attributeNames is not null to avoid NullPointerException later on
- if (attributeNames == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("attributeNames[] cannot be null"),
- "Cannot invoke a getter of " + dClassName);
- }
-
- AttributeList resultList = new AttributeList();
-
- // if attributeNames is empty, return an empty result list
- if (attributeNames.length == 0)
- return resultList;
-
- // build the result attribute list
- for (int i=0 ; i 0) {
- val = attributeName.substring(0, k)+'='+ attributeName.substring(k+3);
- }
- try {
- return new ObjectName("log4j:"+val);
- } catch(JMException e) {
- log.error("Could not create ObjectName" + val);
- } catch(RuntimeException e) {
- log.error("Could not create ObjectName" + val);
- }
- }
-
-
-
- // If attributeName has not been recognized throw an AttributeNotFoundException
- throw(new AttributeNotFoundException("Cannot find " + attributeName +
- " attribute in " + dClassName));
-
- }
-
-
- public
- void addAppenderEvent(Category logger, Appender appender) {
- log.debug("addAppenderEvent called: logger="+logger.getName()+
- ", appender="+appender.getName());
- Notification n = new Notification(ADD_APPENDER+logger.getName(), this, 0);
- n.setUserData(appender);
- log.debug("sending notification.");
- nbs.sendNotification(n);
- }
-
- public
- void removeAppenderEvent(Category cat, Appender appender) {
- log.debug("removeAppenderCalled: logger="+cat.getName()+
- ", appender="+appender.getName());
- }
-
- public
- void postRegister(java.lang.Boolean registrationDone) {
- log.debug("postRegister is called.");
- hierarchy.addHierarchyEventListener(this);
- Logger root = hierarchy.getRootLogger();
- addLoggerMBean(root);
- }
-
- public
- void removeNotificationListener(NotificationListener listener)
- throws ListenerNotFoundException {
- nbs.removeNotificationListener(listener);
- }
-
- public
- void setAttribute(Attribute attribute) throws AttributeNotFoundException,
- InvalidAttributeValueException,
- MBeanException,
- ReflectionException {
-
- // Check attribute is not null to avoid NullPointerException later on
- if (attribute == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("Attribute cannot be null"),
- "Cannot invoke a setter of "+dClassName+" with null attribute");
- }
- String name = attribute.getName();
- Object value = attribute.getValue();
-
- if (name == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("Attribute name cannot be null"),
- "Cannot invoke the setter of "+dClassName+
- " with null attribute name");
- }
-
- if(name.equals(THRESHOLD)) {
- Level l = OptionConverter.toLevel((String) value,
- hierarchy.getThreshold());
- hierarchy.setThreshold(l);
- }
-
-
- }
-}
diff --git a/java/src/org/apache/log4j/jmx/LayoutDynamicMBean.java b/java/src/org/apache/log4j/jmx/LayoutDynamicMBean.java
deleted file mode 100644
index 4be6b63..0000000
--- a/java/src/org/apache/log4j/jmx/LayoutDynamicMBean.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.jmx;
-
-import java.lang.reflect.Constructor;
-import org.apache.log4j.Logger;
-import org.apache.log4j.Level;
-import org.apache.log4j.Layout;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.spi.OptionHandler;
-
-import java.util.Vector;
-import java.util.Hashtable;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanConstructorInfo;
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanInfo;
-import javax.management.Attribute;
-
-import javax.management.MBeanException;
-import javax.management.AttributeNotFoundException;
-import javax.management.RuntimeOperationsException;
-import javax.management.ReflectionException;
-import javax.management.InvalidAttributeValueException;
-import javax.management.MBeanOperationInfo;
-import javax.management.MBeanParameterInfo;
-
-import java.beans.Introspector;
-import java.beans.BeanInfo;
-import java.beans.PropertyDescriptor;
-import java.beans.IntrospectionException;
-import java.io.InterruptedIOException;
-
-public class LayoutDynamicMBean extends AbstractDynamicMBean {
-
- private MBeanConstructorInfo[] dConstructors = new MBeanConstructorInfo[1];
- private Vector dAttributes = new Vector();
- private String dClassName = this.getClass().getName();
-
- private Hashtable dynamicProps = new Hashtable(5);
- private MBeanOperationInfo[] dOperations = new MBeanOperationInfo[1];
- private String dDescription =
- "This MBean acts as a management facade for log4j layouts.";
-
- // This category instance is for logging.
- private static Logger cat = Logger.getLogger(LayoutDynamicMBean.class);
-
- // We wrap this layout instance.
- private Layout layout;
-
- public LayoutDynamicMBean(Layout layout) throws IntrospectionException {
- this.layout = layout;
- buildDynamicMBeanInfo();
- }
-
- private
- void buildDynamicMBeanInfo() throws IntrospectionException {
- Constructor[] constructors = this.getClass().getConstructors();
- dConstructors[0] = new MBeanConstructorInfo(
- "LayoutDynamicMBean(): Constructs a LayoutDynamicMBean instance",
- constructors[0]);
-
-
- BeanInfo bi = Introspector.getBeanInfo(layout.getClass());
- PropertyDescriptor[] pd = bi.getPropertyDescriptors();
-
- int size = pd.length;
-
- for(int i = 0; i < size; i++) {
- String name = pd[i].getName();
- Method readMethod = pd[i].getReadMethod();
- Method writeMethod = pd[i].getWriteMethod();
- if(readMethod != null) {
- Class returnClass = readMethod.getReturnType();
- if(isSupportedType(returnClass)) {
- String returnClassName;
- if(returnClass.isAssignableFrom(Level.class)) {
- returnClassName = "java.lang.String";
- } else {
- returnClassName = returnClass.getName();
- }
-
- dAttributes.add(new MBeanAttributeInfo(name,
- returnClassName,
- "Dynamic",
- true,
- writeMethod != null,
- false));
- dynamicProps.put(name, new MethodUnion(readMethod, writeMethod));
- }
- }
- }
-
- MBeanParameterInfo[] params = new MBeanParameterInfo[0];
-
- dOperations[0] = new MBeanOperationInfo("activateOptions",
- "activateOptions(): add an layout",
- params,
- "void",
- MBeanOperationInfo.ACTION);
- }
-
- private
- boolean isSupportedType(Class clazz) {
- if(clazz.isPrimitive()) {
- return true;
- }
-
- if(clazz == String.class) {
- return true;
- }
- if(clazz.isAssignableFrom(Level.class)) {
- return true;
- }
-
- return false;
- }
-
-
-
- public
- MBeanInfo getMBeanInfo() {
- cat.debug("getMBeanInfo called.");
-
- MBeanAttributeInfo[] attribs = new MBeanAttributeInfo[dAttributes.size()];
- dAttributes.toArray(attribs);
-
- return new MBeanInfo(dClassName,
- dDescription,
- attribs,
- dConstructors,
- dOperations,
- new MBeanNotificationInfo[0]);
- }
-
- public
- Object invoke(String operationName, Object params[], String signature[])
- throws MBeanException,
- ReflectionException {
-
- if(operationName.equals("activateOptions") &&
- layout instanceof OptionHandler) {
- OptionHandler oh = (OptionHandler) layout;
- oh.activateOptions();
- return "Options activated.";
- }
- return null;
- }
-
- protected
- Logger getLogger() {
- return cat;
- }
-
-
- public
- Object getAttribute(String attributeName) throws AttributeNotFoundException,
- MBeanException,
- ReflectionException {
-
- // Check attributeName is not null to avoid NullPointerException later on
- if (attributeName == null) {
- throw new RuntimeOperationsException(new IllegalArgumentException(
- "Attribute name cannot be null"),
- "Cannot invoke a getter of " + dClassName + " with null attribute name");
- }
-
-
- MethodUnion mu = (MethodUnion) dynamicProps.get(attributeName);
-
- cat.debug("----name="+attributeName+", mu="+mu);
-
- if(mu != null && mu.readMethod != null) {
- try {
- return mu.readMethod.invoke(layout, null);
- } catch(InvocationTargetException e) {
- if (e.getTargetException() instanceof InterruptedException
- || e.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- return null;
- } catch(IllegalAccessException e) {
- return null;
- } catch(RuntimeException e) {
- return null;
- }
- }
-
-
-
- // If attributeName has not been recognized throw an AttributeNotFoundException
- throw(new AttributeNotFoundException("Cannot find " + attributeName +
- " attribute in " + dClassName));
-
- }
-
-
- public
- void setAttribute(Attribute attribute) throws AttributeNotFoundException,
- InvalidAttributeValueException,
- MBeanException,
- ReflectionException {
-
- // Check attribute is not null to avoid NullPointerException later on
- if (attribute == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("Attribute cannot be null"),
- "Cannot invoke a setter of " + dClassName +
- " with null attribute");
- }
- String name = attribute.getName();
- Object value = attribute.getValue();
-
- if (name == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("Attribute name cannot be null"),
- "Cannot invoke the setter of "+dClassName+
- " with null attribute name");
- }
-
-
-
- MethodUnion mu = (MethodUnion) dynamicProps.get(name);
-
- if(mu != null && mu.writeMethod != null) {
- Object[] o = new Object[1];
-
- Class[] params = mu.writeMethod.getParameterTypes();
- if(params[0] == org.apache.log4j.Priority.class) {
- value = OptionConverter.toLevel((String) value,
- (Level) getAttribute(name));
- }
- o[0] = value;
-
- try {
- mu.writeMethod.invoke(layout, o);
-
- } catch(InvocationTargetException e) {
- if (e.getTargetException() instanceof InterruptedException
- || e.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- cat.error("FIXME", e);
- } catch(IllegalAccessException e) {
- cat.error("FIXME", e);
- } catch(RuntimeException e) {
- cat.error("FIXME", e);
- }
- } else {
- throw(new AttributeNotFoundException("Attribute " + name +
- " not found in " +
- this.getClass().getName()));
- }
- }
-}
-
-
diff --git a/java/src/org/apache/log4j/jmx/LoggerDynamicMBean.java b/java/src/org/apache/log4j/jmx/LoggerDynamicMBean.java
deleted file mode 100644
index b226319..0000000
--- a/java/src/org/apache/log4j/jmx/LoggerDynamicMBean.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.jmx;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.OptionConverter;
-
-import javax.management.Attribute;
-import javax.management.AttributeNotFoundException;
-import javax.management.InvalidAttributeValueException;
-import javax.management.JMException;
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanConstructorInfo;
-import javax.management.MBeanException;
-import javax.management.MBeanInfo;
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanOperationInfo;
-import javax.management.MBeanParameterInfo;
-import javax.management.MalformedObjectNameException;
-import javax.management.Notification;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-import javax.management.ReflectionException;
-import javax.management.RuntimeOperationsException;
-import java.lang.reflect.Constructor;
-import java.util.Enumeration;
-import java.util.Vector;
-
-public class LoggerDynamicMBean extends AbstractDynamicMBean
- implements NotificationListener {
-
- private MBeanConstructorInfo[] dConstructors = new MBeanConstructorInfo[1];
- private MBeanOperationInfo[] dOperations = new MBeanOperationInfo[1];
-
- private Vector dAttributes = new Vector();
- private String dClassName = this.getClass().getName();
-
- private String dDescription =
- "This MBean acts as a management facade for a org.apache.log4j.Logger instance.";
-
- // This Logger instance is for logging.
- private static Logger cat = Logger.getLogger(LoggerDynamicMBean.class);
-
- // We wrap this Logger instance.
- private Logger logger;
-
- public LoggerDynamicMBean(Logger logger) {
- this.logger = logger;
- buildDynamicMBeanInfo();
- }
-
- public
- void handleNotification(Notification notification, Object handback) {
- cat.debug("Received notification: "+notification.getType());
- registerAppenderMBean((Appender) notification.getUserData() );
-
-
- }
-
- private
- void buildDynamicMBeanInfo() {
- Constructor[] constructors = this.getClass().getConstructors();
- dConstructors[0] = new MBeanConstructorInfo(
- "HierarchyDynamicMBean(): Constructs a HierarchyDynamicMBean instance",
- constructors[0]);
-
- dAttributes.add(new MBeanAttributeInfo("name",
- "java.lang.String",
- "The name of this Logger.",
- true,
- false,
- false));
-
- dAttributes.add(new MBeanAttributeInfo("priority",
- "java.lang.String",
- "The priority of this logger.",
- true,
- true,
- false));
-
-
-
-
-
- MBeanParameterInfo[] params = new MBeanParameterInfo[2];
- params[0] = new MBeanParameterInfo("class name", "java.lang.String",
- "add an appender to this logger");
- params[1] = new MBeanParameterInfo("appender name", "java.lang.String",
- "name of the appender");
-
- dOperations[0] = new MBeanOperationInfo("addAppender",
- "addAppender(): add an appender",
- params,
- "void",
- MBeanOperationInfo.ACTION);
- }
-
- protected
- Logger getLogger() {
- return logger;
- }
-
-
- public
- MBeanInfo getMBeanInfo() {
- //cat.debug("getMBeanInfo called.");
-
- MBeanAttributeInfo[] attribs = new MBeanAttributeInfo[dAttributes.size()];
- dAttributes.toArray(attribs);
-
- MBeanInfo mb = new MBeanInfo(dClassName,
- dDescription,
- attribs,
- dConstructors,
- dOperations,
- new MBeanNotificationInfo[0]);
- //cat.debug("getMBeanInfo exit.");
- return mb;
- }
-
- public
- Object invoke(String operationName, Object params[], String signature[])
- throws MBeanException,
- ReflectionException {
-
- if(operationName.equals("addAppender")) {
- addAppender((String) params[0], (String) params[1]);
- return "Hello world.";
- }
-
- return null;
- }
-
-
- public
- Object getAttribute(String attributeName) throws AttributeNotFoundException,
- MBeanException,
- ReflectionException {
-
- // Check attributeName is not null to avoid NullPointerException later on
- if (attributeName == null) {
- throw new RuntimeOperationsException(new IllegalArgumentException(
- "Attribute name cannot be null"),
- "Cannot invoke a getter of " + dClassName + " with null attribute name");
- }
-
- // Check for a recognized attributeName and call the corresponding getter
- if (attributeName.equals("name")) {
- return logger.getName();
- } else if(attributeName.equals("priority")) {
- Level l = logger.getLevel();
- if(l == null) {
- return null;
- } else {
- return l.toString();
- }
- } else if(attributeName.startsWith("appender=")) {
- try {
- return new ObjectName("log4j:"+attributeName );
- } catch(MalformedObjectNameException e) {
- cat.error("Could not create ObjectName" + attributeName);
- } catch(RuntimeException e) {
- cat.error("Could not create ObjectName" + attributeName);
- }
- }
-
-
- // If attributeName has not been recognized throw an AttributeNotFoundException
- throw(new AttributeNotFoundException("Cannot find " + attributeName +
- " attribute in " + dClassName));
-
- }
-
-
- void addAppender(String appenderClass, String appenderName) {
- cat.debug("addAppender called with "+appenderClass+", "+appenderName);
- Appender appender = (Appender)
- OptionConverter.instantiateByClassName(appenderClass,
- org.apache.log4j.Appender.class,
- null);
- appender.setName(appenderName);
- logger.addAppender(appender);
-
- //appenderMBeanRegistration();
-
- }
-
-
- public
- void setAttribute(Attribute attribute) throws AttributeNotFoundException,
- InvalidAttributeValueException,
- MBeanException,
- ReflectionException {
-
- // Check attribute is not null to avoid NullPointerException later on
- if (attribute == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("Attribute cannot be null"),
- "Cannot invoke a setter of " + dClassName +
- " with null attribute");
- }
- String name = attribute.getName();
- Object value = attribute.getValue();
-
- if (name == null) {
- throw new RuntimeOperationsException(
- new IllegalArgumentException("Attribute name cannot be null"),
- "Cannot invoke the setter of "+dClassName+
- " with null attribute name");
- }
-
-
- if(name.equals("priority")) {
- if (value instanceof String) {
- String s = (String) value;
- Level p = logger.getLevel();
- if(s.equalsIgnoreCase("NULL")) {
- p = null;
- } else {
- p = OptionConverter.toLevel(s, p);
- }
- logger.setLevel(p);
- }
- } else {
- throw(new AttributeNotFoundException("Attribute " + name +
- " not found in " +
- this.getClass().getName()));
- }
- }
-
- void appenderMBeanRegistration() {
- Enumeration enumeration = logger.getAllAppenders();
- while(enumeration.hasMoreElements()) {
- Appender appender = (Appender) enumeration.nextElement();
- registerAppenderMBean(appender);
- }
- }
-
- void registerAppenderMBean(Appender appender) {
- String name = getAppenderName(appender);
- cat.debug("Adding AppenderMBean for appender named "+name);
- ObjectName objectName = null;
- try {
- AppenderDynamicMBean appenderMBean = new AppenderDynamicMBean(appender);
- objectName = new ObjectName("log4j", "appender", name);
- if (!server.isRegistered(objectName)) {
- registerMBean(appenderMBean, objectName);
- dAttributes.add(new MBeanAttributeInfo("appender=" + name, "javax.management.ObjectName",
- "The " + name + " appender.", true, true, false));
- }
-
- } catch(JMException e) {
- cat.error("Could not add appenderMBean for ["+name+"].", e);
- } catch(java.beans.IntrospectionException e) {
- cat.error("Could not add appenderMBean for ["+name+"].", e);
- } catch(RuntimeException e) {
- cat.error("Could not add appenderMBean for ["+name+"].", e);
- }
- }
-
- public
- void postRegister(java.lang.Boolean registrationDone) {
- appenderMBeanRegistration();
- }
-}
diff --git a/java/src/org/apache/log4j/jmx/MethodUnion.java b/java/src/org/apache/log4j/jmx/MethodUnion.java
deleted file mode 100644
index e9f2fb2..0000000
--- a/java/src/org/apache/log4j/jmx/MethodUnion.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.jmx;
-
-import java.lang.reflect.Method;
-
-class MethodUnion {
-
- Method readMethod;
- Method writeMethod;
-
- MethodUnion( Method readMethod, Method writeMethod) {
- this.readMethod = readMethod;
- this.writeMethod = writeMethod;
- }
-
-}
diff --git a/java/src/org/apache/log4j/jmx/package.html b/java/src/org/apache/log4j/jmx/package.html
deleted file mode 100644
index 6d1583a..0000000
--- a/java/src/org/apache/log4j/jmx/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- This package lets you manage log4j settings using JMX. It is
- unfortunately not of production quality.
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/AppenderFinalizer.java b/java/src/org/apache/log4j/lf5/AppenderFinalizer.java
deleted file mode 100644
index a2a7019..0000000
--- a/java/src/org/apache/log4j/lf5/AppenderFinalizer.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import org.apache.log4j.lf5.viewer.LogBrokerMonitor;
-
-/**
- * AppenderFinalizer has a single method that will finalize
- * resources associated with a LogBrokerMonitor in the event
- * that the LF5Appender class is destroyed, and the class loader
- * is garbage collected.
- *
- * @author Brent Sprecher
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class AppenderFinalizer {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- protected LogBrokerMonitor _defaultMonitor = null;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public AppenderFinalizer(LogBrokerMonitor defaultMonitor) {
- _defaultMonitor = defaultMonitor;
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- /**
- * @throws java.lang.Throwable
- */
- protected void finalize() throws Throwable {
- System.out.println("Disposing of the default LogBrokerMonitor instance");
- _defaultMonitor.dispose();
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/DefaultLF5Configurator.java b/java/src/org/apache/log4j/lf5/DefaultLF5Configurator.java
deleted file mode 100644
index 31d7f5b..0000000
--- a/java/src/org/apache/log4j/lf5/DefaultLF5Configurator.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.spi.Configurator;
-import org.apache.log4j.spi.LoggerRepository;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * The DefaultLF5Configurator provides a default
- * configuration for the LF5Appender.
- *
- * Note: The preferred method for configuring a LF5Appender
- * is to use the LF5Manager class. This class ensures
- * that configuration does not occur multiple times, and improves system
- * performance. Reconfiguring the monitor multiple times can result in
- * unexpected behavior.
- *
- * @author Brent Sprecher
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class DefaultLF5Configurator implements Configurator {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- /**
- * This class should never be instantiated! It implements the
- * Configurator
- * interface, but does not provide the same functionality as full
- * configurator class.
- */
- private DefaultLF5Configurator() {
-
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- /**
- * This method configures the LF5Appender using a
- * default configuration file. The default configuration file is
- * defaultconfig.properties.
- * @throws java.io.IOException
- */
- public static void configure() throws IOException {
- String resource =
- "/org/apache/log4j/lf5/config/defaultconfig.properties";
- URL configFileResource =
- DefaultLF5Configurator.class.getResource(resource);
-
- if (configFileResource != null) {
- PropertyConfigurator.configure(configFileResource);
- } else {
- throw new IOException("Error: Unable to open the resource" +
- resource);
- }
-
- }
-
- /**
- * This is a dummy method that will throw an
- * IllegalStateException if used.
- */
- public void doConfigure(URL configURL, LoggerRepository repository) {
- throw new IllegalStateException("This class should NOT be" +
- " instantiated!");
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/LF5Appender.java b/java/src/org/apache/log4j/lf5/LF5Appender.java
deleted file mode 100644
index c466f3a..0000000
--- a/java/src/org/apache/log4j/lf5/LF5Appender.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import java.awt.Toolkit;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.lf5.viewer.LogBrokerMonitor;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * LF5Appender logs events to a swing based logging
- * console. The swing console supports turning categories on and off,
- * multiple detail level views, as well as full text searching and many
- * other capabilties.
- *
- * @author Brent Sprecher
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LF5Appender extends AppenderSkeleton {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- protected LogBrokerMonitor _logMonitor;
- protected static LogBrokerMonitor _defaultLogMonitor;
- protected static AppenderFinalizer _finalizer;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- * Constructs a LF5Appender using the default instance of
- * the LogBrokerMonitor. This constructor should always
- * be preferred over the
- * LF5Appender(LogBrokerMonitor monitor)
- * constructor, unless you need to spawn additional log monitoring
- * windows.
- */
- public LF5Appender() {
- this(getDefaultInstance());
- }
-
- /**
- * Constructs a LF5Appender using an instance of
- * a LogBrokerMonitor supplied by the user. This
- * constructor should only be used when you need to spawn
- * additional log monitoring windows.
- *
- * @param monitor An instance of a LogBrokerMonitor
- * created by the user.
- */
- public LF5Appender(LogBrokerMonitor monitor) {
-
- if (monitor != null) {
- _logMonitor = monitor;
- }
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Appends a LoggingEvent record to the
- * LF5Appender.
- * @param event The LoggingEvent
- * to be appended.
- */
- public void append(LoggingEvent event) {
- // Retrieve the information from the log4j LoggingEvent.
- String category = event.getLoggerName();
- String logMessage = event.getRenderedMessage();
- String nestedDiagnosticContext = event.getNDC();
- String threadDescription = event.getThreadName();
- String level = event.getLevel().toString();
- long time = event.timeStamp;
- LocationInfo locationInfo = event.getLocationInformation();
-
- // Add the logging event information to a LogRecord
- Log4JLogRecord record = new Log4JLogRecord();
-
- record.setCategory(category);
- record.setMessage(logMessage);
- record.setLocation(locationInfo.fullInfo);
- record.setMillis(time);
- record.setThreadDescription(threadDescription);
-
- if (nestedDiagnosticContext != null) {
- record.setNDC(nestedDiagnosticContext);
- } else {
- record.setNDC("");
- }
-
- if (event.getThrowableInformation() != null) {
- record.setThrownStackTrace(event.getThrowableInformation());
- }
-
- try {
- record.setLevel(LogLevel.valueOf(level));
- } catch (LogLevelFormatException e) {
- // If the priority level doesn't match one of the predefined
- // log levels, then set the level to warning.
- record.setLevel(LogLevel.WARN);
- }
-
- if (_logMonitor != null) {
- _logMonitor.addMessage(record);
- }
- }
-
- /**
- * This method is an empty implementation of the close() method inherited
- * from the org.apache.log4j.Appender interface.
- */
- public void close() {
- }
-
- /**
- * Returns a value that indicates whether this appender requires a
- * Layout. This method always returns false.
- * No layout is required for the LF5Appender.
- */
- public boolean requiresLayout() {
- return false;
- }
-
- /**
- * This method is used to set the property that controls whether
- * the LogBrokerMonitor is hidden or closed when a user
- * exits
- * the monitor. By default, the LogBrokerMonitor will hide
- * itself when the log window is exited, and the swing thread will
- * continue to running in the background. If this property is
- * set to true, the LogBrokerMonitor will call System.exit(0)
- * and will shut down swing thread and the virtual machine.
- *
- * @param callSystemExitOnClose A boolean value indicating whether
- * to call System.exit(0) when closing the log window.
- */
- public void setCallSystemExitOnClose(boolean callSystemExitOnClose) {
- _logMonitor.setCallSystemExitOnClose(callSystemExitOnClose);
- }
-
- /**
- * The equals method compares two LF5Appenders and determines whether
- * they are equal. Two Appenders will be considered equal
- * if, and only if, they both contain references to the same
- * LogBrokerMonitor.
- *
- * @param compareTo A boolean value indicating whether
- * the two LF5Appenders are equal.
- */
- public boolean equals(LF5Appender compareTo) {
- // If both reference the same LogBrokerMonitor, they are equal.
- return _logMonitor == compareTo.getLogBrokerMonitor();
- }
-
- public LogBrokerMonitor getLogBrokerMonitor() {
- return _logMonitor;
- }
-
- public static void main(String[] args) {
- new LF5Appender();
- }
-
- public void setMaxNumberOfRecords(int maxNumberOfRecords) {
- _defaultLogMonitor.setMaxNumberOfLogRecords(maxNumberOfRecords);
- }
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- /**
- * @return The default instance of the LogBrokerMonitor.
- */
- protected static synchronized LogBrokerMonitor getDefaultInstance() {
- if (_defaultLogMonitor == null) {
- try {
- _defaultLogMonitor =
- new LogBrokerMonitor(LogLevel.getLog4JLevels());
- _finalizer = new AppenderFinalizer(_defaultLogMonitor);
-
- _defaultLogMonitor.setFrameSize(getDefaultMonitorWidth(),
- getDefaultMonitorHeight());
- _defaultLogMonitor.setFontSize(12);
- _defaultLogMonitor.show();
-
- } catch (SecurityException e) {
- _defaultLogMonitor = null;
- }
- }
-
- return _defaultLogMonitor;
- }
-
- /**
- * @return the screen width from Toolkit.getScreenSize()
- * if possible, otherwise returns 800
- * @see java.awt.Toolkit
- */
- protected static int getScreenWidth() {
- try {
- return Toolkit.getDefaultToolkit().getScreenSize().width;
- } catch (Throwable t) {
- return 800;
- }
- }
-
- /**
- * @return the screen height from Toolkit.getScreenSize()
- * if possible, otherwise returns 600
- * @see java.awt.Toolkit
- */
- protected static int getScreenHeight() {
- try {
- return Toolkit.getDefaultToolkit().getScreenSize().height;
- } catch (Throwable t) {
- return 600;
- }
- }
-
- protected static int getDefaultMonitorWidth() {
- return (3 * getScreenWidth()) / 4;
- }
-
- protected static int getDefaultMonitorHeight() {
- return (3 * getScreenHeight()) / 4;
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/Log4JLogRecord.java b/java/src/org/apache/log4j/lf5/Log4JLogRecord.java
deleted file mode 100644
index 4393eb5..0000000
--- a/java/src/org/apache/log4j/lf5/Log4JLogRecord.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import org.apache.log4j.spi.ThrowableInformation;
-
-/**
- * A Log4JLogRecord encapsulates
- * the details of your log4j LoggingEvent in a format usable
- * by the LogBrokerMonitor.
- *
- * @author Brent Sprecher
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class Log4JLogRecord extends LogRecord {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- * Constructs an instance of a Log4JLogRecord.
- */
- public Log4JLogRecord() {
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- /**
- * Determines which Priority levels will
- * be displayed in colored font when the LogMonitorAppender
- * renders this log message. By default, messages will be colored
- * red if they are of Priority ERROR or FATAL.
- *
- * @return true if the log level is ERROR or FATAL.
- */
- public boolean isSevereLevel() {
- boolean isSevere = false;
-
- if (LogLevel.ERROR.equals(getLevel()) ||
- LogLevel.FATAL.equals(getLevel())) {
- isSevere = true;
- }
-
- return isSevere;
- }
-
- /**
- * Set stack trace information associated with this Log4JLogRecord.
- * When this method is called, the stack trace in a
- * String-based format is made
- * available via the getThrownStackTrace() method.
- *
- * @param throwableInfo An org.apache.log4j.spi.ThrowableInformation to
- * associate with this Log4JLogRecord.
- * @see #getThrownStackTrace()
- */
- public void setThrownStackTrace(ThrowableInformation throwableInfo) {
- String[] stackTraceArray = throwableInfo.getThrowableStrRep();
-
- StringBuffer stackTrace = new StringBuffer();
- String nextLine;
-
- for (int i = 0; i < stackTraceArray.length; i++) {
- nextLine = stackTraceArray[i] + "\n";
- stackTrace.append(nextLine);
- }
-
- _thrownStackTrace = stackTrace.toString();
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/LogLevel.java b/java/src/org/apache/log4j/lf5/LogLevel.java
deleted file mode 100644
index 080ed68..0000000
--- a/java/src/org/apache/log4j/lf5/LogLevel.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import java.awt.Color;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The LogLevel class defines a set of standard logging levels.
- *
- * The logging Level objects are ordered and are specified by ordered
- * integers. Enabling logging at a given level also enables logging at all
- * higher levels.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- * @author Brent Sprecher
- * @author Richard Hurst
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogLevel implements java.io.Serializable {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- // log4j log levels.
- public final static LogLevel FATAL = new LogLevel("FATAL", 0);
- public final static LogLevel ERROR = new LogLevel("ERROR", 1);
- public final static LogLevel WARN = new LogLevel("WARN", 2);
- public final static LogLevel INFO = new LogLevel("INFO", 3);
- public final static LogLevel DEBUG = new LogLevel("DEBUG", 4);
-
- // jdk1.4 log levels NOTE: also includes INFO
- public final static LogLevel SEVERE = new LogLevel("SEVERE", 1);
- public final static LogLevel WARNING = new LogLevel("WARNING", 2);
- public final static LogLevel CONFIG = new LogLevel("CONFIG", 4);
- public final static LogLevel FINE = new LogLevel("FINE", 5);
- public final static LogLevel FINER = new LogLevel("FINER", 6);
- public final static LogLevel FINEST = new LogLevel("FINEST", 7);
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected String _label;
- protected int _precedence;
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private static LogLevel[] _log4JLevels;
- private static LogLevel[] _jdk14Levels;
- private static LogLevel[] _allDefaultLevels;
- private static Map _logLevelMap;
- private static Map _logLevelColorMap;
- private static Map _registeredLogLevelMap = new HashMap();
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- static {
- _log4JLevels = new LogLevel[]{FATAL, ERROR, WARN, INFO, DEBUG};
- _jdk14Levels = new LogLevel[]{SEVERE, WARNING, INFO,
- CONFIG, FINE, FINER, FINEST};
- _allDefaultLevels = new LogLevel[]{FATAL, ERROR, WARN, INFO, DEBUG,
- SEVERE, WARNING, CONFIG, FINE, FINER, FINEST};
-
- _logLevelMap = new HashMap();
- for (int i = 0; i < _allDefaultLevels.length; i++) {
- _logLevelMap.put(_allDefaultLevels[i].getLabel(), _allDefaultLevels[i]);
- }
-
- // prepopulate map with levels and text color of black
- _logLevelColorMap = new HashMap();
- for (int i = 0; i < _allDefaultLevels.length; i++) {
- _logLevelColorMap.put(_allDefaultLevels[i], Color.black);
- }
- }
-
- public LogLevel(String label, int precedence) {
- _label = label;
- _precedence = precedence;
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Return the Label of the LogLevel.
- */
- public String getLabel() {
- return _label;
- }
-
- /**
- * Returns true if the level supplied is encompassed by this level.
- * For example, LogLevel.SEVERE encompasses no other LogLevels and
- * LogLevel.FINE encompasses all other LogLevels. By definition,
- * a LogLevel encompasses itself.
- */
- public boolean encompasses(LogLevel level) {
- if (level.getPrecedence() <= getPrecedence()) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Convert a log level label into a LogLevel object.
- *
- * @param level The label of a level to be converted into a LogLevel.
- * @return LogLevel The LogLevel with a label equal to level.
- * @throws LogLevelFormatException Is thrown when the level can not be
- * converted into a LogLevel.
- */
- public static LogLevel valueOf(String level)
- throws LogLevelFormatException {
- LogLevel logLevel = null;
- if (level != null) {
- level = level.trim().toUpperCase();
- logLevel = (LogLevel) _logLevelMap.get(level);
- }
-
- // Didn't match, Check for registered LogLevels
- if (logLevel == null && _registeredLogLevelMap.size() > 0) {
- logLevel = (LogLevel) _registeredLogLevelMap.get(level);
- }
-
- if (logLevel == null) {
- StringBuffer buf = new StringBuffer();
- buf.append("Error while trying to parse (" + level + ") into");
- buf.append(" a LogLevel.");
- throw new LogLevelFormatException(buf.toString());
- }
- return logLevel;
- }
-
- /**
- * Registers a used defined LogLevel.
- *
- * @param logLevel The log level to be registered. Cannot be a default LogLevel
- * @return LogLevel The replaced log level.
- */
- public static LogLevel register(LogLevel logLevel) {
- if (logLevel == null) return null;
-
- // ensure that this is not a default log level
- if (_logLevelMap.get(logLevel.getLabel()) == null) {
- return (LogLevel) _registeredLogLevelMap.put(logLevel.getLabel(), logLevel);
- }
-
- return null;
- }
-
- public static void register(LogLevel[] logLevels) {
- if (logLevels != null) {
- for (int i = 0; i < logLevels.length; i++) {
- register(logLevels[i]);
- }
- }
- }
-
- public static void register(List logLevels) {
- if (logLevels != null) {
- Iterator it = logLevels.iterator();
- while (it.hasNext()) {
- register((LogLevel) it.next());
- }
- }
- }
-
- public boolean equals(Object o) {
- boolean equals = false;
-
- if (o instanceof LogLevel) {
- if (this.getPrecedence() ==
- ((LogLevel) o).getPrecedence()) {
- equals = true;
- }
-
- }
-
- return equals;
- }
-
- public int hashCode() {
- return _label.hashCode();
- }
-
- public String toString() {
- return _label;
- }
-
- // set a text color for a specific log level
- public void setLogLevelColorMap(LogLevel level, Color color) {
- // remove the old entry
- _logLevelColorMap.remove(level);
- // add the new color entry
- if (color == null) {
- color = Color.black;
- }
- _logLevelColorMap.put(level, color);
- }
-
- public static void resetLogLevelColorMap() {
- // empty the map
- _logLevelColorMap.clear();
-
- // repopulate map and reset text color black
- for (int i = 0; i < _allDefaultLevels.length; i++) {
- _logLevelColorMap.put(_allDefaultLevels[i], Color.black);
- }
- }
-
- /**
- * @return A List of LogLevel objects that map
- * to log4j Priority objects.
- */
- public static List getLog4JLevels() {
- return Arrays.asList(_log4JLevels);
- }
-
- public static List getJdk14Levels() {
- return Arrays.asList(_jdk14Levels);
- }
-
- public static List getAllDefaultLevels() {
- return Arrays.asList(_allDefaultLevels);
- }
-
- public static Map getLogLevelColorMap() {
- return _logLevelColorMap;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected int getPrecedence() {
- return _precedence;
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/LogLevelFormatException.java b/java/src/org/apache/log4j/lf5/LogLevelFormatException.java
deleted file mode 100644
index 1109e23..0000000
--- a/java/src/org/apache/log4j/lf5/LogLevelFormatException.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-/**
- * Thrown to indicate that the client has attempted to convert a string
- * to one the LogLevel types, but the string does not have the appropriate
- * format.
- *
- * @author Michael J. Sikorsky<
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogLevelFormatException extends Exception {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public LogLevelFormatException(String message) {
- super(message);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/LogRecord.java b/java/src/org/apache/log4j/lf5/LogRecord.java
deleted file mode 100644
index 4f4097f..0000000
--- a/java/src/org/apache/log4j/lf5/LogRecord.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * LogRecord. A LogRecord encapsulates the details of your desired log
- * request.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public abstract class LogRecord implements java.io.Serializable {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected static long _seqCount = 0;
-
- protected LogLevel _level;
- protected String _message;
- protected long _sequenceNumber;
- protected long _millis;
- protected String _category;
- protected String _thread;
- protected String _thrownStackTrace;
- protected Throwable _thrown;
- protected String _ndc;
- protected String _location;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public LogRecord() {
- super();
-
- _millis = System.currentTimeMillis();
- _category = "Debug";
- _message = "";
- _level = LogLevel.INFO;
- _sequenceNumber = getNextId();
- _thread = Thread.currentThread().toString();
- _ndc = "";
- _location = "";
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Get the level of this LogRecord.
- *
- * @return The LogLevel of this record.
- * @see #setLevel(LogLevel)
- * @see LogLevel
- */
- public LogLevel getLevel() {
- return (_level);
- }
-
- /**
- * Set the level of this LogRecord.
- *
- * @param level The LogLevel for this record.
- * @see #getLevel()
- * @see LogLevel
- */
- public void setLevel(LogLevel level) {
- _level = level;
- }
-
- /**
- * Abstract method. Must be overridden to indicate what log level
- * to show in red.
- */
- public abstract boolean isSevereLevel();
-
- /**
- * @return true if getThrown().toString() is a non-empty string.
- */
- public boolean hasThrown() {
- Throwable thrown = getThrown();
- if (thrown == null) {
- return false;
- }
- String thrownString = thrown.toString();
- return thrownString != null && thrownString.trim().length() != 0;
- }
-
- /**
- * @return true if isSevereLevel() or hasThrown() returns true.
- */
- public boolean isFatal() {
- return isSevereLevel() || hasThrown();
- }
-
- /**
- * Get the category asscociated with this LogRecord. For a more detailed
- * description of what a category is see setCategory().
- *
- * @return The category of this record.
- * @see #setCategory(String)
- */
- public String getCategory() {
- return (_category);
- }
-
- /**
- * Set the category associated with this LogRecord. A category represents
- * a hierarchical dot (".") separated namespace for messages.
- * The definition of a category is application specific, but a common convention
- * is as follows:
- *
- *
- * When logging messages
- * for a particluar class you can use its class name:
- * com.thoughtworks.framework.servlet.ServletServiceBroker.
- * Futhermore, to log a message for a particular method in a class
- * add the method name:
- * com.thoughtworks.framework.servlet.ServletServiceBroker.init().
- *
- *
- * @param category The category for this record.
- * @see #getCategory()
- */
- public void setCategory(String category) {
- _category = category;
- }
-
- /**
- * Get the message asscociated with this LogRecord.
- *
- * @return The message of this record.
- * @see #setMessage(String)
- */
- public String getMessage() {
- return (_message);
- }
-
- /**
- * Set the message associated with this LogRecord.
- *
- * @param message The message for this record.
- * @see #getMessage()
- */
- public void setMessage(String message) {
- _message = message;
- }
-
- /**
- * Get the sequence number associated with this LogRecord. Sequence numbers
- * are generally assigned when a LogRecord is constructed. Sequence numbers
- * start at 0 and increase with each newly constructed LogRocord.
- *
- * @return The sequence number of this record.
- * @see #setSequenceNumber(long)
- */
- public long getSequenceNumber() {
- return (_sequenceNumber);
- }
-
- /**
- * Set the sequence number assocsiated with this LogRecord. A sequence number
- * will automatically be assigned to evey newly constructed LogRecord, however,
- * this method can override the value.
- *
- * @param number The sequence number.
- * @see #getSequenceNumber()
- */
- public void setSequenceNumber(long number) {
- _sequenceNumber = number;
- }
-
- /**
- * Get the event time of this record in milliseconds from 1970.
- * When a LogRecord is constructed the event time is set but may be
- * overridden by calling setMillis();
- *
- * @return The event time of this record in milliseconds from 1970.
- * @see #setMillis(long)
- */
- public long getMillis() {
- return _millis;
- }
-
- /**
- * Set the event time of this record. When a LogRecord is constructed
- * the event time is set but may be overridden by calling this method.
- *
- * @param millis The time in milliseconds from 1970.
- * @see #getMillis()
- */
- public void setMillis(long millis) {
- _millis = millis;
- }
-
- /**
- * Get the thread description asscociated with this LogRecord. When a
- * LogRecord is constructed, the thread description is set by calling:
- * Thread.currentThread().toString(). You may supply a thread description
- * of your own by calling the setThreadDescription(String) method.
- *
- * @return The thread description of this record.
- * @see #setThreadDescription(String)
- */
- public String getThreadDescription() {
- return (_thread);
- }
-
- /**
- * Set the thread description associated with this LogRecord. When a
- * LogRecord is constructed, the thread description is set by calling:
- * Thread.currentThread().toString(). You may supply a thread description
- * of your own by calling this method.
- *
- * @param threadDescription The description of the thread for this record.
- * @see #getThreadDescription()
- */
- public void setThreadDescription(String threadDescription) {
- _thread = threadDescription;
- }
-
- /**
- * Get the stack trace in a String-based format for the associated Throwable
- * of this LogRecord. The stack trace in a String-based format is set
- * when the setThrown(Throwable) method is called.
- *
- *
- * Why do we need this method considering that we
- * have the getThrown() and setThrown() methods?
- * A Throwable object may not be serializable, however, a String representation
- * of it is. Users of LogRecords should generally call this method over
- * getThrown() for the reasons of serialization.
- *
- *
- * @return The Stack Trace for the asscoiated Throwable of this LogRecord.
- * @see #setThrown(Throwable)
- * @see #getThrown()
- */
- public String getThrownStackTrace() {
- return (_thrownStackTrace);
- }
-
- /**
- * Set the ThrownStackTrace for the log record.
- *
- * @param trace A String to associate with this LogRecord
- * @see #getThrownStackTrace()
- */
- public void setThrownStackTrace(String trace) {
- _thrownStackTrace = trace;
- }
-
- /**
- * Get the Throwable associated with this LogRecord.
- *
- * @return The LogLevel of this record.
- * @see #setThrown(Throwable)
- * @see #getThrownStackTrace()
- */
- public Throwable getThrown() {
- return (_thrown);
- }
-
- /**
- * Set the Throwable associated with this LogRecord. When this method
- * is called, the stack trace in a String-based format is made
- * available via the getThrownStackTrace() method.
- *
- * @param thrown A Throwable to associate with this LogRecord.
- * @see #getThrown()
- * @see #getThrownStackTrace()
- */
- public void setThrown(Throwable thrown) {
- if (thrown == null) {
- return;
- }
- _thrown = thrown;
- StringWriter sw = new StringWriter();
- PrintWriter out = new PrintWriter(sw);
- thrown.printStackTrace(out);
- out.flush();
- _thrownStackTrace = sw.toString();
- try {
- out.close();
- sw.close();
- } catch (IOException e) {
- // Do nothing, this should not happen as it is StringWriter.
- }
- out = null;
- sw = null;
- }
-
- /**
- * Return a String representation of this LogRecord.
- */
- public String toString() {
- StringBuffer buf = new StringBuffer();
- buf.append("LogRecord: [" + _level + ", " + _message + "]");
- return (buf.toString());
- }
-
- /**
- * Get the NDC (nested diagnostic context) for this record.
- *
- * @return The string representing the NDC.
- */
- public String getNDC() {
- return _ndc;
- }
-
- /**
- * Set the NDC (nested diagnostic context) for this record.
- *
- * @param ndc A string representing the NDC.
- */
- public void setNDC(String ndc) {
- _ndc = ndc;
- }
-
- /**
- * Get the location in code where this LogRecord originated.
- *
- * @return The string containing the location information.
- */
- public String getLocation() {
- return _location;
- }
-
- /**
- * Set the location in code where this LogRecord originated.
- *
- * @param location A string containing location information.
- */
- public void setLocation(String location) {
- _location = location;
- }
-
- /**
- * Resets that sequence number to 0.
- *
- */
- public static synchronized void resetSequenceNumber() {
- _seqCount = 0;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected static synchronized long getNextId() {
- _seqCount++;
- return _seqCount;
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/LogRecordFilter.java b/java/src/org/apache/log4j/lf5/LogRecordFilter.java
deleted file mode 100644
index 25a3e53..0000000
--- a/java/src/org/apache/log4j/lf5/LogRecordFilter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-
-/**
- * An interface for classes which filters LogRecords. Implementations
- * represent a rule or condition which LogRecords may pass or fail.
- * @see LogRecord
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public interface LogRecordFilter {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * @return true if the specified LogRecord satisfies whatever condition
- * implementing class tests for.
- */
- public boolean passes(LogRecord record);
-
-}
-
diff --git a/java/src/org/apache/log4j/lf5/PassingLogRecordFilter.java b/java/src/org/apache/log4j/lf5/PassingLogRecordFilter.java
deleted file mode 100644
index 178f6cb..0000000
--- a/java/src/org/apache/log4j/lf5/PassingLogRecordFilter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-
-/**
- * An implementation of LogRecordFilter which always returns true.
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class PassingLogRecordFilter implements LogRecordFilter {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * @return true;
- */
- public boolean passes(LogRecord record) {
- return true;
- }
-
- /**
- * Does nothing.
- */
- public void reset() {
- // do nothing
- }
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/StartLogFactor5.java b/java/src/org/apache/log4j/lf5/StartLogFactor5.java
deleted file mode 100644
index 914b02f..0000000
--- a/java/src/org/apache/log4j/lf5/StartLogFactor5.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5;
-
-import org.apache.log4j.lf5.viewer.LogBrokerMonitor;
-
-/**
- * Starts an instance of the LogFactor5 console for off-line viewing.
- *
- * @author Brad Marlborough
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class StartLogFactor5 {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * NetworkClient - starts a an instance of the LogFactor5 console and configures
- * the console settings.
- */
- public final static void main(String[] args) {
-
- LogBrokerMonitor monitor = new LogBrokerMonitor(
- LogLevel.getLog4JLevels());
-
- monitor.setFrameSize(LF5Appender.getDefaultMonitorWidth(),
- LF5Appender.getDefaultMonitorHeight());
- monitor.setFontSize(12);
- monitor.show();
-
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-
-}
-
-
diff --git a/java/src/org/apache/log4j/lf5/util/AdapterLogRecord.java b/java/src/org/apache/log4j/lf5/util/AdapterLogRecord.java
deleted file mode 100644
index 2e4ee6f..0000000
--- a/java/src/org/apache/log4j/lf5/util/AdapterLogRecord.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import org.apache.log4j.lf5.LogLevel;
-import org.apache.log4j.lf5.LogRecord;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * A LogRecord to be used with the LogMonitorAdapter
- *
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class AdapterLogRecord extends LogRecord {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private static LogLevel severeLevel = null;
-
- private static StringWriter sw = new StringWriter();
- private static PrintWriter pw = new PrintWriter(sw);
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public AdapterLogRecord() {
- super();
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public void setCategory(String category) {
- super.setCategory(category);
- super.setLocation(getLocationInfo(category));
- }
-
- public boolean isSevereLevel() {
- if (severeLevel == null) return false;
- return severeLevel.equals(getLevel());
- }
-
- public static void setSevereLevel(LogLevel level) {
- severeLevel = level;
- }
-
- public static LogLevel getSevereLevel() {
- return severeLevel;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected String getLocationInfo(String category) {
- String stackTrace = stackTraceToString(new Throwable());
- String line = parseLine(stackTrace, category);
- return line;
- }
-
- protected String stackTraceToString(Throwable t) {
- String s = null;
-
- synchronized (sw) {
- t.printStackTrace(pw);
- s = sw.toString();
- sw.getBuffer().setLength(0);
- }
-
- return s;
- }
-
- protected String parseLine(String trace, String category) {
- int index = trace.indexOf(category);
- if (index == -1) return null;
- trace = trace.substring(index);
- trace = trace.substring(0, trace.indexOf(")") + 1);
- return trace;
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/util/DateFormatManager.java b/java/src/org/apache/log4j/lf5/util/DateFormatManager.java
deleted file mode 100644
index 6bed9cc..0000000
--- a/java/src/org/apache/log4j/lf5/util/DateFormatManager.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * Date format manager.
- * Utility class to help manage consistent date formatting and parsing.
- * It may be advantageous to have multiple DateFormatManagers per
- * application. For example, one for handling the output (formatting) of
- * dates, and another one for handling the input (parsing) of dates.
- *
- * @author Robert Shaw
- * @author Michael J. Sikorsky
- */
-
-// Contributed by ThoughtWorks Inc.
-public class DateFormatManager {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private TimeZone _timeZone = null;
- private Locale _locale = null;
-
- private String _pattern = null;
- private DateFormat _dateFormat = null;
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public DateFormatManager() {
- super();
- configure();
- }
-
- public DateFormatManager(TimeZone timeZone) {
- super();
-
- _timeZone = timeZone;
- configure();
- }
-
- public DateFormatManager(Locale locale) {
- super();
-
- _locale = locale;
- configure();
- }
-
- public DateFormatManager(String pattern) {
- super();
-
- _pattern = pattern;
- configure();
- }
-
- public DateFormatManager(TimeZone timeZone, Locale locale) {
- super();
-
- _timeZone = timeZone;
- _locale = locale;
- configure();
- }
-
- public DateFormatManager(TimeZone timeZone, String pattern) {
- super();
-
- _timeZone = timeZone;
- _pattern = pattern;
- configure();
- }
-
- public DateFormatManager(Locale locale, String pattern) {
- super();
-
- _locale = locale;
- _pattern = pattern;
- configure();
- }
-
- public DateFormatManager(TimeZone timeZone, Locale locale, String pattern) {
- super();
-
- _timeZone = timeZone;
- _locale = locale;
- _pattern = pattern;
- configure();
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public synchronized TimeZone getTimeZone() {
- if (_timeZone == null) {
- return TimeZone.getDefault();
- } else {
- return _timeZone;
- }
- }
-
- public synchronized void setTimeZone(TimeZone timeZone) {
- _timeZone = timeZone;
- configure();
- }
-
- public synchronized Locale getLocale() {
- if (_locale == null) {
- return Locale.getDefault();
- } else {
- return _locale;
- }
- }
-
- public synchronized void setLocale(Locale locale) {
- _locale = locale;
- configure();
- }
-
- public synchronized String getPattern() {
- return _pattern;
- }
-
- /**
- * Set the pattern. i.e. "EEEEE, MMMMM d, yyyy hh:mm aaa"
- */
- public synchronized void setPattern(String pattern) {
- _pattern = pattern;
- configure();
- }
-
-
- /**
- * This method has been deprecated in favour of getPattern().
- * @deprecated Use getPattern().
- */
- public synchronized String getOutputFormat() {
- return _pattern;
- }
-
- /**
- * This method has been deprecated in favour of setPattern().
- * @deprecated Use setPattern().
- */
- public synchronized void setOutputFormat(String pattern) {
- _pattern = pattern;
- configure();
- }
-
- public synchronized DateFormat getDateFormatInstance() {
- return _dateFormat;
- }
-
- public synchronized void setDateFormatInstance(DateFormat dateFormat) {
- _dateFormat = dateFormat;
- // No reconfiguration necessary!
- }
-
- public String format(Date date) {
- return getDateFormatInstance().format(date);
- }
-
- public String format(Date date, String pattern) {
- DateFormat formatter = null;
- formatter = getDateFormatInstance();
- if (formatter instanceof SimpleDateFormat) {
- formatter = (SimpleDateFormat) (formatter.clone());
- ((SimpleDateFormat) formatter).applyPattern(pattern);
- }
- return formatter.format(date);
- }
-
- /**
- * @throws java.text.ParseException
- */
- public Date parse(String date) throws ParseException {
- return getDateFormatInstance().parse(date);
- }
-
- /**
- * @throws java.text.ParseException
- */
- public Date parse(String date, String pattern) throws ParseException {
- DateFormat formatter = null;
- formatter = getDateFormatInstance();
- if (formatter instanceof SimpleDateFormat) {
- formatter = (SimpleDateFormat) (formatter.clone());
- ((SimpleDateFormat) formatter).applyPattern(pattern);
- }
- return formatter.parse(date);
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
- private synchronized void configure() {
- _dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL,
- DateFormat.FULL,
- getLocale());
- _dateFormat.setTimeZone(getTimeZone());
-
- if (_pattern != null) {
- ((SimpleDateFormat) _dateFormat).applyPattern(_pattern);
- }
- }
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/util/LogFileParser.java b/java/src/org/apache/log4j/lf5/util/LogFileParser.java
deleted file mode 100644
index ee4592d..0000000
--- a/java/src/org/apache/log4j/lf5/util/LogFileParser.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import javax.swing.SwingUtilities;
-
-import org.apache.log4j.lf5.Log4JLogRecord;
-import org.apache.log4j.lf5.LogLevel;
-import org.apache.log4j.lf5.LogLevelFormatException;
-import org.apache.log4j.lf5.LogRecord;
-import org.apache.log4j.lf5.viewer.LogBrokerMonitor;
-import org.apache.log4j.lf5.viewer.LogFactor5ErrorDialog;
-import org.apache.log4j.lf5.viewer.LogFactor5LoadingDialog;
-
-/**
- * Provides utility methods for input and output streams.
- *
- * @author Brad Marlborough
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogFileParser implements Runnable {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
- public static final String RECORD_DELIMITER = "[slf5s.start]";
- public static final String ATTRIBUTE_DELIMITER = "[slf5s.";
- public static final String DATE_DELIMITER = ATTRIBUTE_DELIMITER + "DATE]";
- public static final String THREAD_DELIMITER = ATTRIBUTE_DELIMITER + "THREAD]";
- public static final String CATEGORY_DELIMITER = ATTRIBUTE_DELIMITER + "CATEGORY]";
- public static final String LOCATION_DELIMITER = ATTRIBUTE_DELIMITER + "LOCATION]";
- public static final String MESSAGE_DELIMITER = ATTRIBUTE_DELIMITER + "MESSAGE]";
- public static final String PRIORITY_DELIMITER = ATTRIBUTE_DELIMITER + "PRIORITY]";
- public static final String NDC_DELIMITER = ATTRIBUTE_DELIMITER + "NDC]";
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private static SimpleDateFormat _sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,S");
- private LogBrokerMonitor _monitor;
- LogFactor5LoadingDialog _loadDialog;
- private InputStream _in = null;
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public LogFileParser(File file) throws IOException,
- FileNotFoundException {
- this(new FileInputStream(file));
- }
-
- public LogFileParser(InputStream stream) throws IOException {
- _in = stream;
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Starts a new thread to parse the log file and create a LogRecord.
- * See running().
- * @param monitor LogBrokerMonitor
- */
- public void parse(LogBrokerMonitor monitor) throws RuntimeException {
- _monitor = monitor;
- Thread t = new Thread(this);
- t.start();
- }
-
- /**
- * Parses the file and creates new log records and adds the record
- * to the monitor.
- */
- public void run() {
-
- int index = 0;
- int counter = 0;
- LogRecord temp;
- boolean isLogFile = false;
-
- _loadDialog = new LogFactor5LoadingDialog(
- _monitor.getBaseFrame(), "Loading file...");
-
-
- try {
- String logRecords = loadLogFile(_in);
-
- while ((counter = logRecords.indexOf(RECORD_DELIMITER, index)) != -1) {
- temp = createLogRecord(logRecords.substring(index, counter));
- isLogFile = true;
-
- if (temp != null) {
- _monitor.addMessage(temp);
- }
-
- index = counter + RECORD_DELIMITER.length();
- }
-
- if (index < logRecords.length() && isLogFile) {
- temp = createLogRecord(logRecords.substring(index));
-
- if (temp != null) {
- _monitor.addMessage(temp);
- }
- }
-
- if (isLogFile == false) {
- throw new RuntimeException("Invalid log file format");
- }
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- destroyDialog();
- }
- });
-
- } catch (RuntimeException e) {
- destroyDialog();
- displayError("Error - Invalid log file format.\nPlease see documentation"
- + " on how to load log files.");
- } catch (IOException e) {
- destroyDialog();
- displayError("Error - Unable to load log file!");
- }
-
- _in = null;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected void displayError(String message) {
- LogFactor5ErrorDialog error = new LogFactor5ErrorDialog(
- _monitor.getBaseFrame(), message);
-
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
- private void destroyDialog() {
- _loadDialog.hide();
- _loadDialog.dispose();
- }
-
- /**
- * Loads a log file from a web server into the LogFactor5 GUI.
- */
- private String loadLogFile(InputStream stream) throws IOException {
- BufferedInputStream br = new BufferedInputStream(stream);
-
- int count = 0;
- int size = br.available();
-
- StringBuffer sb = null;
- if (size > 0) {
- sb = new StringBuffer(size);
- } else {
- sb = new StringBuffer(1024);
- }
-
- while ((count = br.read()) != -1) {
- sb.append((char) count);
- }
-
- br.close();
- br = null;
- return sb.toString();
-
- }
-
- private String parseAttribute(String name, String record) {
-
- int index = record.indexOf(name);
-
- if (index == -1) {
- return null;
- }
-
- return getAttribute(index, record);
- }
-
- private long parseDate(String record) {
- try {
- String s = parseAttribute(DATE_DELIMITER, record);
-
- if (s == null) {
- return 0;
- }
-
- Date d = _sdf.parse(s);
-
- return d.getTime();
- } catch (ParseException e) {
- return 0;
- }
- }
-
- private LogLevel parsePriority(String record) {
- String temp = parseAttribute(PRIORITY_DELIMITER, record);
-
- if (temp != null) {
- try {
- return LogLevel.valueOf(temp);
- } catch (LogLevelFormatException e) {
- return LogLevel.DEBUG;
- }
-
- }
-
- return LogLevel.DEBUG;
- }
-
- private String parseThread(String record) {
- return parseAttribute(THREAD_DELIMITER, record);
- }
-
- private String parseCategory(String record) {
- return parseAttribute(CATEGORY_DELIMITER, record);
- }
-
- private String parseLocation(String record) {
- return parseAttribute(LOCATION_DELIMITER, record);
- }
-
- private String parseMessage(String record) {
- return parseAttribute(MESSAGE_DELIMITER, record);
- }
-
- private String parseNDC(String record) {
- return parseAttribute(NDC_DELIMITER, record);
- }
-
- private String parseThrowable(String record) {
- return getAttribute(record.length(), record);
- }
-
- private LogRecord createLogRecord(String record) {
- if (record == null || record.trim().length() == 0) {
- return null;
- }
-
- LogRecord lr = new Log4JLogRecord();
- lr.setMillis(parseDate(record));
- lr.setLevel(parsePriority(record));
- lr.setCategory(parseCategory(record));
- lr.setLocation(parseLocation(record));
- lr.setThreadDescription(parseThread(record));
- lr.setNDC(parseNDC(record));
- lr.setMessage(parseMessage(record));
- lr.setThrownStackTrace(parseThrowable(record));
-
- return lr;
- }
-
-
- private String getAttribute(int index, String record) {
- int start = record.lastIndexOf(ATTRIBUTE_DELIMITER, index - 1);
-
- if (start == -1) {
- return record.substring(0, index);
- }
-
- start = record.indexOf("]", start);
-
- return record.substring(start + 1, index).trim();
- }
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/util/LogMonitorAdapter.java b/java/src/org/apache/log4j/lf5/util/LogMonitorAdapter.java
deleted file mode 100644
index 6ba927c..0000000
--- a/java/src/org/apache/log4j/lf5/util/LogMonitorAdapter.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import java.awt.Toolkit;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.log4j.lf5.LogLevel;
-import org.apache.log4j.lf5.LogRecord;
-import org.apache.log4j.lf5.viewer.LogBrokerMonitor;
-
-/**
- * LogMonitorAdapter facilitates the usage of the LogMonitor
- *
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogMonitorAdapter {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
- public static final int LOG4J_LOG_LEVELS = 0;
- public static final int JDK14_LOG_LEVELS = 1;
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private LogBrokerMonitor _logMonitor;
- private LogLevel _defaultLevel = null;
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- private LogMonitorAdapter(List userDefinedLevels) {
- super();
- // set the default level to be the first entry in the list
- _defaultLevel = (LogLevel) userDefinedLevels.get(0);
- _logMonitor = new LogBrokerMonitor(userDefinedLevels);
-
- _logMonitor.setFrameSize(getDefaultMonitorWidth(),
- getDefaultMonitorHeight());
- _logMonitor.setFontSize(12);
- _logMonitor.show();
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- /**
- * Creates an instance of LogMonitorAdapter using the
- * log levels inticated by the parameter. Log4J and JDK1.4 both have default
- * LogLevels which are set but these levels can be overriden.
- *
- * @param loglevels An integer representing either Log4J or JDK1.4 logging levels
- * @return LogMonitorAdapter
- */
- public static LogMonitorAdapter newInstance(int loglevels) {
- LogMonitorAdapter adapter;
- if (loglevels == JDK14_LOG_LEVELS) {
- adapter = newInstance(LogLevel.getJdk14Levels());
- adapter.setDefaultLevel(LogLevel.FINEST);
- adapter.setSevereLevel(LogLevel.SEVERE);
- } else {
- adapter = newInstance(LogLevel.getLog4JLevels());
- adapter.setDefaultLevel(LogLevel.DEBUG);
- adapter.setSevereLevel(LogLevel.FATAL);
- }
- return adapter;
- }
-
- /**
- *
Creates an instance of LogMonitorAdapter using the specified LogLevels.
- * The first LogLevel in the array is used as the default LogLevel unless
- * changed using the setDefaultLevel method.
- *
- * @param userDefined An array of user defined LogLevel objects.
- * @return LogMonitorAdapter
- */
- public static LogMonitorAdapter newInstance(LogLevel[] userDefined) {
- if (userDefined == null) {
- return null;
- }
- return newInstance(Arrays.asList(userDefined));
- }
-
- /**
- *
Creates an instance of LogMonitorAdapter using the specified LogLevels.
- * The first LogLevel in the List is used as the default LogLevel unless
- * changed using the setDefaultLevel method.
- *
- * @param userDefinedLevels A list of user defined LogLevel objects.
- * @return LogMonitorAdapter
- */
- public static LogMonitorAdapter newInstance(List userDefinedLevels) {
- return new LogMonitorAdapter(userDefinedLevels);
- }
-
- /**
- *
Adds a LogRecord to the LogMonitor.
- *
- * @param record The LogRecord object to be logged in the logging monitor.
- */
- public void addMessage(LogRecord record) {
- _logMonitor.addMessage(record);
- }
-
- /**
- *
Set the maximum number of records to be displayed in the monitor
- *
- * @param maxNumberOfRecords
- */
- public void setMaxNumberOfRecords(int maxNumberOfRecords) {
- _logMonitor.setMaxNumberOfLogRecords(maxNumberOfRecords);
- }
-
- /**
- *
Set the default log level to be used when logging messages without
- * specifying a LogLevel.
- *
- * @param level
- */
- public void setDefaultLevel(LogLevel level) {
- _defaultLevel = level;
- }
-
- /**
- *
Gets the default LogLevel for the Adapter.
- *
- * @return LogLevel
- */
- public LogLevel getDefaultLevel() {
- return _defaultLevel;
- }
-
- /**
- *
Sets the Severe LogLevel.
- *
- * @param level
- */
- public void setSevereLevel(LogLevel level) {
- AdapterLogRecord.setSevereLevel(level);
- }
-
- /**
- * Gets the current Severe LogLevel
- *
- * @return LogLevel
- */
- public LogLevel getSevereLevel() {
- return AdapterLogRecord.getSevereLevel();
- }
-
- /**
- *
Log a complete message to the Monitor.
- *
- * @param category The category to be used
- * @param level The log level to apply to the message
- * @param message The message
- * @param t The throwable content of the message
- * @param NDC The NDC really only applies to Log4J and the parameter can
- * usually be ignored.
- */
- public void log(String category, LogLevel level, String message,
- Throwable t, String NDC) {
- AdapterLogRecord record = new AdapterLogRecord();
- record.setCategory(category);
- record.setMessage(message);
- record.setNDC(NDC);
- record.setThrown(t);
-
- if (level == null) {
- record.setLevel(getDefaultLevel());
- } else {
- record.setLevel(level);
- }
-
- addMessage(record);
- }
-
- /**
- *
Log a message to the Monitor and use the default LogLevel.
- *
- * @param category The category to be used
- * @param message The message
- */
- public void log(String category, String message) {
- log(category, null, message);
- }
-
- /**
- *
Log a message to the Monitor.
- *
- * @param category The category to be used
- * @param level The log level to apply to the message
- * @param message The message
- * @param NDC
- */
- public void log(String category, LogLevel level, String message, String NDC) {
- log(category, level, message, null, NDC);
- }
-
- /**
- *
Log a message to the Monitor.
- *
- * @param category The category to be used
- * @param level The log level to apply to the message
- * @param message The message
- * @param t The throwable content of the message
- */
- public void log(String category, LogLevel level, String message,
- Throwable t) {
- log(category, level, message, t, null);
- }
-
- /**
- *
Log a message to the Monitor.
- *
- * @param category The category to be used
- * @param level The log level to apply to the message
- * @param message The message
- */
- public void log(String category, LogLevel level, String message) {
- log(category, level, message, null, null);
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- /**
- * @return the screen width from Toolkit.getScreenSize()
- * if possible, otherwise returns 800
- * @see java.awt.Toolkit
- */
- protected static int getScreenWidth() {
- try {
- return Toolkit.getDefaultToolkit().getScreenSize().width;
- } catch (Throwable t) {
- return 800;
- }
- }
-
- /**
- * @return the screen height from Toolkit.getScreenSize()
- * if possible, otherwise returns 600
- * @see java.awt.Toolkit
- */
- protected static int getScreenHeight() {
- try {
- return Toolkit.getDefaultToolkit().getScreenSize().height;
- } catch (Throwable t) {
- return 600;
- }
- }
-
- protected static int getDefaultMonitorWidth() {
- return (3 * getScreenWidth()) / 4;
- }
-
- protected static int getDefaultMonitorHeight() {
- return (3 * getScreenHeight()) / 4;
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/util/Resource.java b/java/src/org/apache/log4j/lf5/util/Resource.java
deleted file mode 100644
index 66293cf..0000000
--- a/java/src/org/apache/log4j/lf5/util/Resource.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-
-/**
- * Resource encapsulates access to Resources via the Classloader.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class Resource {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected String _name;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- * Default, no argument constructor.
- */
- public Resource() {
- super();
- }
-
- /**
- * Construct a Resource given a name.
- *
- * @see #setName(String)
- */
- public Resource(String name) {
- _name = name;
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Set the name of the resource.
- *
- * A resource is some data (images, audio, text, etc) that can be accessed
- * by class code in a way that is independent of the location of the code.
- *
- *
- * The name of a resource is a "/"-separated path name that identifies
- * the resource.
- *
- *
- * @see #getName()
- */
- public void setName(String name) {
- _name = name;
- }
-
- /**
- * Get the name of the resource. Set setName() for a description of
- * a resource.
- *
- * @see #setName
- */
- public String getName() {
- return (_name);
- }
-
- /**
- * Get the InputStream for this Resource. Uses the classloader
- * from this Resource.
- *
- * @see #getInputStreamReader
- * @see ResourceUtils
- */
- public InputStream getInputStream() {
- InputStream in = ResourceUtils.getResourceAsStream(this, this);
-
- return (in);
- }
-
- /**
- * Get the InputStreamReader for this Resource. Uses the classloader from
- * this Resource.
- *
- * @see #getInputStream
- * @see ResourceUtils
- */
- public InputStreamReader getInputStreamReader() {
- InputStream in = ResourceUtils.getResourceAsStream(this, this);
-
- if (in == null) {
- return null;
- }
-
- InputStreamReader reader = new InputStreamReader(in);
-
- return reader;
- }
-
- /**
- * Get the URL of the Resource. Uses the classloader from this Resource.
- *
- * @see ResourceUtils
- */
- public URL getURL() {
- return (ResourceUtils.getResourceAsURL(this, this));
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/util/ResourceUtils.java b/java/src/org/apache/log4j/lf5/util/ResourceUtils.java
deleted file mode 100644
index 5f022b6..0000000
--- a/java/src/org/apache/log4j/lf5/util/ResourceUtils.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * ResourceUtils. Provide a set of convenience methods for working with
- * Resources.
- *
- * @see org.apache.log4j.lf5.util.Resource
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class ResourceUtils {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Get the InputStream for this resource. Note: to convert an InputStream
- * into an InputReader, use: new InputStreamReader(InputStream).
- *
- * @param object The object to grab the Classloader from.
- * This parameter is quite important from a
- * visibility of resources standpoint as the
- * hierarchy of Classloaders plays a role.
- *
- * @param resource The resource to load.
- *
- * @return If the Resource was found, the InputStream, otherwise null.
- *
- * @see Resource
- * @see #getResourceAsURL(Object,Resource)
- * @see InputStream
- */
- public static InputStream getResourceAsStream(Object object, Resource resource) {
- ClassLoader loader = object.getClass().getClassLoader();
-
- InputStream in = null;
-
- if (loader != null) {
- in = loader.getResourceAsStream(resource.getName());
- } else {
- in = ClassLoader.getSystemResourceAsStream(resource.getName());
- }
-
- return in;
- }
-
- /**
- * Get the URL for this resource.
- *
- * @param object The object to grab the Classloader from.
- * This parameter is quite important from a
- * visibility of resources standpoint as the
- * hierarchy of Classloaders plays a role.
- *
- * @param resource The resource to load.
- *
- * @return If the Resource was found, the URL, otherwise null.
- *
- * @see Resource
- * @see #getResourceAsStream(Object,Resource)
- */
- public static URL getResourceAsURL(Object object, Resource resource) {
- ClassLoader loader = object.getClass().getClassLoader();
-
- URL url = null;
-
- if (loader != null) {
- url = loader.getResource(resource.getName());
- } else {
- url = ClassLoader.getSystemResource(resource.getName());
- }
-
- return (url);
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/util/StreamUtils.java b/java/src/org/apache/log4j/lf5/util/StreamUtils.java
deleted file mode 100644
index 183f9aa..0000000
--- a/java/src/org/apache/log4j/lf5/util/StreamUtils.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Provides utility methods for input and output streams.
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public abstract class StreamUtils {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- /**
- * Default value is 2048.
- */
- public static final int DEFAULT_BUFFER_SIZE = 2048;
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Copies information from the input stream to the output stream using
- * a default buffer size of 2048 bytes.
- * @throws java.io.IOException
- */
- public static void copy(InputStream input, OutputStream output)
- throws IOException {
- copy(input, output, DEFAULT_BUFFER_SIZE);
- }
-
- /**
- * Copies information from the input stream to the output stream using
- * the specified buffer size
- * @throws java.io.IOException
- */
- public static void copy(InputStream input,
- OutputStream output,
- int bufferSize)
- throws IOException {
- byte[] buf = new byte[bufferSize];
- int bytesRead = input.read(buf);
- while (bytesRead != -1) {
- output.write(buf, 0, bytesRead);
- bytesRead = input.read(buf);
- }
- output.flush();
- }
-
- /**
- * Copies information between specified streams and then closes
- * both of the streams.
- * @throws java.io.IOException
- */
- public static void copyThenClose(InputStream input, OutputStream output)
- throws IOException {
- copy(input, output);
- input.close();
- output.close();
- }
-
- /**
- * @return a byte[] containing the information contained in the
- * specified InputStream.
- * @throws java.io.IOException
- */
- public static byte[] getBytes(InputStream input)
- throws IOException {
- ByteArrayOutputStream result = new ByteArrayOutputStream();
- copy(input, result);
- result.close();
- return result.toByteArray();
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java b/java/src/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java
deleted file mode 100644
index 2c68180..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import org.apache.log4j.lf5.LogRecord;
-import org.apache.log4j.lf5.LogRecordFilter;
-import org.apache.log4j.lf5.PassingLogRecordFilter;
-
-import javax.swing.table.AbstractTableModel;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-
-/**
- * A TableModel for LogRecords which includes filtering support.
- *
- * @author Richard Wan
- * @author Brent Sprecher
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class FilteredLogTableModel
- extends AbstractTableModel {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- protected LogRecordFilter _filter = new PassingLogRecordFilter();
- protected List _allRecords = new ArrayList();
- protected List _filteredRecords;
- protected int _maxNumberOfLogRecords = 5000;
- protected String[] _colNames = {"Date",
- "Thread",
- "Message #",
- "Level",
- "NDC",
- "Category",
- "Message",
- "Location",
- "Thrown"};
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public FilteredLogTableModel() {
- super();
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public void setLogRecordFilter(LogRecordFilter filter) {
- _filter = filter;
- }
-
- public LogRecordFilter getLogRecordFilter() {
- return _filter;
- }
-
- public String getColumnName(int i) {
- return _colNames[i];
- }
-
- public int getColumnCount() {
- return _colNames.length;
- }
-
- public int getRowCount() {
- return getFilteredRecords().size();
- }
-
- public int getTotalRowCount() {
- return _allRecords.size();
- }
-
- public Object getValueAt(int row, int col) {
- LogRecord record = getFilteredRecord(row);
- return getColumn(col, record);
- }
-
- public void setMaxNumberOfLogRecords(int maxNumRecords) {
- if (maxNumRecords > 0) {
- _maxNumberOfLogRecords = maxNumRecords;
- }
-
- }
-
- public synchronized boolean addLogRecord(LogRecord record) {
-
- _allRecords.add(record);
-
- if (_filter.passes(record) == false) {
- return false;
- }
- getFilteredRecords().add(record);
- fireTableRowsInserted(getRowCount(), getRowCount());
- trimRecords();
- return true;
- }
-
- /**
- * Forces the LogTableModel to requery its filters to determine
- * which records to display.
- */
- public synchronized void refresh() {
- _filteredRecords = createFilteredRecordsList();
- fireTableDataChanged();
- }
-
- public synchronized void fastRefresh() {
- _filteredRecords.remove(0);
- fireTableRowsDeleted(0, 0);
- }
-
-
- /**
- * Clears all records from the LogTableModel
- */
- public synchronized void clear() {
- _allRecords.clear();
- _filteredRecords.clear();
- fireTableDataChanged();
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected List getFilteredRecords() {
- if (_filteredRecords == null) {
- refresh();
- }
- return _filteredRecords;
- }
-
- protected List createFilteredRecordsList() {
- List result = new ArrayList();
- Iterator records = _allRecords.iterator();
- LogRecord current;
- while (records.hasNext()) {
- current = (LogRecord) records.next();
- if (_filter.passes(current)) {
- result.add(current);
- }
- }
- return result;
- }
-
- protected LogRecord getFilteredRecord(int row) {
- List records = getFilteredRecords();
- int size = records.size();
- if (row < size) {
- return (LogRecord) records.get(row);
- }
- // a minor problem has happened. JTable has asked for
- // a row outside the bounds, because the size of
- // _filteredRecords has changed while it was looping.
- // return the last row.
- return (LogRecord) records.get(size - 1);
-
- }
-
- protected Object getColumn(int col, LogRecord lr) {
- if (lr == null) {
- return "NULL Column";
- }
- String date = new Date(lr.getMillis()).toString();
- switch (col) {
- case 0:
- return date + " (" + lr.getMillis() + ")";
- case 1:
- return lr.getThreadDescription();
- case 2:
- return new Long(lr.getSequenceNumber());
- case 3:
- return lr.getLevel();
- case 4:
- return lr.getNDC();
- case 5:
- return lr.getCategory();
- case 6:
- return lr.getMessage();
- case 7:
- return lr.getLocation();
- case 8:
- return lr.getThrownStackTrace();
- default:
- String message = "The column number " + col + "must be between 0 and 8";
- throw new IllegalArgumentException(message);
- }
- }
-
- // We don't want the amount of rows to grow without bound,
- // leading to a out-of-memory-exception. Especially not good
- // in a production environment :)
-
- // This method & clearLogRecords() are synchronized so we don't
- // delete rows that don't exist.
- protected void trimRecords() {
- if (needsTrimming()) {
- trimOldestRecords();
- }
- }
-
- protected boolean needsTrimming() {
- return (_allRecords.size() > _maxNumberOfLogRecords);
- }
-
- protected void trimOldestRecords() {
- synchronized (_allRecords) {
- int trim = numberOfRecordsToTrim();
- if (trim > 1) {
- List oldRecords =
- _allRecords.subList(0, trim);
- oldRecords.clear();
- refresh();
- } else {
- _allRecords.remove(0);
- fastRefresh();
- }
- }
-
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
- private int numberOfRecordsToTrim() {
- return _allRecords.size() - _maxNumberOfLogRecords;
- }
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LF5SwingUtils.java b/java/src/org/apache/log4j/lf5/viewer/LF5SwingUtils.java
deleted file mode 100644
index ef29447..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LF5SwingUtils.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.Adjustable;
-
-import javax.swing.JComponent;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
-import javax.swing.table.TableModel;
-
-/**
- * Provides methods to accomplish common yet non-trivial tasks
- * with Swing. Obvious implementations of these methods have been
- * tried and failed.
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LF5SwingUtils {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Selects a the specified row in the specified JTable and scrolls
- * the specified JScrollpane to the newly selected row. More importantly,
- * the call to repaint() delayed long enough to have the table
- * properly paint the newly selected row which may be offscre
- * @param table should belong to the specified JScrollPane
- */
- public static void selectRow(int row, JTable table, JScrollPane pane) {
- if (table == null || pane == null) {
- return;
- }
- if (contains(row, table.getModel()) == false) {
- return;
- }
- moveAdjustable(row * table.getRowHeight(), pane.getVerticalScrollBar());
- selectRow(row, table.getSelectionModel());
- // repaint must be done later because moveAdjustable
- // posts requests to the swing thread which must execute before
- // the repaint logic gets executed.
- repaintLater(table);
- }
-
- /**
- * Makes the specified Adjustable track if the view area expands and
- * the specified Adjustable is located near the of the view.
- */
- public static void makeScrollBarTrack(Adjustable scrollBar) {
- if (scrollBar == null) {
- return;
- }
- scrollBar.addAdjustmentListener(new TrackingAdjustmentListener());
- }
-
- /**
- * Makes the vertical scroll bar of the specified JScrollPane
- * track if the view expands (e.g. if rows are added to an underlying
- * table).
- */
- public static void makeVerticalScrollBarTrack(JScrollPane pane) {
- if (pane == null) {
- return;
- }
- makeScrollBarTrack(pane.getVerticalScrollBar());
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected static boolean contains(int row, TableModel model) {
- if (model == null) {
- return false;
- }
- if (row < 0) {
- return false;
- }
- if (row >= model.getRowCount()) {
- return false;
- }
- return true;
- }
-
- protected static void selectRow(int row, ListSelectionModel model) {
- if (model == null) {
- return;
- }
- model.setSelectionInterval(row, row);
- }
-
- protected static void moveAdjustable(int location, Adjustable scrollBar) {
- if (scrollBar == null) {
- return;
- }
- scrollBar.setValue(location);
- }
-
- /**
- * Work around for JTable/viewport bug.
- * @link http://developer.java.sun.com/developer/bugParade/bugs/4205145.html
- */
- protected static void repaintLater(final JComponent component) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- component.repaint();
- }
- });
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java b/java/src/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java
deleted file mode 100644
index 934ba17..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java
+++ /dev/null
@@ -1,1612 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Font;
-import java.awt.GraphicsEnvironment;
-import java.awt.Toolkit;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JColorChooser;
-import javax.swing.JComboBox;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTextArea;
-import javax.swing.JToolBar;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-
-import org.apache.log4j.lf5.LogLevel;
-import org.apache.log4j.lf5.LogRecord;
-import org.apache.log4j.lf5.LogRecordFilter;
-import org.apache.log4j.lf5.util.DateFormatManager;
-import org.apache.log4j.lf5.util.LogFileParser;
-import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryExplorerTree;
-import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryPath;
-import org.apache.log4j.lf5.viewer.configure.ConfigurationManager;
-import org.apache.log4j.lf5.viewer.configure.MRUFileManager;
-
-/**
- * LogBrokerMonitor
- *.
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- * @author Brad Marlborough
- * @author Richard Wan
- * @author Brent Sprecher
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogBrokerMonitor {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- public static final String DETAILED_VIEW = "Detailed";
-// public static final String STANDARD_VIEW = "Standard";
-// public static final String COMPACT_VIEW = "Compact";
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected JFrame _logMonitorFrame;
- protected int _logMonitorFrameWidth = 550;
- protected int _logMonitorFrameHeight = 500;
- protected LogTable _table;
- protected CategoryExplorerTree _categoryExplorerTree;
- protected String _searchText;
- protected String _NDCTextFilter = "";
- protected LogLevel _leastSevereDisplayedLogLevel = LogLevel.DEBUG;
-
- protected JScrollPane _logTableScrollPane;
- protected JLabel _statusLabel;
- protected Object _lock = new Object();
- protected JComboBox _fontSizeCombo;
-
- protected int _fontSize = 10;
- protected String _fontName = "Dialog";
- protected String _currentView = DETAILED_VIEW;
-
- protected boolean _loadSystemFonts = false;
- protected boolean _trackTableScrollPane = true;
- protected Dimension _lastTableViewportSize;
- protected boolean _callSystemExitOnClose = false;
- protected List _displayedLogBrokerProperties = new Vector();
-
- protected Map _logLevelMenuItems = new HashMap();
- protected Map _logTableColumnMenuItems = new HashMap();
-
- protected List _levels = null;
- protected List _columns = null;
- protected boolean _isDisposed = false;
-
- protected ConfigurationManager _configurationManager = null;
- protected MRUFileManager _mruFileManager = null;
- protected File _fileLocation = null;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- * Construct a LogBrokerMonitor.
- */
- public LogBrokerMonitor(List logLevels) {
-
- _levels = logLevels;
- _columns = LogTableColumn.getLogTableColumns();
- // This allows us to use the LogBroker in command line tools and
- // have the option for it to shutdown.
-
- String callSystemExitOnClose =
- System.getProperty("monitor.exit");
- if (callSystemExitOnClose == null) {
- callSystemExitOnClose = "false";
- }
- callSystemExitOnClose = callSystemExitOnClose.trim().toLowerCase();
-
- if (callSystemExitOnClose.equals("true")) {
- _callSystemExitOnClose = true;
- }
-
- initComponents();
-
-
- _logMonitorFrame.addWindowListener(
- new LogBrokerMonitorWindowAdaptor(this));
-
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Show the frame for the LogBrokerMonitor. Dispatched to the
- * swing thread.
- */
- public void show(final int delay) {
- if (_logMonitorFrame.isVisible()) {
- return;
- }
- // This request is very low priority, let other threads execute first.
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- Thread.yield();
- pause(delay);
- _logMonitorFrame.setVisible(true);
- }
- });
- }
-
- public void show() {
- show(0);
- }
-
- /**
- * Dispose of the frame for the LogBrokerMonitor.
- */
- public void dispose() {
- _logMonitorFrame.dispose();
- _isDisposed = true;
-
- if (_callSystemExitOnClose == true) {
- System.exit(0);
- }
- }
-
- /**
- * Hide the frame for the LogBrokerMonitor.
- */
- public void hide() {
- _logMonitorFrame.setVisible(false);
- }
-
- /**
- * Get the DateFormatManager for formatting dates.
- */
- public DateFormatManager getDateFormatManager() {
- return _table.getDateFormatManager();
- }
-
- /**
- * Set the date format manager for formatting dates.
- */
- public void setDateFormatManager(DateFormatManager dfm) {
- _table.setDateFormatManager(dfm);
- }
-
- /**
- * Get the value of whether or not System.exit() will be called
- * when the LogBrokerMonitor is closed.
- */
- public boolean getCallSystemExitOnClose() {
- return _callSystemExitOnClose;
- }
-
- /**
- * Set the value of whether or not System.exit() will be called
- * when the LogBrokerMonitor is closed.
- */
- public void setCallSystemExitOnClose(boolean callSystemExitOnClose) {
- _callSystemExitOnClose = callSystemExitOnClose;
- }
-
- /**
- * Add a log record message to be displayed in the LogTable.
- * This method is thread-safe as it posts requests to the SwingThread
- * rather than processing directly.
- */
- public void addMessage(final LogRecord lr) {
- if (_isDisposed == true) {
- // If the frame has been disposed of, do not log any more
- // messages.
- return;
- }
-
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- _categoryExplorerTree.getExplorerModel().addLogRecord(lr);
- _table.getFilteredLogTableModel().addLogRecord(lr); // update table
- updateStatusLabel(); // show updated counts
- }
- });
- }
-
- public void setMaxNumberOfLogRecords(int maxNumberOfLogRecords) {
- _table.getFilteredLogTableModel().setMaxNumberOfLogRecords(maxNumberOfLogRecords);
- }
-
- public JFrame getBaseFrame() {
- return _logMonitorFrame;
- }
-
- public void setTitle(String title) {
- _logMonitorFrame.setTitle(title + " - LogFactor5");
- }
-
- public void setFrameSize(int width, int height) {
- Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
- if (0 < width && width < screen.width) {
- _logMonitorFrameWidth = width;
- }
- if (0 < height && height < screen.height) {
- _logMonitorFrameHeight = height;
- }
- updateFrameSize();
- }
-
- public void setFontSize(int fontSize) {
- changeFontSizeCombo(_fontSizeCombo, fontSize);
- // setFontSizeSilently(actualFontSize); - changeFontSizeCombo fires event
- // refreshDetailTextArea();
- }
-
- public void addDisplayedProperty(Object messageLine) {
- _displayedLogBrokerProperties.add(messageLine);
- }
-
- public Map getLogLevelMenuItems() {
- return _logLevelMenuItems;
- }
-
- public Map getLogTableColumnMenuItems() {
- return _logTableColumnMenuItems;
- }
-
- public JCheckBoxMenuItem getTableColumnMenuItem(LogTableColumn column) {
- return getLogTableColumnMenuItem(column);
- }
-
- public CategoryExplorerTree getCategoryExplorerTree() {
- return _categoryExplorerTree;
- }
-
- // Added in version 1.2 - gets the value of the NDC text filter
- // This value is set back to null each time the Monitor is initialized.
- public String getNDCTextFilter() {
- return _NDCTextFilter;
- }
-
- // Added in version 1.2 - sets the NDC Filter based on
- // a String passed in by the user. This value is persisted
- // in the XML Configuration file.
- public void setNDCLogRecordFilter(String textFilter) {
- _table.getFilteredLogTableModel().
- setLogRecordFilter(createNDCLogRecordFilter(textFilter));
- }
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected void setSearchText(String text) {
- _searchText = text;
- }
-
- // Added in version 1.2 - Sets the text filter for the NDC
- protected void setNDCTextFilter(String text) {
- // if no value is set, set it to a blank string
- // otherwise use the value provided
- if (text == null) {
- _NDCTextFilter = "";
- } else {
- _NDCTextFilter = text;
- }
- }
-
- // Added in version 1.2 - Uses a different filter that sorts
- // based on an NDC string passed in by the user. If the string
- // is null or is an empty string, we do nothing.
- protected void sortByNDC() {
- String text = _NDCTextFilter;
- if (text == null || text.length() == 0) {
- return;
- }
-
- // Use new NDC filter
- _table.getFilteredLogTableModel().
- setLogRecordFilter(createNDCLogRecordFilter(text));
- }
-
- protected void findSearchText() {
- String text = _searchText;
- if (text == null || text.length() == 0) {
- return;
- }
- int startRow = getFirstSelectedRow();
- int foundRow = findRecord(
- startRow,
- text,
- _table.getFilteredLogTableModel().getFilteredRecords()
- );
- selectRow(foundRow);
- }
-
- protected int getFirstSelectedRow() {
- return _table.getSelectionModel().getMinSelectionIndex();
- }
-
- protected void selectRow(int foundRow) {
- if (foundRow == -1) {
- String message = _searchText + " not found.";
- JOptionPane.showMessageDialog(
- _logMonitorFrame,
- message,
- "Text not found",
- JOptionPane.INFORMATION_MESSAGE
- );
- return;
- }
- LF5SwingUtils.selectRow(foundRow, _table, _logTableScrollPane);
- }
-
- protected int findRecord(
- int startRow,
- String searchText,
- List records
- ) {
- if (startRow < 0) {
- startRow = 0; // start at first element if no rows are selected
- } else {
- startRow++; // start after the first selected row
- }
- int len = records.size();
-
- for (int i = startRow; i < len; i++) {
- if (matches((LogRecord) records.get(i), searchText)) {
- return i; // found a record
- }
- }
- // wrap around to beginning if when we reach the end with no match
- len = startRow;
- for (int i = 0; i < len; i++) {
- if (matches((LogRecord) records.get(i), searchText)) {
- return i; // found a record
- }
- }
- // nothing found
- return -1;
- }
-
- /**
- * Check to see if the any records contain the search string.
- * Searching now supports NDC messages and date.
- */
- protected boolean matches(LogRecord record, String text) {
- String message = record.getMessage();
- String NDC = record.getNDC();
-
- if (message == null && NDC == null || text == null) {
- return false;
- }
- if (message.toLowerCase().indexOf(text.toLowerCase()) == -1 &&
- NDC.toLowerCase().indexOf(text.toLowerCase()) == -1) {
- return false;
- }
-
- return true;
- }
-
- /**
- * When the fontsize of a JTextArea is changed, the word-wrapped lines
- * may become garbled. This method clears and resets the text of the
- * text area.
- */
- protected void refresh(JTextArea textArea) {
- String text = textArea.getText();
- textArea.setText("");
- textArea.setText(text);
- }
-
- protected void refreshDetailTextArea() {
- refresh(_table._detailTextArea);
- }
-
- protected void clearDetailTextArea() {
- _table._detailTextArea.setText("");
- }
-
- /**
- * Changes the font selection in the combo box and returns the
- * size actually selected.
- * @return -1 if unable to select an appropriate font
- */
- protected int changeFontSizeCombo(JComboBox box, int requestedSize) {
- int len = box.getItemCount();
- int currentValue;
- Object currentObject;
- Object selectedObject = box.getItemAt(0);
- int selectedValue = Integer.parseInt(String.valueOf(selectedObject));
- for (int i = 0; i < len; i++) {
- currentObject = box.getItemAt(i);
- currentValue = Integer.parseInt(String.valueOf(currentObject));
- if (selectedValue < currentValue && currentValue <= requestedSize) {
- selectedValue = currentValue;
- selectedObject = currentObject;
- }
- }
- box.setSelectedItem(selectedObject);
- return selectedValue;
- }
-
- /**
- * Does not update gui or cause any events to be fired.
- */
- protected void setFontSizeSilently(int fontSize) {
- _fontSize = fontSize;
- setFontSize(_table._detailTextArea, fontSize);
- selectRow(0);
- setFontSize(_table, fontSize);
- }
-
- protected void setFontSize(Component component, int fontSize) {
- Font oldFont = component.getFont();
- Font newFont =
- new Font(oldFont.getFontName(), oldFont.getStyle(), fontSize);
- component.setFont(newFont);
- }
-
- protected void updateFrameSize() {
- _logMonitorFrame.setSize(_logMonitorFrameWidth, _logMonitorFrameHeight);
- centerFrame(_logMonitorFrame);
- }
-
- protected void pause(int millis) {
- try {
- Thread.sleep(millis);
- } catch (InterruptedException e) {
-
- }
- }
-
- protected void initComponents() {
- //
- // Configure the Frame.
- //
- _logMonitorFrame = new JFrame("LogFactor5");
-
- _logMonitorFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
-
- String resource =
- "/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif";
- URL lf5IconURL = getClass().getResource(resource);
-
- if (lf5IconURL != null) {
- _logMonitorFrame.setIconImage(new ImageIcon(lf5IconURL).getImage());
- }
- updateFrameSize();
-
- //
- // Configure the LogTable.
- //
- JTextArea detailTA = createDetailTextArea();
- JScrollPane detailTAScrollPane = new JScrollPane(detailTA);
- _table = new LogTable(detailTA);
- setView(_currentView, _table);
- _table.setFont(new Font(_fontName, Font.PLAIN, _fontSize));
- _logTableScrollPane = new JScrollPane(_table);
-
- if (_trackTableScrollPane) {
- _logTableScrollPane.getVerticalScrollBar().addAdjustmentListener(
- new TrackingAdjustmentListener()
- );
- }
-
-
- // Configure the SplitPane between the LogTable & DetailTextArea
- //
-
- JSplitPane tableViewerSplitPane = new JSplitPane();
- tableViewerSplitPane.setOneTouchExpandable(true);
- tableViewerSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
- tableViewerSplitPane.setLeftComponent(_logTableScrollPane);
- tableViewerSplitPane.setRightComponent(detailTAScrollPane);
- // Make sure to do this last..
- //tableViewerSplitPane.setDividerLocation(1.0); Doesn't work
- //the same under 1.2.x & 1.3
- // "350" is a magic number that provides the correct default
- // behaviour under 1.2.x & 1.3. For example, bumping this
- // number to 400, causes the pane to be completely open in 1.2.x
- // and closed in 1.3
- tableViewerSplitPane.setDividerLocation(350);
-
- //
- // Configure the CategoryExplorer
- //
-
- _categoryExplorerTree = new CategoryExplorerTree();
-
- _table.getFilteredLogTableModel().setLogRecordFilter(createLogRecordFilter());
-
- JScrollPane categoryExplorerTreeScrollPane =
- new JScrollPane(_categoryExplorerTree);
- categoryExplorerTreeScrollPane.setPreferredSize(new Dimension(130, 400));
-
- // Load most recently used file list
- _mruFileManager = new MRUFileManager();
-
- //
- // Configure the SplitPane between the CategoryExplorer & (LogTable/Detail)
- //
-
- JSplitPane splitPane = new JSplitPane();
- splitPane.setOneTouchExpandable(true);
- splitPane.setRightComponent(tableViewerSplitPane);
- splitPane.setLeftComponent(categoryExplorerTreeScrollPane);
- // Do this last.
- splitPane.setDividerLocation(130);
- //
- // Add the MenuBar, StatusArea, CategoryExplorer|LogTable to the
- // LogMonitorFrame.
- //
- _logMonitorFrame.getRootPane().setJMenuBar(createMenuBar());
- _logMonitorFrame.getContentPane().add(splitPane, BorderLayout.CENTER);
- _logMonitorFrame.getContentPane().add(createToolBar(),
- BorderLayout.NORTH);
- _logMonitorFrame.getContentPane().add(createStatusArea(),
- BorderLayout.SOUTH);
-
- makeLogTableListenToCategoryExplorer();
- addTableModelProperties();
-
- //
- // Configure ConfigurationManager
- //
- _configurationManager = new ConfigurationManager(this, _table);
-
- }
-
- protected LogRecordFilter createLogRecordFilter() {
- LogRecordFilter result = new LogRecordFilter() {
- public boolean passes(LogRecord record) {
- CategoryPath path = new CategoryPath(record.getCategory());
- return
- getMenuItem(record.getLevel()).isSelected() &&
- _categoryExplorerTree.getExplorerModel().isCategoryPathActive(path);
- }
- };
- return result;
- }
-
- // Added in version 1.2 - Creates a new filter that sorts records based on
- // an NDC string passed in by the user.
- protected LogRecordFilter createNDCLogRecordFilter(String text) {
- _NDCTextFilter = text;
- LogRecordFilter result = new LogRecordFilter() {
- public boolean passes(LogRecord record) {
- String NDC = record.getNDC();
- CategoryPath path = new CategoryPath(record.getCategory());
- if (NDC == null || _NDCTextFilter == null) {
- return false;
- } else if (NDC.toLowerCase().indexOf(_NDCTextFilter.toLowerCase()) == -1) {
- return false;
- } else {
- return getMenuItem(record.getLevel()).isSelected() &&
- _categoryExplorerTree.getExplorerModel().isCategoryPathActive(path);
- }
- }
- };
-
- return result;
- }
-
-
- protected void updateStatusLabel() {
- _statusLabel.setText(getRecordsDisplayedMessage());
- }
-
- protected String getRecordsDisplayedMessage() {
- FilteredLogTableModel model = _table.getFilteredLogTableModel();
- return getStatusText(model.getRowCount(), model.getTotalRowCount());
- }
-
- protected void addTableModelProperties() {
- final FilteredLogTableModel model = _table.getFilteredLogTableModel();
-
- addDisplayedProperty(new Object() {
- public String toString() {
- return getRecordsDisplayedMessage();
- }
- });
- addDisplayedProperty(new Object() {
- public String toString() {
- return "Maximum number of displayed LogRecords: "
- + model._maxNumberOfLogRecords;
- }
- });
- }
-
- protected String getStatusText(int displayedRows, int totalRows) {
- StringBuffer result = new StringBuffer();
- result.append("Displaying: ");
- result.append(displayedRows);
- result.append(" records out of a total of: ");
- result.append(totalRows);
- result.append(" records.");
- return result.toString();
- }
-
- protected void makeLogTableListenToCategoryExplorer() {
- ActionListener listener = new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
- };
- _categoryExplorerTree.getExplorerModel().addActionListener(listener);
- }
-
- protected JPanel createStatusArea() {
- JPanel statusArea = new JPanel();
- JLabel status =
- new JLabel("No log records to display.");
- _statusLabel = status;
- status.setHorizontalAlignment(JLabel.LEFT);
-
- statusArea.setBorder(BorderFactory.createEtchedBorder());
- statusArea.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
- statusArea.add(status);
-
- return (statusArea);
- }
-
- protected JTextArea createDetailTextArea() {
- JTextArea detailTA = new JTextArea();
- detailTA.setFont(new Font("Monospaced", Font.PLAIN, 14));
- detailTA.setTabSize(3);
- detailTA.setLineWrap(true);
- detailTA.setWrapStyleWord(false);
- return (detailTA);
- }
-
- protected JMenuBar createMenuBar() {
- JMenuBar menuBar = new JMenuBar();
- menuBar.add(createFileMenu());
- menuBar.add(createEditMenu());
- menuBar.add(createLogLevelMenu());
- menuBar.add(createViewMenu());
- menuBar.add(createConfigureMenu());
- menuBar.add(createHelpMenu());
-
- return (menuBar);
- }
-
- protected JMenu createLogLevelMenu() {
- JMenu result = new JMenu("Log Level");
- result.setMnemonic('l');
- Iterator levels = getLogLevels();
- while (levels.hasNext()) {
- result.add(getMenuItem((LogLevel) levels.next()));
- }
-
- result.addSeparator();
- result.add(createAllLogLevelsMenuItem());
- result.add(createNoLogLevelsMenuItem());
- result.addSeparator();
- result.add(createLogLevelColorMenu());
- result.add(createResetLogLevelColorMenuItem());
-
- return result;
- }
-
- protected JMenuItem createAllLogLevelsMenuItem() {
- JMenuItem result = new JMenuItem("Show all LogLevels");
- result.setMnemonic('s');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- selectAllLogLevels(true);
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
- });
- return result;
- }
-
- protected JMenuItem createNoLogLevelsMenuItem() {
- JMenuItem result = new JMenuItem("Hide all LogLevels");
- result.setMnemonic('h');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- selectAllLogLevels(false);
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
- });
- return result;
- }
-
- protected JMenu createLogLevelColorMenu() {
- JMenu colorMenu = new JMenu("Configure LogLevel Colors");
- colorMenu.setMnemonic('c');
- Iterator levels = getLogLevels();
- while (levels.hasNext()) {
- colorMenu.add(createSubMenuItem((LogLevel) levels.next()));
- }
-
- return colorMenu;
- }
-
- protected JMenuItem createResetLogLevelColorMenuItem() {
- JMenuItem result = new JMenuItem("Reset LogLevel Colors");
- result.setMnemonic('r');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- // reset the level colors in the map
- LogLevel.resetLogLevelColorMap();
-
- // refresh the table
- _table.getFilteredLogTableModel().refresh();
- }
- });
- return result;
- }
-
- protected void selectAllLogLevels(boolean selected) {
- Iterator levels = getLogLevels();
- while (levels.hasNext()) {
- getMenuItem((LogLevel) levels.next()).setSelected(selected);
- }
- }
-
- protected JCheckBoxMenuItem getMenuItem(LogLevel level) {
- JCheckBoxMenuItem result = (JCheckBoxMenuItem) (_logLevelMenuItems.get(level));
- if (result == null) {
- result = createMenuItem(level);
- _logLevelMenuItems.put(level, result);
- }
- return result;
- }
-
- protected JMenuItem createSubMenuItem(LogLevel level) {
- final JMenuItem result = new JMenuItem(level.toString());
- final LogLevel logLevel = level;
- result.setMnemonic(level.toString().charAt(0));
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- showLogLevelColorChangeDialog(result, logLevel);
- }
- });
-
- return result;
-
- }
-
- protected void showLogLevelColorChangeDialog(JMenuItem result, LogLevel level) {
- JMenuItem menuItem = result;
- Color newColor = JColorChooser.showDialog(
- _logMonitorFrame,
- "Choose LogLevel Color",
- result.getForeground());
-
- if (newColor != null) {
- // set the color for the record
- level.setLogLevelColorMap(level, newColor);
- _table.getFilteredLogTableModel().refresh();
- }
-
- }
-
- protected JCheckBoxMenuItem createMenuItem(LogLevel level) {
- JCheckBoxMenuItem result = new JCheckBoxMenuItem(level.toString());
- result.setSelected(true);
- result.setMnemonic(level.toString().charAt(0));
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
- });
- return result;
- }
-
- // view menu
- protected JMenu createViewMenu() {
- JMenu result = new JMenu("View");
- result.setMnemonic('v');
- Iterator columns = getLogTableColumns();
- while (columns.hasNext()) {
- result.add(getLogTableColumnMenuItem((LogTableColumn) columns.next()));
- }
-
- result.addSeparator();
- result.add(createAllLogTableColumnsMenuItem());
- result.add(createNoLogTableColumnsMenuItem());
- return result;
- }
-
- protected JCheckBoxMenuItem getLogTableColumnMenuItem(LogTableColumn column) {
- JCheckBoxMenuItem result = (JCheckBoxMenuItem) (_logTableColumnMenuItems.get(column));
- if (result == null) {
- result = createLogTableColumnMenuItem(column);
- _logTableColumnMenuItems.put(column, result);
- }
- return result;
- }
-
- protected JCheckBoxMenuItem createLogTableColumnMenuItem(LogTableColumn column) {
- JCheckBoxMenuItem result = new JCheckBoxMenuItem(column.toString());
-
- result.setSelected(true);
- result.setMnemonic(column.toString().charAt(0));
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- // update list of columns and reset the view
- List selectedColumns = updateView();
- _table.setView(selectedColumns);
- }
- });
- return result;
- }
-
- protected List updateView() {
- ArrayList updatedList = new ArrayList();
- Iterator columnIterator = _columns.iterator();
- while (columnIterator.hasNext()) {
- LogTableColumn column = (LogTableColumn) columnIterator.next();
- JCheckBoxMenuItem result = getLogTableColumnMenuItem(column);
- // check and see if the checkbox is checked
- if (result.isSelected()) {
- updatedList.add(column);
- }
- }
-
- return updatedList;
- }
-
- protected JMenuItem createAllLogTableColumnsMenuItem() {
- JMenuItem result = new JMenuItem("Show all Columns");
- result.setMnemonic('s');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- selectAllLogTableColumns(true);
- // update list of columns and reset the view
- List selectedColumns = updateView();
- _table.setView(selectedColumns);
- }
- });
- return result;
- }
-
- protected JMenuItem createNoLogTableColumnsMenuItem() {
- JMenuItem result = new JMenuItem("Hide all Columns");
- result.setMnemonic('h');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- selectAllLogTableColumns(false);
- // update list of columns and reset the view
- List selectedColumns = updateView();
- _table.setView(selectedColumns);
- }
- });
- return result;
- }
-
- protected void selectAllLogTableColumns(boolean selected) {
- Iterator columns = getLogTableColumns();
- while (columns.hasNext()) {
- getLogTableColumnMenuItem((LogTableColumn) columns.next()).setSelected(selected);
- }
- }
-
- protected JMenu createFileMenu() {
- JMenu fileMenu = new JMenu("File");
- fileMenu.setMnemonic('f');
- JMenuItem exitMI;
- fileMenu.add(createOpenMI());
- fileMenu.add(createOpenURLMI());
- fileMenu.addSeparator();
- fileMenu.add(createCloseMI());
- createMRUFileListMI(fileMenu);
- fileMenu.addSeparator();
- fileMenu.add(createExitMI());
- return fileMenu;
- }
-
- /**
- * Menu item added to allow log files to be opened with
- * the LF5 GUI.
- */
- protected JMenuItem createOpenMI() {
- JMenuItem result = new JMenuItem("Open...");
- result.setMnemonic('o');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- requestOpen();
- }
- });
- return result;
- }
-
- /**
- * Menu item added to allow log files loaded from a URL
- * to be opened by the LF5 GUI.
- */
- protected JMenuItem createOpenURLMI() {
- JMenuItem result = new JMenuItem("Open URL...");
- result.setMnemonic('u');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- requestOpenURL();
- }
- });
- return result;
- }
-
- protected JMenuItem createCloseMI() {
- JMenuItem result = new JMenuItem("Close");
- result.setMnemonic('c');
- result.setAccelerator(KeyStroke.getKeyStroke("control Q"));
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- requestClose();
- }
- });
- return result;
- }
-
- /**
- * Creates a Most Recently Used file list to be
- * displayed in the File menu
- */
- protected void createMRUFileListMI(JMenu menu) {
-
- String[] files = _mruFileManager.getMRUFileList();
-
- if (files != null) {
- menu.addSeparator();
- for (int i = 0; i < files.length; i++) {
- JMenuItem result = new JMenuItem((i + 1) + " " + files[i]);
- result.setMnemonic(i + 1);
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- requestOpenMRU(e);
- }
- });
- menu.add(result);
- }
- }
- }
-
- protected JMenuItem createExitMI() {
- JMenuItem result = new JMenuItem("Exit");
- result.setMnemonic('x');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- requestExit();
- }
- });
- return result;
- }
-
- protected JMenu createConfigureMenu() {
- JMenu configureMenu = new JMenu("Configure");
- configureMenu.setMnemonic('c');
- configureMenu.add(createConfigureSave());
- configureMenu.add(createConfigureReset());
- configureMenu.add(createConfigureMaxRecords());
-
- return configureMenu;
- }
-
- protected JMenuItem createConfigureSave() {
- JMenuItem result = new JMenuItem("Save");
- result.setMnemonic('s');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- saveConfiguration();
- }
- });
-
- return result;
- }
-
- protected JMenuItem createConfigureReset() {
- JMenuItem result = new JMenuItem("Reset");
- result.setMnemonic('r');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- resetConfiguration();
- }
- });
-
- return result;
- }
-
- protected JMenuItem createConfigureMaxRecords() {
- JMenuItem result = new JMenuItem("Set Max Number of Records");
- result.setMnemonic('m');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- setMaxRecordConfiguration();
- }
- });
-
- return result;
- }
-
-
- protected void saveConfiguration() {
- _configurationManager.save();
- }
-
- protected void resetConfiguration() {
- _configurationManager.reset();
- }
-
- protected void setMaxRecordConfiguration() {
- LogFactor5InputDialog inputDialog = new LogFactor5InputDialog(
- getBaseFrame(), "Set Max Number of Records", "", 10);
-
- String temp = inputDialog.getText();
-
- if (temp != null) {
- try {
- setMaxNumberOfLogRecords(Integer.parseInt(temp));
- } catch (NumberFormatException e) {
- LogFactor5ErrorDialog error = new LogFactor5ErrorDialog(
- getBaseFrame(),
- "'" + temp + "' is an invalid parameter.\nPlease try again.");
- setMaxRecordConfiguration();
- }
- }
- }
-
-
- protected JMenu createHelpMenu() {
- JMenu helpMenu = new JMenu("Help");
- helpMenu.setMnemonic('h');
- helpMenu.add(createHelpProperties());
- return helpMenu;
- }
-
- protected JMenuItem createHelpProperties() {
- final String title = "LogFactor5 Properties";
- final JMenuItem result = new JMenuItem(title);
- result.setMnemonic('l');
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- showPropertiesDialog(title);
- }
- });
- return result;
- }
-
- protected void showPropertiesDialog(String title) {
- JOptionPane.showMessageDialog(
- _logMonitorFrame,
- _displayedLogBrokerProperties.toArray(),
- title,
- JOptionPane.PLAIN_MESSAGE
- );
- }
-
- protected JMenu createEditMenu() {
- JMenu editMenu = new JMenu("Edit");
- editMenu.setMnemonic('e');
- editMenu.add(createEditFindMI());
- editMenu.add(createEditFindNextMI());
- editMenu.addSeparator();
- editMenu.add(createEditSortNDCMI());
- editMenu.add(createEditRestoreAllNDCMI());
- return editMenu;
- }
-
- protected JMenuItem createEditFindNextMI() {
- JMenuItem editFindNextMI = new JMenuItem("Find Next");
- editFindNextMI.setMnemonic('n');
- editFindNextMI.setAccelerator(KeyStroke.getKeyStroke("F3"));
- editFindNextMI.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- findSearchText();
- }
- });
- return editFindNextMI;
- }
-
- protected JMenuItem createEditFindMI() {
- JMenuItem editFindMI = new JMenuItem("Find");
- editFindMI.setMnemonic('f');
- editFindMI.setAccelerator(KeyStroke.getKeyStroke("control F"));
-
- editFindMI.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- String inputValue =
- JOptionPane.showInputDialog(
- _logMonitorFrame,
- "Find text: ",
- "Search Record Messages",
- JOptionPane.QUESTION_MESSAGE
- );
- setSearchText(inputValue);
- findSearchText();
- }
- }
-
- );
- return editFindMI;
- }
-
- // Added version 1.2 - Allows users to Sort Log Records by an
- // NDC text filter. A new LogRecordFilter was created to
- // sort the records.
- protected JMenuItem createEditSortNDCMI() {
- JMenuItem editSortNDCMI = new JMenuItem("Sort by NDC");
- editSortNDCMI.setMnemonic('s');
- editSortNDCMI.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- String inputValue =
- JOptionPane.showInputDialog(
- _logMonitorFrame,
- "Sort by this NDC: ",
- "Sort Log Records by NDC",
- JOptionPane.QUESTION_MESSAGE
- );
- setNDCTextFilter(inputValue);
- sortByNDC();
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
- }
-
- );
- return editSortNDCMI;
- }
-
- // Added in version 1.2 - Resets the LogRecordFilter back to default
- // filter.
- protected JMenuItem createEditRestoreAllNDCMI() {
- JMenuItem editRestoreAllNDCMI = new JMenuItem("Restore all NDCs");
- editRestoreAllNDCMI.setMnemonic('r');
- editRestoreAllNDCMI.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _table.getFilteredLogTableModel().setLogRecordFilter(createLogRecordFilter());
- // reset the text filter
- setNDCTextFilter("");
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
- }
- );
- return editRestoreAllNDCMI;
- }
-
- protected JToolBar createToolBar() {
- JToolBar tb = new JToolBar();
- tb.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
- JComboBox fontCombo = new JComboBox();
- JComboBox fontSizeCombo = new JComboBox();
- _fontSizeCombo = fontSizeCombo;
-
- ClassLoader cl = this.getClass().getClassLoader();
- if(cl == null) {
- cl = ClassLoader.getSystemClassLoader();
- }
- URL newIconURL = cl.getResource("org/apache/log4j/lf5/viewer/" +
- "images/channelexplorer_new.gif");
-
- ImageIcon newIcon = null;
-
- if (newIconURL != null) {
- newIcon = new ImageIcon(newIconURL);
- }
-
- JButton newButton = new JButton("Clear Log Table");
-
- if (newIcon != null) {
- newButton.setIcon(newIcon);
- }
-
- newButton.setToolTipText("Clear Log Table.");
- //newButton.setBorder(BorderFactory.createEtchedBorder());
-
- newButton.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _table.clearLogRecords();
- _categoryExplorerTree.getExplorerModel().resetAllNodeCounts();
- updateStatusLabel();
- clearDetailTextArea();
- LogRecord.resetSequenceNumber();
- }
- }
- );
-
- Toolkit tk = Toolkit.getDefaultToolkit();
- // This will actually grab all the fonts
-
- String[] fonts;
-
- if (_loadSystemFonts) {
- fonts = GraphicsEnvironment.
- getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
- } else {
- fonts = tk.getFontList();
- }
-
- for (int j = 0; j < fonts.length; j++) {
- fontCombo.addItem(fonts[j]);
- }
-
- fontCombo.setSelectedItem(_fontName);
-
- fontCombo.addActionListener(
-
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JComboBox box = (JComboBox) e.getSource();
- String font = (String) box.getSelectedItem();
- _table.setFont(new Font(font, Font.PLAIN, _fontSize));
- _fontName = font;
- }
- }
- );
-
- fontSizeCombo.addItem("8");
- fontSizeCombo.addItem("9");
- fontSizeCombo.addItem("10");
- fontSizeCombo.addItem("12");
- fontSizeCombo.addItem("14");
- fontSizeCombo.addItem("16");
- fontSizeCombo.addItem("18");
- fontSizeCombo.addItem("24");
-
- fontSizeCombo.setSelectedItem(String.valueOf(_fontSize));
- fontSizeCombo.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JComboBox box = (JComboBox) e.getSource();
- String size = (String) box.getSelectedItem();
- int s = Integer.valueOf(size).intValue();
-
- setFontSizeSilently(s);
- refreshDetailTextArea();
- _fontSize = s;
- }
- }
- );
-
- tb.add(new JLabel(" Font: "));
- tb.add(fontCombo);
- tb.add(fontSizeCombo);
- tb.addSeparator();
- tb.addSeparator();
- tb.add(newButton);
-
- newButton.setAlignmentY(0.5f);
- newButton.setAlignmentX(0.5f);
-
- fontCombo.setMaximumSize(fontCombo.getPreferredSize());
- fontSizeCombo.setMaximumSize(
- fontSizeCombo.getPreferredSize());
-
- return (tb);
- }
-
-// protected void setView(String viewString, LogTable table) {
-// if (STANDARD_VIEW.equals(viewString)) {
-// table.setStandardView();
-// } else if (COMPACT_VIEW.equals(viewString)) {
-// table.setCompactView();
-// } else if (DETAILED_VIEW.equals(viewString)) {
-// table.setDetailedView();
-// } else {
-// String message = viewString + "does not match a supported view.";
-// throw new IllegalArgumentException(message);
-// }
-// _currentView = viewString;
-// }
-
- protected void setView(String viewString, LogTable table) {
- if (DETAILED_VIEW.equals(viewString)) {
- table.setDetailedView();
- } else {
- String message = viewString + "does not match a supported view.";
- throw new IllegalArgumentException(message);
- }
- _currentView = viewString;
- }
-
- protected JComboBox createLogLevelCombo() {
- JComboBox result = new JComboBox();
- Iterator levels = getLogLevels();
- while (levels.hasNext()) {
- result.addItem(levels.next());
- }
- result.setSelectedItem(_leastSevereDisplayedLogLevel);
-
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JComboBox box = (JComboBox) e.getSource();
- LogLevel level = (LogLevel) box.getSelectedItem();
- setLeastSevereDisplayedLogLevel(level);
- }
- });
- result.setMaximumSize(result.getPreferredSize());
- return result;
- }
-
- protected void setLeastSevereDisplayedLogLevel(LogLevel level) {
- if (level == null || _leastSevereDisplayedLogLevel == level) {
- return; // nothing to do
- }
- _leastSevereDisplayedLogLevel = level;
- _table.getFilteredLogTableModel().refresh();
- updateStatusLabel();
- }
-
- /**
- * Ensures that the Table's ScrollPane Viewport will "track" with updates
- * to the Table. When the vertical scroll bar is at its bottom anchor
- * and tracking is enabled then viewport will stay at the bottom most
- * point of the component. The purpose of this feature is to allow
- * a developer to watch the table as messages arrive and not have to
- * scroll after each new message arrives. When the vertical scroll bar
- * is at any other location, then no tracking will happen.
- * @deprecated tracking is now done automatically.
- */
- protected void trackTableScrollPane() {
- // do nothing
- }
-
- protected void centerFrame(JFrame frame) {
- Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
- Dimension comp = frame.getSize();
-
- frame.setLocation(((screen.width - comp.width) / 2),
- ((screen.height - comp.height) / 2));
-
- }
-
- /**
- * Uses a JFileChooser to select a file to opened with the
- * LF5 GUI.
- */
- protected void requestOpen() {
- JFileChooser chooser;
-
- if (_fileLocation == null) {
- chooser = new JFileChooser();
- } else {
- chooser = new JFileChooser(_fileLocation);
- }
-
- int returnVal = chooser.showOpenDialog(_logMonitorFrame);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- File f = chooser.getSelectedFile();
- if (loadLogFile(f)) {
- _fileLocation = chooser.getSelectedFile();
- _mruFileManager.set(f);
- updateMRUList();
- }
- }
- }
-
- /**
- * Uses a Dialog box to accept a URL to a file to be opened
- * with the LF5 GUI.
- */
- protected void requestOpenURL() {
- LogFactor5InputDialog inputDialog = new LogFactor5InputDialog(
- getBaseFrame(), "Open URL", "URL:");
- String temp = inputDialog.getText();
-
- if (temp != null) {
- if (temp.indexOf("://") == -1) {
- temp = "http://" + temp;
- }
-
- try {
- URL url = new URL(temp);
- if (loadLogFile(url)) {
- _mruFileManager.set(url);
- updateMRUList();
- }
- } catch (MalformedURLException e) {
- LogFactor5ErrorDialog error = new LogFactor5ErrorDialog(
- getBaseFrame(), "Error reading URL.");
- }
- }
- }
-
- /**
- * Removes old file list and creates a new file list
- * with the updated MRU list.
- */
- protected void updateMRUList() {
- JMenu menu = _logMonitorFrame.getJMenuBar().getMenu(0);
- menu.removeAll();
- menu.add(createOpenMI());
- menu.add(createOpenURLMI());
- menu.addSeparator();
- menu.add(createCloseMI());
- createMRUFileListMI(menu);
- menu.addSeparator();
- menu.add(createExitMI());
- }
-
- protected void requestClose() {
- setCallSystemExitOnClose(false);
- closeAfterConfirm();
- }
-
- /**
- * Opens a file in the MRU list.
- */
- protected void requestOpenMRU(ActionEvent e) {
- String file = e.getActionCommand();
- StringTokenizer st = new StringTokenizer(file);
- String num = st.nextToken().trim();
- file = st.nextToken("\n");
-
- try {
- int index = Integer.parseInt(num) - 1;
-
- InputStream in = _mruFileManager.getInputStream(index);
- LogFileParser lfp = new LogFileParser(in);
- lfp.parse(this);
-
- _mruFileManager.moveToTop(index);
- updateMRUList();
-
- } catch (Exception me) {
- LogFactor5ErrorDialog error = new LogFactor5ErrorDialog(
- getBaseFrame(), "Unable to load file " + file);
- }
-
- }
-
- protected void requestExit() {
- _mruFileManager.save();
- setCallSystemExitOnClose(true);
- closeAfterConfirm();
- }
-
- protected void closeAfterConfirm() {
- StringBuffer message = new StringBuffer();
-
- if (_callSystemExitOnClose == false) {
- message.append("Are you sure you want to close the logging ");
- message.append("console?\n");
- message.append("(Note: This will not shut down the Virtual Machine,\n");
- message.append("or the Swing event thread.)");
- } else {
- message.append("Are you sure you want to exit?\n");
- message.append("This will shut down the Virtual Machine.\n");
- }
-
- String title =
- "Are you sure you want to dispose of the Logging Console?";
-
- if (_callSystemExitOnClose == true) {
- title = "Are you sure you want to exit?";
- }
- int value = JOptionPane.showConfirmDialog(
- _logMonitorFrame,
- message.toString(),
- title,
- JOptionPane.OK_CANCEL_OPTION,
- JOptionPane.QUESTION_MESSAGE,
- null
- );
-
- if (value == JOptionPane.OK_OPTION) {
- dispose();
- }
- }
-
- protected Iterator getLogLevels() {
- return _levels.iterator();
- }
-
- protected Iterator getLogTableColumns() {
- return _columns.iterator();
- }
-
- /**
- * Loads and parses a log file.
- */
- protected boolean loadLogFile(File file) {
- boolean ok = false;
- try {
- LogFileParser lfp = new LogFileParser(file);
- lfp.parse(this);
- ok = true;
- } catch (IOException e) {
- LogFactor5ErrorDialog error = new LogFactor5ErrorDialog(
- getBaseFrame(), "Error reading " + file.getName());
- }
-
- return ok;
- }
-
- /**
- * Loads a parses a log file running on a server.
- */
- protected boolean loadLogFile(URL url) {
- boolean ok = false;
- try {
- LogFileParser lfp = new LogFileParser(url.openStream());
- lfp.parse(this);
- ok = true;
- } catch (IOException e) {
- LogFactor5ErrorDialog error = new LogFactor5ErrorDialog(
- getBaseFrame(), "Error reading URL:" + url.getFile());
- }
- return ok;
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
- class LogBrokerMonitorWindowAdaptor extends WindowAdapter {
- protected LogBrokerMonitor _monitor;
-
- public LogBrokerMonitorWindowAdaptor(LogBrokerMonitor monitor) {
- _monitor = monitor;
- }
-
- public void windowClosing(WindowEvent ev) {
- _monitor.requestClose();
- }
- }
-}
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java b/java/src/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java
deleted file mode 100644
index 763d870..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.Label;
-import java.awt.Toolkit;
-import java.awt.Window;
-
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-
-/**
- * LogFactor5Dialog
- *
- * @author Richard Hurst
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public abstract class LogFactor5Dialog extends JDialog {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
- protected static final Font DISPLAY_FONT = new Font("Arial", Font.BOLD, 12);
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- protected LogFactor5Dialog(JFrame jframe, String message, boolean modal) {
- super(jframe, message, modal);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public void show() {
- pack();
- minimumSizeDialog(this, 200, 100);
- centerWindow(this);
- super.show();
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
- protected void centerWindow(Window win) {
- Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
-
- // If larger than screen, reduce window width or height
- if (screenDim.width < win.getSize().width) {
- win.setSize(screenDim.width, win.getSize().height);
- }
-
- if (screenDim.height < win.getSize().height) {
- win.setSize(win.getSize().width, screenDim.height);
- }
-
- // Center Frame, Dialogue or Window on screen
- int x = (screenDim.width - win.getSize().width) / 2;
- int y = (screenDim.height - win.getSize().height) / 2;
- win.setLocation(x, y);
- }
-
- protected void wrapStringOnPanel(String message,
- Container container) {
- GridBagConstraints c = getDefaultConstraints();
- c.gridwidth = GridBagConstraints.REMAINDER;
- // Insets() args are top, left, bottom, right
- c.insets = new Insets(0, 0, 0, 0);
- GridBagLayout gbLayout = (GridBagLayout) container.getLayout();
-
-
- while (message.length() > 0) {
- int newLineIndex = message.indexOf('\n');
- String line;
- if (newLineIndex >= 0) {
- line = message.substring(0, newLineIndex);
- message = message.substring(newLineIndex + 1);
- } else {
- line = message;
- message = "";
- }
- Label label = new Label(line);
- label.setFont(DISPLAY_FONT);
- gbLayout.setConstraints(label, c);
- container.add(label);
- }
- }
-
- protected GridBagConstraints getDefaultConstraints() {
- GridBagConstraints constraints = new GridBagConstraints();
- constraints.weightx = 1.0;
- constraints.weighty = 1.0;
- constraints.gridheight = 1; // One row high
- // Insets() args are top, left, bottom, right
- constraints.insets = new Insets(4, 4, 4, 4);
- // fill of NONE means do not change size
- constraints.fill = GridBagConstraints.NONE;
- // WEST means align left
- constraints.anchor = GridBagConstraints.WEST;
-
- return constraints;
- }
-
- protected void minimumSizeDialog(Component component,
- int minWidth,
- int minHeight) {
- // set the min width
- if (component.getSize().width < minWidth)
- component.setSize(minWidth, component.getSize().height);
- // set the min height
- if (component.getSize().height < minHeight)
- component.setSize(component.getSize().width, minHeight);
- }
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java b/java/src/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java
deleted file mode 100644
index 64b2e21..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-
-/**
- * LogFactor5ErrorDialog
- *
- * @author Richard Hurst
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogFactor5ErrorDialog extends LogFactor5Dialog {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public LogFactor5ErrorDialog(JFrame jframe, String message) {
- super(jframe, "Error", true);
-
- JButton ok = new JButton("Ok");
- ok.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- hide();
- }
- });
-
- JPanel bottom = new JPanel();
- bottom.setLayout(new FlowLayout());
- bottom.add(ok);
-
- JPanel main = new JPanel();
- main.setLayout(new GridBagLayout());
- wrapStringOnPanel(message, main);
-
- getContentPane().add(main, BorderLayout.CENTER);
- getContentPane().add(bottom, BorderLayout.SOUTH);
- show();
-
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java b/java/src/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java
deleted file mode 100644
index 890e6db..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-
-/**
- * LogFactor5InputDialog
- *
- * Creates a popup input dialog box so that users can enter
- * a URL to open a log file from.
- *
- * @author Richard Hurst
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogFactor5InputDialog extends LogFactor5Dialog {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
- public static final int SIZE = 30;
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private JTextField _textField;
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- * Configures an input dialog box using a defualt size for the text field.
- * param jframe the frame where the dialog will be loaded from.
- * param title the title of the dialog box.
- * param label the label to be put in the dialog box.
- */
- public LogFactor5InputDialog(JFrame jframe, String title, String label) {
- this(jframe, title, label, SIZE);
- }
-
- /**
- * Configures an input dialog box.
- * param jframe the frame where the dialog will be loaded from.
- * param title the title of the dialog box.
- * param label the label to be put in the dialog box.
- * param size the size of the text field.
- */
- public LogFactor5InputDialog(JFrame jframe, String title, String label,
- int size) {
- super(jframe, title, true);
-
- JPanel bottom = new JPanel();
- bottom.setLayout(new FlowLayout());
-
- JPanel main = new JPanel();
- main.setLayout(new FlowLayout());
- main.add(new JLabel(label));
- _textField = new JTextField(size);
- main.add(_textField);
-
- addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ENTER) {
- hide();
- }
- }
- });
-
- JButton ok = new JButton("Ok");
- ok.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- hide();
- }
- });
-
- JButton cancel = new JButton("Cancel");
- cancel.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- hide();
- // set the text field to blank just in case
- // a file was selected before the Cancel
- // button was pressed.
- _textField.setText("");
- }
- });
-
- bottom.add(ok);
- bottom.add(cancel);
- getContentPane().add(main, BorderLayout.CENTER);
- getContentPane().add(bottom, BorderLayout.SOUTH);
- pack();
- centerWindow(this);
- show();
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public String getText() {
- String s = _textField.getText();
-
- if (s != null && s.trim().length() == 0) {
- return null;
- }
-
- return s;
-
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java b/java/src/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java
deleted file mode 100644
index 3e5a62b..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.GridBagLayout;
-
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-
-/**
- * LogFactor5LoadingDialog
- *
- * @author Richard Hurst
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogFactor5LoadingDialog extends LogFactor5Dialog {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public LogFactor5LoadingDialog(JFrame jframe, String message) {
- super(jframe, "LogFactor5", false);
-
- JPanel bottom = new JPanel();
- bottom.setLayout(new FlowLayout());
-
- JPanel main = new JPanel();
- main.setLayout(new GridBagLayout());
- wrapStringOnPanel(message, main);
-
- getContentPane().add(main, BorderLayout.CENTER);
- getContentPane().add(bottom, BorderLayout.SOUTH);
- show();
-
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogTable.java b/java/src/org/apache/log4j/lf5/viewer/LogTable.java
deleted file mode 100644
index 6bea10d..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogTable.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.JTable;
-import javax.swing.JTextArea;
-import javax.swing.ListSelectionModel;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-
-import org.apache.log4j.lf5.util.DateFormatManager;
-
-/**
- * LogTable.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- * @author Brad Marlborough
- * @author Brent Sprecher
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogTable extends JTable {
- private static final long serialVersionUID = 4867085140195148458L;
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected int _rowHeight = 30;
- protected JTextArea _detailTextArea;
-
- // For the columns:
- protected int _numCols = 9;
- protected TableColumn[] _tableColumns = new TableColumn[_numCols];
- protected int[] _colWidths = {40, 40, 40, 70, 70, 360, 440, 200, 60};
- protected LogTableColumn[] _colNames = LogTableColumn.getLogTableColumnArray();
- protected int _colDate = 0;
- protected int _colThread = 1;
- protected int _colMessageNum = 2;
- protected int _colLevel = 3;
- protected int _colNDC = 4;
- protected int _colCategory = 5;
- protected int _colMessage = 6;
- protected int _colLocation = 7;
- protected int _colThrown = 8;
-
- protected DateFormatManager _dateFormatManager = null;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public LogTable(JTextArea detailTextArea) {
- super();
-
- init();
-
- _detailTextArea = detailTextArea;
-
- setModel(new FilteredLogTableModel());
-
- Enumeration columns = getColumnModel().getColumns();
- int i = 0;
- while (columns.hasMoreElements()) {
- TableColumn col = (TableColumn) columns.nextElement();
- col.setCellRenderer(new LogTableRowRenderer());
- col.setPreferredWidth(_colWidths[i]);
-
- _tableColumns[i] = col;
- i++;
- }
-
- ListSelectionModel rowSM = getSelectionModel();
- rowSM.addListSelectionListener(new LogTableListSelectionListener(this));
-
- //setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Get the DateFormatManager for formatting dates.
- */
- public DateFormatManager getDateFormatManager() {
- return _dateFormatManager;
- }
-
- /**
- * Set the date format manager for formatting dates.
- */
- public void setDateFormatManager(DateFormatManager dfm) {
- _dateFormatManager = dfm;
- }
-
- public synchronized void clearLogRecords() {
- //For JDK1.3
- //((DefaultTableModel)getModel()).setRowCount(0);
-
- // For JDK1.2.x
- getFilteredLogTableModel().clear();
- }
-
- public FilteredLogTableModel getFilteredLogTableModel() {
- return (FilteredLogTableModel) getModel();
- }
-
- // default view if a view is not set and saved
- public void setDetailedView() {
- //TODO: Defineable Views.
- TableColumnModel model = getColumnModel();
- // Remove all the columns:
- for (int f = 0; f < _numCols; f++) {
- model.removeColumn(_tableColumns[f]);
- }
- // Add them back in the correct order:
- for (int i = 0; i < _numCols; i++) {
- model.addColumn(_tableColumns[i]);
- }
- //SWING BUG:
- sizeColumnsToFit(-1);
- }
-
- public void setView(List columns) {
- TableColumnModel model = getColumnModel();
-
- // Remove all the columns:
- for (int f = 0; f < _numCols; f++) {
- model.removeColumn(_tableColumns[f]);
- }
- Iterator selectedColumns = columns.iterator();
- Vector columnNameAndNumber = getColumnNameAndNumber();
- while (selectedColumns.hasNext()) {
- // add the column to the view
- model.addColumn(_tableColumns[columnNameAndNumber.indexOf(selectedColumns.next())]);
- }
-
- //SWING BUG:
- sizeColumnsToFit(-1);
- }
-
- public void setFont(Font font) {
- super.setFont(font);
- Graphics g = this.getGraphics();
- if (g != null) {
- FontMetrics fm = g.getFontMetrics(font);
- int height = fm.getHeight();
- _rowHeight = height + height / 3;
- setRowHeight(_rowHeight);
- }
-
-
- }
-
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected void init() {
- setRowHeight(_rowHeight);
- setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- }
-
- // assign a column number to a column name
- protected Vector getColumnNameAndNumber() {
- Vector columnNameAndNumber = new Vector();
- for (int i = 0; i < _colNames.length; i++) {
- columnNameAndNumber.add(i, _colNames[i]);
- }
- return columnNameAndNumber;
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
- class LogTableListSelectionListener implements ListSelectionListener {
- protected JTable _table;
-
- public LogTableListSelectionListener(JTable table) {
- _table = table;
- }
-
- public void valueChanged(ListSelectionEvent e) {
- //Ignore extra messages.
- if (e.getValueIsAdjusting()) {
- return;
- }
-
- ListSelectionModel lsm = (ListSelectionModel) e.getSource();
- if (lsm.isSelectionEmpty()) {
- //no rows are selected
- } else {
- StringBuffer buf = new StringBuffer();
- int selectedRow = lsm.getMinSelectionIndex();
-
- for (int i = 0; i < _numCols - 1; i++) {
- String value = "";
- Object obj = _table.getModel().getValueAt(selectedRow, i);
- if (obj != null) {
- value = obj.toString();
- }
-
- buf.append(_colNames[i] + ":");
- buf.append("\t");
-
- if (i == _colThread || i == _colMessage || i == _colLevel) {
- buf.append("\t"); // pad out the date.
- }
-
- if (i == _colDate || i == _colNDC) {
- buf.append("\t\t"); // pad out the date.
- }
-
-// if( i == _colSequence)
-// {
-// buf.append("\t\t\t"); // pad out the Sequnce.
-// }
-
- buf.append(value);
- buf.append("\n");
- }
- buf.append(_colNames[_numCols - 1] + ":\n");
- Object obj = _table.getModel().getValueAt(selectedRow, _numCols - 1);
- if (obj != null) {
- buf.append(obj.toString());
- }
-
- _detailTextArea.setText(buf.toString());
- }
- }
- }
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogTableColumn.java b/java/src/org/apache/log4j/lf5/viewer/LogTableColumn.java
deleted file mode 100644
index c86c6bb..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogTableColumn.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * LogTableColumn
- *
- * @author Michael J. Sikorsky
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogTableColumn implements java.io.Serializable {
- private static final long serialVersionUID = -4275827753626456547L;
-
- // log4j table columns.
- public final static LogTableColumn DATE = new LogTableColumn("Date");
- public final static LogTableColumn THREAD = new LogTableColumn("Thread");
- public final static LogTableColumn MESSAGE_NUM = new LogTableColumn("Message #");
- public final static LogTableColumn LEVEL = new LogTableColumn("Level");
- public final static LogTableColumn NDC = new LogTableColumn("NDC");
- public final static LogTableColumn CATEGORY = new LogTableColumn("Category");
- public final static LogTableColumn MESSAGE = new LogTableColumn("Message");
- public final static LogTableColumn LOCATION = new LogTableColumn("Location");
- public final static LogTableColumn THROWN = new LogTableColumn("Thrown");
-
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected String _label;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private static LogTableColumn[] _log4JColumns;
- private static Map _logTableColumnMap;
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- static {
- _log4JColumns = new LogTableColumn[]{DATE, THREAD, MESSAGE_NUM, LEVEL, NDC, CATEGORY,
- MESSAGE, LOCATION, THROWN};
-
- _logTableColumnMap = new HashMap();
-
- for (int i = 0; i < _log4JColumns.length; i++) {
- _logTableColumnMap.put(_log4JColumns[i].getLabel(), _log4JColumns[i]);
- }
- }
-
-
- public LogTableColumn(String label) {
- _label = label;
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Return the Label of the LogLevel.
- */
- public String getLabel() {
- return _label;
- }
-
- /**
- * Convert a column label into a LogTableColumn object.
- *
- * @param column The label of a level to be converted into a LogTableColumn.
- * @return LogTableColumn The LogTableColumn with a label equal to column.
- * @throws LogTableColumnFormatException Is thrown when the column can not be
- * converted into a LogTableColumn.
- */
- public static LogTableColumn valueOf(String column)
- throws LogTableColumnFormatException {
- LogTableColumn tableColumn = null;
- if (column != null) {
- column = column.trim();
- tableColumn = (LogTableColumn) _logTableColumnMap.get(column);
- }
-
- if (tableColumn == null) {
- StringBuffer buf = new StringBuffer();
- buf.append("Error while trying to parse (" + column + ") into");
- buf.append(" a LogTableColumn.");
- throw new LogTableColumnFormatException(buf.toString());
- }
- return tableColumn;
- }
-
-
- public boolean equals(Object o) {
- boolean equals = false;
-
- if (o instanceof LogTableColumn) {
- if (this.getLabel() ==
- ((LogTableColumn) o).getLabel()) {
- equals = true;
- }
- }
-
- return equals;
- }
-
- public int hashCode() {
- return _label.hashCode();
- }
-
- public String toString() {
- return _label;
- }
-
- /**
- * @return A List of LogTableColumn/code> objects that map
- * to log4j Column objects.
- */
- public static List getLogTableColumns() {
- return Arrays.asList(_log4JColumns);
- }
-
- public static LogTableColumn[] getLogTableColumnArray() {
- return _log4JColumns;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java b/java/src/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java
deleted file mode 100644
index b161fe7..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-/**
- * Thrown to indicate that the client has attempted to convert a string
- * to one the LogLevel types, but the string does not have the appropriate
- * format.
- *
- * @author Michael J. Sikorsky
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogTableColumnFormatException extends Exception {
- private static final long serialVersionUID = 6529165785030431653L;
-
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public LogTableColumnFormatException(String message) {
- super(message);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogTableModel.java b/java/src/org/apache/log4j/lf5/viewer/LogTableModel.java
deleted file mode 100644
index 3b60000..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogTableModel.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import javax.swing.table.DefaultTableModel;
-
-/**
- * LogTableModel
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogTableModel extends DefaultTableModel {
- private static final long serialVersionUID = 3593300685868700894L;
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public LogTableModel(Object[] colNames, int numRows) {
- super(colNames, numRows);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public boolean isCellEditable(int row, int column) {
- return (false);
- }
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java b/java/src/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java
deleted file mode 100644
index 3d1e397..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.Color;
-import java.awt.Component;
-
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableCellRenderer;
-
-import org.apache.log4j.lf5.LogLevel;
-import org.apache.log4j.lf5.LogRecord;
-
-/**
- * LogTableRowRenderer
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class LogTableRowRenderer extends DefaultTableCellRenderer {
- private static final long serialVersionUID = -3951639953706443213L;
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected boolean _highlightFatal = true;
- protected Color _color = new Color(230, 230, 230);
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public Component getTableCellRendererComponent(JTable table,
- Object value,
- boolean isSelected,
- boolean hasFocus,
- int row,
- int col) {
-
- if ((row % 2) == 0) {
- setBackground(_color);
- } else {
- setBackground(Color.white);
- }
-
- FilteredLogTableModel model = (FilteredLogTableModel) table.getModel();
- LogRecord record = model.getFilteredRecord(row);
-
- setForeground(getLogLevelColor(record.getLevel()));
-
- return (super.getTableCellRendererComponent(table,
- value,
- isSelected,
- hasFocus,
- row, col));
- }
-
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected Color getLogLevelColor(LogLevel level) {
- return (Color) LogLevel.getLogLevelColorMap().get(level);
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java b/java/src/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java
deleted file mode 100644
index 4aa959c..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer;
-
-import java.awt.Adjustable;
-import java.awt.event.AdjustmentEvent;
-import java.awt.event.AdjustmentListener;
-
-/**
- * An AdjustmentListener which ensures that an Adjustable (e.g. a Scrollbar)
- * will "track" when the Adjustable expands.
- * For example, when a vertical scroll bar is at its bottom anchor,
- * the scrollbar will remain at the bottom. When the vertical scroll bar
- * is at any other location, then no tracking will happen.
- * An instance of this class should only listen to one Adjustable as
- * it retains state information about the Adjustable it listens to.
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class TrackingAdjustmentListener implements AdjustmentListener {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- protected int _lastMaximum = -1;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public void adjustmentValueChanged(AdjustmentEvent e) {
- Adjustable bar = e.getAdjustable();
- int currentMaximum = bar.getMaximum();
- if (bar.getMaximum() == _lastMaximum) {
- return; // nothing to do, the adjustable has not expanded
- }
- int bottom = bar.getValue() + bar.getVisibleAmount();
-
- if (bottom + bar.getUnitIncrement() >= _lastMaximum) {
- bar.setValue(bar.getMaximum()); // use the most recent maximum
- }
- _lastMaximum = currentMaximum;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java
deleted file mode 100644
index e5bbaa6..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.awt.Component;
-import java.awt.event.MouseEvent;
-import java.util.EventObject;
-
-import javax.swing.JTable;
-import javax.swing.JTree;
-import javax.swing.event.CellEditorListener;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.EventListenerList;
-import javax.swing.table.TableCellEditor;
-import javax.swing.tree.TreeCellEditor;
-
-/**
- * CategoryAbstractCellEditor. Base class to handle the some common
- * details of cell editing.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryAbstractCellEditor implements TableCellEditor, TreeCellEditor {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected EventListenerList _listenerList = new EventListenerList();
- protected Object _value;
- protected ChangeEvent _changeEvent = null;
- protected int _clickCountToStart = 1;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public Object getCellEditorValue() {
- return _value;
- }
-
- public void setCellEditorValue(Object value) {
- _value = value;
- }
-
- public void setClickCountToStart(int count) {
- _clickCountToStart = count;
- }
-
- public int getClickCountToStart() {
- return _clickCountToStart;
- }
-
- public boolean isCellEditable(EventObject anEvent) {
- if (anEvent instanceof MouseEvent) {
- if (((MouseEvent) anEvent).getClickCount() < _clickCountToStart) {
- return false;
- }
- }
- return true;
- }
-
- public boolean shouldSelectCell(EventObject anEvent) {
- if (this.isCellEditable(anEvent)) {
- if (anEvent == null ||
- ((MouseEvent) anEvent).getClickCount() >= _clickCountToStart) {
- return true;
- }
- }
- return false;
- }
-
- public boolean stopCellEditing() {
- fireEditingStopped();
- return true;
- }
-
- public void cancelCellEditing() {
- fireEditingCanceled();
- }
-
- public void addCellEditorListener(CellEditorListener l) {
- _listenerList.add(CellEditorListener.class, l);
- }
-
- public void removeCellEditorListener(CellEditorListener l) {
- _listenerList.remove(CellEditorListener.class, l);
- }
-
- public Component getTreeCellEditorComponent(
- JTree tree, Object value,
- boolean isSelected,
- boolean expanded,
- boolean leaf, int row) {
- return null;
- }
-
- public Component getTableCellEditorComponent(
- JTable table, Object value,
- boolean isSelected,
- int row, int column) {
- return null;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected void fireEditingStopped() {
- Object[] listeners = _listenerList.getListenerList();
-
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == CellEditorListener.class) {
- if (_changeEvent == null) {
- _changeEvent = new ChangeEvent(this);
- }
-
- ((CellEditorListener) listeners[i + 1]).editingStopped(_changeEvent);
- }
- }
- }
-
- protected void fireEditingCanceled() {
- Object[] listeners = _listenerList.getListenerList();
-
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == CellEditorListener.class) {
- if (_changeEvent == null) {
- _changeEvent = new ChangeEvent(this);
- }
-
- ((CellEditorListener) listeners[i + 1]).editingCanceled(_changeEvent);
- }
- }
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java
deleted file mode 100644
index 1391fd5..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-/**
- * CategoryElement represents a single element or part of a Category.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryElement {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected String _categoryTitle;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public CategoryElement() {
- super();
- }
-
- public CategoryElement(String title) {
- _categoryTitle = title;
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public String getTitle() {
- return (_categoryTitle);
- }
-
- public void setTitle(String title) {
- _categoryTitle = title;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java
deleted file mode 100644
index 63f91ae..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import org.apache.log4j.lf5.LogRecord;
-import org.apache.log4j.lf5.LogRecordFilter;
-
-import java.util.Enumeration;
-
-/**
- * An implementation of LogRecordFilter based on a CategoryExplorerModel
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryExplorerLogRecordFilter implements LogRecordFilter {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- protected CategoryExplorerModel _model;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public CategoryExplorerLogRecordFilter(CategoryExplorerModel model) {
- _model = model;
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * @return true if the CategoryExplorer model specified at construction
- * is accepting the category of the specified LogRecord. Has a side-effect
- * of adding the CategoryPath of the LogRecord to the explorer model
- * if the CategoryPath is new.
- */
- public boolean passes(LogRecord record) {
- CategoryPath path = new CategoryPath(record.getCategory());
- return _model.isCategoryPathActive(path);
- }
-
- /**
- * Resets the counters for the contained CategoryNodes to zero.
- */
- public void reset() {
- resetAllNodes();
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected void resetAllNodes() {
- Enumeration nodes = _model.getRootCategoryNode().depthFirstEnumeration();
- CategoryNode current;
- while (nodes.hasMoreElements()) {
- current = (CategoryNode) nodes.nextElement();
- current.resetNumberOfContainedRecords();
- _model.nodeChanged(current);
- }
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java
deleted file mode 100644
index c70b55c..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.awt.AWTEventMulticaster;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Enumeration;
-
-import javax.swing.SwingUtilities;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
-
-import org.apache.log4j.lf5.LogRecord;
-
-/**
- * CategoryExplorerModel
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- * @author Brent Sprecher
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryExplorerModel extends DefaultTreeModel {
- private static final long serialVersionUID = -3413887384316015901L;
-
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- protected boolean _renderFatal = true;
- protected ActionListener _listener = null;
- protected ActionEvent _event = new ActionEvent(this,
- ActionEvent.ACTION_PERFORMED,
- "Nodes Selection changed");
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public CategoryExplorerModel(CategoryNode node) {
- super(node);
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public void addLogRecord(LogRecord lr) {
- CategoryPath path = new CategoryPath(lr.getCategory());
- addCategory(path); // create category path if it is new
- CategoryNode node = getCategoryNode(path);
- node.addRecord(); // update category node
- if (_renderFatal && lr.isFatal()) {
- TreeNode[] nodes = getPathToRoot(node);
- int len = nodes.length;
- CategoryNode parent;
-
- // i = 0 gives root node
- // skip node and root, loop through "parents" in between
- for (int i = 1; i < len - 1; i++) {
- parent = (CategoryNode) nodes[i];
- parent.setHasFatalChildren(true);
- nodeChanged(parent);
- }
- node.setHasFatalRecords(true);
- nodeChanged(node);
- }
- }
-
- public CategoryNode getRootCategoryNode() {
- return (CategoryNode) getRoot();
- }
-
- public CategoryNode getCategoryNode(String category) {
- CategoryPath path = new CategoryPath(category);
- return (getCategoryNode(path));
- }
-
- /**
- * returns null if no CategoryNode exists.
- */
- public CategoryNode getCategoryNode(CategoryPath path) {
- CategoryNode root = (CategoryNode) getRoot();
- CategoryNode parent = root; // Start condition.
-
- for (int i = 0; i < path.size(); i++) {
- CategoryElement element = path.categoryElementAt(i);
-
- // If the two nodes have matching titles they are considered equal.
- Enumeration children = parent.children();
-
- boolean categoryAlreadyExists = false;
- while (children.hasMoreElements()) {
- CategoryNode node = (CategoryNode) children.nextElement();
- String title = node.getTitle().toLowerCase();
-
- String pathLC = element.getTitle().toLowerCase();
- if (title.equals(pathLC)) {
- categoryAlreadyExists = true;
- // This is now the new parent node.
- parent = node;
- break; // out of the while, and back to the for().
- }
- }
-
- if (categoryAlreadyExists == false) {
- return null; // Didn't find the Node.
- }
- }
-
- return (parent);
- }
-
- /**
- * @return true if all the nodes in the specified CategoryPath are
- * selected.
- */
- public boolean isCategoryPathActive(CategoryPath path) {
- CategoryNode root = (CategoryNode) getRoot();
- CategoryNode parent = root; // Start condition.
- boolean active = false;
-
- for (int i = 0; i < path.size(); i++) {
- CategoryElement element = path.categoryElementAt(i);
-
- // If the two nodes have matching titles they are considered equal.
- Enumeration children = parent.children();
-
- boolean categoryAlreadyExists = false;
- active = false;
-
- while (children.hasMoreElements()) {
- CategoryNode node = (CategoryNode) children.nextElement();
- String title = node.getTitle().toLowerCase();
-
- String pathLC = element.getTitle().toLowerCase();
- if (title.equals(pathLC)) {
- categoryAlreadyExists = true;
- // This is now the new parent node.
- parent = node;
-
- if (parent.isSelected()) {
- active = true;
- }
-
- break; // out of the while, and back to the for().
- }
- }
-
- if (active == false || categoryAlreadyExists == false) {
- return false;
- }
- }
-
- return (active);
- }
-
-
- /**
- * Method altered by Richard Hurst such that it returns the CategoryNode
- * corresponding to the CategoryPath
- *
- * @param path category path.
- * @return CategoryNode
- */
- public CategoryNode addCategory(CategoryPath path) {
- CategoryNode root = (CategoryNode) getRoot();
- CategoryNode parent = root; // Start condition.
-
- for (int i = 0; i < path.size(); i++) {
- CategoryElement element = path.categoryElementAt(i);
-
- // If the two nodes have matching titles they are considered equal.
- Enumeration children = parent.children();
-
- boolean categoryAlreadyExists = false;
- while (children.hasMoreElements()) {
- CategoryNode node = (CategoryNode) children.nextElement();
- String title = node.getTitle().toLowerCase();
-
- String pathLC = element.getTitle().toLowerCase();
- if (title.equals(pathLC)) {
- categoryAlreadyExists = true;
- // This is now the new parent node.
- parent = node;
- break;
- }
- }
-
- if (categoryAlreadyExists == false) {
- // We need to add the node.
- CategoryNode newNode = new CategoryNode(element.getTitle());
-
- //This method of adding a new node cause parent roots to be
- // collapsed.
- //parent.add( newNode );
- //reload(parent);
-
- // This doesn't force the nodes to collapse.
- insertNodeInto(newNode, parent, parent.getChildCount());
- refresh(newNode);
-
- // The newly added node is now the parent.
- parent = newNode;
-
- }
- }
-
- return parent;
- }
-
- public void update(CategoryNode node, boolean selected) {
- if (node.isSelected() == selected) {
- return; // nothing was changed, nothing to do
- }
- // select parents or deselect children
- if (selected) {
- setParentSelection(node, true);
- } else {
- setDescendantSelection(node, false);
- }
- }
-
- public void setDescendantSelection(CategoryNode node, boolean selected) {
- Enumeration descendants = node.depthFirstEnumeration();
- CategoryNode current;
- while (descendants.hasMoreElements()) {
- current = (CategoryNode) descendants.nextElement();
- // does the current node need to be changed?
- if (current.isSelected() != selected) {
- current.setSelected(selected);
- nodeChanged(current);
- }
- }
- notifyActionListeners();
- }
-
- public void setParentSelection(CategoryNode node, boolean selected) {
- TreeNode[] nodes = getPathToRoot(node);
- int len = nodes.length;
- CategoryNode parent;
-
- // i = 0 gives root node, i=len-1 gives this node
- // skip the root node
- for (int i = 1; i < len; i++) {
- parent = (CategoryNode) nodes[i];
- if (parent.isSelected() != selected) {
- parent.setSelected(selected);
- nodeChanged(parent);
- }
- }
- notifyActionListeners();
- }
-
-
- public synchronized void addActionListener(ActionListener l) {
- _listener = AWTEventMulticaster.add(_listener, l);
- }
-
- public synchronized void removeActionListener(ActionListener l) {
- _listener = AWTEventMulticaster.remove(_listener, l);
- }
-
- public void resetAllNodeCounts() {
- Enumeration nodes = getRootCategoryNode().depthFirstEnumeration();
- CategoryNode current;
- while (nodes.hasMoreElements()) {
- current = (CategoryNode) nodes.nextElement();
- current.resetNumberOfContainedRecords();
- nodeChanged(current);
- }
- }
-
- /**
- * Returns the CategoryPath to the specified CategoryNode
- *
- * @param node The target CategoryNode
- * @return CategoryPath
- */
- public TreePath getTreePathToRoot(CategoryNode node) {
- if (node == null) {
- return null;
- }
- return (new TreePath(getPathToRoot(node)));
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected void notifyActionListeners() {
- if (_listener != null) {
- _listener.actionPerformed(_event);
- }
- }
-
- /**
- * Fires a nodechanged event on the SwingThread.
- */
- protected void refresh(final CategoryNode node) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- nodeChanged(node); // remind the tree to render the new node
- }
- });
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java
deleted file mode 100644
index a8e97f5..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.awt.event.MouseEvent;
-
-import javax.swing.JTree;
-import javax.swing.event.TreeModelEvent;
-import javax.swing.tree.TreePath;
-
-/**
- * CategoryExplorerTree
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- * @author Brent Sprecher
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryExplorerTree extends JTree {
- private static final long serialVersionUID = 8066257446951323576L;
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected CategoryExplorerModel _model;
- protected boolean _rootAlreadyExpanded = false;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- * Construct a CategoryExplorerTree with a specific model.
- */
- public CategoryExplorerTree(CategoryExplorerModel model) {
- super(model);
-
- _model = model;
- init();
- }
-
- /**
- * Construct a CategoryExplorerTree and create a default CategoryExplorerModel.
- */
- public CategoryExplorerTree() {
- super();
-
- CategoryNode rootNode = new CategoryNode("Categories");
-
- _model = new CategoryExplorerModel(rootNode);
-
- setModel(_model);
-
- init();
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public CategoryExplorerModel getExplorerModel() {
- return (_model);
- }
-
- public String getToolTipText(MouseEvent e) {
-
- try {
- return super.getToolTipText(e);
- } catch (Exception ex) {
- return "";
- }
-
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected void init() {
- // Put visible lines on the JTree.
- putClientProperty("JTree.lineStyle", "Angled");
-
- // Configure the Tree with the appropriate Renderers and Editors.
-
- CategoryNodeRenderer renderer = new CategoryNodeRenderer();
- setEditable(true);
- setCellRenderer(renderer);
-
- CategoryNodeEditor editor = new CategoryNodeEditor(_model);
-
- setCellEditor(new CategoryImmediateEditor(this,
- new CategoryNodeRenderer(),
- editor));
- setShowsRootHandles(true);
-
- setToolTipText("");
-
- ensureRootExpansion();
-
- }
-
- protected void expandRootNode() {
- if (_rootAlreadyExpanded) {
- return;
- }
- _rootAlreadyExpanded = true;
- TreePath path = new TreePath(_model.getRootCategoryNode().getPath());
- expandPath(path);
- }
-
- protected void ensureRootExpansion() {
- _model.addTreeModelListener(new TreeModelAdapter() {
- public void treeNodesInserted(TreeModelEvent e) {
- expandRootNode();
- }
- });
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java
deleted file mode 100644
index 4c7374b..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.awt.Dimension;
-import java.awt.Rectangle;
-import java.awt.event.MouseEvent;
-import java.util.EventObject;
-
-import javax.swing.Icon;
-import javax.swing.JTree;
-import javax.swing.tree.DefaultTreeCellEditor;
-import javax.swing.tree.TreePath;
-
-/**
- * CategoryImmediateEditor
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryImmediateEditor extends DefaultTreeCellEditor {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- private CategoryNodeRenderer renderer;
- protected Icon editingIcon = null;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public CategoryImmediateEditor(JTree tree,
- CategoryNodeRenderer renderer,
- CategoryNodeEditor editor) {
- super(tree, renderer, editor);
- this.renderer = renderer;
- renderer.setIcon(null);
- renderer.setLeafIcon(null);
- renderer.setOpenIcon(null);
- renderer.setClosedIcon(null);
-
- super.editingIcon = null;
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public boolean shouldSelectCell(EventObject e) {
- boolean rv = false; // only mouse events
-
- if (e instanceof MouseEvent) {
- MouseEvent me = (MouseEvent) e;
- TreePath path = tree.getPathForLocation(me.getX(),
- me.getY());
- CategoryNode node = (CategoryNode)
- path.getLastPathComponent();
-
- rv = node.isLeaf() /*|| !inCheckBoxHitRegion(me)*/;
- }
- return rv;
- }
-
- public boolean inCheckBoxHitRegion(MouseEvent e) {
- TreePath path = tree.getPathForLocation(e.getX(),
- e.getY());
- if (path == null) {
- return false;
- }
- CategoryNode node = (CategoryNode) path.getLastPathComponent();
- boolean rv = false;
-
- if (true) {
- // offset and lastRow DefaultTreeCellEditor
- // protected members
-
- Rectangle bounds = tree.getRowBounds(lastRow);
- Dimension checkBoxOffset =
- renderer.getCheckBoxOffset();
-
- bounds.translate(offset + checkBoxOffset.width,
- checkBoxOffset.height);
-
- rv = bounds.contains(e.getPoint());
- }
- return true;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected boolean canEditImmediately(EventObject e) {
- boolean rv = false;
-
- if (e instanceof MouseEvent) {
- MouseEvent me = (MouseEvent) e;
- rv = inCheckBoxHitRegion(me);
- }
-
- return rv;
- }
-
- protected void determineOffset(JTree tree, Object value,
- boolean isSelected, boolean expanded,
- boolean leaf, int row) {
- // Very important: means that the tree won't jump around.
- offset = 0;
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java
deleted file mode 100644
index 95bdc42..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreeNode;
-import java.util.Enumeration;
-
-/**
- * CategoryNode
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryNode extends DefaultMutableTreeNode {
- private static final long serialVersionUID = 5958994817693177319L;
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected boolean _selected = true;
- protected int _numberOfContainedRecords = 0;
- protected int _numberOfRecordsFromChildren = 0;
- protected boolean _hasFatalChildren = false;
- protected boolean _hasFatalRecords = false;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- /**
- *
- */
- public CategoryNode(String title) {
- setUserObject(title);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public String getTitle() {
- return (String) getUserObject();
- }
-
- public void setSelected(boolean s) {
- if (s != _selected) {
- _selected = s;
- }
- }
-
- public boolean isSelected() {
- return _selected;
- }
-
- /**
- * @deprecated
- */
- public void setAllDescendantsSelected() {
- Enumeration children = children();
- while (children.hasMoreElements()) {
- CategoryNode node = (CategoryNode) children.nextElement();
- node.setSelected(true);
- node.setAllDescendantsSelected();
- }
- }
-
- /**
- * @deprecated
- */
- public void setAllDescendantsDeSelected() {
- Enumeration children = children();
- while (children.hasMoreElements()) {
- CategoryNode node = (CategoryNode) children.nextElement();
- node.setSelected(false);
- node.setAllDescendantsDeSelected();
- }
- }
-
- public String toString() {
- return (getTitle());
- }
-
- public boolean equals(Object obj) {
- if (obj instanceof CategoryNode) {
- CategoryNode node = (CategoryNode) obj;
- String tit1 = getTitle().toLowerCase();
- String tit2 = node.getTitle().toLowerCase();
-
- if (tit1.equals(tit2)) {
- return (true);
- }
- }
- return (false);
- }
-
- public int hashCode() {
- return (getTitle().hashCode());
- }
-
- public void addRecord() {
- _numberOfContainedRecords++;
- addRecordToParent();
- }
-
- public int getNumberOfContainedRecords() {
- return _numberOfContainedRecords;
- }
-
- public void resetNumberOfContainedRecords() {
- _numberOfContainedRecords = 0;
- _numberOfRecordsFromChildren = 0;
- _hasFatalRecords = false;
- _hasFatalChildren = false;
- }
-
- public boolean hasFatalRecords() {
- return _hasFatalRecords;
- }
-
- public boolean hasFatalChildren() {
- return _hasFatalChildren;
- }
-
- public void setHasFatalRecords(boolean flag) {
- _hasFatalRecords = flag;
- }
-
- public void setHasFatalChildren(boolean flag) {
- _hasFatalChildren = flag;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected int getTotalNumberOfRecords() {
- return getNumberOfRecordsFromChildren() + getNumberOfContainedRecords();
- }
-
- /**
- * Passes up the addition from child to parent
- */
- protected void addRecordFromChild() {
- _numberOfRecordsFromChildren++;
- addRecordToParent();
- }
-
- protected int getNumberOfRecordsFromChildren() {
- return _numberOfRecordsFromChildren;
- }
-
- protected void addRecordToParent() {
- TreeNode parent = getParent();
- if (parent == null) {
- return;
- }
- ((CategoryNode) parent).addRecordFromChild();
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java
deleted file mode 100644
index b653cd7..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.Enumeration;
-
-import javax.swing.JCheckBox;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPopupMenu;
-import javax.swing.JTree;
-import javax.swing.tree.TreePath;
-
-/**
- * CategoryNodeEditor
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryNodeEditor extends CategoryAbstractCellEditor {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected CategoryNodeEditorRenderer _renderer;
- protected CategoryNode _lastEditedNode;
- protected JCheckBox _checkBox;
- protected CategoryExplorerModel _categoryModel;
- protected JTree _tree;
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public CategoryNodeEditor(CategoryExplorerModel model) {
- _renderer = new CategoryNodeEditorRenderer();
- _checkBox = _renderer.getCheckBox();
- _categoryModel = model;
-
- _checkBox.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _categoryModel.update(_lastEditedNode, _checkBox.isSelected());
- stopCellEditing();
- }
- });
-
- _renderer.addMouseListener(new MouseAdapter() {
- public void mousePressed(MouseEvent e) {
- if ((e.getModifiers() & MouseEvent.BUTTON3_MASK) != 0) {
- showPopup(_lastEditedNode, e.getX(), e.getY());
- }
- stopCellEditing();
- }
- });
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public Component getTreeCellEditorComponent(JTree tree, Object value,
- boolean selected, boolean expanded,
- boolean leaf, int row) {
- _lastEditedNode = (CategoryNode) value;
- _tree = tree;
-
- return _renderer.getTreeCellRendererComponent(tree,
- value, selected, expanded,
- leaf, row, true);
- // hasFocus ignored
- }
-
- public Object getCellEditorValue() {
- return _lastEditedNode.getUserObject();
- }
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected JMenuItem createPropertiesMenuItem(final CategoryNode node) {
- JMenuItem result = new JMenuItem("Properties");
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- showPropertiesDialog(node);
- }
- });
- return result;
- }
-
- protected void showPropertiesDialog(CategoryNode node) {
- JOptionPane.showMessageDialog(
- _tree,
- getDisplayedProperties(node),
- "Category Properties: " + node.getTitle(),
- JOptionPane.PLAIN_MESSAGE
- );
- }
-
- protected Object getDisplayedProperties(CategoryNode node) {
- ArrayList result = new ArrayList();
- result.add("Category: " + node.getTitle());
- if (node.hasFatalRecords()) {
- result.add("Contains at least one fatal LogRecord.");
- }
- if (node.hasFatalChildren()) {
- result.add("Contains descendants with a fatal LogRecord.");
- }
- result.add("LogRecords in this category alone: " +
- node.getNumberOfContainedRecords());
- result.add("LogRecords in descendant categories: " +
- node.getNumberOfRecordsFromChildren());
- result.add("LogRecords in this category including descendants: " +
- node.getTotalNumberOfRecords());
- return result.toArray();
- }
-
- protected void showPopup(CategoryNode node, int x, int y) {
- JPopupMenu popup = new JPopupMenu();
- popup.setSize(150, 400);
- //
- // Configure the Popup
- //
- if (node.getParent() == null) {
- popup.add(createRemoveMenuItem());
- popup.addSeparator();
- }
- popup.add(createSelectDescendantsMenuItem(node));
- popup.add(createUnselectDescendantsMenuItem(node));
- popup.addSeparator();
- popup.add(createExpandMenuItem(node));
- popup.add(createCollapseMenuItem(node));
- popup.addSeparator();
- popup.add(createPropertiesMenuItem(node));
- popup.show(_renderer, x, y);
- }
-
- protected JMenuItem createSelectDescendantsMenuItem(final CategoryNode node) {
- JMenuItem selectDescendants =
- new JMenuItem("Select All Descendant Categories");
- selectDescendants.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _categoryModel.setDescendantSelection(node, true);
- }
- }
- );
- return selectDescendants;
- }
-
- protected JMenuItem createUnselectDescendantsMenuItem(final CategoryNode node) {
- JMenuItem unselectDescendants =
- new JMenuItem("Deselect All Descendant Categories");
- unselectDescendants.addActionListener(
-
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- _categoryModel.setDescendantSelection(node, false);
- }
- }
-
- );
- return unselectDescendants;
- }
-
- protected JMenuItem createExpandMenuItem(final CategoryNode node) {
- JMenuItem result = new JMenuItem("Expand All Descendant Categories");
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- expandDescendants(node);
- }
- });
- return result;
- }
-
- protected JMenuItem createCollapseMenuItem(final CategoryNode node) {
- JMenuItem result = new JMenuItem("Collapse All Descendant Categories");
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- collapseDescendants(node);
- }
- });
- return result;
- }
-
- /**
- * This featured was moved from the LogBrokerMonitor class
- * to the CategoryNodeExplorer so that the Category tree
- * could be pruned from the Category Explorer popup menu.
- * This menu option only appears when a user right clicks on
- * the Category parent node.
- *
- * See removeUnusedNodes()
- */
- protected JMenuItem createRemoveMenuItem() {
- JMenuItem result = new JMenuItem("Remove All Empty Categories");
- result.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- while (removeUnusedNodes() > 0) ;
- }
- });
- return result;
- }
-
- protected void expandDescendants(CategoryNode node) {
- Enumeration descendants = node.depthFirstEnumeration();
- CategoryNode current;
- while (descendants.hasMoreElements()) {
- current = (CategoryNode) descendants.nextElement();
- expand(current);
- }
- }
-
- protected void collapseDescendants(CategoryNode node) {
- Enumeration descendants = node.depthFirstEnumeration();
- CategoryNode current;
- while (descendants.hasMoreElements()) {
- current = (CategoryNode) descendants.nextElement();
- collapse(current);
- }
- }
-
- /**
- * Removes any inactive nodes from the Category tree.
- */
- protected int removeUnusedNodes() {
- int count = 0;
- CategoryNode root = _categoryModel.getRootCategoryNode();
- Enumeration enumeration = root.depthFirstEnumeration();
- while (enumeration.hasMoreElements()) {
- CategoryNode node = (CategoryNode) enumeration.nextElement();
- if (node.isLeaf() && node.getNumberOfContainedRecords() == 0
- && node.getParent() != null) {
- _categoryModel.removeNodeFromParent(node);
- count++;
- }
- }
-
- return count;
- }
-
- protected void expand(CategoryNode node) {
- _tree.expandPath(getTreePath(node));
- }
-
- protected TreePath getTreePath(CategoryNode node) {
- return new TreePath(node.getPath());
- }
-
- protected void collapse(CategoryNode node) {
- _tree.collapsePath(getTreePath(node));
- }
-
- //-----------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java
deleted file mode 100644
index 57be9fc..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.awt.Component;
-
-import javax.swing.JCheckBox;
-import javax.swing.JTree;
-
-/**
- * CategoryNodeEditorRenderer
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryNodeEditorRenderer extends CategoryNodeRenderer {
- private static final long serialVersionUID = -6094804684259929574L;
-
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public Component getTreeCellRendererComponent(
- JTree tree, Object value,
- boolean selected, boolean expanded,
- boolean leaf, int row,
- boolean hasFocus) {
- Component c = super.getTreeCellRendererComponent(tree,
- value, selected, expanded,
- leaf, row, hasFocus);
-
- return c;
- }
-
- public JCheckBox getCheckBox() {
- return _checkBox;
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java
deleted file mode 100644
index 4eb461d..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import javax.swing.*;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import java.awt.*;
-import java.net.URL;
-
-/**
- * CategoryNodeRenderer
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryNodeRenderer extends DefaultTreeCellRenderer {
- private static final long serialVersionUID = -6046702673278595048L;
-
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- public static final Color FATAL_CHILDREN = new Color(189, 113, 0);
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected JCheckBox _checkBox = new JCheckBox();
- protected JPanel _panel = new JPanel();
- protected static ImageIcon _sat = null;
-// protected JLabel _label = new JLabel();
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public CategoryNodeRenderer() {
- _panel.setBackground(UIManager.getColor("Tree.textBackground"));
-
- if (_sat == null) {
- // Load the satellite image.
- String resource =
- "/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif";
- URL satURL = getClass().getResource(resource);
-
- _sat = new ImageIcon(satURL);
- }
-
- setOpaque(false);
- _checkBox.setOpaque(false);
- _panel.setOpaque(false);
-
- // The flowlayout set to LEFT is very important so that the editor
- // doesn't jump around.
- _panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
- _panel.add(_checkBox);
- _panel.add(this);
-
- setOpenIcon(_sat);
- setClosedIcon(_sat);
- setLeafIcon(_sat);
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public Component getTreeCellRendererComponent(
- JTree tree, Object value,
- boolean selected, boolean expanded,
- boolean leaf, int row,
- boolean hasFocus) {
-
- CategoryNode node = (CategoryNode) value;
- //FileNode node = (FileNode)value;
- //String s = tree.convertValueToText(value, selected,
- // expanded, leaf, row, hasFocus);
-
- super.getTreeCellRendererComponent(
- tree, value, selected, expanded,
- leaf, row, hasFocus);
-
- if (row == 0) {
- // Root row -- no check box
- _checkBox.setVisible(false);
- } else {
- _checkBox.setVisible(true);
- _checkBox.setSelected(node.isSelected());
- }
- String toolTip = buildToolTip(node);
- _panel.setToolTipText(toolTip);
- if (node.hasFatalChildren()) {
- this.setForeground(FATAL_CHILDREN);
- }
- if (node.hasFatalRecords()) {
- this.setForeground(Color.red);
- }
-
- return _panel;
- }
-
- public Dimension getCheckBoxOffset() {
- return new Dimension(0, 0);
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- protected String buildToolTip(CategoryNode node) {
- StringBuffer result = new StringBuffer();
- result.append(node.getTitle()).append(" contains a total of ");
- result.append(node.getTotalNumberOfRecords());
- result.append(" LogRecords.");
- result.append(" Right-click for more info.");
- return result.toString();
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java
deleted file mode 100644
index 8cc3da1..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import java.util.LinkedList;
-import java.util.StringTokenizer;
-
-/**
- * CategoryPath is a collection of CategoryItems which represent a
- * path of categories.
- *
- * @author Michael J. Sikorsky
- * @author Robert Shaw
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class CategoryPath {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
- protected LinkedList _categoryElements = new LinkedList();
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- public CategoryPath() {
- super();
- }
-
- /**
- * Construct a CategoryPath. If the category is null, it defaults to "Debug".
- */
- public CategoryPath(String category) {
- String processedCategory = category;
-
- if (processedCategory == null) {
- processedCategory = "Debug";
- }
-
- processedCategory = processedCategory.replace('/', '.');
- processedCategory = processedCategory.replace('\\', '.');
-
- StringTokenizer st = new StringTokenizer(processedCategory, ".");
- while (st.hasMoreTokens()) {
- String element = st.nextToken();
- addCategoryElement(new CategoryElement(element));
- }
- }
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * returns the number of CategoryElements.
- */
- public int size() {
- int count = _categoryElements.size();
-
- return (count);
- }
-
- public boolean isEmpty() {
- boolean empty = false;
-
- if (_categoryElements.size() == 0) {
- empty = true;
- }
-
- return (empty);
- }
-
-
- /**
- * Removes all categoryElements.
- */
- public void removeAllCategoryElements() {
- _categoryElements.clear();
- }
-
- /**
- * Adds the specified categoryElement to the end of the categoryElement set.
- */
- public void addCategoryElement(CategoryElement categoryElement) {
- _categoryElements.addLast(categoryElement);
- }
-
- /**
- * Returns the CategoryElement at the specified index.
- */
- public CategoryElement categoryElementAt(int index) {
- return ((CategoryElement) _categoryElements.get(index));
- }
-
-
- public String toString() {
- StringBuffer out = new StringBuffer(100);
-
- out.append("\n");
- out.append("===========================\n");
- out.append("CategoryPath: \n");
- out.append("---------------------------\n");
-
- out.append("\nCategoryPath:\n\t");
-
- if (this.size() > 0) {
- for (int i = 0; i < this.size(); i++) {
- out.append(this.categoryElementAt(i).toString());
- out.append("\n\t");
- }
- } else {
- out.append("<>");
- }
-
- out.append("\n");
- out.append("===========================\n");
-
- return (out.toString());
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
diff --git a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java b/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java
deleted file mode 100644
index 7323dcc..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.categoryexplorer;
-
-import javax.swing.event.TreeModelEvent;
-import javax.swing.event.TreeModelListener;
-
-/**
- * Default implementation of TreeModelListener which does nothing.
- *
- * @author Richard Wan
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class TreeModelAdapter implements TreeModelListener {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
- public void treeNodesChanged(TreeModelEvent e) {
- }
-
- public void treeNodesInserted(TreeModelEvent e) {
- }
-
- public void treeNodesRemoved(TreeModelEvent e) {
- }
-
- public void treeStructureChanged(TreeModelEvent e) {
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java b/java/src/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java
deleted file mode 100644
index a94ffab..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.configure;
-
-import java.awt.Color;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.tree.TreePath;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.apache.log4j.lf5.LogLevel;
-import org.apache.log4j.lf5.LogLevelFormatException;
-import org.apache.log4j.lf5.viewer.LogBrokerMonitor;
-import org.apache.log4j.lf5.viewer.LogTable;
-import org.apache.log4j.lf5.viewer.LogTableColumn;
-import org.apache.log4j.lf5.viewer.LogTableColumnFormatException;
-import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryExplorerModel;
-import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryExplorerTree;
-import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryNode;
-import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryPath;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ConfigurationManager handles the storage and retrival of the state of
- * the CategoryExplorer
- *
- * @author Richard Hurst
- * @author Brad Marlborough
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class ConfigurationManager extends Object {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
- private static final String CONFIG_FILE_NAME = "lf5_configuration.xml";
- private static final String NAME = "name";
- private static final String PATH = "path";
- private static final String SELECTED = "selected";
- private static final String EXPANDED = "expanded";
- private static final String CATEGORY = "category";
- private static final String FIRST_CATEGORY_NAME = "Categories";
- private static final String LEVEL = "level";
- private static final String COLORLEVEL = "colorlevel";
- private static final String RED = "red";
- private static final String GREEN = "green";
- private static final String BLUE = "blue";
- private static final String COLUMN = "column";
- private static final String NDCTEXTFILTER = "searchtext";
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private LogBrokerMonitor _monitor = null;
- private LogTable _table = null;
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public ConfigurationManager(LogBrokerMonitor monitor, LogTable table) {
- super();
- _monitor = monitor;
- _table = table;
- load();
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- public void save() {
- CategoryExplorerModel model = _monitor.getCategoryExplorerTree().getExplorerModel();
- CategoryNode root = model.getRootCategoryNode();
-
- StringBuffer xml = new StringBuffer(2048);
- openXMLDocument(xml);
- openConfigurationXML(xml);
- processLogRecordFilter(_monitor.getNDCTextFilter(), xml);
- processLogLevels(_monitor.getLogLevelMenuItems(), xml);
- processLogLevelColors(_monitor.getLogLevelMenuItems(),
- LogLevel.getLogLevelColorMap(), xml);
- processLogTableColumns(LogTableColumn.getLogTableColumns(), xml);
- processConfigurationNode(root, xml);
- closeConfigurationXML(xml);
- store(xml.toString());
- }
-
- public void reset() {
- deleteConfigurationFile();
- collapseTree();
- selectAllNodes();
- }
-
- public static String treePathToString(TreePath path) {
- // count begins at one so as to not include the 'Categories' - root category
- StringBuffer sb = new StringBuffer();
- CategoryNode n = null;
- Object[] objects = path.getPath();
- for (int i = 1; i < objects.length; i++) {
- n = (CategoryNode) objects[i];
- if (i > 1) {
- sb.append(".");
- }
- sb.append(n.getTitle());
- }
- return sb.toString();
- }
-
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- protected void load() {
- File file = new File(getFilename());
- if (file.exists()) {
- try {
- DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.
- newInstance();
- DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
- Document doc = docBuilder.parse(file);
- processRecordFilter(doc);
- processCategories(doc);
- processLogLevels(doc);
- processLogLevelColors(doc);
- processLogTableColumns(doc);
- } catch (Exception e) {
- // ignore all error and just continue as if there was no
- // configuration xml file but do report a message
- System.err.println("Unable process configuration file at " +
- getFilename() + ". Error Message=" + e.getMessage());
- }
- }
-
- }
-
- // Added in version 1.2 - reads in the NDC text filter from the
- // xml configuration file. If the value of the filter is not null
- // or an empty string ("") then the manager will set the LogBrokerMonitor's
- // LogRecordFilter to use the NDC LogRecordFilter. Otherwise, the
- // LogBrokerMonitor will use the default LogRecordFilter.
- protected void processRecordFilter(Document doc) {
- NodeList nodeList = doc.getElementsByTagName(NDCTEXTFILTER);
-
- // there is only one value stored
- Node n = nodeList.item(0);
- // add check for backwards compatibility as this feature was added in
- // version 1.2
- if (n == null) {
- return;
- }
-
- NamedNodeMap map = n.getAttributes();
- String text = getValue(map, NAME);
-
- if (text == null || text.equals("")) {
- return;
- }
- _monitor.setNDCLogRecordFilter(text);
- }
-
- protected void processCategories(Document doc) {
- CategoryExplorerTree tree = _monitor.getCategoryExplorerTree();
- CategoryExplorerModel model = tree.getExplorerModel();
- NodeList nodeList = doc.getElementsByTagName(CATEGORY);
-
- // determine where the starting node is
- NamedNodeMap map = nodeList.item(0).getAttributes();
- int j = (getValue(map, NAME).equalsIgnoreCase(FIRST_CATEGORY_NAME)) ? 1 : 0;
- // iterate backwards throught the nodeList so that expansion of the
- // list can occur
- for (int i = nodeList.getLength() - 1; i >= j; i--) {
- Node n = nodeList.item(i);
- map = n.getAttributes();
- CategoryNode chnode = model.addCategory(new CategoryPath(getValue(map, PATH)));
- chnode.setSelected((getValue(map, SELECTED).equalsIgnoreCase("true")) ? true : false);
- if (getValue(map, EXPANDED).equalsIgnoreCase("true")) ;
- tree.expandPath(model.getTreePathToRoot(chnode));
- }
-
- }
-
- protected void processLogLevels(Document doc) {
- NodeList nodeList = doc.getElementsByTagName(LEVEL);
- Map menuItems = _monitor.getLogLevelMenuItems();
-
- for (int i = 0; i < nodeList.getLength(); i++) {
- Node n = nodeList.item(i);
- NamedNodeMap map = n.getAttributes();
- String name = getValue(map, NAME);
- try {
- JCheckBoxMenuItem item =
- (JCheckBoxMenuItem) menuItems.get(LogLevel.valueOf(name));
- item.setSelected(getValue(map, SELECTED).equalsIgnoreCase("true"));
- } catch (LogLevelFormatException e) {
- // ignore it will be on by default.
- }
- }
- }
-
- protected void processLogLevelColors(Document doc) {
- NodeList nodeList = doc.getElementsByTagName(COLORLEVEL);
- LogLevel.getLogLevelColorMap();
-
- for (int i = 0; i < nodeList.getLength(); i++) {
- Node n = nodeList.item(i);
- // check for backwards compatibility since this feature was added
- // in version 1.3
- if (n == null) {
- return;
- }
-
- NamedNodeMap map = n.getAttributes();
- String name = getValue(map, NAME);
- try {
- LogLevel level = LogLevel.valueOf(name);
- int red = Integer.parseInt(getValue(map, RED));
- int green = Integer.parseInt(getValue(map, GREEN));
- int blue = Integer.parseInt(getValue(map, BLUE));
- Color c = new Color(red, green, blue);
- if (level != null) {
- level.setLogLevelColorMap(level, c);
- }
-
- } catch (LogLevelFormatException e) {
- // ignore it will be on by default.
- }
- }
- }
-
- protected void processLogTableColumns(Document doc) {
- NodeList nodeList = doc.getElementsByTagName(COLUMN);
- Map menuItems = _monitor.getLogTableColumnMenuItems();
- List selectedColumns = new ArrayList();
- for (int i = 0; i < nodeList.getLength(); i++) {
- Node n = nodeList.item(i);
- // check for backwards compatibility since this feature was added
- // in version 1.3
- if (n == null) {
- return;
- }
- NamedNodeMap map = n.getAttributes();
- String name = getValue(map, NAME);
- try {
- LogTableColumn column = LogTableColumn.valueOf(name);
- JCheckBoxMenuItem item =
- (JCheckBoxMenuItem) menuItems.get(column);
- item.setSelected(getValue(map, SELECTED).equalsIgnoreCase("true"));
-
- if (item.isSelected()) {
- selectedColumns.add(column);
- }
- } catch (LogTableColumnFormatException e) {
- // ignore it will be on by default.
- }
-
- if (selectedColumns.isEmpty()) {
- _table.setDetailedView();
- } else {
- _table.setView(selectedColumns);
- }
-
- }
- }
-
- protected String getValue(NamedNodeMap map, String attr) {
- Node n = map.getNamedItem(attr);
- return n.getNodeValue();
- }
-
- protected void collapseTree() {
- // collapse everything except the first category
- CategoryExplorerTree tree = _monitor.getCategoryExplorerTree();
- for (int i = tree.getRowCount() - 1; i > 0; i--) {
- tree.collapseRow(i);
- }
- }
-
- protected void selectAllNodes() {
- CategoryExplorerModel model = _monitor.getCategoryExplorerTree().getExplorerModel();
- CategoryNode root = model.getRootCategoryNode();
- Enumeration all = root.breadthFirstEnumeration();
- CategoryNode n = null;
- while (all.hasMoreElements()) {
- n = (CategoryNode) all.nextElement();
- n.setSelected(true);
- }
- }
-
- protected void store(String s) {
-
- try {
- PrintWriter writer = new PrintWriter(new FileWriter(getFilename()));
- writer.print(s);
- writer.close();
- } catch (IOException e) {
- // do something with this error.
- e.printStackTrace();
- }
-
- }
-
- protected void deleteConfigurationFile() {
- try {
- File f = new File(getFilename());
- if (f.exists()) {
- f.delete();
- }
- } catch (SecurityException e) {
- System.err.println("Cannot delete " + getFilename() +
- " because a security violation occured.");
- }
- }
-
- protected String getFilename() {
- String home = System.getProperty("user.home");
- String sep = System.getProperty("file.separator");
-
- return home + sep + "lf5" + sep + CONFIG_FILE_NAME;
- }
-
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
- private void processConfigurationNode(CategoryNode node, StringBuffer xml) {
- CategoryExplorerModel model = _monitor.getCategoryExplorerTree().getExplorerModel();
-
- Enumeration all = node.breadthFirstEnumeration();
- CategoryNode n = null;
- while (all.hasMoreElements()) {
- n = (CategoryNode) all.nextElement();
- exportXMLElement(n, model.getTreePathToRoot(n), xml);
- }
-
- }
-
- private void processLogLevels(Map logLevelMenuItems, StringBuffer xml) {
- xml.append("\t\r\n");
- Iterator it = logLevelMenuItems.keySet().iterator();
- while (it.hasNext()) {
- LogLevel level = (LogLevel) it.next();
- JCheckBoxMenuItem item = (JCheckBoxMenuItem) logLevelMenuItems.get(level);
- exportLogLevelXMLElement(level.getLabel(), item.isSelected(), xml);
- }
-
- xml.append("\t\r\n");
- }
-
- private void processLogLevelColors(Map logLevelMenuItems, Map logLevelColors, StringBuffer xml) {
- xml.append("\t\r\n");
- // iterate through the list of log levels being used (log4j, jdk1.4, custom levels)
- Iterator it = logLevelMenuItems.keySet().iterator();
- while (it.hasNext()) {
- LogLevel level = (LogLevel) it.next();
- // for each level, get the associated color from the log level color map
- Color color = (Color) logLevelColors.get(level);
- exportLogLevelColorXMLElement(level.getLabel(), color, xml);
- }
-
- xml.append("\t\r\n");
- }
-
-
- private void processLogTableColumns(List logTableColumnMenuItems, StringBuffer xml) {
- xml.append("\t\r\n");
- Iterator it = logTableColumnMenuItems.iterator();
- while (it.hasNext()) {
- LogTableColumn column = (LogTableColumn) it.next();
- JCheckBoxMenuItem item = _monitor.getTableColumnMenuItem(column);
- exportLogTableColumnXMLElement(column.getLabel(), item.isSelected(), xml);
- }
-
- xml.append("\t\r\n");
- }
-
- // Added in version 1.2 - stores the NDC text filter in the xml file
- // for future use.
- private void processLogRecordFilter(String text, StringBuffer xml) {
- xml.append("\t<").append(NDCTEXTFILTER).append(" ");
- xml.append(NAME).append("=\"").append(text).append("\"");
- xml.append("/>\r\n");
- }
-
- private void openXMLDocument(StringBuffer xml) {
- xml.append("\r\n");
- }
-
- private void openConfigurationXML(StringBuffer xml) {
- xml.append("\r\n");
- }
-
- private void closeConfigurationXML(StringBuffer xml) {
- xml.append("\r\n");
- }
-
- private void exportXMLElement(CategoryNode node, TreePath path, StringBuffer xml) {
- CategoryExplorerTree tree = _monitor.getCategoryExplorerTree();
-
- xml.append("\t<").append(CATEGORY).append(" ");
- xml.append(NAME).append("=\"").append(node.getTitle()).append("\" ");
- xml.append(PATH).append("=\"").append(treePathToString(path)).append("\" ");
- xml.append(EXPANDED).append("=\"").append(tree.isExpanded(path)).append("\" ");
- xml.append(SELECTED).append("=\"").append(node.isSelected()).append("\"/>\r\n");
- }
-
- private void exportLogLevelXMLElement(String label, boolean selected, StringBuffer xml) {
- xml.append("\t\t<").append(LEVEL).append(" ").append(NAME);
- xml.append("=\"").append(label).append("\" ");
- xml.append(SELECTED).append("=\"").append(selected);
- xml.append("\"/>\r\n");
- }
-
- private void exportLogLevelColorXMLElement(String label, Color color, StringBuffer xml) {
- xml.append("\t\t<").append(COLORLEVEL).append(" ").append(NAME);
- xml.append("=\"").append(label).append("\" ");
- xml.append(RED).append("=\"").append(color.getRed()).append("\" ");
- xml.append(GREEN).append("=\"").append(color.getGreen()).append("\" ");
- xml.append(BLUE).append("=\"").append(color.getBlue());
- xml.append("\"/>\r\n");
- }
-
- private void exportLogTableColumnXMLElement(String label, boolean selected, StringBuffer xml) {
- xml.append("\t\t<").append(COLUMN).append(" ").append(NAME);
- xml.append("=\"").append(label).append("\" ");
- xml.append(SELECTED).append("=\"").append(selected);
- xml.append("\"/>\r\n");
- }
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces:
- //--------------------------------------------------------------------------
-
-}
-
-
-
-
-
-
diff --git a/java/src/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java b/java/src/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java
deleted file mode 100644
index 6ff275d..0000000
--- a/java/src/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.lf5.viewer.configure;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.net.URL;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-
-/**
- *
MRUFileManager handles the storage and retrival the most
- * recently opened log files.
- *
- * @author Brad Marlborough
- * @author Richard Hurst
- */
-
-// Contributed by ThoughtWorks Inc.
-
-public class MRUFileManager {
- //--------------------------------------------------------------------------
- // Constants:
- //--------------------------------------------------------------------------
- private static final String CONFIG_FILE_NAME = "mru_file_manager";
- private static final int DEFAULT_MAX_SIZE = 3;
-
- //--------------------------------------------------------------------------
- // Protected Variables:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Private Variables:
- //--------------------------------------------------------------------------
- private int _maxSize = 0;
- private LinkedList _mruFileList;
-
- //--------------------------------------------------------------------------
- // Constructors:
- //--------------------------------------------------------------------------
- public MRUFileManager() {
- load();
- setMaxSize(DEFAULT_MAX_SIZE);
- }
-
- public MRUFileManager(int maxSize) {
- load();
- setMaxSize(maxSize);
- }
- //--------------------------------------------------------------------------
- // Public Methods:
- //--------------------------------------------------------------------------
-
- /**
- * Saves a list of MRU files out to a file.
- */
- public void save() {
- File file = new File(getFilename());
-
- try {
- ObjectOutputStream oos = new ObjectOutputStream(new
- FileOutputStream(file));
- oos.writeObject(_mruFileList);
- oos.flush();
- oos.close();
- } catch (Exception e) {
- // do nothing
- e.printStackTrace();
- }
- }
-
- /**
- * Gets the size of the MRU file list.
- */
- public int size() {
- return _mruFileList.size();
- }
-
- /**
- * Returns a particular file name stored in a MRU file
- * list based on an index value.
- */
- public Object getFile(int index) {
- if (index < size()) {
- return _mruFileList.get(index);
- }
-
- return null;
- }
-
- /**
- * Returns a input stream to the resource at the specified index
- */
- public InputStream getInputStream(int index) throws IOException,
- FileNotFoundException {
- if (index < size()) {
- Object o = getFile(index);
- if (o instanceof File) {
- return getInputStream((File) o);
- } else {
- return getInputStream((URL) o);
- }
- }
- return null;
- }
-
- /**
- * Adds a file name to the MRU file list.
- */
- public void set(File file) {
- setMRU(file);
- }
-
- /**
- * Adds a url to the MRU file list.
- */
- public void set(URL url) {
- setMRU(url);
- }
-
- /**
- * Gets the list of files stored in the MRU file list.
- */
- public String[] getMRUFileList() {
- if (size() == 0) {
- return null;
- }
-
- String[] ss = new String[size()];
-
- for (int i = 0; i < size(); i++) {
- Object o = getFile(i);
- if (o instanceof File) {
- ss[i] = ((File) o).getAbsolutePath();
- } else // must be a url
- {
- ss[i] = o.toString();
- }
-
- }
-
- return ss;
- }
-
- /**
- * Moves the the index to the top of the MRU List
- *
- * @param index The index to be first in the mru list
- */
- public void moveToTop(int index) {
- _mruFileList.add(0, _mruFileList.remove(index));
- }
-
- /**
- * Creates the directory where the MRU file list will be written.
- * The "lf5" directory is created in the Documents and Settings
- * directory on Windows 2000 machines and where ever the user.home
- * variable points on all other platforms.
- */
- public static void createConfigurationDirectory() {
- String home = System.getProperty("user.home");
- String sep = System.getProperty("file.separator");
- File f = new File(home + sep + "lf5");
- if (!f.exists()) {
- try {
- f.mkdir();
- } catch (SecurityException e) {
- e.printStackTrace();
- }
- }
-
- }
- //--------------------------------------------------------------------------
- // Protected Methods:
- //--------------------------------------------------------------------------
- /**
- * Gets an input stream for the corresponding file.
- *
- * @param file The file to create the input stream from.
- * @return InputStream
- */
- protected InputStream getInputStream(File file) throws IOException,
- FileNotFoundException {
- BufferedInputStream reader =
- new BufferedInputStream(new FileInputStream(file));
-
- return reader;
- }
-
- /**
- * Gets an input stream for the corresponding URL.
- *
- * @param url The url to create the input stream from.
- * @return InputStream
- */
- protected InputStream getInputStream(URL url) throws IOException {
- return url.openStream();
- }
-
- /**
- * Adds an object to the mru.
- */
- protected void setMRU(Object o) {
- int index = _mruFileList.indexOf(o);
-
- if (index == -1) {
- _mruFileList.add(0, o);
- setMaxSize(_maxSize);
- } else {
- moveToTop(index);
- }
- }
-
- /**
- * Loads the MRU file list in from a file and stores it in a LinkedList.
- * If no file exists, a new LinkedList is created.
- */
- protected void load() {
- createConfigurationDirectory();
- File file = new File(getFilename());
- if (file.exists()) {
- try {
- ObjectInputStream ois = new ObjectInputStream(
- new FileInputStream(file));
- _mruFileList = (LinkedList) ois.readObject();
- ois.close();
-
- // check that only files and url are in linked list
- Iterator it = _mruFileList.iterator();
- while (it.hasNext()) {
- Object o = it.next();
- if (!(o instanceof File) && !(o instanceof URL)) {
- it.remove();
- }
- }
- } catch (Exception e) {
- _mruFileList = new LinkedList();
- }
- } else {
- _mruFileList = new LinkedList();
- }
-
- }
-
- protected String getFilename() {
- String home = System.getProperty("user.home");
- String sep = System.getProperty("file.separator");
-
- return home + sep + "lf5" + sep + CONFIG_FILE_NAME;
- }
-
- /**
- * Ensures that the MRU list will have a MaxSize.
- */
- protected void setMaxSize(int maxSize) {
- if (maxSize < _mruFileList.size()) {
- for (int i = 0; i < _mruFileList.size() - maxSize; i++) {
- _mruFileList.removeLast();
- }
- }
-
- _maxSize = maxSize;
- }
- //--------------------------------------------------------------------------
- // Private Methods:
- //--------------------------------------------------------------------------
-
- //--------------------------------------------------------------------------
- // Nested Top-Level Classes or Interfaces
- //--------------------------------------------------------------------------
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/net/JMSAppender.java b/java/src/org/apache/log4j/net/JMSAppender.java
deleted file mode 100644
index 60bd5d0..0000000
--- a/java/src/org/apache/log4j/net/JMSAppender.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.LoggingEvent;
-
-import javax.jms.JMSException;
-import javax.jms.ObjectMessage;
-import javax.jms.Session;
-import javax.jms.Topic;
-import javax.jms.TopicConnection;
-import javax.jms.TopicConnectionFactory;
-import javax.jms.TopicPublisher;
-import javax.jms.TopicSession;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameNotFoundException;
-import javax.naming.NamingException;
-import java.util.Properties;
-
-/**
- * A simple appender that publishes events to a JMS Topic. The events
- * are serialized and transmitted as JMS message type {@link
- * ObjectMessage}.
-
- *
JMS {@link Topic topics} and {@link TopicConnectionFactory topic
- * connection factories} are administered objects that are retrieved
- * using JNDI messaging which in turn requires the retreival of a JNDI
- * {@link Context}.
-
- *
There are two common methods for retrieving a JNDI {@link
- * Context}. If a file resource named jndi.properties is
- * available to the JNDI API, it will use the information found
- * therein to retrieve an initial JNDI context. To obtain an initial
- * context, your code will simply call:
-
-
- InitialContext jndiContext = new InitialContext();
-
-
- * Calling the no-argument InitialContext() method
- * will also work from within Enterprise Java Beans (EJBs) because it
- * is part of the EJB contract for application servers to provide each
- * bean an environment naming context (ENC).
-
- *
In the second approach, several predetermined properties are set
- * and these properties are passed to the InitialContext
- * contructor to connect to the naming service provider. For example,
- * to connect to JBoss naming service one would write:
-
-
- Properties env = new Properties( );
- env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
- env.put(Context.PROVIDER_URL, "jnp://hostname:1099");
- env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
- InitialContext jndiContext = new InitialContext(env);
-
-
- * where hostname is the host where the JBoss applicaiton
- * server is running.
- *
- * To connect to the the naming service of Weblogic application
- * server one would write:
-
-
- Properties env = new Properties( );
- env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
- env.put(Context.PROVIDER_URL, "t3://localhost:7001");
- InitialContext jndiContext = new InitialContext(env);
-
-
- * Other JMS providers will obviously require different values.
- *
- * The initial JNDI context can be obtained by calling the
- * no-argument InitialContext() method in EJBs. Only
- * clients running in a separate JVM need to be concerned about the
- * jndi.properties file and calling {@link
- * InitialContext#InitialContext()} or alternatively correctly
- * setting the different properties before calling {@link
- * InitialContext#InitialContext(java.util.Hashtable)} method.
-
-
- @author Ceki Gülcü */
-public class JMSAppender extends AppenderSkeleton {
-
- String securityPrincipalName;
- String securityCredentials;
- String initialContextFactoryName;
- String urlPkgPrefixes;
- String providerURL;
- String topicBindingName;
- String tcfBindingName;
- String userName;
- String password;
- boolean locationInfo;
-
- TopicConnection topicConnection;
- TopicSession topicSession;
- TopicPublisher topicPublisher;
-
- public
- JMSAppender() {
- }
-
- /**
- The TopicConnectionFactoryBindingName option takes a
- string value. Its value will be used to lookup the appropriate
- TopicConnectionFactory from the JNDI context.
- */
- public
- void setTopicConnectionFactoryBindingName(String tcfBindingName) {
- this.tcfBindingName = tcfBindingName;
- }
-
- /**
- Returns the value of the TopicConnectionFactoryBindingName option.
- */
- public
- String getTopicConnectionFactoryBindingName() {
- return tcfBindingName;
- }
-
- /**
- The TopicBindingName option takes a
- string value. Its value will be used to lookup the appropriate
- Topic from the JNDI context.
- */
- public
- void setTopicBindingName(String topicBindingName) {
- this.topicBindingName = topicBindingName;
- }
-
- /**
- Returns the value of the TopicBindingName option.
- */
- public
- String getTopicBindingName() {
- return topicBindingName;
- }
-
-
- /**
- Returns value of the LocationInfo property which
- determines whether location (stack) info is sent to the remote
- subscriber. */
- public
- boolean getLocationInfo() {
- return locationInfo;
- }
-
- /**
- * Options are activated and become effective only after calling
- * this method.*/
- public void activateOptions() {
- TopicConnectionFactory topicConnectionFactory;
-
- try {
- Context jndi;
-
- LogLog.debug("Getting initial context.");
- if(initialContextFactoryName != null) {
- Properties env = new Properties( );
- env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactoryName);
- if(providerURL != null) {
- env.put(Context.PROVIDER_URL, providerURL);
- } else {
- LogLog.warn("You have set InitialContextFactoryName option but not the "
- +"ProviderURL. This is likely to cause problems.");
- }
- if(urlPkgPrefixes != null) {
- env.put(Context.URL_PKG_PREFIXES, urlPkgPrefixes);
- }
-
- if(securityPrincipalName != null) {
- env.put(Context.SECURITY_PRINCIPAL, securityPrincipalName);
- if(securityCredentials != null) {
- env.put(Context.SECURITY_CREDENTIALS, securityCredentials);
- } else {
- LogLog.warn("You have set SecurityPrincipalName option but not the "
- +"SecurityCredentials. This is likely to cause problems.");
- }
- }
- jndi = new InitialContext(env);
- } else {
- jndi = new InitialContext();
- }
-
- LogLog.debug("Looking up ["+tcfBindingName+"]");
- topicConnectionFactory = (TopicConnectionFactory) lookup(jndi, tcfBindingName);
- LogLog.debug("About to create TopicConnection.");
- if(userName != null) {
- topicConnection = topicConnectionFactory.createTopicConnection(userName,
- password);
- } else {
- topicConnection = topicConnectionFactory.createTopicConnection();
- }
-
- LogLog.debug("Creating TopicSession, non-transactional, "
- +"in AUTO_ACKNOWLEDGE mode.");
- topicSession = topicConnection.createTopicSession(false,
- Session.AUTO_ACKNOWLEDGE);
-
- LogLog.debug("Looking up topic name ["+topicBindingName+"].");
- Topic topic = (Topic) lookup(jndi, topicBindingName);
-
- LogLog.debug("Creating TopicPublisher.");
- topicPublisher = topicSession.createPublisher(topic);
-
- LogLog.debug("Starting TopicConnection.");
- topicConnection.start();
-
- jndi.close();
- } catch(JMSException e) {
- errorHandler.error("Error while activating options for appender named ["+name+
- "].", e, ErrorCode.GENERIC_FAILURE);
- } catch(NamingException e) {
- errorHandler.error("Error while activating options for appender named ["+name+
- "].", e, ErrorCode.GENERIC_FAILURE);
- } catch(RuntimeException e) {
- errorHandler.error("Error while activating options for appender named ["+name+
- "].", e, ErrorCode.GENERIC_FAILURE);
- }
- }
-
- protected Object lookup(Context ctx, String name) throws NamingException {
- try {
- return ctx.lookup(name);
- } catch(NameNotFoundException e) {
- LogLog.error("Could not find name ["+name+"].");
- throw e;
- }
- }
-
- protected boolean checkEntryConditions() {
- String fail = null;
-
- if(this.topicConnection == null) {
- fail = "No TopicConnection";
- } else if(this.topicSession == null) {
- fail = "No TopicSession";
- } else if(this.topicPublisher == null) {
- fail = "No TopicPublisher";
- }
-
- if(fail != null) {
- errorHandler.error(fail +" for JMSAppender named ["+name+"].");
- return false;
- } else {
- return true;
- }
- }
-
- /**
- Close this JMSAppender. Closing releases all resources used by the
- appender. A closed appender cannot be re-opened. */
- public synchronized void close() {
- // The synchronized modifier avoids concurrent append and close operations
-
- if(this.closed)
- return;
-
- LogLog.debug("Closing appender ["+name+"].");
- this.closed = true;
-
- try {
- if(topicSession != null)
- topicSession.close();
- if(topicConnection != null)
- topicConnection.close();
- } catch(JMSException e) {
- LogLog.error("Error while closing JMSAppender ["+name+"].", e);
- } catch(RuntimeException e) {
- LogLog.error("Error while closing JMSAppender ["+name+"].", e);
- }
- // Help garbage collection
- topicPublisher = null;
- topicSession = null;
- topicConnection = null;
- }
-
- /**
- This method called by {@link AppenderSkeleton#doAppend} method to
- do most of the real appending work. */
- public void append(LoggingEvent event) {
- if(!checkEntryConditions()) {
- return;
- }
-
- try {
- ObjectMessage msg = topicSession.createObjectMessage();
- if(locationInfo) {
- event.getLocationInformation();
- }
- msg.setObject(event);
- topicPublisher.publish(msg);
- } catch(JMSException e) {
- errorHandler.error("Could not publish message in JMSAppender ["+name+"].", e,
- ErrorCode.GENERIC_FAILURE);
- } catch(RuntimeException e) {
- errorHandler.error("Could not publish message in JMSAppender ["+name+"].", e,
- ErrorCode.GENERIC_FAILURE);
- }
- }
-
- /**
- * Returns the value of the InitialContextFactoryName option.
- * See {@link #setInitialContextFactoryName} for more details on the
- * meaning of this option.
- * */
- public String getInitialContextFactoryName() {
- return initialContextFactoryName;
- }
-
- /**
- * Setting the InitialContextFactoryName method will cause
- * this JMSAppender instance to use the {@link
- * InitialContext#InitialContext(Hashtable)} method instead of the
- * no-argument constructor. If you set this option, you should also
- * at least set the ProviderURL option.
- *
- *
See also {@link #setProviderURL(String)}.
- * */
- public void setInitialContextFactoryName(String initialContextFactoryName) {
- this.initialContextFactoryName = initialContextFactoryName;
- }
-
- public String getProviderURL() {
- return providerURL;
- }
-
- public void setProviderURL(String providerURL) {
- this.providerURL = providerURL;
- }
-
- String getURLPkgPrefixes( ) {
- return urlPkgPrefixes;
- }
-
- public void setURLPkgPrefixes(String urlPkgPrefixes ) {
- this.urlPkgPrefixes = urlPkgPrefixes;
- }
-
- public String getSecurityCredentials() {
- return securityCredentials;
- }
-
- public void setSecurityCredentials(String securityCredentials) {
- this.securityCredentials = securityCredentials;
- }
-
-
- public String getSecurityPrincipalName() {
- return securityPrincipalName;
- }
-
- public void setSecurityPrincipalName(String securityPrincipalName) {
- this.securityPrincipalName = securityPrincipalName;
- }
-
- public String getUserName() {
- return userName;
- }
-
- /**
- * The user name to use when {@link
- * TopicConnectionFactory#createTopicConnection(String, String)
- * creating a topic session}. If you set this option, you should
- * also set the Password option. See {@link
- * #setPassword(String)}.
- * */
- public void setUserName(String userName) {
- this.userName = userName;
- }
-
- public String getPassword() {
- return password;
- }
-
- /**
- * The paswword to use when creating a topic session.
- */
- public void setPassword(String password) {
- this.password = password;
- }
-
-
- /**
- If true, the information sent to the remote subscriber will
- include caller's location information. By default no location
- information is sent to the subscriber. */
- public void setLocationInfo(boolean locationInfo) {
- this.locationInfo = locationInfo;
- }
-
- /**
- * Returns the TopicConnection used for this appender. Only valid after
- * activateOptions() method has been invoked.
- */
- protected TopicConnection getTopicConnection() {
- return topicConnection;
- }
-
- /**
- * Returns the TopicSession used for this appender. Only valid after
- * activateOptions() method has been invoked.
- */
- protected TopicSession getTopicSession() {
- return topicSession;
- }
-
- /**
- * Returns the TopicPublisher used for this appender. Only valid after
- * activateOptions() method has been invoked.
- */
- protected TopicPublisher getTopicPublisher() {
- return topicPublisher;
- }
-
- /**
- * The JMSAppender sends serialized events and consequently does not
- * require a layout.
- */
- public boolean requiresLayout() {
- return false;
- }
-}
diff --git a/java/src/org/apache/log4j/net/JMSSink.java b/java/src/org/apache/log4j/net/JMSSink.java
deleted file mode 100644
index 6a02831..0000000
--- a/java/src/org/apache/log4j/net/JMSSink.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.xml.DOMConfigurator;
-
-import javax.jms.JMSException;
-import javax.jms.ObjectMessage;
-import javax.jms.Session;
-import javax.jms.Topic;
-import javax.jms.TopicConnection;
-import javax.jms.TopicConnectionFactory;
-import javax.jms.TopicSession;
-import javax.jms.TopicSubscriber;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameNotFoundException;
-import javax.naming.NamingException;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-/**
- * A simple application that consumes logging events sent by a {@link
- * JMSAppender}.
- *
- *
- * @author Ceki Gülcü
- * */
-public class JMSSink implements javax.jms.MessageListener {
-
- static Logger logger = Logger.getLogger(JMSSink.class);
-
- static public void main(String[] args) throws Exception {
- if(args.length != 5) {
- usage("Wrong number of arguments.");
- }
-
- String tcfBindingName = args[0];
- String topicBindingName = args[1];
- String username = args[2];
- String password = args[3];
-
-
- String configFile = args[4];
-
- if(configFile.endsWith(".xml")) {
- DOMConfigurator.configure(configFile);
- } else {
- PropertyConfigurator.configure(configFile);
- }
-
- new JMSSink(tcfBindingName, topicBindingName, username, password);
-
- BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
- // Loop until the word "exit" is typed
- System.out.println("Type \"exit\" to quit JMSSink.");
- while(true){
- String s = stdin.readLine( );
- if (s.equalsIgnoreCase("exit")) {
- System.out.println("Exiting. Kill the application if it does not exit "
- + "due to daemon threads.");
- return;
- }
- }
- }
-
- public JMSSink( String tcfBindingName, String topicBindingName, String username,
- String password) {
-
- try {
- Context ctx = new InitialContext();
- TopicConnectionFactory topicConnectionFactory;
- topicConnectionFactory = (TopicConnectionFactory) lookup(ctx,
- tcfBindingName);
-
- TopicConnection topicConnection =
- topicConnectionFactory.createTopicConnection(username,
- password);
- topicConnection.start();
-
- TopicSession topicSession = topicConnection.createTopicSession(false,
- Session.AUTO_ACKNOWLEDGE);
-
- Topic topic = (Topic)ctx.lookup(topicBindingName);
-
- TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);
-
- topicSubscriber.setMessageListener(this);
-
- } catch(JMSException e) {
- logger.error("Could not read JMS message.", e);
- } catch(NamingException e) {
- logger.error("Could not read JMS message.", e);
- } catch(RuntimeException e) {
- logger.error("Could not read JMS message.", e);
- }
- }
-
- public void onMessage(javax.jms.Message message) {
- LoggingEvent event;
- Logger remoteLogger;
-
- try {
- if(message instanceof ObjectMessage) {
- ObjectMessage objectMessage = (ObjectMessage) message;
- event = (LoggingEvent) objectMessage.getObject();
- remoteLogger = Logger.getLogger(event.getLoggerName());
- remoteLogger.callAppenders(event);
- } else {
- logger.warn("Received message is of type "+message.getJMSType()
- +", was expecting ObjectMessage.");
- }
- } catch(JMSException jmse) {
- logger.error("Exception thrown while processing incoming message.",
- jmse);
- }
- }
-
-
- protected static Object lookup(Context ctx, String name) throws NamingException {
- try {
- return ctx.lookup(name);
- } catch(NameNotFoundException e) {
- logger.error("Could not find name ["+name+"].");
- throw e;
- }
- }
-
- static void usage(String msg) {
- System.err.println(msg);
- System.err.println("Usage: java " + JMSSink.class.getName()
- + " TopicConnectionFactoryBindingName TopicBindingName username password configFile");
- System.exit(1);
- }
-}
diff --git a/java/src/org/apache/log4j/net/SMTPAppender.java b/java/src/org/apache/log4j/net/SMTPAppender.java
deleted file mode 100644
index 7350474..0000000
--- a/java/src/org/apache/log4j/net/SMTPAppender.java
+++ /dev/null
@@ -1,787 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Layout;
-import org.apache.log4j.Level;
-import org.apache.log4j.helpers.CyclicBuffer;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.OptionHandler;
-import org.apache.log4j.spi.TriggeringEventEvaluator;
-import org.apache.log4j.xml.UnrecognizedElementHandler;
-import org.w3c.dom.Element;
-
-import javax.mail.Authenticator;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Multipart;
-import javax.mail.PasswordAuthentication;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.AddressException;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.InternetHeaders;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMultipart;
-import javax.mail.internet.MimeUtility;
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.util.Date;
-import java.util.Properties;
-
-/**
- Send an e-mail when a specific logging event occurs, typically on
- errors or fatal errors.
-
-
The number of logging events delivered in this e-mail depend on
- the value of BufferSize option. The
- SMTPAppender keeps only the last
- BufferSize logging events in its cyclic buffer. This
- keeps memory requirements at a reasonable level while still
- delivering useful application context.
-
- By default, an email message will be sent when an ERROR or higher
- severity message is appended. The triggering criteria can be
- modified by setting the evaluatorClass property with the name
- of a class implementing TriggeringEventEvaluator, setting the evaluator
- property with an instance of TriggeringEventEvaluator or
- nesting a triggeringPolicy element where the specified
- class implements TriggeringEventEvaluator.
-
- This class has implemented UnrecognizedElementHandler since 1.2.15.
-
- Since 1.2.16, SMTP over SSL is supported by setting SMTPProtocol to "smpts".
-
- @author Ceki Gülcü
- @since 1.0 */
-public class SMTPAppender extends AppenderSkeleton
- implements UnrecognizedElementHandler {
- private String to;
- /**
- * Comma separated list of cc recipients.
- */
- private String cc;
- /**
- * Comma separated list of bcc recipients.
- */
- private String bcc;
- private String from;
- /**
- * Comma separated list of replyTo addresses.
- */
- private String replyTo;
- private String subject;
- private String smtpHost;
- private String smtpUsername;
- private String smtpPassword;
- private String smtpProtocol;
- private int smtpPort = -1;
- private boolean smtpDebug = false;
- private int bufferSize = 512;
- private boolean locationInfo = false;
- private boolean sendOnClose = false;
-
- protected CyclicBuffer cb = new CyclicBuffer(bufferSize);
- protected Message msg;
-
- protected TriggeringEventEvaluator evaluator;
-
-
-
- /**
- The default constructor will instantiate the appender with a
- {@link TriggeringEventEvaluator} that will trigger on events with
- level ERROR or higher.*/
- public
- SMTPAppender() {
- this(new DefaultEvaluator());
- }
-
-
- /**
- Use evaluator passed as parameter as the {@link
- TriggeringEventEvaluator} for this SMTPAppender. */
- public
- SMTPAppender(TriggeringEventEvaluator evaluator) {
- this.evaluator = evaluator;
- }
-
-
- /**
- Activate the specified options, such as the smtp host, the
- recipient, from, etc. */
- public
- void activateOptions() {
- Session session = createSession();
- msg = new MimeMessage(session);
-
- try {
- addressMessage(msg);
- if(subject != null) {
- try {
- msg.setSubject(MimeUtility.encodeText(subject, "UTF-8", null));
- } catch(UnsupportedEncodingException ex) {
- LogLog.error("Unable to encode SMTP subject", ex);
- }
- }
- } catch(MessagingException e) {
- LogLog.error("Could not activate SMTPAppender options.", e );
- }
-
- if (evaluator instanceof OptionHandler) {
- ((OptionHandler) evaluator).activateOptions();
- }
- }
-
- /**
- * Address message.
- * @param msg message, may not be null.
- * @throws MessagingException thrown if error addressing message.
- * @since 1.2.14
- */
- protected void addressMessage(final Message msg) throws MessagingException {
- if (from != null) {
- msg.setFrom(getAddress(from));
- } else {
- msg.setFrom();
- }
-
- //Add ReplyTo addresses if defined.
- if (replyTo != null && replyTo.length() > 0) {
- msg.setReplyTo(parseAddress(replyTo));
- }
-
- if (to != null && to.length() > 0) {
- msg.setRecipients(Message.RecipientType.TO, parseAddress(to));
- }
-
- //Add CC receipients if defined.
- if (cc != null && cc.length() > 0) {
- msg.setRecipients(Message.RecipientType.CC, parseAddress(cc));
- }
-
- //Add BCC receipients if defined.
- if (bcc != null && bcc.length() > 0) {
- msg.setRecipients(Message.RecipientType.BCC, parseAddress(bcc));
- }
- }
-
- /**
- * Create mail session.
- * @return mail session, may not be null.
- * @since 1.2.14
- */
- protected Session createSession() {
- Properties props = null;
- try {
- props = new Properties (System.getProperties());
- } catch(SecurityException ex) {
- props = new Properties();
- }
-
- String prefix = "mail.smtp";
- if (smtpProtocol != null) {
- props.put("mail.transport.protocol", smtpProtocol);
- prefix = "mail." + smtpProtocol;
- }
- if (smtpHost != null) {
- props.put(prefix + ".host", smtpHost);
- }
- if (smtpPort > 0) {
- props.put(prefix + ".port", String.valueOf(smtpPort));
- }
-
- Authenticator auth = null;
- if(smtpPassword != null && smtpUsername != null) {
- props.put(prefix + ".auth", "true");
- auth = new Authenticator() {
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(smtpUsername, smtpPassword);
- }
- };
- }
- Session session = Session.getInstance(props, auth);
- if (smtpProtocol != null) {
- session.setProtocolForAddress("rfc822", smtpProtocol);
- }
- if (smtpDebug) {
- session.setDebug(smtpDebug);
- }
- return session;
- }
-
- /**
- Perform SMTPAppender specific appending actions, mainly adding
- the event to a cyclic buffer and checking if the event triggers
- an e-mail to be sent. */
- public
- void append(LoggingEvent event) {
-
- if(!checkEntryConditions()) {
- return;
- }
-
- event.getThreadName();
- event.getNDC();
- event.getMDCCopy();
- if(locationInfo) {
- event.getLocationInformation();
- }
- event.getRenderedMessage();
- event.getThrowableStrRep();
- cb.add(event);
- if(evaluator.isTriggeringEvent(event)) {
- sendBuffer();
- }
- }
-
- /**
- This method determines if there is a sense in attempting to append.
-
-
It checks whether there is a set output target and also if
- there is a set layout. If these checks fail, then the boolean
- value false is returned. */
- protected
- boolean checkEntryConditions() {
- if(this.msg == null) {
- errorHandler.error("Message object not configured.");
- return false;
- }
-
- if(this.evaluator == null) {
- errorHandler.error("No TriggeringEventEvaluator is set for appender ["+
- name+"].");
- return false;
- }
-
-
- if(this.layout == null) {
- errorHandler.error("No layout set for appender named ["+name+"].");
- return false;
- }
- return true;
- }
-
-
- synchronized
- public
- void close() {
- this.closed = true;
- if (sendOnClose && cb.length() > 0) {
- sendBuffer();
- }
- }
-
- InternetAddress getAddress(String addressStr) {
- try {
- return new InternetAddress(addressStr);
- } catch(AddressException e) {
- errorHandler.error("Could not parse address ["+addressStr+"].", e,
- ErrorCode.ADDRESS_PARSE_FAILURE);
- return null;
- }
- }
-
- InternetAddress[] parseAddress(String addressStr) {
- try {
- return InternetAddress.parse(addressStr, true);
- } catch(AddressException e) {
- errorHandler.error("Could not parse address ["+addressStr+"].", e,
- ErrorCode.ADDRESS_PARSE_FAILURE);
- return null;
- }
- }
-
- /**
- Returns value of the To option.
- */
- public
- String getTo() {
- return to;
- }
-
-
- /**
- The SMTPAppender requires a {@link
- org.apache.log4j.Layout layout}. */
- public
- boolean requiresLayout() {
- return true;
- }
-
- /**
- * Layout body of email message.
- * @since 1.2.16
- */
- protected String formatBody() {
-
- // Note: this code already owns the monitor for this
- // appender. This frees us from needing to synchronize on 'cb'.
-
- StringBuffer sbuf = new StringBuffer();
- String t = layout.getHeader();
- if(t != null)
- sbuf.append(t);
- int len = cb.length();
- for(int i = 0; i < len; i++) {
- //sbuf.append(MimeUtility.encodeText(layout.format(cb.get())));
- LoggingEvent event = cb.get();
- sbuf.append(layout.format(event));
- if(layout.ignoresThrowable()) {
- String[] s = event.getThrowableStrRep();
- if (s != null) {
- for(int j = 0; j < s.length; j++) {
- sbuf.append(s[j]);
- sbuf.append(Layout.LINE_SEP);
- }
- }
- }
- }
- t = layout.getFooter();
- if(t != null) {
- sbuf.append(t);
- }
-
- return sbuf.toString();
- }
-
- /**
- Send the contents of the cyclic buffer as an e-mail message.
- */
- protected
- void sendBuffer() {
-
- try {
- String s = formatBody();
- boolean allAscii = true;
- for(int i = 0; i < s.length() && allAscii; i++) {
- allAscii = s.charAt(i) <= 0x7F;
- }
- MimeBodyPart part;
- if (allAscii) {
- part = new MimeBodyPart();
- part.setContent(s, layout.getContentType());
- } else {
- try {
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- Writer writer = new OutputStreamWriter(
- MimeUtility.encode(os, "quoted-printable"), "UTF-8");
- writer.write(s);
- writer.close();
- InternetHeaders headers = new InternetHeaders();
- headers.setHeader("Content-Type", layout.getContentType() + "; charset=UTF-8");
- headers.setHeader("Content-Transfer-Encoding", "quoted-printable");
- part = new MimeBodyPart(headers, os.toByteArray());
- } catch(Exception ex) {
- StringBuffer sbuf = new StringBuffer(s);
- for (int i = 0; i < sbuf.length(); i++) {
- if (sbuf.charAt(i) >= 0x80) {
- sbuf.setCharAt(i, '?');
- }
- }
- part = new MimeBodyPart();
- part.setContent(sbuf.toString(), layout.getContentType());
- }
- }
-
-
-
- Multipart mp = new MimeMultipart();
- mp.addBodyPart(part);
- msg.setContent(mp);
-
- msg.setSentDate(new Date());
- Transport.send(msg);
- } catch(MessagingException e) {
- LogLog.error("Error occured while sending e-mail notification.", e);
- } catch(RuntimeException e) {
- LogLog.error("Error occured while sending e-mail notification.", e);
- }
- }
-
-
-
- /**
- Returns value of the EvaluatorClass option.
- */
- public
- String getEvaluatorClass() {
- return evaluator == null ? null : evaluator.getClass().getName();
- }
-
- /**
- Returns value of the From option.
- */
- public
- String getFrom() {
- return from;
- }
-
- /**
- Get the reply addresses.
- @return reply addresses as comma separated string, may be null.
- @since 1.2.16
- */
- public
- String getReplyTo() {
- return replyTo;
- }
-
- /**
- Returns value of the Subject option.
- */
- public
- String getSubject() {
- return subject;
- }
-
- /**
- The From option takes a string value which should be a
- e-mail address of the sender.
- */
- public
- void setFrom(String from) {
- this.from = from;
- }
-
- /**
- Set the e-mail addresses to which replies should be directed.
- @param addresses reply addresses as comma separated string, may be null.
- @since 1.2.16
- */
- public
- void setReplyTo(final String addresses) {
- this.replyTo = addresses;
- }
-
-
- /**
- The Subject option takes a string value which should be a
- the subject of the e-mail message.
- */
- public
- void setSubject(String subject) {
- this.subject = subject;
- }
-
-
- /**
- The BufferSize option takes a positive integer
- representing the maximum number of logging events to collect in a
- cyclic buffer. When the BufferSize is reached,
- oldest events are deleted as new events are added to the
- buffer. By default the size of the cyclic buffer is 512 events.
- */
- public
- void setBufferSize(int bufferSize) {
- this.bufferSize = bufferSize;
- cb.resize(bufferSize);
- }
-
- /**
- The SMTPHost option takes a string value which should be a
- the host name of the SMTP server that will send the e-mail message.
- */
- public
- void setSMTPHost(String smtpHost) {
- this.smtpHost = smtpHost;
- }
-
- /**
- Returns value of the SMTPHost option.
- */
- public
- String getSMTPHost() {
- return smtpHost;
- }
-
- /**
- The To option takes a string value which should be a
- comma separated list of e-mail address of the recipients.
- */
- public
- void setTo(String to) {
- this.to = to;
- }
-
-
-
- /**
- Returns value of the BufferSize option.
- */
- public
- int getBufferSize() {
- return bufferSize;
- }
-
- /**
- The EvaluatorClass option takes a string value
- representing the name of the class implementing the {@link
- TriggeringEventEvaluator} interface. A corresponding object will
- be instantiated and assigned as the triggering event evaluator
- for the SMTPAppender.
- */
- public
- void setEvaluatorClass(String value) {
- evaluator = (TriggeringEventEvaluator)
- OptionConverter.instantiateByClassName(value,
- TriggeringEventEvaluator.class,
- evaluator);
- }
-
-
- /**
- The LocationInfo option takes a boolean value. By
- default, it is set to false which means there will be no effort
- to extract the location information related to the event. As a
- result, the layout that formats the events as they are sent out
- in an e-mail is likely to place the wrong location information
- (if present in the format).
-
-
Location information extraction is comparatively very slow and
- should be avoided unless performance is not a concern.
- */
- public
- void setLocationInfo(boolean locationInfo) {
- this.locationInfo = locationInfo;
- }
-
- /**
- Returns value of the LocationInfo option.
- */
- public
- boolean getLocationInfo() {
- return locationInfo;
- }
-
- /**
- Set the cc recipient addresses.
- @param addresses recipient addresses as comma separated string, may be null.
- @since 1.2.14
- */
- public void setCc(final String addresses) {
- this.cc = addresses;
- }
-
- /**
- Get the cc recipient addresses.
- @return recipient addresses as comma separated string, may be null.
- @since 1.2.14
- */
- public String getCc() {
- return cc;
- }
-
- /**
- Set the bcc recipient addresses.
- @param addresses recipient addresses as comma separated string, may be null.
- @since 1.2.14
- */
- public void setBcc(final String addresses) {
- this.bcc = addresses;
- }
-
- /**
- Get the bcc recipient addresses.
- @return recipient addresses as comma separated string, may be null.
- @since 1.2.14
- */
- public String getBcc() {
- return bcc;
- }
-
- /**
- * The SmtpPassword option takes a string value which should be the password required to authenticate against
- * the mail server.
- * @param password password, may be null.
- * @since 1.2.14
- */
- public void setSMTPPassword(final String password) {
- this.smtpPassword = password;
- }
-
- /**
- * The SmtpUsername option takes a string value which should be the username required to authenticate against
- * the mail server.
- * @param username user name, may be null.
- * @since 1.2.14
- */
- public void setSMTPUsername(final String username) {
- this.smtpUsername = username;
- }
-
- /**
- * Setting the SmtpDebug option to true will cause the mail session to log its server interaction to stdout.
- * This can be useful when debuging the appender but should not be used during production because username and
- * password information is included in the output.
- * @param debug debug flag.
- * @since 1.2.14
- */
- public void setSMTPDebug(final boolean debug) {
- this.smtpDebug = debug;
- }
-
- /**
- * Get SMTP password.
- * @return SMTP password, may be null.
- * @since 1.2.14
- */
- public String getSMTPPassword() {
- return smtpPassword;
- }
-
- /**
- * Get SMTP user name.
- * @return SMTP user name, may be null.
- * @since 1.2.14
- */
- public String getSMTPUsername() {
- return smtpUsername;
- }
-
- /**
- * Get SMTP debug.
- * @return SMTP debug flag.
- * @since 1.2.14
- */
- public boolean getSMTPDebug() {
- return smtpDebug;
- }
-
- /**
- * Sets triggering evaluator.
- * @param trigger triggering event evaluator.
- * @since 1.2.15
- */
- public final void setEvaluator(final TriggeringEventEvaluator trigger) {
- if (trigger == null) {
- throw new NullPointerException("trigger");
- }
- this.evaluator = trigger;
- }
-
- /**
- * Get triggering evaluator.
- * @return triggering event evaluator.
- * @since 1.2.15
- */
- public final TriggeringEventEvaluator getEvaluator() {
- return evaluator;
- }
-
- /** {@inheritDoc}
- * @since 1.2.15
- */
- public boolean parseUnrecognizedElement(final Element element,
- final Properties props) throws Exception {
- if ("triggeringPolicy".equals(element.getNodeName())) {
- Object triggerPolicy =
- org.apache.log4j.xml.DOMConfigurator.parseElement(
- element, props, TriggeringEventEvaluator.class);
- if (triggerPolicy instanceof TriggeringEventEvaluator) {
- setEvaluator((TriggeringEventEvaluator) triggerPolicy);
- }
- return true;
- }
-
- return false;
- }
-
- /**
- * Get transport protocol.
- * Typically null or "smtps".
- *
- * @return transport protocol, may be null.
- * @since 1.2.16
- */
- public final String getSMTPProtocol() {
- return smtpProtocol;
- }
-
- /**
- * Set transport protocol.
- * Typically null or "smtps".
- *
- * @param val transport protocol, may be null.
- * @since 1.2.16
- */
- public final void setSMTPProtocol(final String val) {
- smtpProtocol = val;
- }
-
- /**
- * Get port.
- *
- * @return port, negative values indicate use of default ports for protocol.
- * @since 1.2.16
- */
- public final int getSMTPPort() {
- return smtpPort;
- }
-
- /**
- * Set port.
- *
- * @param val port, negative values indicate use of default ports for protocol.
- * @since 1.2.16
- */
- public final void setSMTPPort(final int val) {
- smtpPort = val;
- }
-
- /**
- * Get sendOnClose.
- *
- * @return if true all buffered logging events will be sent when the appender is closed.
- * @since 1.2.16
- */
- public final boolean getSendOnClose() {
- return sendOnClose;
- }
-
- /**
- * Set sendOnClose.
- *
- * @param val if true all buffered logging events will be sent when appender is closed.
- * @since 1.2.16
- */
- public final void setSendOnClose(final boolean val) {
- sendOnClose = val;
- }
-
-}
-
-class DefaultEvaluator implements TriggeringEventEvaluator {
- /**
- Is this event the e-mail triggering event?
-
-
This method returns true, if the event level
- has ERROR level or higher. Otherwise it returns
- false. */
- public
- boolean isTriggeringEvent(LoggingEvent event) {
- return event.getLevel().isGreaterOrEqual(Level.ERROR);
- }
-}
diff --git a/java/src/org/apache/log4j/net/SimpleSocketServer.java b/java/src/org/apache/log4j/net/SimpleSocketServer.java
deleted file mode 100644
index c15aa3c..0000000
--- a/java/src/org/apache/log4j/net/SimpleSocketServer.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.xml.DOMConfigurator;
-
-
-/**
- * A simple {@link SocketNode} based server.
- *
-
- Usage: java org.apache.log4j.net.SimpleSocketServer port configFile
-
- where port is a part number where the server listens and
- configFile is a configuration file fed to the {@link
- PropertyConfigurator} or to {@link DOMConfigurator} if an XML file.
-
- *
- * @author Ceki Gülcü
- *
- * @since 0.8.4
- * */
-public class SimpleSocketServer {
-
- static Logger cat = Logger.getLogger(SimpleSocketServer.class);
-
- static int port;
-
- public
- static
- void main(String argv[]) {
- if(argv.length == 2) {
- init(argv[0], argv[1]);
- } else {
- usage("Wrong number of arguments.");
- }
-
- try {
- cat.info("Listening on port " + port);
- ServerSocket serverSocket = new ServerSocket(port);
- while(true) {
- cat.info("Waiting to accept a new client.");
- Socket socket = serverSocket.accept();
- cat.info("Connected to client at " + socket.getInetAddress());
- cat.info("Starting new socket node.");
- new Thread(new SocketNode(socket,
- LogManager.getLoggerRepository()),"SimpleSocketServer-" + port).start();
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
-
-
- static void usage(String msg) {
- System.err.println(msg);
- System.err.println(
- "Usage: java " +SimpleSocketServer.class.getName() + " port configFile");
- System.exit(1);
- }
-
- static void init(String portStr, String configFile) {
- try {
- port = Integer.parseInt(portStr);
- } catch(java.lang.NumberFormatException e) {
- e.printStackTrace();
- usage("Could not interpret port number ["+ portStr +"].");
- }
-
- if(configFile.endsWith(".xml")) {
- DOMConfigurator.configure(configFile);
- } else {
- PropertyConfigurator.configure(configFile);
- }
- }
-}
diff --git a/java/src/org/apache/log4j/net/SocketAppender.java b/java/src/org/apache/log4j/net/SocketAppender.java
deleted file mode 100644
index 855b057..0000000
--- a/java/src/org/apache/log4j/net/SocketAppender.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Dan MacDonald
-
-package org.apache.log4j.net;
-
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.InterruptedIOException;
-import java.net.InetAddress;
-import java.net.Socket;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- Sends {@link LoggingEvent} objects to a remote a log server,
- usually a {@link SocketNode}.
-
- The SocketAppender has the following properties:
-
-
-
- - If sent to a {@link SocketNode}, remote logging is
- non-intrusive as far as the log event is concerned. In other
- words, the event will be logged with the same time stamp, {@link
- org.apache.log4j.NDC}, location info as if it were logged locally by
- the client.
-
-
- SocketAppenders do not use a layout. They ship a
- serialized {@link LoggingEvent} object to the server side.
-
-
- Remote logging uses the TCP protocol. Consequently, if
- the server is reachable, then log events will eventually arrive
- at the server.
-
-
- If the remote server is down, the logging requests are
- simply dropped. However, if and when the server comes back up,
- then event transmission is resumed transparently. This
- transparent reconneciton is performed by a connector
- thread which periodically attempts to connect to the server.
-
-
- Logging events are automatically buffered by the
- native TCP implementation. This means that if the link to server
- is slow but still faster than the rate of (log) event production
- by the client, the client will not be affected by the slow
- network connection. However, if the network connection is slower
- then the rate of event production, then the client can only
- progress at the network rate. In particular, if the network link
- to the the server is down, the client will be blocked.
-
-
On the other hand, if the network link is up, but the server
- is down, the client will not be blocked when making log requests
- but the log events will be lost due to server unavailability.
-
-
- Even if a
SocketAppender is no longer
- attached to any category, it will not be garbage collected in
- the presence of a connector thread. A connector thread exists
- only if the connection to the server is down. To avoid this
- garbage collection problem, you should {@link #close} the the
- SocketAppender explicitly. See also next item.
-
- Long lived applications which create/destroy many
- SocketAppender instances should be aware of this
- garbage collection problem. Most other applications can safely
- ignore it.
-
-
- If the JVM hosting the
SocketAppender exits
- before the SocketAppender is closed either
- explicitly or subsequent to garbage collection, then there might
- be untransmitted data in the pipe which might be lost. This is a
- common problem on Windows based systems.
-
- To avoid lost data, it is usually sufficient to {@link
- #close} the SocketAppender either explicitly or by
- calling the {@link org.apache.log4j.LogManager#shutdown} method
- before exiting the application.
-
-
-
-
- @author Ceki Gülcü
- @since 0.8.4 */
-
-public class SocketAppender extends AppenderSkeleton {
-
- /**
- The default port number of remote logging server (4560).
- @since 1.2.15
- */
- static public final int DEFAULT_PORT = 4560;
-
- /**
- The default reconnection delay (30000 milliseconds or 30 seconds).
- */
- static final int DEFAULT_RECONNECTION_DELAY = 30000;
-
- /**
- We remember host name as String in addition to the resolved
- InetAddress so that it can be returned via getOption().
- */
- String remoteHost;
-
- /**
- * The MulticastDNS zone advertised by a SocketAppender
- */
- public static final String ZONE = "_log4j_obj_tcpconnect_appender.local.";
-
- InetAddress address;
- int port = DEFAULT_PORT;
- ObjectOutputStream oos;
- int reconnectionDelay = DEFAULT_RECONNECTION_DELAY;
- boolean locationInfo = false;
- private String application;
-
- private Connector connector;
-
- int counter = 0;
-
- // reset the ObjectOutputStream every 70 calls
- //private static final int RESET_FREQUENCY = 70;
- private static final int RESET_FREQUENCY = 1;
- private boolean advertiseViaMulticastDNS;
- private ZeroConfSupport zeroConf;
-
- public SocketAppender() {
- }
-
- /**
- Connects to remote server at address and port.
- */
- public SocketAppender(InetAddress address, int port) {
- this.address = address;
- this.remoteHost = address.getHostName();
- this.port = port;
- connect(address, port);
- }
-
- /**
- Connects to remote server at host and port.
- */
- public SocketAppender(String host, int port) {
- this.port = port;
- this.address = getAddressByName(host);
- this.remoteHost = host;
- connect(address, port);
- }
-
- /**
- Connect to the specified RemoteHost and Port.
- */
- public void activateOptions() {
- if (advertiseViaMulticastDNS) {
- zeroConf = new ZeroConfSupport(ZONE, port, getName());
- zeroConf.advertise();
- }
- connect(address, port);
- }
-
- /**
- * Close this appender.
- *
- * This will mark the appender as closed and call then {@link
- * #cleanUp} method.
- * */
- synchronized public void close() {
- if(closed)
- return;
-
- this.closed = true;
- if (advertiseViaMulticastDNS) {
- zeroConf.unadvertise();
- }
-
- cleanUp();
- }
-
- /**
- * Drop the connection to the remote host and release the underlying
- * connector thread if it has been created
- * */
- public void cleanUp() {
- if(oos != null) {
- try {
- oos.close();
- } catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not close oos.", e);
- }
- oos = null;
- }
- if(connector != null) {
- //LogLog.debug("Interrupting the connector.");
- connector.interrupted = true;
- connector = null; // allow gc
- }
- }
-
- void connect(InetAddress address, int port) {
- if(this.address == null)
- return;
- try {
- // First, close the previous connection if any.
- cleanUp();
- oos = new ObjectOutputStream(new Socket(address, port).getOutputStream());
- } catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- String msg = "Could not connect to remote log4j server at ["
- +address.getHostName()+"].";
- if(reconnectionDelay > 0) {
- msg += " We will try again later.";
- fireConnector(); // fire the connector thread
- } else {
- msg += " We are not retrying.";
- errorHandler.error(msg, e, ErrorCode.GENERIC_FAILURE);
- }
- LogLog.error(msg);
- }
- }
-
-
- public void append(LoggingEvent event) {
- if(event == null)
- return;
-
- if(address==null) {
- errorHandler.error("No remote host is set for SocketAppender named \""+
- this.name+"\".");
- return;
- }
-
- if(oos != null) {
- try {
-
- if(locationInfo) {
- event.getLocationInformation();
- }
- if (application != null) {
- event.setProperty("application", application);
- }
- event.getNDC();
- event.getThreadName();
- event.getMDCCopy();
- event.getRenderedMessage();
- event.getThrowableStrRep();
-
- oos.writeObject(event);
- //LogLog.debug("=========Flushing.");
- oos.flush();
- if(++counter >= RESET_FREQUENCY) {
- counter = 0;
- // Failing to reset the object output stream every now and
- // then creates a serious memory leak.
- //System.err.println("Doing oos.reset()");
- oos.reset();
- }
- } catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- oos = null;
- LogLog.warn("Detected problem with connection: "+e);
- if(reconnectionDelay > 0) {
- fireConnector();
- } else {
- errorHandler.error("Detected problem with connection, not reconnecting.", e,
- ErrorCode.GENERIC_FAILURE);
- }
- }
- }
- }
-
- public void setAdvertiseViaMulticastDNS(boolean advertiseViaMulticastDNS) {
- this.advertiseViaMulticastDNS = advertiseViaMulticastDNS;
- }
-
- public boolean isAdvertiseViaMulticastDNS() {
- return advertiseViaMulticastDNS;
- }
-
- void fireConnector() {
- if(connector == null) {
- LogLog.debug("Starting a new connector thread.");
- connector = new Connector();
- connector.setDaemon(true);
- connector.setPriority(Thread.MIN_PRIORITY);
- connector.start();
- }
- }
-
- static
- InetAddress getAddressByName(String host) {
- try {
- return InetAddress.getByName(host);
- } catch(Exception e) {
- if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not find address of ["+host+"].", e);
- return null;
- }
- }
-
- /**
- * The SocketAppender does not use a layout. Hence, this method
- * returns false.
- * */
- public boolean requiresLayout() {
- return false;
- }
-
- /**
- * The RemoteHost option takes a string value which should be
- * the host name of the server where a {@link SocketNode} is
- * running.
- * */
- public void setRemoteHost(String host) {
- address = getAddressByName(host);
- remoteHost = host;
- }
-
- /**
- Returns value of the RemoteHost option.
- */
- public String getRemoteHost() {
- return remoteHost;
- }
-
- /**
- The Port option takes a positive integer representing
- the port where the server is waiting for connections.
- */
- public void setPort(int port) {
- this.port = port;
- }
-
- /**
- Returns value of the Port option.
- */
- public int getPort() {
- return port;
- }
-
- /**
- The LocationInfo option takes a boolean value. If true,
- the information sent to the remote host will include location
- information. By default no location information is sent to the server.
- */
- public void setLocationInfo(boolean locationInfo) {
- this.locationInfo = locationInfo;
- }
-
- /**
- Returns value of the LocationInfo option.
- */
- public boolean getLocationInfo() {
- return locationInfo;
- }
-
- /**
- * The App option takes a string value which should be the name of the
- * application getting logged.
- * If property was already set (via system property), don't set here.
- * @since 1.2.15
- */
- public void setApplication(String lapp) {
- this.application = lapp;
- }
-
- /**
- * Returns value of the Application option.
- * @since 1.2.15
- */
- public String getApplication() {
- return application;
- }
-
- /**
- The ReconnectionDelay option takes a positive integer
- representing the number of milliseconds to wait between each
- failed connection attempt to the server. The default value of
- this option is 30000 which corresponds to 30 seconds.
-
-
Setting this option to zero turns off reconnection
- capability.
- */
- public void setReconnectionDelay(int delay) {
- this.reconnectionDelay = delay;
- }
-
- /**
- Returns value of the ReconnectionDelay option.
- */
- public int getReconnectionDelay() {
- return reconnectionDelay;
- }
-
- /**
- The Connector will reconnect when the server becomes available
- again. It does this by attempting to open a new connection every
- reconnectionDelay milliseconds.
-
-
It stops trying whenever a connection is established. It will
- restart to try reconnect to the server when previously open
- connection is droppped.
-
- @author Ceki Gülcü
- @since 0.8.4
- */
- class Connector extends Thread {
-
- boolean interrupted = false;
-
- public
- void run() {
- Socket socket;
- while(!interrupted) {
- try {
- sleep(reconnectionDelay);
- LogLog.debug("Attempting connection to "+address.getHostName());
- socket = new Socket(address, port);
- synchronized(this) {
- oos = new ObjectOutputStream(socket.getOutputStream());
- connector = null;
- LogLog.debug("Connection established. Exiting connector thread.");
- break;
- }
- } catch(InterruptedException e) {
- LogLog.debug("Connector interrupted. Leaving loop.");
- return;
- } catch(java.net.ConnectException e) {
- LogLog.debug("Remote host "+address.getHostName()
- +" refused connection.");
- } catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.debug("Could not connect to " + address.getHostName()+
- ". Exception is " + e);
- }
- }
- //LogLog.debug("Exiting Connector.run() method.");
- }
-
- /**
- public
- void finalize() {
- LogLog.debug("Connector finalize() has been called.");
- }
- */
- }
-
-}
diff --git a/java/src/org/apache/log4j/net/SocketHubAppender.java b/java/src/org/apache/log4j/net/SocketHubAppender.java
deleted file mode 100644
index 665c58a..0000000
--- a/java/src/org/apache/log4j/net/SocketHubAppender.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.ObjectOutputStream;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.util.Vector;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.CyclicBuffer;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- Sends {@link LoggingEvent} objects to a set of remote log servers,
- usually a {@link SocketNode SocketNodes}.
-
-
Acts just like {@link SocketAppender} except that instead of
- connecting to a given remote log server,
- SocketHubAppender accepts connections from the remote
- log servers as clients. It can accept more than one connection.
- When a log event is received, the event is sent to the set of
- currently connected remote log servers. Implemented this way it does
- not require any update to the configuration file to send data to
- another remote log server. The remote log server simply connects to
- the host and port the SocketHubAppender is running on.
-
-
The SocketHubAppender does not store events such
- that the remote side will events that arrived after the
- establishment of its connection. Once connected, events arrive in
- order as guaranteed by the TCP protocol.
-
-
This implementation borrows heavily from the {@link
- SocketAppender}.
-
-
The SocketHubAppender has the following characteristics:
-
-
-
- - If sent to a {@link SocketNode}, logging is non-intrusive as
- far as the log event is concerned. In other words, the event will be
- logged with the same time stamp, {@link org.apache.log4j.NDC},
- location info as if it were logged locally.
-
-
SocketHubAppender does not use a layout. It
- ships a serialized {@link LoggingEvent} object to the remote side.
-
- SocketHubAppender relies on the TCP
- protocol. Consequently, if the remote side is reachable, then log
- events will eventually arrive at remote client.
-
- - If no remote clients are attached, the logging requests are
- simply dropped.
-
-
- Logging events are automatically buffered by the
- native TCP implementation. This means that if the link to remote
- client is slow but still faster than the rate of (log) event
- production, the application will not be affected by the slow network
- connection. However, if the network connection is slower then the
- rate of event production, then the local application can only
- progress at the network rate. In particular, if the network link to
- the the remote client is down, the application will be blocked.
-
-
On the other hand, if the network link is up, but the remote
- client is down, the client will not be blocked when making log
- requests but the log events will be lost due to client
- unavailability.
-
-
The single remote client case extends to multiple clients
- connections. The rate of logging will be determined by the slowest
- link.
-
-
- If the JVM hosting the
SocketHubAppender exits
- before the SocketHubAppender is closed either
- explicitly or subsequent to garbage collection, then there might
- be untransmitted data in the pipe which might be lost. This is a
- common problem on Windows based systems.
-
- To avoid lost data, it is usually sufficient to {@link #close}
- the SocketHubAppender either explicitly or by calling
- the {@link org.apache.log4j.LogManager#shutdown} method before
- exiting the application.
-
-
-
- @author Mark Womack */
-
-public class SocketHubAppender extends AppenderSkeleton {
-
- /**
- The default port number of the ServerSocket will be created on. */
- static final int DEFAULT_PORT = 4560;
-
- private int port = DEFAULT_PORT;
- private Vector oosList = new Vector();
- private ServerMonitor serverMonitor = null;
- private boolean locationInfo = false;
- private CyclicBuffer buffer = null;
- private String application;
- private boolean advertiseViaMulticastDNS;
- private ZeroConfSupport zeroConf;
-
- /**
- * The MulticastDNS zone advertised by a SocketHubAppender
- */
- public static final String ZONE = "_log4j_obj_tcpaccept_appender.local.";
-
-
- public SocketHubAppender() { }
-
- /**
- Connects to remote server at address and port. */
- public
- SocketHubAppender(int _port) {
- port = _port;
- startServer();
- }
-
- /**
- Set up the socket server on the specified port. */
- public
- void activateOptions() {
- if (advertiseViaMulticastDNS) {
- zeroConf = new ZeroConfSupport(ZONE, port, getName());
- zeroConf.advertise();
- }
- startServer();
- }
-
- /**
- Close this appender.
- This will mark the appender as closed and
- call then {@link #cleanUp} method. */
- synchronized
- public
- void close() {
- if(closed)
- return;
-
- LogLog.debug("closing SocketHubAppender " + getName());
- this.closed = true;
- if (advertiseViaMulticastDNS) {
- zeroConf.unadvertise();
- }
- cleanUp();
-
- LogLog.debug("SocketHubAppender " + getName() + " closed");
- }
-
- /**
- Release the underlying ServerMonitor thread, and drop the connections
- to all connected remote servers. */
- public
- void cleanUp() {
- // stop the monitor thread
- LogLog.debug("stopping ServerSocket");
- serverMonitor.stopMonitor();
- serverMonitor = null;
-
- // close all of the connections
- LogLog.debug("closing client connections");
- while (oosList.size() != 0) {
- ObjectOutputStream oos = (ObjectOutputStream)oosList.elementAt(0);
- if(oos != null) {
- try {
- oos.close();
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- LogLog.error("could not close oos.", e);
- } catch(IOException e) {
- LogLog.error("could not close oos.", e);
- }
-
- oosList.removeElementAt(0);
- }
- }
- }
-
- /**
- Append an event to all of current connections. */
- public
- void append(LoggingEvent event) {
- if (event != null) {
- // set up location info if requested
- if (locationInfo) {
- event.getLocationInformation();
- }
- if (application != null) {
- event.setProperty("application", application);
- }
- event.getNDC();
- event.getThreadName();
- event.getMDCCopy();
- event.getRenderedMessage();
- event.getThrowableStrRep();
-
- if (buffer != null) {
- buffer.add(event);
- }
- }
-
- // if no event or no open connections, exit now
- if ((event == null) || (oosList.size() == 0)) {
- return;
- }
-
- // loop through the current set of open connections, appending the event to each
- for (int streamCount = 0; streamCount < oosList.size(); streamCount++) {
-
- ObjectOutputStream oos = null;
- try {
- oos = (ObjectOutputStream)oosList.elementAt(streamCount);
- }
- catch (ArrayIndexOutOfBoundsException e) {
- // catch this, but just don't assign a value
- // this should not really occur as this method is
- // the only one that can remove oos's (besides cleanUp).
- }
-
- // list size changed unexpectedly? Just exit the append.
- if (oos == null)
- break;
-
- try {
- oos.writeObject(event);
- oos.flush();
- // Failing to reset the object output stream every now and
- // then creates a serious memory leak.
- // right now we always reset. TODO - set up frequency counter per oos?
- oos.reset();
- }
- catch(IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- // there was an io exception so just drop the connection
- oosList.removeElementAt(streamCount);
- LogLog.debug("dropped connection");
-
- // decrement to keep the counter in place (for loop always increments)
- streamCount--;
- }
- }
- }
-
- /**
- The SocketHubAppender does not use a layout. Hence, this method returns
- false. */
- public
- boolean requiresLayout() {
- return false;
- }
-
- /**
- The Port option takes a positive integer representing
- the port where the server is waiting for connections. */
- public
- void setPort(int _port) {
- port = _port;
- }
-
- /**
- * The App option takes a string value which should be the name of the application getting logged. If property was already set (via system
- * property), don't set here.
- */
- public
- void setApplication(String lapp) {
- this.application = lapp;
- }
-
- /**
- * Returns value of the Application option.
- */
- public
- String getApplication() {
- return application;
- }
-
- /**
- Returns value of the Port option. */
- public
- int getPort() {
- return port;
- }
-
- /**
- * The BufferSize option takes a positive integer representing the number of events this appender will buffer and send to newly connected
- * clients.
- */
- public
- void setBufferSize(int _bufferSize) {
- buffer = new CyclicBuffer(_bufferSize);
- }
-
- /**
- * Returns value of the bufferSize option.
- */
- public
- int getBufferSize() {
- if (buffer == null) {
- return 0;
- } else {
- return buffer.getMaxSize();
- }
- }
-
- /**
- The LocationInfo option takes a boolean value. If true,
- the information sent to the remote host will include location
- information. By default no location information is sent to the server. */
- public
- void setLocationInfo(boolean _locationInfo) {
- locationInfo = _locationInfo;
- }
-
- /**
- Returns value of the LocationInfo option. */
- public
- boolean getLocationInfo() {
- return locationInfo;
- }
-
- public void setAdvertiseViaMulticastDNS(boolean advertiseViaMulticastDNS) {
- this.advertiseViaMulticastDNS = advertiseViaMulticastDNS;
- }
-
- public boolean isAdvertiseViaMulticastDNS() {
- return advertiseViaMulticastDNS;
- }
-
- /**
- Start the ServerMonitor thread. */
- private
- void startServer() {
- serverMonitor = new ServerMonitor(port, oosList);
- }
-
- /**
- * Creates a server socket to accept connections.
- * @param socketPort port on which the socket should listen, may be zero.
- * @return new socket.
- * @throws IOException IO error when opening the socket.
- */
- protected ServerSocket createServerSocket(final int socketPort) throws IOException {
- return new ServerSocket(socketPort);
- }
-
- /**
- This class is used internally to monitor a ServerSocket
- and register new connections in a vector passed in the
- constructor. */
- private
- class ServerMonitor implements Runnable {
- private int port;
- private Vector oosList;
- private boolean keepRunning;
- private Thread monitorThread;
-
- /**
- Create a thread and start the monitor. */
- public
- ServerMonitor(int _port, Vector _oosList) {
- port = _port;
- oosList = _oosList;
- keepRunning = true;
- monitorThread = new Thread(this);
- monitorThread.setDaemon(true);
- monitorThread.setName("SocketHubAppender-Monitor-" + port);
- monitorThread.start();
- }
-
- /**
- Stops the monitor. This method will not return until
- the thread has finished executing. */
- public
- synchronized
- void stopMonitor() {
- if (keepRunning) {
- LogLog.debug("server monitor thread shutting down");
- keepRunning = false;
- try {
- monitorThread.join();
- }
- catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- // do nothing?
- }
-
- // release the thread
- monitorThread = null;
- LogLog.debug("server monitor thread shut down");
- }
- }
-
- private
- void sendCachedEvents(ObjectOutputStream stream) throws IOException {
- if (buffer != null) {
- for (int i = 0; i < buffer.length(); i++) {
- stream.writeObject(buffer.get(i));
- }
- stream.flush();
- stream.reset();
- }
- }
-
- /**
- Method that runs, monitoring the ServerSocket and adding connections as
- they connect to the socket. */
- public
- void run() {
- ServerSocket serverSocket = null;
- try {
- serverSocket = createServerSocket(port);
- serverSocket.setSoTimeout(1000);
- }
- catch (Exception e) {
- if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("exception setting timeout, shutting down server socket.", e);
- keepRunning = false;
- return;
- }
-
- try {
- try {
- serverSocket.setSoTimeout(1000);
- }
- catch (SocketException e) {
- LogLog.error("exception setting timeout, shutting down server socket.", e);
- return;
- }
-
- while (keepRunning) {
- Socket socket = null;
- try {
- socket = serverSocket.accept();
- }
- catch (InterruptedIOException e) {
- // timeout occurred, so just loop
- }
- catch (SocketException e) {
- LogLog.error("exception accepting socket, shutting down server socket.", e);
- keepRunning = false;
- }
- catch (IOException e) {
- LogLog.error("exception accepting socket.", e);
- }
-
- // if there was a socket accepted
- if (socket != null) {
- try {
- InetAddress remoteAddress = socket.getInetAddress();
- LogLog.debug("accepting connection from " + remoteAddress.getHostName()
- + " (" + remoteAddress.getHostAddress() + ")");
-
- // create an ObjectOutputStream
- ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
- if (buffer != null && buffer.length() > 0) {
- sendCachedEvents(oos);
- }
-
- // add it to the oosList. OK since Vector is synchronized.
- oosList.addElement(oos);
- } catch (IOException e) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("exception creating output stream on socket.", e);
- }
- }
- }
- }
- finally {
- // close the socket
- try {
- serverSocket.close();
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- } catch (IOException e) {
- // do nothing with it?
- }
- }
- }
- }
-}
-
diff --git a/java/src/org/apache/log4j/net/SocketNode.java b/java/src/org/apache/log4j/net/SocketNode.java
deleted file mode 100644
index e977f13..0000000
--- a/java/src/org/apache/log4j/net/SocketNode.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.ObjectInputStream;
-import java.net.Socket;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggingEvent;
-
-// Contributors: Moses Hohman
-
-/**
- Read {@link LoggingEvent} objects sent from a remote client using
- Sockets (TCP). These logging events are logged according to local
- policy, as if they were generated locally.
-
- For example, the socket node might decide to log events to a
- local file and also resent them to a second socket node.
-
- @author Ceki Gülcü
-
- @since 0.8.4
-*/
-public class SocketNode implements Runnable {
-
- Socket socket;
- LoggerRepository hierarchy;
- ObjectInputStream ois;
-
- static Logger logger = Logger.getLogger(SocketNode.class);
-
- public SocketNode(Socket socket, LoggerRepository hierarchy) {
- this.socket = socket;
- this.hierarchy = hierarchy;
- try {
- ois = new ObjectInputStream(
- new BufferedInputStream(socket.getInputStream()));
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- logger.error("Could not open ObjectInputStream to "+socket, e);
- } catch(IOException e) {
- logger.error("Could not open ObjectInputStream to "+socket, e);
- } catch(RuntimeException e) {
- logger.error("Could not open ObjectInputStream to "+socket, e);
- }
- }
-
- //public
- //void finalize() {
- //System.err.println("-------------------------Finalize called");
- // System.err.flush();
- //}
-
- public void run() {
- LoggingEvent event;
- Logger remoteLogger;
-
- try {
- if (ois != null) {
- while(true) {
- // read an event from the wire
- event = (LoggingEvent) ois.readObject();
- // get a logger from the hierarchy. The name of the logger is taken to be the name contained in the event.
- remoteLogger = hierarchy.getLogger(event.getLoggerName());
- //event.logger = remoteLogger;
- // apply the logger-level filter
- if(event.getLevel().isGreaterOrEqual(remoteLogger.getEffectiveLevel())) {
- // finally log the event as if was generated locally
- remoteLogger.callAppenders(event);
- }
- }
- }
- } catch(java.io.EOFException e) {
- logger.info("Caught java.io.EOFException closing conneciton.");
- } catch(java.net.SocketException e) {
- logger.info("Caught java.net.SocketException closing conneciton.");
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- logger.info("Caught java.io.InterruptedIOException: "+e);
- logger.info("Closing connection.");
- } catch(IOException e) {
- logger.info("Caught java.io.IOException: "+e);
- logger.info("Closing connection.");
- } catch(Exception e) {
- logger.error("Unexpected exception. Closing conneciton.", e);
- } finally {
- if (ois != null) {
- try {
- ois.close();
- } catch(Exception e) {
- logger.info("Could not close connection.", e);
- }
- }
- if (socket != null) {
- try {
- socket.close();
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- } catch(IOException ex) {
- }
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/net/SocketServer.java b/java/src/org/apache/log4j/net/SocketServer.java
deleted file mode 100644
index 8ea3cb7..0000000
--- a/java/src/org/apache/log4j/net/SocketServer.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import java.io.File;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.Hashtable;
-
-import org.apache.log4j.Hierarchy;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.RootLogger;
-
-
-/**
- A {@link SocketNode} based server that uses a different hierarchy
- for each client.
-
-
- Usage: java org.apache.log4j.net.SocketServer port configFile configDir
-
- where port is a part number where the server listens,
- configFile is a configuration file fed to the {@link PropertyConfigurator} and
- configDir is a path to a directory containing configuration files, possibly one for each client host.
-
-
- The configFile is used to configure the log4j
- default hierarchy that the SocketServer will use to
- report on its actions.
-
-
When a new connection is opened from a previously unknown
- host, say foo.bar.net, then the
- SocketServer will search for a configuration file
- called foo.bar.net.lcf under the directory
- configDir that was passed as the third argument. If
- the file can be found, then a new hierarchy is instantiated and
- configured using the configuration file
- foo.bar.net.lcf. If and when the host
- foo.bar.net opens another connection to the server,
- then the previously configured hierarchy is used.
-
-
In case there is no file called foo.bar.net.lcf
- under the directory configDir, then the
- generic hierarchy is used. The generic hierarchy is
- configured using a configuration file called
- generic.lcf under the configDir
- directory. If no such file exists, then the generic hierarchy will be
- identical to the log4j default hierarchy.
-
-
Having different client hosts log using different hierarchies
- ensures the total independence of the clients with respect to
- their logging settings.
-
-
Currently, the hierarchy that will be used for a given request
- depends on the IP address of the client host. For example, two
- separate applicatons running on the same host and logging to the
- same server will share the same hierarchy. This is perfectly safe
- except that it might not provide the right amount of independence
- between applications. The SocketServer is intended
- as an example to be enhanced in order to implement more elaborate
- policies.
-
-
- @author Ceki Gülcü
-
- @since 1.0 */
-
-public class SocketServer {
-
- static String GENERIC = "generic";
- static String CONFIG_FILE_EXT = ".lcf";
-
- static Logger cat = Logger.getLogger(SocketServer.class);
- static SocketServer server;
- static int port;
-
- // key=inetAddress, value=hierarchy
- Hashtable hierarchyMap;
- LoggerRepository genericHierarchy;
- File dir;
-
- public
- static
- void main(String argv[]) {
- if(argv.length == 3)
- init(argv[0], argv[1], argv[2]);
- else
- usage("Wrong number of arguments.");
-
- try {
- cat.info("Listening on port " + port);
- ServerSocket serverSocket = new ServerSocket(port);
- while(true) {
- cat.info("Waiting to accept a new client.");
- Socket socket = serverSocket.accept();
- InetAddress inetAddress = socket.getInetAddress();
- cat.info("Connected to client at " + inetAddress);
-
- LoggerRepository h = (LoggerRepository) server.hierarchyMap.get(inetAddress);
- if(h == null) {
- h = server.configureHierarchy(inetAddress);
- }
-
- cat.info("Starting new socket node.");
- new Thread(new SocketNode(socket, h)).start();
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- }
-
-
- static
- void usage(String msg) {
- System.err.println(msg);
- System.err.println(
- "Usage: java " +SocketServer.class.getName() + " port configFile directory");
- System.exit(1);
- }
-
- static
- void init(String portStr, String configFile, String dirStr) {
- try {
- port = Integer.parseInt(portStr);
- }
- catch(java.lang.NumberFormatException e) {
- e.printStackTrace();
- usage("Could not interpret port number ["+ portStr +"].");
- }
-
- PropertyConfigurator.configure(configFile);
-
- File dir = new File(dirStr);
- if(!dir.isDirectory()) {
- usage("["+dirStr+"] is not a directory.");
- }
- server = new SocketServer(dir);
- }
-
-
- public
- SocketServer(File directory) {
- this.dir = directory;
- hierarchyMap = new Hashtable(11);
- }
-
- // This method assumes that there is no hiearchy for inetAddress
- // yet. It will configure one and return it.
- LoggerRepository configureHierarchy(InetAddress inetAddress) {
- cat.info("Locating configuration file for "+inetAddress);
- // We assume that the toSting method of InetAddress returns is in
- // the format hostname/d1.d2.d3.d4 e.g. torino/192.168.1.1
- String s = inetAddress.toString();
- int i = s.indexOf("/");
- if(i == -1) {
- cat.warn("Could not parse the inetAddress ["+inetAddress+
- "]. Using default hierarchy.");
- return genericHierarchy();
- } else {
- String key = s.substring(0, i);
-
- File configFile = new File(dir, key+CONFIG_FILE_EXT);
- if(configFile.exists()) {
- Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG));
- hierarchyMap.put(inetAddress, h);
-
- new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h);
-
- return h;
- } else {
- cat.warn("Could not find config file ["+configFile+"].");
- return genericHierarchy();
- }
- }
- }
-
- LoggerRepository genericHierarchy() {
- if(genericHierarchy == null) {
- File f = new File(dir, GENERIC+CONFIG_FILE_EXT);
- if(f.exists()) {
- genericHierarchy = new Hierarchy(new RootLogger(Level.DEBUG));
- new PropertyConfigurator().doConfigure(f.getAbsolutePath(), genericHierarchy);
- } else {
- cat.warn("Could not find config file ["+f+
- "]. Will use the default hierarchy.");
- genericHierarchy = LogManager.getLoggerRepository();
- }
- }
- return genericHierarchy;
- }
-}
diff --git a/java/src/org/apache/log4j/net/SyslogAppender.java b/java/src/org/apache/log4j/net/SyslogAppender.java
deleted file mode 100644
index 6ab7edd..0000000
--- a/java/src/org/apache/log4j/net/SyslogAppender.java
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Layout;
-import org.apache.log4j.helpers.SyslogQuietWriter;
-import org.apache.log4j.helpers.SyslogWriter;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.io.IOException;
-
-// Contributors: Yves Bossel
-// Christopher Taylor
-
-/**
- Use SyslogAppender to send log messages to a remote syslog daemon.
-
- @author Ceki Gülcü
- @author Anders Kristensen
- */
-public class SyslogAppender extends AppenderSkeleton {
- // The following constants are extracted from a syslog.h file
- // copyrighted by the Regents of the University of California
- // I hope nobody at Berkley gets offended.
-
- /** Kernel messages */
- final static public int LOG_KERN = 0;
- /** Random user-level messages */
- final static public int LOG_USER = 1<<3;
- /** Mail system */
- final static public int LOG_MAIL = 2<<3;
- /** System daemons */
- final static public int LOG_DAEMON = 3<<3;
- /** security/authorization messages */
- final static public int LOG_AUTH = 4<<3;
- /** messages generated internally by syslogd */
- final static public int LOG_SYSLOG = 5<<3;
-
- /** line printer subsystem */
- final static public int LOG_LPR = 6<<3;
- /** network news subsystem */
- final static public int LOG_NEWS = 7<<3;
- /** UUCP subsystem */
- final static public int LOG_UUCP = 8<<3;
- /** clock daemon */
- final static public int LOG_CRON = 9<<3;
- /** security/authorization messages (private) */
- final static public int LOG_AUTHPRIV = 10<<3;
- /** ftp daemon */
- final static public int LOG_FTP = 11<<3;
-
- // other codes through 15 reserved for system use
- /** reserved for local use */
- final static public int LOG_LOCAL0 = 16<<3;
- /** reserved for local use */
- final static public int LOG_LOCAL1 = 17<<3;
- /** reserved for local use */
- final static public int LOG_LOCAL2 = 18<<3;
- /** reserved for local use */
- final static public int LOG_LOCAL3 = 19<<3;
- /** reserved for local use */
- final static public int LOG_LOCAL4 = 20<<3;
- /** reserved for local use */
- final static public int LOG_LOCAL5 = 21<<3;
- /** reserved for local use */
- final static public int LOG_LOCAL6 = 22<<3;
- /** reserved for local use*/
- final static public int LOG_LOCAL7 = 23<<3;
-
- protected static final int SYSLOG_HOST_OI = 0;
- protected static final int FACILITY_OI = 1;
-
- static final String TAB = " ";
-
- // Have LOG_USER as default
- int syslogFacility = LOG_USER;
- String facilityStr;
- boolean facilityPrinting = false;
-
- //SyslogTracerPrintWriter stp;
- SyslogQuietWriter sqw;
- String syslogHost;
-
- /**
- * If true, the appender will generate the HEADER (timestamp and host name)
- * part of the syslog packet.
- * @since 1.2.15
- */
- private boolean header = false;
- /**
- * Date format used if header = true.
- * @since 1.2.15
- */
- private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss ", Locale.ENGLISH);
- /**
- * Host name used to identify messages from this appender.
- * @since 1.2.15
- */
- private String localHostname;
-
- /**
- * Set to true after the header of the layout has been sent or if it has none.
- */
- private boolean layoutHeaderChecked = false;
-
- public
- SyslogAppender() {
- this.initSyslogFacilityStr();
- }
-
- public
- SyslogAppender(Layout layout, int syslogFacility) {
- this.layout = layout;
- this.syslogFacility = syslogFacility;
- this.initSyslogFacilityStr();
- }
-
- public
- SyslogAppender(Layout layout, String syslogHost, int syslogFacility) {
- this(layout, syslogFacility);
- setSyslogHost(syslogHost);
- }
-
- /**
- Release any resources held by this SyslogAppender.
-
- @since 0.8.4
- */
- synchronized
- public
- void close() {
- closed = true;
- if (sqw != null) {
- try {
- if (layoutHeaderChecked && layout != null && layout.getFooter() != null) {
- sendLayoutMessage(layout.getFooter());
- }
- sqw.close();
- sqw = null;
- } catch(java.io.InterruptedIOException e) {
- Thread.currentThread().interrupt();
- sqw = null;
- } catch(IOException e) {
- sqw = null;
- }
- }
- }
-
- private
- void initSyslogFacilityStr() {
- facilityStr = getFacilityString(this.syslogFacility);
-
- if (facilityStr == null) {
- System.err.println("\"" + syslogFacility +
- "\" is an unknown syslog facility. Defaulting to \"USER\".");
- this.syslogFacility = LOG_USER;
- facilityStr = "user:";
- } else {
- facilityStr += ":";
- }
- }
-
- /**
- Returns the specified syslog facility as a lower-case String,
- e.g. "kern", "user", etc.
- */
- public
- static
- String getFacilityString(int syslogFacility) {
- switch(syslogFacility) {
- case LOG_KERN: return "kern";
- case LOG_USER: return "user";
- case LOG_MAIL: return "mail";
- case LOG_DAEMON: return "daemon";
- case LOG_AUTH: return "auth";
- case LOG_SYSLOG: return "syslog";
- case LOG_LPR: return "lpr";
- case LOG_NEWS: return "news";
- case LOG_UUCP: return "uucp";
- case LOG_CRON: return "cron";
- case LOG_AUTHPRIV: return "authpriv";
- case LOG_FTP: return "ftp";
- case LOG_LOCAL0: return "local0";
- case LOG_LOCAL1: return "local1";
- case LOG_LOCAL2: return "local2";
- case LOG_LOCAL3: return "local3";
- case LOG_LOCAL4: return "local4";
- case LOG_LOCAL5: return "local5";
- case LOG_LOCAL6: return "local6";
- case LOG_LOCAL7: return "local7";
- default: return null;
- }
- }
-
- /**
- Returns the integer value corresponding to the named syslog
- facility, or -1 if it couldn't be recognized.
-
- @param facilityName one of the strings KERN, USER, MAIL, DAEMON,
- AUTH, SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, LOCAL0,
- LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.
- The matching is case-insensitive.
-
- @since 1.1
- */
- public
- static
- int getFacility(String facilityName) {
- if(facilityName != null) {
- facilityName = facilityName.trim();
- }
- if("KERN".equalsIgnoreCase(facilityName)) {
- return LOG_KERN;
- } else if("USER".equalsIgnoreCase(facilityName)) {
- return LOG_USER;
- } else if("MAIL".equalsIgnoreCase(facilityName)) {
- return LOG_MAIL;
- } else if("DAEMON".equalsIgnoreCase(facilityName)) {
- return LOG_DAEMON;
- } else if("AUTH".equalsIgnoreCase(facilityName)) {
- return LOG_AUTH;
- } else if("SYSLOG".equalsIgnoreCase(facilityName)) {
- return LOG_SYSLOG;
- } else if("LPR".equalsIgnoreCase(facilityName)) {
- return LOG_LPR;
- } else if("NEWS".equalsIgnoreCase(facilityName)) {
- return LOG_NEWS;
- } else if("UUCP".equalsIgnoreCase(facilityName)) {
- return LOG_UUCP;
- } else if("CRON".equalsIgnoreCase(facilityName)) {
- return LOG_CRON;
- } else if("AUTHPRIV".equalsIgnoreCase(facilityName)) {
- return LOG_AUTHPRIV;
- } else if("FTP".equalsIgnoreCase(facilityName)) {
- return LOG_FTP;
- } else if("LOCAL0".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL0;
- } else if("LOCAL1".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL1;
- } else if("LOCAL2".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL2;
- } else if("LOCAL3".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL3;
- } else if("LOCAL4".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL4;
- } else if("LOCAL5".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL5;
- } else if("LOCAL6".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL6;
- } else if("LOCAL7".equalsIgnoreCase(facilityName)) {
- return LOG_LOCAL7;
- } else {
- return -1;
- }
- }
-
-
- private void splitPacket(final String header, final String packet) {
- int byteCount = packet.getBytes().length;
- //
- // if packet is less than RFC 3164 limit
- // of 1024 bytes, then write it
- // (must allow for up 5to 5 characters in the PRI section
- // added by SyslogQuietWriter)
- if (byteCount <= 1019) {
- sqw.write(packet);
- } else {
- int split = header.length() + (packet.length() - header.length())/2;
- splitPacket(header, packet.substring(0, split) + "...");
- splitPacket(header, header + "..." + packet.substring(split));
- }
- }
-
- public
- void append(LoggingEvent event) {
-
- if(!isAsSevereAsThreshold(event.getLevel()))
- return;
-
- // We must not attempt to append if sqw is null.
- if(sqw == null) {
- errorHandler.error("No syslog host is set for SyslogAppedender named \""+
- this.name+"\".");
- return;
- }
-
- if (!layoutHeaderChecked) {
- if (layout != null && layout.getHeader() != null) {
- sendLayoutMessage(layout.getHeader());
- }
- layoutHeaderChecked = true;
- }
-
- String hdr = getPacketHeader(event.timeStamp);
- String packet;
- if (layout == null) {
- packet = String.valueOf(event.getMessage());
- } else {
- packet = layout.format(event);
- }
- if(facilityPrinting || hdr.length() > 0) {
- StringBuffer buf = new StringBuffer(hdr);
- if(facilityPrinting) {
- buf.append(facilityStr);
- }
- buf.append(packet);
- packet = buf.toString();
- }
-
- sqw.setLevel(event.getLevel().getSyslogEquivalent());
- //
- // if message has a remote likelihood of exceeding 1024 bytes
- // when encoded, consider splitting message into multiple packets
- if (packet.length() > 256) {
- splitPacket(hdr, packet);
- } else {
- sqw.write(packet);
- }
-
- if (layout == null || layout.ignoresThrowable()) {
- String[] s = event.getThrowableStrRep();
- if (s != null) {
- for(int i = 0; i < s.length; i++) {
- if (s[i].startsWith("\t")) {
- sqw.write(hdr+TAB+s[i].substring(1));
- } else {
- sqw.write(hdr+s[i]);
- }
- }
- }
- }
- }
-
- /**
- This method returns immediately as options are activated when they
- are set.
- */
- public
- void activateOptions() {
- if (header) {
- getLocalHostname();
- }
- if (layout != null && layout.getHeader() != null) {
- sendLayoutMessage(layout.getHeader());
- }
- layoutHeaderChecked = true;
- }
-
- /**
- The SyslogAppender requires a layout. Hence, this method returns
- true.
-
- @since 0.8.4 */
- public
- boolean requiresLayout() {
- return true;
- }
-
- /**
- The SyslogHost option is the name of the the syslog host
- where log output should go. A non-default port can be specified by
- appending a colon and port number to a host name,
- an IPv4 address or an IPv6 address enclosed in square brackets.
-
- WARNING If the SyslogHost is not set, then this appender
- will fail.
- */
- public
- void setSyslogHost(final String syslogHost) {
- this.sqw = new SyslogQuietWriter(new SyslogWriter(syslogHost),
- syslogFacility, errorHandler);
- //this.stp = new SyslogTracerPrintWriter(sqw);
- this.syslogHost = syslogHost;
- }
-
- /**
- Returns the value of the SyslogHost option.
- */
- public
- String getSyslogHost() {
- return syslogHost;
- }
-
- /**
- Set the syslog facility. This is the Facility option.
-
- The facilityName parameter must be one of the
- strings KERN, USER, MAIL, DAEMON, AUTH, SYSLOG, LPR, NEWS, UUCP,
- CRON, AUTHPRIV, FTP, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4,
- LOCAL5, LOCAL6, LOCAL7. Case is unimportant.
-
- @since 0.8.1 */
- public
- void setFacility(String facilityName) {
- if(facilityName == null)
- return;
-
- syslogFacility = getFacility(facilityName);
- if (syslogFacility == -1) {
- System.err.println("["+facilityName +
- "] is an unknown syslog facility. Defaulting to [USER].");
- syslogFacility = LOG_USER;
- }
-
- this.initSyslogFacilityStr();
-
- // If there is already a sqw, make it use the new facility.
- if(sqw != null) {
- sqw.setSyslogFacility(this.syslogFacility);
- }
- }
-
- /**
- Returns the value of the Facility option.
- */
- public
- String getFacility() {
- return getFacilityString(syslogFacility);
- }
-
- /**
- If the FacilityPrinting option is set to true, the printed
- message will include the facility name of the application. It is
- false by default.
- */
- public
- void setFacilityPrinting(boolean on) {
- facilityPrinting = on;
- }
-
- /**
- Returns the value of the FacilityPrinting option.
- */
- public
- boolean getFacilityPrinting() {
- return facilityPrinting;
- }
-
- /**
- * If true, the appender will generate the HEADER part (that is, timestamp and host name)
- * of the syslog packet. Default value is false for compatibility with existing behavior,
- * however should be true unless there is a specific justification.
- * @since 1.2.15
- */
- public final boolean getHeader() {
- return header;
- }
-
- /**
- * Returns whether the appender produces the HEADER part (that is, timestamp and host name)
- * of the syslog packet.
- * @since 1.2.15
- */
- public final void setHeader(final boolean val) {
- header = val;
- }
-
- /**
- * Get the host name used to identify this appender.
- * @return local host name
- * @since 1.2.15
- */
- private String getLocalHostname() {
- if (localHostname == null) {
- try {
- InetAddress addr = InetAddress.getLocalHost();
- localHostname = addr.getHostName();
- } catch (UnknownHostException uhe) {
- localHostname = "UNKNOWN_HOST";
- }
- }
- return localHostname;
- }
-
- /**
- * Gets HEADER portion of packet.
- * @param timeStamp number of milliseconds after the standard base time.
- * @return HEADER portion of packet, will be zero-length string if header is false.
- * @since 1.2.15
- */
- private String getPacketHeader(final long timeStamp) {
- if (header) {
- StringBuffer buf = new StringBuffer(dateFormat.format(new Date(timeStamp)));
- // RFC 3164 says leading space, not leading zero on days 1-9
- if (buf.charAt(4) == '0') {
- buf.setCharAt(4, ' ');
- }
- buf.append(getLocalHostname());
- buf.append(' ');
- return buf.toString();
- }
- return "";
- }
-
- /**
- * Set header or footer of layout.
- * @param msg message body, may not be null.
- */
- private void sendLayoutMessage(final String msg) {
- if (sqw != null) {
- String packet = msg;
- String hdr = getPacketHeader(new Date().getTime());
- if(facilityPrinting || hdr.length() > 0) {
- StringBuffer buf = new StringBuffer(hdr);
- if(facilityPrinting) {
- buf.append(facilityStr);
- }
- buf.append(msg);
- packet = buf.toString();
- }
- sqw.setLevel(6);
- sqw.write(packet);
- }
- }
-}
diff --git a/java/src/org/apache/log4j/net/TelnetAppender.java b/java/src/org/apache/log4j/net/TelnetAppender.java
deleted file mode 100644
index 23847b5..0000000
--- a/java/src/org/apache/log4j/net/TelnetAppender.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.InterruptedIOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.Vector;
-
-/**
-
The TelnetAppender is a log4j appender that specializes in
- writing to a read-only socket. The output is provided in a
- telnet-friendly way so that a log can be monitored over TCP/IP.
- Clients using telnet connect to the socket and receive log data.
- This is handy for remote monitoring, especially when monitoring a
- servlet.
-
-
Here is a list of the available configuration options:
-
-
-
- | Name |
- Requirement |
- Description |
- Sample Value |
-
-
-
- | Port |
- optional |
- This parameter determines the port to use for announcing log events. The default port is 23 (telnet). |
- 5875 |
-
-
- @author Jay Funnell
-*/
-
-public class TelnetAppender extends AppenderSkeleton {
-
- private SocketHandler sh;
- private int port = 23;
-
- /**
- This appender requires a layout to format the text to the
- attached client(s). */
- public boolean requiresLayout() {
- return true;
- }
-
- /** all of the options have been set, create the socket handler and
- wait for connections. */
- public void activateOptions() {
- try {
- sh = new SocketHandler(port);
- sh.start();
- }
- catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- } catch(RuntimeException e) {
- e.printStackTrace();
- }
- super.activateOptions();
- }
-
- public
- int getPort() {
- return port;
- }
-
- public
- void setPort(int port) {
- this.port = port;
- }
-
-
- /** shuts down the appender. */
- public void close() {
- if (sh != null) {
- sh.close();
- try {
- sh.join();
- } catch(InterruptedException ex) {
- Thread.currentThread().interrupt();
- }
- }
- }
-
- /** Handles a log event. For this appender, that means writing the
- message to each connected client. */
- protected void append(LoggingEvent event) {
- if(sh != null) {
- sh.send(layout.format(event));
- if(layout.ignoresThrowable()) {
- String[] s = event.getThrowableStrRep();
- if (s != null) {
- StringBuffer buf = new StringBuffer();
- for(int i = 0; i < s.length; i++) {
- buf.append(s[i]);
- buf.append("\r\n");
- }
- sh.send(buf.toString());
- }
- }
- }
- }
-
- //---------------------------------------------------------- SocketHandler:
-
- /** The SocketHandler class is used to accept connections from
- clients. It is threaded so that clients can connect/disconnect
- asynchronously. */
- protected class SocketHandler extends Thread {
-
- private Vector writers = new Vector();
- private Vector connections = new Vector();
- private ServerSocket serverSocket;
- private int MAX_CONNECTIONS = 20;
-
- public void finalize() {
- close();
- }
-
- /**
- * make sure we close all network connections when this handler is destroyed.
- * @since 1.2.15
- */
- public void close() {
- synchronized(this) {
- for(Enumeration e = connections.elements();e.hasMoreElements();) {
- try {
- ((Socket)e.nextElement()).close();
- } catch(InterruptedIOException ex) {
- Thread.currentThread().interrupt();
- } catch(IOException ex) {
- } catch(RuntimeException ex) {
- }
- }
- }
-
- try {
- serverSocket.close();
- } catch(InterruptedIOException ex) {
- Thread.currentThread().interrupt();
- } catch(IOException ex) {
- } catch(RuntimeException ex) {
- }
- }
-
- /** sends a message to each of the clients in telnet-friendly output. */
- public synchronized void send(final String message) {
- Iterator ce = connections.iterator();
- for(Iterator e = writers.iterator();e.hasNext();) {
- ce.next();
- PrintWriter writer = (PrintWriter)e.next();
- writer.print(message);
- if(writer.checkError()) {
- ce.remove();
- e.remove();
- }
- }
- }
-
- /**
- Continually accepts client connections. Client connections
- are refused when MAX_CONNECTIONS is reached.
- */
- public void run() {
- while(!serverSocket.isClosed()) {
- try {
- Socket newClient = serverSocket.accept();
- PrintWriter pw = new PrintWriter(newClient.getOutputStream());
- if(connections.size() < MAX_CONNECTIONS) {
- synchronized(this) {
- connections.addElement(newClient);
- writers.addElement(pw);
- pw.print("TelnetAppender v1.0 (" + connections.size()
- + " active connections)\r\n\r\n");
- pw.flush();
- }
- } else {
- pw.print("Too many connections.\r\n");
- pw.flush();
- newClient.close();
- }
- } catch(Exception e) {
- if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- if (!serverSocket.isClosed()) {
- LogLog.error("Encountered error while in SocketHandler loop.", e);
- }
- break;
- }
- }
-
- try {
- serverSocket.close();
- } catch(InterruptedIOException ex) {
- Thread.currentThread().interrupt();
- } catch(IOException ex) {
- }
- }
-
- public SocketHandler(int port) throws IOException {
- serverSocket = new ServerSocket(port);
- setName("TelnetAppender-" + getName() + "-" + port);
- }
-
- }
-}
diff --git a/java/src/org/apache/log4j/net/ZeroConfSupport.java b/java/src/org/apache/log4j/net/ZeroConfSupport.java
deleted file mode 100644
index 32ac971..0000000
--- a/java/src/org/apache/log4j/net/ZeroConfSupport.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.net;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.apache.log4j.helpers.LogLog;
-
-public class ZeroConfSupport {
- private static Object jmDNS = initializeJMDNS();
-
- Object serviceInfo;
- private static Class jmDNSClass;
- private static Class serviceInfoClass;
-
- public ZeroConfSupport(String zone, int port, String name, Map properties) {
- //if version 3 is available, use it to constuct a serviceInfo instance, otherwise support the version1 API
- boolean isVersion3 = false;
- try {
- //create method is in version 3, not version 1
- jmDNSClass.getMethod("create", null);
- isVersion3 = true;
- } catch (NoSuchMethodException e) {
- //no-op
- }
-
- if (isVersion3) {
- LogLog.debug("using JmDNS version 3 to construct serviceInfo instance");
- serviceInfo = buildServiceInfoVersion3(zone, port, name, properties);
- } else {
- LogLog.debug("using JmDNS version 1.0 to construct serviceInfo instance");
- serviceInfo = buildServiceInfoVersion1(zone, port, name, properties);
- }
- }
-
- public ZeroConfSupport(String zone, int port, String name) {
- this(zone, port, name, new HashMap());
- }
-
- private static Object createJmDNSVersion1()
- {
- try {
- return jmDNSClass.newInstance();
- } catch (InstantiationException e) {
- LogLog.warn("Unable to instantiate JMDNS", e);
- } catch (IllegalAccessException e) {
- LogLog.warn("Unable to instantiate JMDNS", e);
- }
- return null;
- }
-
- private static Object createJmDNSVersion3()
- {
- try {
- Method jmDNSCreateMethod = jmDNSClass.getMethod("create", null);
- return jmDNSCreateMethod.invoke(null, null);
- } catch (IllegalAccessException e) {
- LogLog.warn("Unable to instantiate jmdns class", e);
- } catch (NoSuchMethodException e) {
- LogLog.warn("Unable to access constructor", e);
- } catch (InvocationTargetException e) {
- LogLog.warn("Unable to call constructor", e);
- }
- return null;
- }
-
- private Object buildServiceInfoVersion1(String zone, int port, String name, Map properties) {
- //version 1 uses a hashtable
- Hashtable hashtableProperties = new Hashtable(properties);
- try {
- Class[] args = new Class[6];
- args[0] = String.class;
- args[1] = String.class;
- args[2] = int.class;
- args[3] = int.class; //weight (0)
- args[4] = int.class; //priority (0)
- args[5] = Hashtable.class;
- Constructor constructor = serviceInfoClass.getConstructor(args);
- Object[] values = new Object[6];
- values[0] = zone;
- values[1] = name;
- values[2] = new Integer(port);
- values[3] = new Integer(0);
- values[4] = new Integer(0);
- values[5] = hashtableProperties;
- Object result = constructor.newInstance(values);
- LogLog.debug("created serviceinfo: " + result);
- return result;
- } catch (IllegalAccessException e) {
- LogLog.warn("Unable to construct ServiceInfo instance", e);
- } catch (NoSuchMethodException e) {
- LogLog.warn("Unable to get ServiceInfo constructor", e);
- } catch (InstantiationException e) {
- LogLog.warn("Unable to construct ServiceInfo instance", e);
- } catch (InvocationTargetException e) {
- LogLog.warn("Unable to construct ServiceInfo instance", e);
- }
- return null;
- }
-
- private Object buildServiceInfoVersion3(String zone, int port, String name, Map properties) {
- try {
- Class[] args = new Class[6];
- args[0] = String.class; //zone/type
- args[1] = String.class; //display name
- args[2] = int.class; //port
- args[3] = int.class; //weight (0)
- args[4] = int.class; //priority (0)
- args[5] = Map.class;
- Method serviceInfoCreateMethod = serviceInfoClass.getMethod("create", args);
- Object[] values = new Object[6];
- values[0] = zone;
- values[1] = name;
- values[2] = new Integer(port);
- values[3] = new Integer(0);
- values[4] = new Integer(0);
- values[5] = properties;
- Object result = serviceInfoCreateMethod.invoke(null, values);
- LogLog.debug("created serviceinfo: " + result);
- return result;
- } catch (IllegalAccessException e) {
- LogLog.warn("Unable to invoke create method", e);
- } catch (NoSuchMethodException e) {
- LogLog.warn("Unable to find create method", e);
- } catch (InvocationTargetException e) {
- LogLog.warn("Unable to invoke create method", e);
- }
- return null;
- }
-
- public void advertise() {
- try {
- Method method = jmDNSClass.getMethod("registerService", new Class[]{serviceInfoClass});
- method.invoke(jmDNS, new Object[]{serviceInfo});
- LogLog.debug("registered serviceInfo: " + serviceInfo);
- } catch(IllegalAccessException e) {
- LogLog.warn("Unable to invoke registerService method", e);
- } catch(NoSuchMethodException e) {
- LogLog.warn("No registerService method", e);
- } catch(InvocationTargetException e) {
- LogLog.warn("Unable to invoke registerService method", e);
- }
- }
-
- public void unadvertise() {
- try {
- Method method = jmDNSClass.getMethod("unregisterService", new Class[]{serviceInfoClass});
- method.invoke(jmDNS, new Object[]{serviceInfo});
- LogLog.debug("unregistered serviceInfo: " + serviceInfo);
- } catch(IllegalAccessException e) {
- LogLog.warn("Unable to invoke unregisterService method", e);
- } catch(NoSuchMethodException e) {
- LogLog.warn("No unregisterService method", e);
- } catch(InvocationTargetException e) {
- LogLog.warn("Unable to invoke unregisterService method", e);
- }
- }
-
- private static Object initializeJMDNS() {
- try {
- jmDNSClass = Class.forName("javax.jmdns.JmDNS");
- serviceInfoClass = Class.forName("javax.jmdns.ServiceInfo");
- } catch (ClassNotFoundException e) {
- LogLog.warn("JmDNS or serviceInfo class not found", e);
- }
-
- //if version 3 is available, use it to constuct a serviceInfo instance, otherwise support the version1 API
- boolean isVersion3 = false;
- try {
- //create method is in version 3, not version 1
- jmDNSClass.getMethod("create", null);
- isVersion3 = true;
- } catch (NoSuchMethodException e) {
- //no-op
- }
-
- if (isVersion3) {
- return createJmDNSVersion3();
- } else {
- return createJmDNSVersion1();
- }
- }
-
- public static Object getJMDNSInstance() {
- return jmDNS;
- }
-}
diff --git a/java/src/org/apache/log4j/net/package.html b/java/src/org/apache/log4j/net/package.html
deleted file mode 100644
index 1d2e965..0000000
--- a/java/src/org/apache/log4j/net/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-Package for remote logging.
-
-
-
-
-Last modified: Tue Mar 21 20:28:14 MET 2000
-
-
diff --git a/java/src/org/apache/log4j/nt/NTEventLogAppender.java b/java/src/org/apache/log4j/nt/NTEventLogAppender.java
deleted file mode 100644
index 9f80add..0000000
--- a/java/src/org/apache/log4j/nt/NTEventLogAppender.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.nt;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Layout;
-import org.apache.log4j.TTCCLayout;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- Append to the NT event log system.
-
- WARNING This appender can only be installed and used on a
- Windows system.
-
-
Do not forget to place NTEventLogAppender.dll,
- NTEventLogAppender.amd64.dll, NTEventLogAppender.ia64.dll
- or NTEventLogAppender.x86.dll as appropriate in a
- directory that is on the PATH of the Windows system. Otherwise, you
- will get a java.lang.UnsatisfiedLinkError.
-
- @author Chris Taylor
- @author Jim Cakalic */
-public class NTEventLogAppender extends AppenderSkeleton {
- private int _handle = 0;
-
- private String source = null;
- private String server = null;
-
-
- public NTEventLogAppender() {
- this(null, null, null);
- }
-
- public NTEventLogAppender(String source) {
- this(null, source, null);
- }
-
- public NTEventLogAppender(String server, String source) {
- this(server, source, null);
- }
-
- public NTEventLogAppender(Layout layout) {
- this(null, null, layout);
- }
-
- public NTEventLogAppender(String source, Layout layout) {
- this(null, source, layout);
- }
-
- public NTEventLogAppender(String server, String source, Layout layout) {
- if (source == null) {
- source = "Log4j";
- }
- if (layout == null) {
- this.layout = new TTCCLayout();
- } else {
- this.layout = layout;
- }
-
- try {
- _handle = registerEventSource(server, source);
- } catch (Exception e) {
- e.printStackTrace();
- _handle = 0;
- }
- }
-
- public
- void close() {
- // unregister ...
- }
-
- public
- void activateOptions() {
- if (source != null) {
- try {
- _handle = registerEventSource(server, source);
- } catch (Exception e) {
- LogLog.error("Could not register event source.", e);
- _handle = 0;
- }
- }
- }
-
-
- public void append(LoggingEvent event) {
-
- StringBuffer sbuf = new StringBuffer();
-
- sbuf.append(layout.format(event));
- if(layout.ignoresThrowable()) {
- String[] s = event.getThrowableStrRep();
- if (s != null) {
- int len = s.length;
- for(int i = 0; i < len; i++) {
- sbuf.append(s[i]);
- }
- }
- }
- // Normalize the log message level into the supported categories
- int nt_category = event.getLevel().toInt();
-
- // Anything above FATAL or below DEBUG is labeled as INFO.
- //if (nt_category > FATAL || nt_category < DEBUG) {
- // nt_category = INFO;
- //}
- reportEvent(_handle, sbuf.toString(), nt_category);
- }
-
-
- public
- void finalize() {
- deregisterEventSource(_handle);
- _handle = 0;
- }
-
- /**
- The Source option which names the source of the event. The
- current value of this constant is Source.
- */
- public
- void setSource(String source) {
- this.source = source.trim();
- }
-
- public
- String getSource() {
- return source;
- }
-
-/**
- The NTEventLogAppender requires a layout. Hence,
- this method always returns true. */
- public
- boolean requiresLayout() {
- return true;
- }
-
- native private int registerEventSource(String server, String source);
- native private void reportEvent(int handle, String message, int level);
- native private void deregisterEventSource(int handle);
-
- static {
- String[] archs;
- try {
- archs = new String[] { System.getProperty("os.arch")};
- } catch(SecurityException e) {
- archs = new String[] { "amd64", "ia64", "x86"};
- }
- boolean loaded = false;
- for(int i = 0; i < archs.length; i++) {
- try {
- System.loadLibrary("NTEventLogAppender." + archs[i]);
- loaded = true;
- break;
- } catch(java.lang.UnsatisfiedLinkError e) {
- loaded = false;
- }
- }
- if (!loaded) {
- System.loadLibrary("NTEventLogAppender");
- }
-}
-}
diff --git a/java/src/org/apache/log4j/nt/package.html b/java/src/org/apache/log4j/nt/package.html
deleted file mode 100644
index a50567c..0000000
--- a/java/src/org/apache/log4j/nt/package.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-Package for NT event logging.
-
-
-
-
-Last modified: Sat Apr 29 14:30:12 MDT 2000
-
-
diff --git a/java/src/org/apache/log4j/or/DefaultRenderer.java b/java/src/org/apache/log4j/or/DefaultRenderer.java
deleted file mode 100644
index 7fe4ac6..0000000
--- a/java/src/org/apache/log4j/or/DefaultRenderer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.or;
-
-/**
- The default Renderer renders objects by calling their
- toString method.
-
- @author Ceki Gülcü
- @since 1.0 */
-class DefaultRenderer implements ObjectRenderer {
-
- DefaultRenderer() {
- }
-
- /**
- Render the object passed as parameter by calling its
- toString method. */
- public
- String doRender(final Object o) {
- try {
- return o.toString();
- } catch(Exception ex) {
- return ex.toString();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/or/ObjectRenderer.java b/java/src/org/apache/log4j/or/ObjectRenderer.java
deleted file mode 100644
index 8ad9943..0000000
--- a/java/src/org/apache/log4j/or/ObjectRenderer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.or;
-
-/**
- Implement this interface in order to render objects as strings.
-
- @author Ceki Gülcü
- @since 1.0 */
-public interface ObjectRenderer {
-
- /**
- Render the object passed as parameter as a String.
- */
- public
- String doRender(Object o);
-}
diff --git a/java/src/org/apache/log4j/or/RendererMap.java b/java/src/org/apache/log4j/or/RendererMap.java
deleted file mode 100644
index f60bd5a..0000000
--- a/java/src/org/apache/log4j/or/RendererMap.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.or;
-
-import org.apache.log4j.spi.RendererSupport;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.OptionConverter;
-import java.util.Hashtable;
-
-/**
- Map class objects to an {@link ObjectRenderer}.
-
- @author Ceki Gülcü
- @since version 1.0 */
-public class RendererMap {
-
- Hashtable map;
-
- static ObjectRenderer defaultRenderer = new DefaultRenderer();
-
- public
- RendererMap() {
- map = new Hashtable();
- }
-
- /**
- Add a renderer to a hierarchy passed as parameter.
- */
- static
- public
- void addRenderer(RendererSupport repository, String renderedClassName,
- String renderingClassName) {
- LogLog.debug("Rendering class: ["+renderingClassName+"], Rendered class: ["+
- renderedClassName+"].");
- ObjectRenderer renderer = (ObjectRenderer)
- OptionConverter.instantiateByClassName(renderingClassName,
- ObjectRenderer.class,
- null);
- if(renderer == null) {
- LogLog.error("Could not instantiate renderer ["+renderingClassName+"].");
- return;
- } else {
- try {
- Class renderedClass = Loader.loadClass(renderedClassName);
- repository.setRenderer(renderedClass, renderer);
- } catch(ClassNotFoundException e) {
- LogLog.error("Could not find class ["+renderedClassName+"].", e);
- }
- }
- }
-
-
- /**
- Find the appropriate renderer for the class type of the
- o parameter. This is accomplished by calling the
- {@link #get(Class)} method. Once a renderer is found, it is
- applied on the object o and the result is returned
- as a {@link String}. */
- public
- String findAndRender(Object o) {
- if(o == null)
- return null;
- else
- return get(o.getClass()).doRender(o);
- }
-
-
- /**
- Syntactic sugar method that calls {@link #get(Class)} with the
- class of the object parameter. */
- public
- ObjectRenderer get(Object o) {
- if(o == null)
- return null;
- else
- return get(o.getClass());
- }
-
-
- /**
- Search the parents of clazz for a renderer. The
- renderer closest in the hierarchy will be returned. If no
- renderers could be found, then the default renderer is returned.
-
- The search first looks for a renderer configured for
- clazz. If a renderer could not be found, then the
- search continues by looking at all the interfaces implemented by
- clazz including the super-interfaces of each
- interface. If a renderer cannot be found, then the search looks
- for a renderer defined for the parent (superclass) of
- clazz. If that fails, then all the interfaces
- implemented by the parent of clazz are searched and
- so on.
-
-
For example, if A0, A1, A2 are classes and X0, X1, X2, Y0, Y1
- are interfaces where A2 extends A1 which in turn extends A0 and
- similarly X2 extends X1 which extends X0 and Y1 extends Y0. Let
- us also assume that A1 implements the Y0 interface and that A2
- implements the X2 interface.
-
-
The table below shows the results returned by the
- get(A2.class) method depending on the renderers
- added to the map.
-
-
- | Added renderers | Value returned by get(A2.class) |
-
-
|---|
A0Renderer
- | A0Renderer
-
- |
A0Renderer, A1Renderer
- | A1Renderer
-
- |
X0Renderer
- | X0Renderer
-
- |
A1Renderer, X0Renderer
- | X0Renderer
-
- |
-
- This search algorithm is not the most natural, although it is
- particularly easy to implement. Future log4j versions
- may implement a more intuitive search
- algorithm. However, the present algorithm should be acceptable in
- the vast majority of circumstances.
-
- */
- public
- ObjectRenderer get(Class clazz) {
- //System.out.println("\nget: "+clazz);
- ObjectRenderer r = null;
- for(Class c = clazz; c != null; c = c.getSuperclass()) {
- //System.out.println("Searching for class: "+c);
- r = (ObjectRenderer) map.get(c);
- if(r != null) {
- return r;
- }
- r = searchInterfaces(c);
- if(r != null)
- return r;
- }
- return defaultRenderer;
- }
-
- ObjectRenderer searchInterfaces(Class c) {
- //System.out.println("Searching interfaces of class: "+c);
-
- ObjectRenderer r = (ObjectRenderer) map.get(c);
- if(r != null) {
- return r;
- } else {
- Class[] ia = c.getInterfaces();
- for(int i = 0; i < ia.length; i++) {
- r = searchInterfaces(ia[i]);
- if(r != null)
- return r;
- }
- }
- return null;
- }
-
-
- public
- ObjectRenderer getDefaultRenderer() {
- return defaultRenderer;
- }
-
-
- public
- void clear() {
- map.clear();
- }
-
- /**
- Register an {@link ObjectRenderer} for clazz.
- */
- public
- void put(Class clazz, ObjectRenderer or) {
- map.put(clazz, or);
- }
-}
diff --git a/java/src/org/apache/log4j/or/ThreadGroupRenderer.java b/java/src/org/apache/log4j/or/ThreadGroupRenderer.java
deleted file mode 100644
index 026ff4f..0000000
--- a/java/src/org/apache/log4j/or/ThreadGroupRenderer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.or;
-
-import org.apache.log4j.Layout;
-
-
-/**
- Render {@link ThreadGroup} objects in a format similar to the
- information output by the {@link ThreadGroup#list} method.
- @author Ceki Gülcü
- @since 1.0 */
-public class ThreadGroupRenderer implements ObjectRenderer {
-
- public
- ThreadGroupRenderer() {
- }
-
- /**
- Render a {@link ThreadGroup} object similar to the way that the
- {@link ThreadGroup#list} method output information.
-
-
The output of a simple program consisting of one
- main thread is:
-
- java.lang.ThreadGroup[name=main, maxpri=10]
- Thread=[main,5,false]
-
-
- The boolean value in thread information is the value returned
- by {@link Thread#isDaemon}.
-
- */
- public
- String doRender(Object o) {
- if(o instanceof ThreadGroup) {
- StringBuffer sbuf = new StringBuffer();
- ThreadGroup tg = (ThreadGroup) o;
- sbuf.append("java.lang.ThreadGroup[name=");
- sbuf.append(tg.getName());
- sbuf.append(", maxpri=");
- sbuf.append(tg.getMaxPriority());
- sbuf.append("]");
- Thread[] t = new Thread[tg.activeCount()];
- tg.enumerate(t);
- for(int i = 0; i < t.length; i++) {
- sbuf.append(Layout.LINE_SEP);
- sbuf.append(" Thread=[");
- sbuf.append(t[i].getName());
- sbuf.append(",");
- sbuf.append(t[i].getPriority());
- sbuf.append(",");
- sbuf.append(t[i].isDaemon());
- sbuf.append("]");
- }
- return sbuf.toString();
- } else {
- try {
- // this is the best we can do
- return o.toString();
- } catch(Exception ex) {
- return ex.toString();
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/or/jms/MessageRenderer.java b/java/src/org/apache/log4j/or/jms/MessageRenderer.java
deleted file mode 100644
index e3140cb..0000000
--- a/java/src/org/apache/log4j/or/jms/MessageRenderer.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.or.jms;
-
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.or.ObjectRenderer;
-
-import javax.jms.Message;
-import javax.jms.JMSException;
-import javax.jms.DeliveryMode;
-
-/**
- Render javax.jms.Message objects.
-
- @author Ceki Gülcü
- @since 1.0 */
-public class MessageRenderer implements ObjectRenderer {
-
- public
- MessageRenderer() {
- }
-
-
- /**
- Render a {@link javax.jms.Message}.
- */
- public
- String doRender(Object o) {
- if(o instanceof Message) {
- StringBuffer sbuf = new StringBuffer();
- Message m = (Message) o;
- try {
- sbuf.append("DeliveryMode=");
- switch(m.getJMSDeliveryMode()) {
- case DeliveryMode.NON_PERSISTENT :
- sbuf.append("NON_PERSISTENT");
- break;
- case DeliveryMode.PERSISTENT :
- sbuf.append("PERSISTENT");
- break;
- default: sbuf.append("UNKNOWN");
- }
- sbuf.append(", CorrelationID=");
- sbuf.append(m.getJMSCorrelationID());
-
- sbuf.append(", Destination=");
- sbuf.append(m.getJMSDestination());
-
- sbuf.append(", Expiration=");
- sbuf.append(m.getJMSExpiration());
-
- sbuf.append(", MessageID=");
- sbuf.append(m.getJMSMessageID());
-
- sbuf.append(", Priority=");
- sbuf.append(m.getJMSPriority());
-
- sbuf.append(", Redelivered=");
- sbuf.append(m.getJMSRedelivered());
-
- sbuf.append(", ReplyTo=");
- sbuf.append(m.getJMSReplyTo());
-
- sbuf.append(", Timestamp=");
- sbuf.append(m.getJMSTimestamp());
-
- sbuf.append(", Type=");
- sbuf.append(m.getJMSType());
-
- //Enumeration enum = m.getPropertyNames();
- //while(enum.hasMoreElements()) {
- // String key = (String) enum.nextElement();
- // sbuf.append("; "+key+"=");
- // sbuf.append(m.getStringProperty(key));
- //}
-
- } catch(JMSException e) {
- LogLog.error("Could not parse Message.", e);
- }
- return sbuf.toString();
- } else {
- return o.toString();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/or/jms/package.html b/java/src/org/apache/log4j/or/jms/package.html
deleted file mode 100644
index d4db1c8..0000000
--- a/java/src/org/apache/log4j/or/jms/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- This package contains the MessageRenderer which renders objects of
- type javax.jms.Message.
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/or/package.html b/java/src/org/apache/log4j/or/package.html
deleted file mode 100644
index 17fd176..0000000
--- a/java/src/org/apache/log4j/or/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-org.apache.log4j.or package
-
-
-
-
-ObjectRenders are resposible for rendering messages depending on
-their class type.
-
-
-
diff --git a/java/src/org/apache/log4j/or/sax/AttributesRenderer.java b/java/src/org/apache/log4j/or/sax/AttributesRenderer.java
deleted file mode 100644
index b5d088c..0000000
--- a/java/src/org/apache/log4j/or/sax/AttributesRenderer.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.or.sax;
-
-import org.apache.log4j.or.ObjectRenderer;
-
-import org.xml.sax.Attributes;
-
-/**
- Render org.xml.sax.Attributes objects.
-
- @author Ceki Gülcü
- @since 1.2 */
-public class AttributesRenderer implements ObjectRenderer {
-
- public
- AttributesRenderer() {
- }
-
-
- /**
- Render a {@link org.xml.sax.Attributes}.
- */
- public
- String doRender(Object o) {
- if(o instanceof Attributes) {
- StringBuffer sbuf = new StringBuffer();
- Attributes a = (Attributes) o;
- int len = a.getLength();
- boolean first = true;
- for(int i = 0; i < len; i++) {
- if(first) {
- first = false;
- } else {
- sbuf.append(", ");
- }
- sbuf.append(a.getQName(i));
- sbuf.append('=');
- sbuf.append(a.getValue(i));
- }
- return sbuf.toString();
- } else {
- try {
- return o.toString();
- } catch(Exception ex) {
- return ex.toString();
- }
- }
- }
-}
-
diff --git a/java/src/org/apache/log4j/or/sax/package.html b/java/src/org/apache/log4j/or/sax/package.html
deleted file mode 100644
index a597141..0000000
--- a/java/src/org/apache/log4j/or/sax/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- This package contains the AttributesRenderer which renders object of
- class org.xml.sax.Attributes.
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/package.html b/java/src/org/apache/log4j/package.html
deleted file mode 100644
index 3cf6e3e..0000000
--- a/java/src/org/apache/log4j/package.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-The main log4j package.
-
-
-
diff --git a/java/src/org/apache/log4j/pattern/BridgePatternConverter.java b/java/src/org/apache/log4j/pattern/BridgePatternConverter.java
deleted file mode 100644
index 96068d5..0000000
--- a/java/src/org/apache/log4j/pattern/BridgePatternConverter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * The class implements the pre log4j 1.3 org.apache.log4j.helpers.PatternConverter
- * contract by delegating to the log4j 1.3 pattern implementation.
- *
- *
- * @author Curt Arnold
- *
- */
-public final class BridgePatternConverter
- extends org.apache.log4j.helpers.PatternConverter {
- /**
- * Pattern converters.
- */
- private LoggingEventPatternConverter[] patternConverters;
-
- /**
- * Field widths and alignment corresponding to pattern converters.
- */
- private FormattingInfo[] patternFields;
-
- /**
- * Does pattern process exceptions.
- */
- private boolean handlesExceptions;
-
- /**
- * Create a new instance.
- * @param pattern pattern, may not be null.
- */
- public BridgePatternConverter(
- final String pattern) {
- next = null;
- handlesExceptions = false;
-
- List converters = new ArrayList();
- List fields = new ArrayList();
- Map converterRegistry = null;
-
- PatternParser.parse(
- pattern, converters, fields, converterRegistry,
- PatternParser.getPatternLayoutRules());
-
- patternConverters = new LoggingEventPatternConverter[converters.size()];
- patternFields = new FormattingInfo[converters.size()];
-
- int i = 0;
- Iterator converterIter = converters.iterator();
- Iterator fieldIter = fields.iterator();
-
- while (converterIter.hasNext()) {
- Object converter = converterIter.next();
-
- if (converter instanceof LoggingEventPatternConverter) {
- patternConverters[i] = (LoggingEventPatternConverter) converter;
- handlesExceptions |= patternConverters[i].handlesThrowable();
- } else {
- patternConverters[i] =
- new org.apache.log4j.pattern.LiteralPatternConverter("");
- }
-
- if (fieldIter.hasNext()) {
- patternFields[i] = (FormattingInfo) fieldIter.next();
- } else {
- patternFields[i] = FormattingInfo.getDefault();
- }
-
- i++;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- protected String convert(final LoggingEvent event) {
- //
- // code should be unreachable.
- //
- StringBuffer sbuf = new StringBuffer();
- format(sbuf, event);
-
- return sbuf.toString();
- }
-
- /**
- Format event to string buffer.
- @param sbuf string buffer to receive formatted event, may not be null.
- @param e event to format, may not be null.
- */
- public void format(final StringBuffer sbuf, final LoggingEvent e) {
- for (int i = 0; i < patternConverters.length; i++) {
- int startField = sbuf.length();
- patternConverters[i].format(e, sbuf);
- patternFields[i].format(startField, sbuf);
- }
- }
-
- /**
- * Will return false if any of the conversion specifiers in the pattern
- * handles {@link Exception Exceptions}.
- * @return true if the pattern formats any information from exceptions.
- */
- public boolean ignoresThrowable() {
- return !handlesExceptions;
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/BridgePatternParser.java b/java/src/org/apache/log4j/pattern/BridgePatternParser.java
deleted file mode 100644
index 1c0d4e7..0000000
--- a/java/src/org/apache/log4j/pattern/BridgePatternParser.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-/**
- * The class implements the pre log4j 1.3 org.apache.log4j.helpers.PatternConverter
- * contract by delegating to the log4j 1.3 pattern implementation.
- *
- *
- * @author Curt Arnold
- *
- */
-public final class BridgePatternParser
- extends org.apache.log4j.helpers.PatternParser {
-
-
- /**
- * Create a new instance.
- * @param conversionPattern pattern, may not be null.
- */
- public BridgePatternParser(
- final String conversionPattern) {
- super(conversionPattern);
- }
-
- /**
- * Create new pattern converter.
- * @return pattern converter.
- */
- public org.apache.log4j.helpers.PatternConverter parse() {
- return new BridgePatternConverter(pattern);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/CachedDateFormat.java b/java/src/org/apache/log4j/pattern/CachedDateFormat.java
deleted file mode 100644
index 9a468aa..0000000
--- a/java/src/org/apache/log4j/pattern/CachedDateFormat.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import java.text.DateFormat;
-import java.text.FieldPosition;
-import java.text.NumberFormat;
-import java.text.ParsePosition;
-import java.util.Date;
-import java.util.TimeZone;
-
-
-/**
- * CachedDateFormat optimizes the performance of a wrapped
- * DateFormat. The implementation is not thread-safe.
- * If the millisecond pattern is not recognized,
- * the class will only use the cache if the
- * same value is requested.
- *
- */
-public final class CachedDateFormat extends DateFormat {
- /**
- * Serialization version.
- */
- private static final long serialVersionUID = 1;
- /**
- * Constant used to represent that there was no change
- * observed when changing the millisecond count.
- */
- public static final int NO_MILLISECONDS = -2;
-
- /**
- * Supported digit set. If the wrapped DateFormat uses
- * a different unit set, the millisecond pattern
- * will not be recognized and duplicate requests
- * will use the cache.
- */
- private static final String DIGITS = "0123456789";
-
- /**
- * Constant used to represent that there was an
- * observed change, but was an expected change.
- */
- public static final int UNRECOGNIZED_MILLISECONDS = -1;
-
- /**
- * First magic number used to detect the millisecond position.
- */
- private static final int MAGIC1 = 654;
-
- /**
- * Expected representation of first magic number.
- */
- private static final String MAGICSTRING1 = "654";
-
- /**
- * Second magic number used to detect the millisecond position.
- */
- private static final int MAGIC2 = 987;
-
- /**
- * Expected representation of second magic number.
- */
- private static final String MAGICSTRING2 = "987";
-
- /**
- * Expected representation of 0 milliseconds.
- */
- private static final String ZERO_STRING = "000";
-
- /**
- * Wrapped formatter.
- */
- private final DateFormat formatter;
-
- /**
- * Index of initial digit of millisecond pattern or
- * UNRECOGNIZED_MILLISECONDS or NO_MILLISECONDS.
- */
- private int millisecondStart;
-
- /**
- * Integral second preceding the previous convered Date.
- */
- private long slotBegin;
-
- /**
- * Cache of previous conversion.
- */
- private StringBuffer cache = new StringBuffer(50);
-
- /**
- * Maximum validity period for the cache.
- * Typically 1, use cache for duplicate requests only, or
- * 1000, use cache for requests within the same integral second.
- */
- private final int expiration;
-
- /**
- * Date requested in previous conversion.
- */
- private long previousTime;
-
- /**
- * Scratch date object used to minimize date object creation.
- */
- private final Date tmpDate = new Date(0);
-
- /**
- * Creates a new CachedDateFormat object.
- * @param dateFormat Date format, may not be null.
- * @param expiration maximum cached range in milliseconds.
- * If the dateFormat is known to be incompatible with the
- * caching algorithm, use a value of 0 to totally disable
- * caching or 1 to only use cache for duplicate requests.
- */
- public CachedDateFormat(final DateFormat dateFormat, final int expiration) {
- if (dateFormat == null) {
- throw new IllegalArgumentException("dateFormat cannot be null");
- }
-
- if (expiration < 0) {
- throw new IllegalArgumentException("expiration must be non-negative");
- }
-
- formatter = dateFormat;
- this.expiration = expiration;
- millisecondStart = 0;
-
- //
- // set the previousTime so the cache will be invalid
- // for the next request.
- previousTime = Long.MIN_VALUE;
- slotBegin = Long.MIN_VALUE;
- }
-
- /**
- * Finds start of millisecond field in formatted time.
- * @param time long time, must be integral number of seconds
- * @param formatted String corresponding formatted string
- * @param formatter DateFormat date format
- * @return int position in string of first digit of milliseconds,
- * -1 indicates no millisecond field, -2 indicates unrecognized
- * field (likely RelativeTimeDateFormat)
- */
- public static int findMillisecondStart(
- final long time, final String formatted, final DateFormat formatter) {
- long slotBegin = (time / 1000) * 1000;
-
- if (slotBegin > time) {
- slotBegin -= 1000;
- }
-
- int millis = (int) (time - slotBegin);
-
- int magic = MAGIC1;
- String magicString = MAGICSTRING1;
-
- if (millis == MAGIC1) {
- magic = MAGIC2;
- magicString = MAGICSTRING2;
- }
-
- String plusMagic = formatter.format(new Date(slotBegin + magic));
-
- /**
- * If the string lengths differ then
- * we can't use the cache except for duplicate requests.
- */
- if (plusMagic.length() != formatted.length()) {
- return UNRECOGNIZED_MILLISECONDS;
- } else {
- // find first difference between values
- for (int i = 0; i < formatted.length(); i++) {
- if (formatted.charAt(i) != plusMagic.charAt(i)) {
- //
- // determine the expected digits for the base time
- StringBuffer formattedMillis = new StringBuffer("ABC");
- millisecondFormat(millis, formattedMillis, 0);
-
- String plusZero = formatter.format(new Date(slotBegin));
-
- // If the next 3 characters match the magic
- // string and the expected string
- if (
- (plusZero.length() == formatted.length())
- && magicString.regionMatches(
- 0, plusMagic, i, magicString.length())
- && formattedMillis.toString().regionMatches(
- 0, formatted, i, magicString.length())
- && ZERO_STRING.regionMatches(
- 0, plusZero, i, ZERO_STRING.length())) {
- return i;
- } else {
- return UNRECOGNIZED_MILLISECONDS;
- }
- }
- }
- }
-
- return NO_MILLISECONDS;
- }
-
- /**
- * Formats a Date into a date/time string.
- *
- * @param date the date to format.
- * @param sbuf the string buffer to write to.
- * @param fieldPosition remains untouched.
- * @return the formatted time string.
- */
- public StringBuffer format(
- Date date, StringBuffer sbuf, FieldPosition fieldPosition) {
- format(date.getTime(), sbuf);
-
- return sbuf;
- }
-
- /**
- * Formats a millisecond count into a date/time string.
- *
- * @param now Number of milliseconds after midnight 1 Jan 1970 GMT.
- * @param buf the string buffer to write to.
- * @return the formatted time string.
- */
- public StringBuffer format(long now, StringBuffer buf) {
- //
- // If the current requested time is identical to the previously
- // requested time, then append the cache contents.
- //
- if (now == previousTime) {
- buf.append(cache);
-
- return buf;
- }
-
- //
- // If millisecond pattern was not unrecognized
- // (that is if it was found or milliseconds did not appear)
- //
- if (millisecondStart != UNRECOGNIZED_MILLISECONDS &&
- // Check if the cache is still valid.
- // If the requested time is within the same integral second
- // as the last request and a shorter expiration was not requested.
- (now < (slotBegin + expiration)) && (now >= slotBegin)
- && (now < (slotBegin + 1000L))) {
- //
- // if there was a millisecond field then update it
- //
- if (millisecondStart >= 0) {
- millisecondFormat((int) (now - slotBegin), cache, millisecondStart);
- }
-
- //
- // update the previously requested time
- // (the slot begin should be unchanged)
- previousTime = now;
- buf.append(cache);
-
- return buf;
- }
-
- //
- // could not use previous value.
- // Call underlying formatter to format date.
- cache.setLength(0);
- tmpDate.setTime(now);
- cache.append(formatter.format(tmpDate));
- buf.append(cache);
- previousTime = now;
- slotBegin = (previousTime / 1000) * 1000;
-
- if (slotBegin > previousTime) {
- slotBegin -= 1000;
- }
-
- //
- // if the milliseconds field was previous found
- // then reevaluate in case it moved.
- //
- if (millisecondStart >= 0) {
- millisecondStart =
- findMillisecondStart(now, cache.toString(), formatter);
- }
-
- return buf;
- }
-
- /**
- * Formats a count of milliseconds (0-999) into a numeric representation.
- * @param millis Millisecond coun between 0 and 999.
- * @param buf String buffer, may not be null.
- * @param offset Starting position in buffer, the length of the
- * buffer must be at least offset + 3.
- */
- private static void millisecondFormat(
- final int millis, final StringBuffer buf, final int offset) {
- buf.setCharAt(offset, DIGITS.charAt(millis / 100));
- buf.setCharAt(offset + 1, DIGITS.charAt((millis / 10) % 10));
- buf.setCharAt(offset + 2, DIGITS.charAt(millis % 10));
- }
-
- /**
- * Set timezone.
- *
- * Setting the timezone using getCalendar().setTimeZone()
- * will likely cause caching to misbehave.
- * @param timeZone TimeZone new timezone
- */
- public void setTimeZone(final TimeZone timeZone) {
- formatter.setTimeZone(timeZone);
- previousTime = Long.MIN_VALUE;
- slotBegin = Long.MIN_VALUE;
- }
-
- /**
- * This method is delegated to the formatter which most
- * likely returns null.
- * @param s string representation of date.
- * @param pos field position, unused.
- * @return parsed date, likely null.
- */
- public Date parse(String s, ParsePosition pos) {
- return formatter.parse(s, pos);
- }
-
- /**
- * Gets number formatter.
- *
- * @return NumberFormat number formatter
- */
- public NumberFormat getNumberFormat() {
- return formatter.getNumberFormat();
- }
-
- /**
- * Gets maximum cache validity for the specified SimpleDateTime
- * conversion pattern.
- * @param pattern conversion pattern, may not be null.
- * @return Duration in milliseconds from an integral second
- * that the cache will return consistent results.
- */
- public static int getMaximumCacheValidity(final String pattern) {
- //
- // If there are more "S" in the pattern than just one "SSS" then
- // (for example, "HH:mm:ss,SSS SSS"), then set the expiration to
- // one millisecond which should only perform duplicate request caching.
- //
- int firstS = pattern.indexOf('S');
-
- if ((firstS >= 0) && (firstS != pattern.lastIndexOf("SSS"))) {
- return 1;
- }
-
- return 1000;
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/ClassNamePatternConverter.java b/java/src/org/apache/log4j/pattern/ClassNamePatternConverter.java
deleted file mode 100644
index 7a24916..0000000
--- a/java/src/org/apache/log4j/pattern/ClassNamePatternConverter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Formats the class name of the site of the logging request.
- *
- * @author Ceki Gülcü
- */
-public final class ClassNamePatternConverter extends NamePatternConverter {
- /**
- * Private constructor.
- * @param options options, may be null.
- */
- private ClassNamePatternConverter(
- final String[] options) {
- super("Class Name", "class name", options);
- }
-
- /**
- * Gets an instance of ClassNamePatternConverter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static ClassNamePatternConverter newInstance(
- final String[] options) {
- return new ClassNamePatternConverter(options);
- }
-
- /**
- * Format a logging event.
- * @param event event to format.
- * @param toAppendTo string buffer to which class name will be appended.
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- final int initialLength = toAppendTo.length();
- LocationInfo li = event.getLocationInformation();
-
- if (li == null) {
- toAppendTo.append(LocationInfo.NA);
- } else {
- toAppendTo.append(li.getClassName());
- }
-
- abbreviate(initialLength, toAppendTo);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/DatePatternConverter.java b/java/src/org/apache/log4j/pattern/DatePatternConverter.java
deleted file mode 100644
index 7162fe7..0000000
--- a/java/src/org/apache/log4j/pattern/DatePatternConverter.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.text.SimpleDateFormat;
-import java.text.DateFormat;
-import java.text.FieldPosition;
-import java.text.ParsePosition;
-import java.util.Date;
-import java.util.TimeZone;
-
-
-/**
- * Convert and format the event's date in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class DatePatternConverter extends LoggingEventPatternConverter {
- /**
- * ABSOLUTE string literal.
- */
- private static final String ABSOLUTE_FORMAT = "ABSOLUTE";
- /**
- * SimpleTimePattern for ABSOLUTE.
- */
- private static final String ABSOLUTE_TIME_PATTERN = "HH:mm:ss,SSS";
-
-
- /**
- * DATE string literal.
- */
- private static final String DATE_AND_TIME_FORMAT = "DATE";
- /**
- * SimpleTimePattern for DATE.
- */
- private static final String DATE_AND_TIME_PATTERN = "dd MMM yyyy HH:mm:ss,SSS";
-
- /**
- * ISO8601 string literal.
- */
- private static final String ISO8601_FORMAT = "ISO8601";
- /**
- * SimpleTimePattern for ISO8601.
- */
- private static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
- /**
- * Date format.
- */
- private final CachedDateFormat df;
-
- /**
- * This class wraps a DateFormat and forces the time zone to the
- * default time zone before each format and parse request.
- */
- private static class DefaultZoneDateFormat extends DateFormat {
- /**
- * Serialization version ID.
- */
- private static final long serialVersionUID = 1;
- /**
- * Wrapped instance of DateFormat.
- */
- private final DateFormat dateFormat;
-
- /**
- * Construct new instance.
- * @param format format, may not be null.
- */
- public DefaultZoneDateFormat(final DateFormat format) {
- dateFormat = format;
- }
-
- /**
- * @{inheritDoc}
- */
- public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
- dateFormat.setTimeZone(TimeZone.getDefault());
- return dateFormat.format(date, toAppendTo, fieldPosition);
- }
-
- /**
- * @{inheritDoc}
- */
- public Date parse(String source, ParsePosition pos) {
- dateFormat.setTimeZone(TimeZone.getDefault());
- return dateFormat.parse(source, pos);
- }
- }
-
- /**
- * Private constructor.
- * @param options options, may be null.
- */
- private DatePatternConverter(final String[] options) {
- super("Date", "date");
-
- String patternOption;
-
- if ((options == null) || (options.length == 0)) {
- // the branch could be optimized, but here we are making explicit
- // that null values for patternOption are allowed.
- patternOption = null;
- } else {
- patternOption = options[0];
- }
-
- String pattern;
-
- if (
- (patternOption == null)
- || patternOption.equalsIgnoreCase(ISO8601_FORMAT)) {
- pattern = ISO8601_PATTERN;
- } else if (patternOption.equalsIgnoreCase(ABSOLUTE_FORMAT)) {
- pattern = ABSOLUTE_TIME_PATTERN;
- } else if (patternOption.equalsIgnoreCase(DATE_AND_TIME_FORMAT)) {
- pattern = DATE_AND_TIME_PATTERN;
- } else {
- pattern = patternOption;
- }
-
- int maximumCacheValidity = 1000;
- DateFormat simpleFormat = null;
-
- try {
- simpleFormat = new SimpleDateFormat(pattern);
- maximumCacheValidity = CachedDateFormat.getMaximumCacheValidity(pattern);
- } catch (IllegalArgumentException e) {
- LogLog.warn(
- "Could not instantiate SimpleDateFormat with pattern "
- + patternOption, e);
-
- // default to the ISO8601 format
- simpleFormat = new SimpleDateFormat(ISO8601_PATTERN);
- }
-
- // if the option list contains a TZ option, then set it.
- if ((options != null) && (options.length > 1)) {
- TimeZone tz = TimeZone.getTimeZone((String) options[1]);
- simpleFormat.setTimeZone(tz);
- } else {
- simpleFormat = new DefaultZoneDateFormat(simpleFormat);
- }
-
- df = new CachedDateFormat(simpleFormat, maximumCacheValidity);
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static DatePatternConverter newInstance(
- final String[] options) {
- return new DatePatternConverter(options);
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer output) {
- synchronized(this) {
- df.format(event.timeStamp, output);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final Object obj, final StringBuffer output) {
- if (obj instanceof Date) {
- format((Date) obj, output);
- }
-
- super.format(obj, output);
- }
-
- /**
- * Append formatted date to string buffer.
- * @param date date
- * @param toAppendTo buffer to which formatted date is appended.
- */
- public void format(final Date date, final StringBuffer toAppendTo) {
- synchronized(this) {
- df.format(date.getTime(), toAppendTo);
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/FileDatePatternConverter.java b/java/src/org/apache/log4j/pattern/FileDatePatternConverter.java
deleted file mode 100644
index 1e08826..0000000
--- a/java/src/org/apache/log4j/pattern/FileDatePatternConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-/**
- * Formats an date by delegating to DatePatternConverter. The default
- * date pattern for a %d specifier in a file name is different than
- * the %d pattern in pattern layout.
- *
- * @author Curt Arnold
- */
-public final class FileDatePatternConverter {
- /**
- * Private constructor.
- */
- private FileDatePatternConverter() {
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static PatternConverter newInstance(
- final String[] options) {
- if ((options == null) || (options.length == 0)) {
- return DatePatternConverter.newInstance(
- new String[] {
- "yyyy-MM-dd"
- });
- }
-
- return DatePatternConverter.newInstance(options);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/FileLocationPatternConverter.java b/java/src/org/apache/log4j/pattern/FileLocationPatternConverter.java
deleted file mode 100644
index 14eb31c..0000000
--- a/java/src/org/apache/log4j/pattern/FileLocationPatternConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the event's line location information in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class FileLocationPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final FileLocationPatternConverter INSTANCE =
- new FileLocationPatternConverter();
-
- /**
- * Private constructor.
- */
- private FileLocationPatternConverter() {
- super("File Location", "file");
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static FileLocationPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer output) {
- LocationInfo locationInfo = event.getLocationInformation();
-
- if (locationInfo != null) {
- output.append(locationInfo.getFileName());
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/FormattingInfo.java b/java/src/org/apache/log4j/pattern/FormattingInfo.java
deleted file mode 100644
index 8a1a12e..0000000
--- a/java/src/org/apache/log4j/pattern/FormattingInfo.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-
-/**
- * Modifies the output of a pattern converter for a specified minimum
- * and maximum width and alignment.
- *
- *
- * @author Jim Cakalic
- * @author Ceki Gülcü
- * @author Curt Arnold
- *
- */
-public final class FormattingInfo {
- /**
- * Array of spaces.
- */
- private static final char[] SPACES =
- new char[] { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
-
- /**
- * Default instance.
- */
- private static final FormattingInfo DEFAULT =
- new FormattingInfo(false, 0, Integer.MAX_VALUE);
-
- /**
- * Minimum length.
- */
- private final int minLength;
-
- /**
- * Maximum length.
- */
- private final int maxLength;
-
- /**
- * Alignment.
- */
- private final boolean leftAlign;
-
- /**
- * Creates new instance.
- * @param leftAlign left align if true.
- * @param minLength minimum length.
- * @param maxLength maximum length.
- */
- public FormattingInfo(
- final boolean leftAlign, final int minLength, final int maxLength) {
- this.leftAlign = leftAlign;
- this.minLength = minLength;
- this.maxLength = maxLength;
- }
-
- /**
- * Gets default instance.
- * @return default instance.
- */
- public static FormattingInfo getDefault() {
- return DEFAULT;
- }
-
- /**
- * Determine if left aligned.
- * @return true if left aligned.
- */
- public boolean isLeftAligned() {
- return leftAlign;
- }
-
- /**
- * Get minimum length.
- * @return minimum length.
- */
- public int getMinLength() {
- return minLength;
- }
-
- /**
- * Get maximum length.
- * @return maximum length.
- */
- public int getMaxLength() {
- return maxLength;
- }
-
- /**
- * Adjust the content of the buffer based on the specified lengths and alignment.
- *
- * @param fieldStart start of field in buffer.
- * @param buffer buffer to be modified.
- */
- public void format(final int fieldStart, final StringBuffer buffer) {
- final int rawLength = buffer.length() - fieldStart;
-
- if (rawLength > maxLength) {
- buffer.delete(fieldStart, buffer.length() - maxLength);
- } else if (rawLength < minLength) {
- if (leftAlign) {
- final int fieldEnd = buffer.length();
- buffer.setLength(fieldStart + minLength);
-
- for (int i = fieldEnd; i < buffer.length(); i++) {
- buffer.setCharAt(i, ' ');
- }
- } else {
- int padLength = minLength - rawLength;
-
- for (; padLength > 8; padLength -= 8) {
- buffer.insert(fieldStart, SPACES);
- }
-
- buffer.insert(fieldStart, SPACES, 0, padLength);
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/FullLocationPatternConverter.java b/java/src/org/apache/log4j/pattern/FullLocationPatternConverter.java
deleted file mode 100644
index 066016c..0000000
--- a/java/src/org/apache/log4j/pattern/FullLocationPatternConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Format the event's line location information.
- *
- * @author Ceki Gülcü
- */
-public final class FullLocationPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final FullLocationPatternConverter INSTANCE =
- new FullLocationPatternConverter();
-
- /**
- * Private constructor.
- */
- private FullLocationPatternConverter() {
- super("Full Location", "fullLocation");
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static FullLocationPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer output) {
- LocationInfo locationInfo = event.getLocationInformation();
-
- if (locationInfo != null) {
- output.append(locationInfo.fullInfo);
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/IntegerPatternConverter.java b/java/src/org/apache/log4j/pattern/IntegerPatternConverter.java
deleted file mode 100644
index f50feeb..0000000
--- a/java/src/org/apache/log4j/pattern/IntegerPatternConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import java.util.Date;
-
-
-/**
- * Formats an integer.
- *
- * @author Curt Arnold
- */
-public final class IntegerPatternConverter extends PatternConverter {
- /**
- * Singleton.
- */
- private static final IntegerPatternConverter INSTANCE =
- new IntegerPatternConverter();
-
- /**
- * Private constructor.
- */
- private IntegerPatternConverter() {
- super("Integer", "integer");
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static IntegerPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(Object obj, final StringBuffer toAppendTo) {
- if (obj instanceof Integer) {
- toAppendTo.append(obj.toString());
- }
-
- if (obj instanceof Date) {
- toAppendTo.append(Long.toString(((Date) obj).getTime()));
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/LevelPatternConverter.java b/java/src/org/apache/log4j/pattern/LevelPatternConverter.java
deleted file mode 100644
index 3dbc6e6..0000000
--- a/java/src/org/apache/log4j/pattern/LevelPatternConverter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the event's level in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class LevelPatternConverter extends LoggingEventPatternConverter {
-
- /**
- * Integer severity for Level.TRACE.
- */
- private static final int TRACE_INT = 5000;
- /**
- * Singleton.
- */
- private static final LevelPatternConverter INSTANCE =
- new LevelPatternConverter();
-
- /**
- * Private constructor.
- */
- private LevelPatternConverter() {
- super("Level", "level");
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static LevelPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer output) {
- output.append(event.getLevel().toString());
- }
-
- /**
- * {@inheritDoc}
- */
- public String getStyleClass(Object e) {
- if (e instanceof LoggingEvent) {
- int lint = ((LoggingEvent) e).getLevel().toInt();
-
- switch (lint) {
- case TRACE_INT:
- return "level trace";
-
- case Level.DEBUG_INT:
- return "level debug";
-
- case Level.INFO_INT:
- return "level info";
-
- case Level.WARN_INT:
- return "level warn";
-
- case Level.ERROR_INT:
- return "level error";
-
- case Level.FATAL_INT:
- return "level fatal";
-
- default:
- return "level " + ((LoggingEvent) e).getLevel().toString();
- }
- }
-
- return "level";
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/LineLocationPatternConverter.java b/java/src/org/apache/log4j/pattern/LineLocationPatternConverter.java
deleted file mode 100644
index 0a9dfd3..0000000
--- a/java/src/org/apache/log4j/pattern/LineLocationPatternConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the event's line location information in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class LineLocationPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final LineLocationPatternConverter INSTANCE =
- new LineLocationPatternConverter();
-
- /**
- * Private constructor.
- */
- private LineLocationPatternConverter() {
- super("Line", "line");
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static LineLocationPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer output) {
- LocationInfo locationInfo = event.getLocationInformation();
-
- if (locationInfo != null) {
- output.append(locationInfo.getLineNumber());
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/LineSeparatorPatternConverter.java b/java/src/org/apache/log4j/pattern/LineSeparatorPatternConverter.java
deleted file mode 100644
index a859870..0000000
--- a/java/src/org/apache/log4j/pattern/LineSeparatorPatternConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.Layout;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Formats a line separator.
- *
- * @author Ceki Gülcü
- */
-public final class LineSeparatorPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final LineSeparatorPatternConverter INSTANCE =
- new LineSeparatorPatternConverter();
-
- /**
- * Line separator.
- */
- private final String lineSep;
-
- /**
- * Private constructor.
- */
- private LineSeparatorPatternConverter() {
- super("Line Sep", "lineSep");
- lineSep = Layout.LINE_SEP;
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static LineSeparatorPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(LoggingEvent event, final StringBuffer toAppendTo) {
- toAppendTo.append(lineSep);
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final Object obj, final StringBuffer toAppendTo) {
- toAppendTo.append(lineSep);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/LiteralPatternConverter.java b/java/src/org/apache/log4j/pattern/LiteralPatternConverter.java
deleted file mode 100644
index b88b6f7..0000000
--- a/java/src/org/apache/log4j/pattern/LiteralPatternConverter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Formats a string literal.
- *
- * @author Curt Arnold
- *
- */
-public final class LiteralPatternConverter extends LoggingEventPatternConverter {
- /**
- * String literal.
- */
- private final String literal;
-
- /**
- * Create a new instance.
- * @param literal string literal.
- */
- public LiteralPatternConverter(final String literal) {
- super("Literal", "literal");
- this.literal = literal;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- toAppendTo.append(literal);
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final Object obj, final StringBuffer toAppendTo) {
- toAppendTo.append(literal);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/LogEvent.java b/java/src/org/apache/log4j/pattern/LogEvent.java
deleted file mode 100644
index 24518ec..0000000
--- a/java/src/org/apache/log4j/pattern/LogEvent.java
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.Category;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.MDC;
-import org.apache.log4j.NDC;
-import org.apache.log4j.Priority;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.RendererSupport;
-import org.apache.log4j.spi.ThrowableInformation;
-
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Set;
-
-// Contributors: Nelson Minar
-// Wolf Siberski
-// Anders Kristensen
-
-/**
- * This class is a copy of o.a.l.spi.LoggingEvent from
- * log4j 1.2.15 which has been renamed to keep
- * the same overall class name length to allow a
- * serialization written with a prior instance of o.a.l.spi.LoggingEvent
- * to be deserialized with this class just by mangling the class name
- * in the byte stream.
- *
- */
-public class LogEvent implements java.io.Serializable {
-
- private static long startTime = System.currentTimeMillis();
-
- /** Fully qualified name of the calling category class. */
- transient public final String fqnOfCategoryClass;
-
- /**
- * The category of the logging event. This field is not serialized
- * for performance reasons.
- *
- * It is set by the LoggingEvent constructor or set by a remote
- * entity after deserialization.
- *
- * @deprecated This field will be marked as private or be completely
- * removed in future releases. Please do not use it.
- * */
- transient private Category logger;
-
- /**
- *
The category (logger) name.
- *
- * @deprecated This field will be marked as private in future
- * releases. Please do not access it directly. Use the {@link
- * #getLoggerName} method instead.
-
- * */
- final public String categoryName;
-
- /**
- * Level of logging event. Level cannot be serializable because it
- * is a flyweight. Due to its special seralization it cannot be
- * declared final either.
- *
- *
This field should not be accessed directly. You shoud use the
- * {@link #getLevel} method instead.
- *
- * @deprecated This field will be marked as private in future
- * releases. Please do not access it directly. Use the {@link
- * #getLevel} method instead.
- * */
- transient public Priority level;
-
- /** The nested diagnostic context (NDC) of logging event. */
- private String ndc;
-
- /** The mapped diagnostic context (MDC) of logging event. */
- private Hashtable mdcCopy;
-
-
- /** Have we tried to do an NDC lookup? If we did, there is no need
- * to do it again. Note that its value is always false when
- * serialized. Thus, a receiving SocketNode will never use it's own
- * (incorrect) NDC. See also writeObject method. */
- private boolean ndcLookupRequired = true;
-
-
- /** Have we tried to do an MDC lookup? If we did, there is no need
- * to do it again. Note that its value is always false when
- * serialized. See also the getMDC and getMDCCopy methods. */
- private boolean mdcCopyLookupRequired = true;
-
- /** The application supplied message of logging event. */
- transient private Object message;
-
- /** The application supplied message rendered through the log4j
- objet rendering mechanism.*/
- private String renderedMessage;
-
- /** The name of thread in which this logging event was generated. */
- private String threadName;
-
-
- /** This
- variable contains information about this event's throwable
- */
- private ThrowableInformation throwableInfo;
-
- /** The number of milliseconds elapsed from 1/1/1970 until logging event
- was created. */
- public final long timeStamp;
- /** Location information for the caller. */
- private LocationInfo locationInfo;
-
- // Serialization
- static final long serialVersionUID = -868428216207166145L;
-
- static final Integer[] PARAM_ARRAY = new Integer[1];
- static final String TO_LEVEL = "toLevel";
- static final Class[] TO_LEVEL_PARAMS = new Class[] {int.class};
- static final Hashtable methodCache = new Hashtable(3); // use a tiny table
-
- /**
- Instantiate a LoggingEvent from the supplied parameters.
-
-
Except {@link #timeStamp} all the other fields of
- LoggingEvent are filled when actually needed.
-
- @param logger The logger generating this event.
- @param level The level of this event.
- @param message The message of this event.
- @param throwable The throwable of this event. */
- public LogEvent(String fqnOfCategoryClass, Category logger,
- Priority level, Object message, Throwable throwable) {
- this.fqnOfCategoryClass = fqnOfCategoryClass;
- this.logger = logger;
- this.categoryName = logger.getName();
- this.level = level;
- this.message = message;
- if(throwable != null) {
- this.throwableInfo = new ThrowableInformation(throwable);
- }
- timeStamp = System.currentTimeMillis();
- }
-
- /**
- Instantiate a LoggingEvent from the supplied parameters.
-
-
Except {@link #timeStamp} all the other fields of
- LoggingEvent are filled when actually needed.
-
- @param logger The logger generating this event.
- @param timeStamp the timestamp of this logging event
- @param level The level of this event.
- @param message The message of this event.
- @param throwable The throwable of this event. */
- public LogEvent(String fqnOfCategoryClass, Category logger,
- long timeStamp, Priority level, Object message,
- Throwable throwable) {
- this.fqnOfCategoryClass = fqnOfCategoryClass;
- this.logger = logger;
- this.categoryName = logger.getName();
- this.level = level;
- this.message = message;
- if(throwable != null) {
- this.throwableInfo = new ThrowableInformation(throwable);
- }
-
- this.timeStamp = timeStamp;
- }
-
- /**
- Create new instance.
- @since 1.2.15
- @param fqnOfCategoryClass Fully qualified class name
- of Logger implementation.
- @param logger The logger generating this event.
- @param timeStamp the timestamp of this logging event
- @param level The level of this event.
- @param message The message of this event.
- @param threadName thread name
- @param throwable The throwable of this event.
- @param ndc Nested diagnostic context
- @param info Location info
- @param properties MDC properties
- */
- public LogEvent(final String fqnOfCategoryClass,
- final Logger logger,
- final long timeStamp,
- final Level level,
- final Object message,
- final String threadName,
- final ThrowableInformation throwable,
- final String ndc,
- final LocationInfo info,
- final java.util.Map properties) {
- super();
- this.fqnOfCategoryClass = fqnOfCategoryClass;
- this.logger = logger;
- if (logger != null) {
- categoryName = logger.getName();
- } else {
- categoryName = null;
- }
- this.level = level;
- this.message = message;
- if(throwable != null) {
- this.throwableInfo = throwable;
- }
-
- this.timeStamp = timeStamp;
- this.threadName = threadName;
- ndcLookupRequired = false;
- this.ndc = ndc;
- this.locationInfo = info;
- mdcCopyLookupRequired = false;
- if (properties != null) {
- mdcCopy = new java.util.Hashtable(properties);
- }
- }
-
- /**
- Set the location information for this logging event. The collected
- information is cached for future use.
- */
- public LocationInfo getLocationInformation() {
- if(locationInfo == null) {
- locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass);
- }
- return locationInfo;
- }
-
- /**
- * Return the level of this event. Use this form instead of directly
- * accessing the level field. */
- public Level getLevel() {
- return (Level) level;
- }
-
- /**
- * Return the name of the logger. Use this form instead of directly
- * accessing the categoryName field.
- */
- public String getLoggerName() {
- return categoryName;
- }
-
- /**
- Return the message for this logging event.
-
-
Before serialization, the returned object is the message
- passed by the user to generate the logging event. After
- serialization, the returned value equals the String form of the
- message possibly after object rendering.
-
- @since 1.1 */
- public
- Object getMessage() {
- if(message != null) {
- return message;
- } else {
- return getRenderedMessage();
- }
- }
-
- /**
- * This method returns the NDC for this event. It will return the
- * correct content even if the event was generated in a different
- * thread or even on a different machine. The {@link NDC#get} method
- * should never be called directly. */
- public
- String getNDC() {
- if(ndcLookupRequired) {
- ndcLookupRequired = false;
- ndc = NDC.get();
- }
- return ndc;
- }
-
-
- /**
- Returns the the context corresponding to the key
- parameter. If there is a local MDC copy, possibly because we are
- in a logging server or running inside AsyncAppender, then we
- search for the key in MDC copy, if a value is found it is
- returned. Otherwise, if the search in MDC copy returns a null
- result, then the current thread's MDC is used.
-
-
Note that both the local MDC copy and the current
- thread's MDC are searched.
-
- */
- public
- Object getMDC(String key) {
- Object r;
- // Note the mdcCopy is used if it exists. Otherwise we use the MDC
- // that is associated with the thread.
- if(mdcCopy != null) {
- r = mdcCopy.get(key);
- if(r != null) {
- return r;
- }
- }
- return MDC.get(key);
- }
-
- /**
- Obtain a copy of this thread's MDC prior to serialization or
- asynchronous logging.
- */
- public
- void getMDCCopy() {
- if(mdcCopyLookupRequired) {
- mdcCopyLookupRequired = false;
- // the clone call is required for asynchronous logging.
- // See also bug #5932.
- Hashtable t = (Hashtable) MDC.getContext();
- if(t != null) {
- mdcCopy = (Hashtable) t.clone();
- }
- }
- }
-
- public
- String getRenderedMessage() {
- if(renderedMessage == null && message != null) {
- if(message instanceof String)
- renderedMessage = (String) message;
- else {
- LoggerRepository repository = logger.getLoggerRepository();
-
- if(repository instanceof RendererSupport) {
- RendererSupport rs = (RendererSupport) repository;
- renderedMessage= rs.getRendererMap().findAndRender(message);
- } else {
- renderedMessage = message.toString();
- }
- }
- }
- return renderedMessage;
- }
-
- /**
- Returns the time when the application started, in milliseconds
- elapsed since 01.01.1970. */
- public static long getStartTime() {
- return startTime;
- }
-
- public
- String getThreadName() {
- if(threadName == null)
- threadName = (Thread.currentThread()).getName();
- return threadName;
- }
-
- /**
- Returns the throwable information contained within this
- event. May be null if there is no such information.
-
-
Note that the {@link Throwable} object contained within a
- {@link ThrowableInformation} does not survive serialization.
-
- @since 1.1 */
- public
- ThrowableInformation getThrowableInformation() {
- return throwableInfo;
- }
-
- /**
- Return this event's throwable's string[] representaion.
- */
- public
- String[] getThrowableStrRep() {
-
- if(throwableInfo == null)
- return null;
- else
- return throwableInfo.getThrowableStrRep();
- }
-
-
- private
- void readLevel(ObjectInputStream ois)
- throws java.io.IOException, ClassNotFoundException {
-
- int p = ois.readInt();
- try {
- String className = (String) ois.readObject();
- if(className == null) {
- level = Level.toLevel(p);
- } else {
- Method m = (Method) methodCache.get(className);
- if(m == null) {
- Class clazz = Loader.loadClass(className);
- // Note that we use Class.getDeclaredMethod instead of
- // Class.getMethod. This assumes that the Level subclass
- // implements the toLevel(int) method which is a
- // requirement. Actually, it does not make sense for Level
- // subclasses NOT to implement this method. Also note that
- // only Level can be subclassed and not Priority.
- m = clazz.getDeclaredMethod(TO_LEVEL, TO_LEVEL_PARAMS);
- methodCache.put(className, m);
- }
- PARAM_ARRAY[0] = new Integer(p);
- level = (Level) m.invoke(null, PARAM_ARRAY);
- }
- } catch(Exception e) {
- LogLog.warn("Level deserialization failed, reverting to default.", e);
- level = Level.toLevel(p);
- }
- }
-
- private void readObject(ObjectInputStream ois)
- throws java.io.IOException, ClassNotFoundException {
- ois.defaultReadObject();
- readLevel(ois);
-
- // Make sure that no location info is available to Layouts
- if(locationInfo == null)
- locationInfo = new LocationInfo(null, null);
- }
-
- private
- void writeObject(ObjectOutputStream oos) throws java.io.IOException {
- // Aside from returning the current thread name the wgetThreadName
- // method sets the threadName variable.
- this.getThreadName();
-
- // This sets the renders the message in case it wasn't up to now.
- this.getRenderedMessage();
-
- // This call has a side effect of setting this.ndc and
- // setting ndcLookupRequired to false if not already false.
- this.getNDC();
-
- // This call has a side effect of setting this.mdcCopy and
- // setting mdcLookupRequired to false if not already false.
- this.getMDCCopy();
-
- // This sets the throwable sting representation of the event throwable.
- this.getThrowableStrRep();
-
- oos.defaultWriteObject();
-
- // serialize this event's level
- writeLevel(oos);
- }
-
- private
- void writeLevel(ObjectOutputStream oos) throws java.io.IOException {
-
- oos.writeInt(level.toInt());
-
- Class clazz = level.getClass();
- if(clazz == Level.class) {
- oos.writeObject(null);
- } else {
- // writing directly the Class object would be nicer, except that
- // serialized a Class object can not be read back by JDK
- // 1.1.x. We have to resort to this hack instead.
- oos.writeObject(clazz.getName());
- }
- }
-
- /**
- * Set value for MDC property.
- * This adds the specified MDC property to the event.
- * Access to the MDC is not synchronized, so this
- * method should only be called when it is known that
- * no other threads are accessing the MDC.
- * @since 1.2.15
- * @param propName
- * @param propValue
- */
- public final void setProperty(final String propName,
- final String propValue) {
- if (mdcCopy == null) {
- getMDCCopy();
- }
- if (mdcCopy == null) {
- mdcCopy = new Hashtable();
- }
- mdcCopy.put(propName, propValue);
- }
-
- /**
- * Return a property for this event. The return value can be null.
- *
- * Equivalent to getMDC(String) in log4j 1.2. Provided
- * for compatibility with log4j 1.3.
- *
- * @param key property name
- * @return property value or null if property not set
- * @since 1.2.15
- */
- public final String getProperty(final String key) {
- Object value = getMDC(key);
- String retval = null;
- if (value != null) {
- retval = value.toString();
- }
- return retval;
- }
-
- /**
- * Check for the existence of location information without creating it
- * (a byproduct of calling getLocationInformation).
- * @return true if location information has been extracted.
- * @since 1.2.15
- */
- public final boolean locationInformationExists() {
- return (locationInfo != null);
- }
-
- /**
- * Getter for the event's time stamp. The time stamp is calculated starting
- * from 1970-01-01 GMT.
- * @return timestamp
- *
- * @since 1.2.15
- */
- public final long getTimeStamp() {
- return timeStamp;
- }
-
- /**
- * Returns the set of the key values in the properties
- * for the event.
- *
- * The returned set is unmodifiable by the caller.
- *
- * Provided for compatibility with log4j 1.3
- *
- * @return Set an unmodifiable set of the property keys.
- * @since 1.2.15
- */
- public Set getPropertyKeySet() {
- return getProperties().keySet();
- }
-
- /**
- * Returns the set of properties
- * for the event.
- *
- * The returned set is unmodifiable by the caller.
- *
- * Provided for compatibility with log4j 1.3
- *
- * @return Set an unmodifiable map of the properties.
- * @since 1.2.15
- */
- public Map getProperties() {
- getMDCCopy();
- Map properties;
- if (mdcCopy == null) {
- properties = new HashMap();
- } else {
- properties = mdcCopy;
- }
- return Collections.unmodifiableMap(properties);
- }
-
- /**
- * Get the fully qualified name of the calling logger sub-class/wrapper.
- * Provided for compatibility with log4j 1.3
- * @return fully qualified class name, may be null.
- * @since 1.2.15
- */
- public String getFQNOfLoggerClass() {
- return fqnOfCategoryClass;
- }
-
-
-
-}
diff --git a/java/src/org/apache/log4j/pattern/LoggerPatternConverter.java b/java/src/org/apache/log4j/pattern/LoggerPatternConverter.java
deleted file mode 100644
index 7052a4e..0000000
--- a/java/src/org/apache/log4j/pattern/LoggerPatternConverter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Formats a logger name.
- *
- * @author Ceki Gülcü
- *
- */
-public final class LoggerPatternConverter extends NamePatternConverter {
- /**
- * Singleton.
- */
- private static final LoggerPatternConverter INSTANCE =
- new LoggerPatternConverter(null);
-
- /**
- * Private constructor.
- * @param options options, may be null.
- */
- private LoggerPatternConverter(final String[] options) {
- super("Logger", "logger", options);
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static LoggerPatternConverter newInstance(
- final String[] options) {
- if ((options == null) || (options.length == 0)) {
- return INSTANCE;
- }
-
- return new LoggerPatternConverter(options);
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- final int initialLength = toAppendTo.length();
- toAppendTo.append(event.getLoggerName());
- abbreviate(initialLength, toAppendTo);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/LoggingEventPatternConverter.java b/java/src/org/apache/log4j/pattern/LoggingEventPatternConverter.java
deleted file mode 100644
index d0fd4f4..0000000
--- a/java/src/org/apache/log4j/pattern/LoggingEventPatternConverter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * LoggingEventPatternConverter is a base class for pattern converters
- * that can format information from instances of LoggingEvent.
- *
- * @author Curt Arnold
- *
- */
-public abstract class LoggingEventPatternConverter extends PatternConverter {
- /**
- * Constructs an instance of LoggingEventPatternConverter.
- * @param name name of converter.
- * @param style CSS style for output.
- */
- protected LoggingEventPatternConverter(
- final String name, final String style) {
- super(name, style);
- }
-
- /**
- * Formats an event into a string buffer.
- * @param event event to format, may not be null.
- * @param toAppendTo string buffer to which the formatted event will be appended. May not be null.
- */
- public abstract void format(
- final LoggingEvent event, final StringBuffer toAppendTo);
-
- /**
- * {@inheritDoc}
- */
- public void format(final Object obj, final StringBuffer output) {
- if (obj instanceof LoggingEvent) {
- format((LoggingEvent) obj, output);
- }
- }
-
- /**
- * Normally pattern converters are not meant to handle Exceptions although
- * few pattern converters might.
- *
- * By examining the return values for this method, the containing layout will
- * determine whether it handles throwables or not.
-
- * @return true if this PatternConverter handles throwables
- */
- public boolean handlesThrowable() {
- return false;
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/MessagePatternConverter.java b/java/src/org/apache/log4j/pattern/MessagePatternConverter.java
deleted file mode 100644
index c29f64a..0000000
--- a/java/src/org/apache/log4j/pattern/MessagePatternConverter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the event's rendered message in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class MessagePatternConverter extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final MessagePatternConverter INSTANCE =
- new MessagePatternConverter();
-
- /**
- * Private constructor.
- */
- private MessagePatternConverter() {
- super("Message", "message");
- }
-
- /**
- * Obtains an instance of pattern converter.
- * @param options options, may be null.
- * @return instance of pattern converter.
- */
- public static MessagePatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- toAppendTo.append(event.getRenderedMessage());
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/MethodLocationPatternConverter.java b/java/src/org/apache/log4j/pattern/MethodLocationPatternConverter.java
deleted file mode 100644
index 4d1b533..0000000
--- a/java/src/org/apache/log4j/pattern/MethodLocationPatternConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the event's line location information in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class MethodLocationPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final MethodLocationPatternConverter INSTANCE =
- new MethodLocationPatternConverter();
-
- /**
- * Private constructor.
- */
- private MethodLocationPatternConverter() {
- super("Method", "method");
- }
-
- /**
- * Obtains an instance of MethodLocationPatternConverter.
- * @param options options, may be null.
- * @return instance of MethodLocationPatternConverter.
- */
- public static MethodLocationPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- LocationInfo locationInfo = event.getLocationInformation();
-
- if (locationInfo != null) {
- toAppendTo.append(locationInfo.getMethodName());
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/NDCPatternConverter.java b/java/src/org/apache/log4j/pattern/NDCPatternConverter.java
deleted file mode 100644
index 9788cb1..0000000
--- a/java/src/org/apache/log4j/pattern/NDCPatternConverter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the event's NDC in a StringBuffer.
- *
- * @author Ceki Gülcü
- */
-public final class NDCPatternConverter extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final NDCPatternConverter INSTANCE =
- new NDCPatternConverter();
-
- /**
- * Private constructor.
- */
- private NDCPatternConverter() {
- super("NDC", "ndc");
- }
-
- /**
- * Obtains an instance of NDCPatternConverter.
- * @param options options, may be null.
- * @return instance of NDCPatternConverter.
- */
- public static NDCPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- toAppendTo.append(event.getNDC());
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/NameAbbreviator.java b/java/src/org/apache/log4j/pattern/NameAbbreviator.java
deleted file mode 100644
index b7e89a0..0000000
--- a/java/src/org/apache/log4j/pattern/NameAbbreviator.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * NameAbbreviator generates abbreviated logger and class names.
- *
- */
-public abstract class NameAbbreviator {
- /**
- * Default (no abbreviation) abbreviator.
- */
- private static final NameAbbreviator DEFAULT = new NOPAbbreviator();
-
- /**
- * Gets an abbreviator.
- *
- * For example, "%logger{2}" will output only 2 elements of the logger name,
- * %logger{-2} will drop 2 elements from the logger name,
- * "%logger{1.}" will output only the first character of the non-final elements in the name,
- * "%logger{1~.2~} will output the first character of the first element, two characters of
- * the second and subsequent elements and will use a tilde to indicate abbreviated characters.
- *
- * @param pattern abbreviation pattern.
- * @return abbreviator, will not be null.
- */
- public static NameAbbreviator getAbbreviator(final String pattern) {
- if (pattern.length() > 0) {
- // if pattern is just spaces and numbers then
- // use MaxElementAbbreviator
- String trimmed = pattern.trim();
-
- if (trimmed.length() == 0) {
- return DEFAULT;
- }
-
- int i = 0;
- if (trimmed.length() > 0) {
- if (trimmed.charAt(0) == '-') {
- i++;
- }
- for (;
- (i < trimmed.length()) &&
- (trimmed.charAt(i) >= '0') &&
- (trimmed.charAt(i) <= '9');
- i++) {
- }
- }
-
-
- //
- // if all blanks and digits
- //
- if (i == trimmed.length()) {
- int elements = Integer.parseInt(trimmed);
- if (elements >= 0) {
- return new MaxElementAbbreviator(elements);
- } else {
- return new DropElementAbbreviator(-elements);
- }
- }
-
- ArrayList fragments = new ArrayList(5);
- char ellipsis;
- int charCount;
- int pos = 0;
-
- while ((pos < trimmed.length()) && (pos >= 0)) {
- int ellipsisPos = pos;
-
- if (trimmed.charAt(pos) == '*') {
- charCount = Integer.MAX_VALUE;
- ellipsisPos++;
- } else {
- if ((trimmed.charAt(pos) >= '0') && (trimmed.charAt(pos) <= '9')) {
- charCount = trimmed.charAt(pos) - '0';
- ellipsisPos++;
- } else {
- charCount = 0;
- }
- }
-
- ellipsis = '\0';
-
- if (ellipsisPos < trimmed.length()) {
- ellipsis = trimmed.charAt(ellipsisPos);
-
- if (ellipsis == '.') {
- ellipsis = '\0';
- }
- }
-
- fragments.add(new PatternAbbreviatorFragment(charCount, ellipsis));
- pos = trimmed.indexOf(".", pos);
-
- if (pos == -1) {
- break;
- }
-
- pos++;
- }
-
- return new PatternAbbreviator(fragments);
- }
-
- //
- // no matching abbreviation, return defaultAbbreviator
- //
- return DEFAULT;
- }
-
- /**
- * Gets default abbreviator.
- *
- * @return default abbreviator.
- */
- public static NameAbbreviator getDefaultAbbreviator() {
- return DEFAULT;
- }
-
- /**
- * Abbreviates a name in a StringBuffer.
- *
- * @param nameStart starting position of name in buf.
- * @param buf buffer, may not be null.
- */
- public abstract void abbreviate(final int nameStart, final StringBuffer buf);
-
- /**
- * Abbreviator that simply appends full name to buffer.
- */
- private static class NOPAbbreviator extends NameAbbreviator {
- /**
- * Constructor.
- */
- public NOPAbbreviator() {
- }
-
- /**
- * {@inheritDoc}
- */
- public void abbreviate(final int nameStart, final StringBuffer buf) {
- }
- }
-
- /**
- * Abbreviator that drops starting path elements.
- */
- private static class MaxElementAbbreviator extends NameAbbreviator {
- /**
- * Maximum number of path elements to output.
- */
- private final int count;
-
- /**
- * Create new instance.
- * @param count maximum number of path elements to output.
- */
- public MaxElementAbbreviator(final int count) {
- this.count = count;
- }
-
- /**
- * Abbreviate name.
- * @param buf buffer to append abbreviation.
- * @param nameStart start of name to abbreviate.
- */
- public void abbreviate(final int nameStart, final StringBuffer buf) {
- // We substract 1 from 'len' when assigning to 'end' to avoid out of
- // bounds exception in return r.substring(end+1, len). This can happen if
- // precision is 1 and the category name ends with a dot.
- int end = buf.length() - 1;
-
- String bufString = buf.toString();
- for (int i = count; i > 0; i--) {
- end = bufString.lastIndexOf(".", end - 1);
-
- if ((end == -1) || (end < nameStart)) {
- return;
- }
- }
-
- buf.delete(nameStart, end + 1);
- }
- }
-
- /**
- * Abbreviator that drops starting path elements.
- */
- private static class DropElementAbbreviator extends NameAbbreviator {
- /**
- * Maximum number of path elements to output.
- */
- private final int count;
-
- /**
- * Create new instance.
- * @param count maximum number of path elements to output.
- */
- public DropElementAbbreviator(final int count) {
- this.count = count;
- }
-
- /**
- * Abbreviate name.
- * @param buf buffer to append abbreviation.
- * @param nameStart start of name to abbreviate.
- */
- public void abbreviate(final int nameStart, final StringBuffer buf) {
- int i = count;
- for(int pos = buf.indexOf(".", nameStart);
- pos != -1;
- pos = buf.indexOf(".", pos + 1)) {
- if(--i == 0) {
- buf.delete(nameStart, pos + 1);
- break;
- }
- }
- }
- }
-
-
- /**
- * Fragment of an pattern abbreviator.
- *
- */
- private static class PatternAbbreviatorFragment {
- /**
- * Count of initial characters of element to output.
- */
- private final int charCount;
-
- /**
- * Character used to represent dropped characters.
- * '\0' indicates no representation of dropped characters.
- */
- private final char ellipsis;
-
- /**
- * Creates a PatternAbbreviatorFragment.
- * @param charCount number of initial characters to preserve.
- * @param ellipsis character to represent elimination of characters,
- * '\0' if no ellipsis is desired.
- */
- public PatternAbbreviatorFragment(
- final int charCount, final char ellipsis) {
- this.charCount = charCount;
- this.ellipsis = ellipsis;
- }
-
- /**
- * Abbreviate element of name.
- * @param buf buffer to receive element.
- * @param startPos starting index of name element.
- * @return starting index of next element.
- */
- public int abbreviate(final StringBuffer buf, final int startPos) {
- int nextDot = buf.toString().indexOf(".", startPos);
-
- if (nextDot != -1) {
- if ((nextDot - startPos) > charCount) {
- buf.delete(startPos + charCount, nextDot);
- nextDot = startPos + charCount;
-
- if (ellipsis != '\0') {
- buf.insert(nextDot, ellipsis);
- nextDot++;
- }
- }
-
- nextDot++;
- }
-
- return nextDot;
- }
- }
-
- /**
- * Pattern abbreviator.
- *
- *
- */
- private static class PatternAbbreviator extends NameAbbreviator {
- /**
- * Element abbreviation patterns.
- */
- private final PatternAbbreviatorFragment[] fragments;
-
- /**
- * Create PatternAbbreviator.
- *
- * @param fragments element abbreviation patterns.
- */
- public PatternAbbreviator(List fragments) {
- if (fragments.size() == 0) {
- throw new IllegalArgumentException(
- "fragments must have at least one element");
- }
-
- this.fragments = new PatternAbbreviatorFragment[fragments.size()];
- fragments.toArray(this.fragments);
- }
-
- /**
- * Abbreviate name.
- * @param buf buffer that abbreviated name is appended.
- * @param nameStart start of name.
- */
- public void abbreviate(final int nameStart, final StringBuffer buf) {
- //
- // all non-terminal patterns are executed once
- //
- int pos = nameStart;
-
- for (int i = 0; (i < (fragments.length - 1)) && (pos < buf.length());
- i++) {
- pos = fragments[i].abbreviate(buf, pos);
- }
-
- //
- // last pattern in executed repeatedly
- //
- PatternAbbreviatorFragment terminalFragment =
- fragments[fragments.length - 1];
-
- while ((pos < buf.length()) && (pos >= 0)) {
- pos = terminalFragment.abbreviate(buf, pos);
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/NamePatternConverter.java b/java/src/org/apache/log4j/pattern/NamePatternConverter.java
deleted file mode 100644
index fbdd999..0000000
--- a/java/src/org/apache/log4j/pattern/NamePatternConverter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-
-/**
- *
- * Base class for other pattern converters which can return only parts of their name.
- *
- * @author Ceki Gülcü
- * @author Curt Arnold
- *
- */
-public abstract class NamePatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Abbreviator.
- */
- private final NameAbbreviator abbreviator;
-
- /**
- * Constructor.
- * @param name name of converter.
- * @param style style name for associated output.
- * @param options options, may be null, first element will be interpreted as an abbreviation pattern.
- */
- protected NamePatternConverter(
- final String name, final String style, final String[] options) {
- super(name, style);
-
- if ((options != null) && (options.length > 0)) {
- abbreviator = NameAbbreviator.getAbbreviator(options[0]);
- } else {
- abbreviator = NameAbbreviator.getDefaultAbbreviator();
- }
- }
-
- /**
- * Abbreviate name in string buffer.
- * @param nameStart starting position of name to abbreviate.
- * @param buf string buffer containing name.
- */
- protected final void abbreviate(final int nameStart, final StringBuffer buf) {
- abbreviator.abbreviate(nameStart, buf);
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/PatternConverter.java b/java/src/org/apache/log4j/pattern/PatternConverter.java
deleted file mode 100644
index 21fb7cd..0000000
--- a/java/src/org/apache/log4j/pattern/PatternConverter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-
-/**
-
-
PatternConverter is an abstract class that provides the
- formatting functionality that derived classes need.
-
-
Conversion specifiers in a conversion patterns are parsed to
- individual PatternConverters. Each of which is responsible for
- converting an object in a converter specific manner.
-
- @author James P. Cakalic
- @author Ceki Gülcü
- @author Chris Nokes
- @author Curt Arnold
-
- */
-public abstract class PatternConverter {
- /**
- * Converter name.
- */
- private final String name;
-
- /**
- * Converter style name.
- */
- private final String style;
-
- /**
- * Create a new pattern converter.
- * @param name name for pattern converter.
- * @param style CSS style for formatted output.
- */
- protected PatternConverter(final String name, final String style) {
- this.name = name;
- this.style = style;
- }
-
- /**
- * Formats an object into a string buffer.
- * @param obj event to format, may not be null.
- * @param toAppendTo string buffer to which the formatted event will be appended. May not be null.
- */
- public abstract void format(final Object obj, final StringBuffer toAppendTo);
-
- /**
- * This method returns the name of the conversion pattern.
- *
- * The name can be useful to certain Layouts such as HTMLLayout.
- *
- * @return the name of the conversion pattern
- */
- public final String getName() {
- return name;
- }
-
- /**
- * This method returns the CSS style class that should be applied to
- * the LoggingEvent passed as parameter, which can be null.
- *
- * This information is currently used only by HTMLLayout.
- *
- * @param e null values are accepted
- * @return the name of the conversion pattern
- */
- public String getStyleClass(Object e) {
- return style;
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/PatternParser.java b/java/src/org/apache/log4j/pattern/PatternParser.java
deleted file mode 100644
index 5d19387..0000000
--- a/java/src/org/apache/log4j/pattern/PatternParser.java
+++ /dev/null
@@ -1,683 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.LogLog;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-// Contributors: Nelson Minar <(nelson@monkey.org>
-// Igor E. Poteryaev
-// Reinhard Deschler
-
-/**
- * Most of the work of the {@link org.apache.log4j.EnhancedPatternLayout} class
- * is delegated to the PatternParser class.
- * It is this class that parses conversion patterns and creates
- * a chained list of {@link PatternConverter PatternConverters}.
- *
- * @author James P. Cakalic
- * @author Ceki Gülcü
- * @author Anders Kristensen
- * @author Paul Smith
- * @author Curt Arnold
- *
-*/
-public final class PatternParser {
- /**
- * Escape character for format specifier.
- */
- private static final char ESCAPE_CHAR = '%';
-
- /**
- * Literal state.
- */
- private static final int LITERAL_STATE = 0;
-
- /**
- * In converter name state.
- */
- private static final int CONVERTER_STATE = 1;
-
- /**
- * Dot state.
- */
- private static final int DOT_STATE = 3;
-
- /**
- * Min state.
- */
- private static final int MIN_STATE = 4;
-
- /**
- * Max state.
- */
- private static final int MAX_STATE = 5;
-
- /**
- * Standard format specifiers for EnhancedPatternLayout.
- */
- private static final Map PATTERN_LAYOUT_RULES;
-
- /**
- * Standard format specifiers for rolling file appenders.
- */
- private static final Map FILENAME_PATTERN_RULES;
-
- static {
- // We set the global rules in the static initializer of PatternParser class
- Map rules = new HashMap(17);
- rules.put("c", LoggerPatternConverter.class);
- rules.put("logger", LoggerPatternConverter.class);
-
- rules.put("C", ClassNamePatternConverter.class);
- rules.put("class", ClassNamePatternConverter.class);
-
- rules.put("d", DatePatternConverter.class);
- rules.put("date", DatePatternConverter.class);
-
- rules.put("F", FileLocationPatternConverter.class);
- rules.put("file", FileLocationPatternConverter.class);
-
- rules.put("l", FullLocationPatternConverter.class);
-
- rules.put("L", LineLocationPatternConverter.class);
- rules.put("line", LineLocationPatternConverter.class);
-
- rules.put("m", MessagePatternConverter.class);
- rules.put("message", MessagePatternConverter.class);
-
- rules.put("n", LineSeparatorPatternConverter.class);
-
- rules.put("M", MethodLocationPatternConverter.class);
- rules.put("method", MethodLocationPatternConverter.class);
-
- rules.put("p", LevelPatternConverter.class);
- rules.put("level", LevelPatternConverter.class);
-
- rules.put("r", RelativeTimePatternConverter.class);
- rules.put("relative", RelativeTimePatternConverter.class);
-
- rules.put("t", ThreadPatternConverter.class);
- rules.put("thread", ThreadPatternConverter.class);
-
- rules.put("x", NDCPatternConverter.class);
- rules.put("ndc", NDCPatternConverter.class);
-
- rules.put("X", PropertiesPatternConverter.class);
- rules.put("properties", PropertiesPatternConverter.class);
-
- rules.put("sn", SequenceNumberPatternConverter.class);
- rules.put("sequenceNumber", SequenceNumberPatternConverter.class);
-
- rules.put("throwable", ThrowableInformationPatternConverter.class);
- PATTERN_LAYOUT_RULES = new ReadOnlyMap(rules);
-
- Map fnameRules = new HashMap(4);
- fnameRules.put("d", FileDatePatternConverter.class);
- fnameRules.put("date", FileDatePatternConverter.class);
- fnameRules.put("i", IntegerPatternConverter.class);
- fnameRules.put("index", IntegerPatternConverter.class);
-
- FILENAME_PATTERN_RULES = new ReadOnlyMap(fnameRules);
- }
-
- /**
- * Private constructor.
- */
- private PatternParser() {
- }
-
- /**
- * Get standard format specifiers for EnhancedPatternLayout.
- * @return read-only map of format converter classes keyed by format specifier strings.
- */
- public static Map getPatternLayoutRules() {
- return PATTERN_LAYOUT_RULES;
- }
-
- /**
- * Get standard format specifiers for rolling file appender file specification.
- * @return read-only map of format converter classes keyed by format specifier strings.
- */
- public static Map getFileNamePatternRules() {
- return FILENAME_PATTERN_RULES;
- }
-
- /** Extract the converter identifier found at position i.
- *
- * After this function returns, the variable i will point to the
- * first char after the end of the converter identifier.
- *
- * If i points to a char which is not a character acceptable at the
- * start of a unicode identifier, the value null is returned.
- *
- * @param lastChar last processed character.
- * @param pattern format string.
- * @param i current index into pattern format.
- * @param convBuf buffer to receive conversion specifier.
- * @param currentLiteral literal to be output in case format specifier in unrecognized.
- * @return position in pattern after converter.
- */
- private static int extractConverter(
- char lastChar, final String pattern, int i, final StringBuffer convBuf,
- final StringBuffer currentLiteral) {
- convBuf.setLength(0);
-
- // When this method is called, lastChar points to the first character of the
- // conversion word. For example:
- // For "%hello" lastChar = 'h'
- // For "%-5hello" lastChar = 'h'
- //System.out.println("lastchar is "+lastChar);
- if (!Character.isUnicodeIdentifierStart(lastChar)) {
- return i;
- }
-
- convBuf.append(lastChar);
-
- while (
- (i < pattern.length())
- && Character.isUnicodeIdentifierPart(pattern.charAt(i))) {
- convBuf.append(pattern.charAt(i));
- currentLiteral.append(pattern.charAt(i));
-
- //System.out.println("conv buffer is now ["+convBuf+"].");
- i++;
- }
-
- return i;
- }
-
- /**
- * Extract options.
- * @param pattern conversion pattern.
- * @param i start of options.
- * @param options array to receive extracted options
- * @return position in pattern after options.
- */
- private static int extractOptions(String pattern, int i, List options) {
- while ((i < pattern.length()) && (pattern.charAt(i) == '{')) {
- int end = pattern.indexOf('}', i);
-
- if (end == -1) {
- break;
- }
-
- String r = pattern.substring(i + 1, end);
- options.add(r);
- i = end + 1;
- }
-
- return i;
- }
-
- /**
- * Parse a format specifier.
- * @param pattern pattern to parse.
- * @param patternConverters list to receive pattern converters.
- * @param formattingInfos list to receive field specifiers corresponding to pattern converters.
- * @param converterRegistry map of user-supported pattern converters keyed by format specifier, may be null.
- * @param rules map of stock pattern converters keyed by format specifier.
- */
- public static void parse(
- final String pattern, final List patternConverters,
- final List formattingInfos, final Map converterRegistry, final Map rules) {
- if (pattern == null) {
- throw new NullPointerException("pattern");
- }
-
- StringBuffer currentLiteral = new StringBuffer(32);
-
- int patternLength = pattern.length();
- int state = LITERAL_STATE;
- char c;
- int i = 0;
- FormattingInfo formattingInfo = FormattingInfo.getDefault();
-
- while (i < patternLength) {
- c = pattern.charAt(i++);
-
- switch (state) {
- case LITERAL_STATE:
-
- // In literal state, the last char is always a literal.
- if (i == patternLength) {
- currentLiteral.append(c);
-
- continue;
- }
-
- if (c == ESCAPE_CHAR) {
- // peek at the next char.
- switch (pattern.charAt(i)) {
- case ESCAPE_CHAR:
- currentLiteral.append(c);
- i++; // move pointer
-
- break;
-
- default:
-
- if (currentLiteral.length() != 0) {
- patternConverters.add(
- new LiteralPatternConverter(currentLiteral.toString()));
- formattingInfos.add(FormattingInfo.getDefault());
- }
-
- currentLiteral.setLength(0);
- currentLiteral.append(c); // append %
- state = CONVERTER_STATE;
- formattingInfo = FormattingInfo.getDefault();
- }
- } else {
- currentLiteral.append(c);
- }
-
- break;
-
- case CONVERTER_STATE:
- currentLiteral.append(c);
-
- switch (c) {
- case '-':
- formattingInfo =
- new FormattingInfo(
- true, formattingInfo.getMinLength(),
- formattingInfo.getMaxLength());
-
- break;
-
- case '.':
- state = DOT_STATE;
-
- break;
-
- default:
-
- if ((c >= '0') && (c <= '9')) {
- formattingInfo =
- new FormattingInfo(
- formattingInfo.isLeftAligned(), c - '0',
- formattingInfo.getMaxLength());
- state = MIN_STATE;
- } else {
- i = finalizeConverter(
- c, pattern, i, currentLiteral, formattingInfo,
- converterRegistry, rules, patternConverters, formattingInfos);
-
- // Next pattern is assumed to be a literal.
- state = LITERAL_STATE;
- formattingInfo = FormattingInfo.getDefault();
- currentLiteral.setLength(0);
- }
- } // switch
-
- break;
-
- case MIN_STATE:
- currentLiteral.append(c);
-
- if ((c >= '0') && (c <= '9')) {
- formattingInfo =
- new FormattingInfo(
- formattingInfo.isLeftAligned(),
- (formattingInfo.getMinLength() * 10) + (c - '0'),
- formattingInfo.getMaxLength());
- } else if (c == '.') {
- state = DOT_STATE;
- } else {
- i = finalizeConverter(
- c, pattern, i, currentLiteral, formattingInfo,
- converterRegistry, rules, patternConverters, formattingInfos);
- state = LITERAL_STATE;
- formattingInfo = FormattingInfo.getDefault();
- currentLiteral.setLength(0);
- }
-
- break;
-
- case DOT_STATE:
- currentLiteral.append(c);
-
- if ((c >= '0') && (c <= '9')) {
- formattingInfo =
- new FormattingInfo(
- formattingInfo.isLeftAligned(), formattingInfo.getMinLength(),
- c - '0');
- state = MAX_STATE;
- } else {
- LogLog.error(
- "Error occured in position " + i
- + ".\n Was expecting digit, instead got char \"" + c + "\".");
-
- state = LITERAL_STATE;
- }
-
- break;
-
- case MAX_STATE:
- currentLiteral.append(c);
-
- if ((c >= '0') && (c <= '9')) {
- formattingInfo =
- new FormattingInfo(
- formattingInfo.isLeftAligned(), formattingInfo.getMinLength(),
- (formattingInfo.getMaxLength() * 10) + (c - '0'));
- } else {
- i = finalizeConverter(
- c, pattern, i, currentLiteral, formattingInfo,
- converterRegistry, rules, patternConverters, formattingInfos);
- state = LITERAL_STATE;
- formattingInfo = FormattingInfo.getDefault();
- currentLiteral.setLength(0);
- }
-
- break;
- } // switch
- }
-
- // while
- if (currentLiteral.length() != 0) {
- patternConverters.add(
- new LiteralPatternConverter(currentLiteral.toString()));
- formattingInfos.add(FormattingInfo.getDefault());
- }
- }
-
- /**
- * Creates a new PatternConverter.
- *
- *
- * @param converterId converterId.
- * @param currentLiteral literal to be used if converter is unrecognized or following converter
- * if converterId contains extra characters.
- * @param converterRegistry map of user-supported pattern converters keyed by format specifier, may be null.
- * @param rules map of stock pattern converters keyed by format specifier.
- * @param options converter options.
- * @return converter or null.
- */
- private static PatternConverter createConverter(
- final String converterId, final StringBuffer currentLiteral,
- final Map converterRegistry, final Map rules, final List options) {
- String converterName = converterId;
- Object converterObj = null;
-
- for (int i = converterId.length(); (i > 0) && (converterObj == null);
- i--) {
- converterName = converterName.substring(0, i);
-
- if (converterRegistry != null) {
- converterObj = converterRegistry.get(converterName);
- }
-
- if ((converterObj == null) && (rules != null)) {
- converterObj = rules.get(converterName);
- }
- }
-
- if (converterObj == null) {
- LogLog.error("Unrecognized format specifier [" + converterId + "]");
-
- return null;
- }
-
- Class converterClass = null;
-
- if (converterObj instanceof Class) {
- converterClass = (Class) converterObj;
- } else {
- if (converterObj instanceof String) {
- try {
- converterClass = Loader.loadClass((String) converterObj);
- } catch (ClassNotFoundException ex) {
- LogLog.warn(
- "Class for conversion pattern %" + converterName + " not found",
- ex);
-
- return null;
- }
- } else {
- LogLog.warn(
- "Bad map entry for conversion pattern %" + converterName + ".");
-
- return null;
- }
- }
-
- try {
- Method factory =
- converterClass.getMethod(
- "newInstance",
- new Class[] {
- Class.forName("[Ljava.lang.String;")
- });
- String[] optionsArray = new String[options.size()];
- optionsArray = (String[]) options.toArray(optionsArray);
-
- Object newObj =
- factory.invoke(null, new Object[] { optionsArray });
-
- if (newObj instanceof PatternConverter) {
- currentLiteral.delete(
- 0,
- currentLiteral.length()
- - (converterId.length() - converterName.length()));
-
- return (PatternConverter) newObj;
- } else {
- LogLog.warn(
- "Class " + converterClass.getName()
- + " does not extend PatternConverter.");
- }
- } catch (Exception ex) {
- LogLog.error("Error creating converter for " + converterId, ex);
-
- try {
- //
- // try default constructor
- PatternConverter pc = (PatternConverter) converterClass.newInstance();
- currentLiteral.delete(
- 0,
- currentLiteral.length()
- - (converterId.length() - converterName.length()));
-
- return pc;
- } catch (Exception ex2) {
- LogLog.error("Error creating converter for " + converterId, ex2);
- }
- }
-
- return null;
- }
-
- /**
- * Processes a format specifier sequence.
- *
- * @param c initial character of format specifier.
- * @param pattern conversion pattern
- * @param i current position in conversion pattern.
- * @param currentLiteral current literal.
- * @param formattingInfo current field specifier.
- * @param converterRegistry map of user-provided pattern converters keyed by format specifier, may be null.
- * @param rules map of stock pattern converters keyed by format specifier.
- * @param patternConverters list to receive parsed pattern converter.
- * @param formattingInfos list to receive corresponding field specifier.
- * @return position after format specifier sequence.
- */
- private static int finalizeConverter(
- char c, String pattern, int i,
- final StringBuffer currentLiteral, final FormattingInfo formattingInfo,
- final Map converterRegistry, final Map rules, final List patternConverters,
- final List formattingInfos) {
- StringBuffer convBuf = new StringBuffer();
- i = extractConverter(c, pattern, i, convBuf, currentLiteral);
-
- String converterId = convBuf.toString();
-
- List options = new ArrayList();
- i = extractOptions(pattern, i, options);
-
- PatternConverter pc =
- createConverter(
- converterId, currentLiteral, converterRegistry, rules, options);
-
- if (pc == null) {
- StringBuffer msg;
-
- if ((converterId == null) || (converterId.length() == 0)) {
- msg =
- new StringBuffer("Empty conversion specifier starting at position ");
- } else {
- msg = new StringBuffer("Unrecognized conversion specifier [");
- msg.append(converterId);
- msg.append("] starting at position ");
- }
-
- msg.append(Integer.toString(i));
- msg.append(" in conversion pattern.");
-
- LogLog.error(msg.toString());
-
- patternConverters.add(
- new LiteralPatternConverter(currentLiteral.toString()));
- formattingInfos.add(FormattingInfo.getDefault());
- } else {
- patternConverters.add(pc);
- formattingInfos.add(formattingInfo);
-
- if (currentLiteral.length() > 0) {
- patternConverters.add(
- new LiteralPatternConverter(currentLiteral.toString()));
- formattingInfos.add(FormattingInfo.getDefault());
- }
- }
-
- currentLiteral.setLength(0);
-
- return i;
- }
-
- /**
- * The class wraps another Map but throws exceptions on any attempt to modify the map.
- */
- private static class ReadOnlyMap implements Map {
- /**
- * Wrapped map.
- */
- private final Map map;
-
- /**
- * Constructor
- * @param src source map.
- */
- public ReadOnlyMap(Map src) {
- map = src;
- }
-
- /**
- * {@inheritDoc}
- */
- public void clear() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean containsKey(Object key) {
- return map.containsKey(key);
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean containsValue(Object value) {
- return map.containsValue(value);
- }
-
- /**
- * {@inheritDoc}
- */
- public Set entrySet() {
- return map.entrySet();
- }
-
- /**
- * {@inheritDoc}
- */
- public Object get(Object key) {
- return map.get(key);
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean isEmpty() {
- return map.isEmpty();
- }
-
- /**
- * {@inheritDoc}
- */
- public Set keySet() {
- return map.keySet();
- }
-
- /**
- * {@inheritDoc}
- */
- public Object put(Object key, Object value) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- */
- public void putAll(Map t) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- */
- public Object remove(Object key) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- */
- public int size() {
- return map.size();
- }
-
- /**
- * {@inheritDoc}
- */
- public Collection values() {
- return map.values();
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/PropertiesPatternConverter.java b/java/src/org/apache/log4j/pattern/PropertiesPatternConverter.java
deleted file mode 100644
index a55cf97..0000000
--- a/java/src/org/apache/log4j/pattern/PropertiesPatternConverter.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.util.Iterator;
-import java.util.Set;
-import org.apache.log4j.helpers.*;
-
-
-/**
- * Able to handle the contents of the LoggingEvent's Property bundle and either
- * output the entire contents of the properties in a similar format to the
- * java.util.Hashtable.toString(), or to output the value of a specific key
- * within the property bundle
- * when this pattern converter has the option set.
- *
- * @author Paul Smith
- * @author Ceki Gülcü
- */
-public final class PropertiesPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Name of property to output.
- */
- private final String option;
-
- /**
- * Private constructor.
- * @param options options, may be null.
- */
- private PropertiesPatternConverter(
- final String[] options) {
- super(
- ((options != null) && (options.length > 0))
- ? ("Property{" + options[0] + "}") : "Properties", "property");
-
- if ((options != null) && (options.length > 0)) {
- option = options[0];
- } else {
- option = null;
- }
- }
-
- /**
- * Obtains an instance of PropertiesPatternConverter.
- * @param options options, may be null or first element contains name of property to format.
- * @return instance of PropertiesPatternConverter.
- */
- public static PropertiesPatternConverter newInstance(
- final String[] options) {
- return new PropertiesPatternConverter(options);
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- // if there is no additional options, we output every single
- // Key/Value pair for the MDC in a similar format to Hashtable.toString()
- if (option == null) {
- toAppendTo.append("{");
-
- try {
- Set keySet = MDCKeySetExtractor.INSTANCE.getPropertyKeySet(event);
- if (keySet != null) {
- for (Iterator i = keySet.iterator(); i.hasNext();) {
- Object item = i.next();
- Object val = event.getMDC(item.toString());
- toAppendTo.append("{").append(item).append(",").append(val).append(
- "}");
- }
- }
- } catch(Exception ex) {
- LogLog.error("Unexpected exception while extracting MDC keys", ex);
- }
-
- toAppendTo.append("}");
- } else {
- // otherwise they just want a single key output
- Object val = event.getMDC(option);
-
- if (val != null) {
- toAppendTo.append(val);
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/RelativeTimePatternConverter.java b/java/src/org/apache/log4j/pattern/RelativeTimePatternConverter.java
deleted file mode 100644
index 007a29a..0000000
--- a/java/src/org/apache/log4j/pattern/RelativeTimePatternConverter.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Return the relative time in milliseconds since loading of the LoggingEvent
- * class.
- *
- * @author Ceki Gülcü
- */
-public class RelativeTimePatternConverter extends LoggingEventPatternConverter {
- /**
- * Cached formatted timestamp.
- */
- private CachedTimestamp lastTimestamp = new CachedTimestamp(0, "");
-
- /**
- * Private constructor.
- */
- public RelativeTimePatternConverter() {
- super("Time", "time");
- }
-
- /**
- * Obtains an instance of RelativeTimePatternConverter.
- * @param options options, currently ignored, may be null.
- * @return instance of RelativeTimePatternConverter.
- */
- public static RelativeTimePatternConverter newInstance(
- final String[] options) {
- return new RelativeTimePatternConverter();
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- long timestamp = event.timeStamp;
-
- if (!lastTimestamp.format(timestamp, toAppendTo)) {
- final String formatted =
- Long.toString(timestamp - LoggingEvent.getStartTime());
- toAppendTo.append(formatted);
- lastTimestamp = new CachedTimestamp(timestamp, formatted);
- }
- }
-
- /**
- * Cached timestamp and formatted value.
- */
- private static final class CachedTimestamp {
- /**
- * Cached timestamp.
- */
- private final long timestamp;
-
- /**
- * Cached formatted timestamp.
- */
- private final String formatted;
-
- /**
- * Creates a new instance.
- * @param timestamp timestamp.
- * @param formatted formatted timestamp.
- */
- public CachedTimestamp(long timestamp, final String formatted) {
- this.timestamp = timestamp;
- this.formatted = formatted;
- }
-
- /**
- * Appends the cached formatted timestamp to the buffer if timestamps match.
- * @param newTimestamp requested timestamp.
- * @param toAppendTo buffer to append formatted timestamp.
- * @return true if requested timestamp matched cached timestamp.
- */
- public boolean format(long newTimestamp, final StringBuffer toAppendTo) {
- if (newTimestamp == timestamp) {
- toAppendTo.append(formatted);
-
- return true;
- }
-
- return false;
- }
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/SequenceNumberPatternConverter.java b/java/src/org/apache/log4j/pattern/SequenceNumberPatternConverter.java
deleted file mode 100644
index 8012682..0000000
--- a/java/src/org/apache/log4j/pattern/SequenceNumberPatternConverter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Formats the event sequence number.
- *
- * @author Ceki Gülcü
- */
-public class SequenceNumberPatternConverter
- extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final SequenceNumberPatternConverter INSTANCE =
- new SequenceNumberPatternConverter();
-
- /**
- * Private constructor.
- */
- private SequenceNumberPatternConverter() {
- super("Sequence Number", "sn");
- }
-
- /**
- * Obtains an instance of SequencePatternConverter.
- * @param options options, currently ignored, may be null.
- * @return instance of SequencePatternConverter.
- */
- public static SequenceNumberPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- toAppendTo.append("0");
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/ThreadPatternConverter.java b/java/src/org/apache/log4j/pattern/ThreadPatternConverter.java
deleted file mode 100644
index 6b3e6c3..0000000
--- a/java/src/org/apache/log4j/pattern/ThreadPatternConverter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- * Formats the event thread name.
- *
- * @author Ceki Gülcü
- */
-public class ThreadPatternConverter extends LoggingEventPatternConverter {
- /**
- * Singleton.
- */
- private static final ThreadPatternConverter INSTANCE =
- new ThreadPatternConverter();
-
- /**
- * Private constructor.
- */
- private ThreadPatternConverter() {
- super("Thread", "thread");
- }
-
- /**
- * Obtains an instance of ThreadPatternConverter.
- * @param options options, currently ignored, may be null.
- * @return instance of ThreadPatternConverter.
- */
- public static ThreadPatternConverter newInstance(
- final String[] options) {
- return INSTANCE;
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- toAppendTo.append(event.getThreadName());
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/ThrowableInformationPatternConverter.java b/java/src/org/apache/log4j/pattern/ThrowableInformationPatternConverter.java
deleted file mode 100644
index bf9c4b4..0000000
--- a/java/src/org/apache/log4j/pattern/ThrowableInformationPatternConverter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.pattern;
-
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.ThrowableInformation;
-
-
-/**
- * Outputs the ThrowableInformation portion of the LoggingEvent.
- * By default, outputs the full stack trace. %throwable{none}
- * or %throwable{0} suppresses the stack trace. %throwable{short}
- * or %throwable{1} outputs just the first line. %throwable{n}
- * will output n lines for a positive integer or drop the last
- * -n lines for a negative integer.
- *
- * @author Paul Smith
- *
- */
-public class ThrowableInformationPatternConverter
- extends LoggingEventPatternConverter {
-
- /**
- * Maximum lines of stack trace to output.
- */
- private int maxLines = Integer.MAX_VALUE;
-
- /**
- * Private constructor.
- * @param options options, may be null.
- */
- private ThrowableInformationPatternConverter(
- final String[] options) {
- super("Throwable", "throwable");
-
- if ((options != null) && (options.length > 0)) {
- if("none".equals(options[0])) {
- maxLines = 0;
- } else if("short".equals(options[0])) {
- maxLines = 1;
- } else {
- try {
- maxLines = Integer.parseInt(options[0]);
- } catch(NumberFormatException ex) {
- }
- }
- }
- }
-
- /**
- * Gets an instance of the class.
- * @param options pattern options, may be null. If first element is "short",
- * only the first line of the throwable will be formatted.
- * @return instance of class.
- */
- public static ThrowableInformationPatternConverter newInstance(
- final String[] options) {
- return new ThrowableInformationPatternConverter(options);
- }
-
- /**
- * {@inheritDoc}
- */
- public void format(final LoggingEvent event, final StringBuffer toAppendTo) {
- if (maxLines != 0) {
- ThrowableInformation information = event.getThrowableInformation();
-
- if (information != null) {
- String[] stringRep = information.getThrowableStrRep();
-
- int length = stringRep.length;
- if (maxLines < 0) {
- length += maxLines;
- } else if (length > maxLines) {
- length = maxLines;
- }
-
- for (int i = 0; i < length; i++) {
- String string = stringRep[i];
- toAppendTo.append(string).append("\n");
- }
- }
- }
- }
-
- /**
- * This converter obviously handles throwables.
- * @return true.
- */
- public boolean handlesThrowable() {
- return true;
- }
-}
diff --git a/java/src/org/apache/log4j/pattern/package.html b/java/src/org/apache/log4j/pattern/package.html
deleted file mode 100644
index 1db8283..0000000
--- a/java/src/org/apache/log4j/pattern/package.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-Provides classes implementing format specifiers in conversion patterns.
-
-
-
diff --git a/java/src/org/apache/log4j/spi/AppenderAttachable.java b/java/src/org/apache/log4j/spi/AppenderAttachable.java
deleted file mode 100644
index 89d7ef4..0000000
--- a/java/src/org/apache/log4j/spi/AppenderAttachable.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Appender;
-import java.util.Enumeration;
-
-/**
- Interface for attaching appenders to objects.
-
- @author Ceki Gülcü
- @since 0.9.1 */
-public interface AppenderAttachable {
-
- /**
- Add an appender.
- */
- public
- void addAppender(Appender newAppender);
-
- /**
- Get all previously added appenders as an Enumeration. */
- public
- Enumeration getAllAppenders();
-
- /**
- Get an appender by name.
- */
- public
- Appender getAppender(String name);
-
-
- /**
- Returns true if the specified appender is in list of
- attached attached, false otherwise.
-
- @since 1.2 */
- public
- boolean isAttached(Appender appender);
-
- /**
- Remove all previously added appenders.
- */
- void removeAllAppenders();
-
-
- /**
- Remove the appender passed as parameter from the list of appenders.
- */
- void removeAppender(Appender appender);
-
-
- /**
- Remove the appender with the name passed as parameter from the
- list of appenders.
- */
- void
- removeAppender(String name);
-}
-
diff --git a/java/src/org/apache/log4j/spi/Configurator.java b/java/src/org/apache/log4j/spi/Configurator.java
deleted file mode 100644
index 14fdd73..0000000
--- a/java/src/org/apache/log4j/spi/Configurator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import java.net.URL;
-
-/**
- Implemented by classes capable of configuring log4j using a URL.
-
- @since 1.0
- @author Anders Kristensen
- */
-public interface Configurator {
-
- /**
- Special level value signifying inherited behaviour. The current
- value of this string constant is inherited. {@link #NULL}
- is a synonym. */
- public static final String INHERITED = "inherited";
-
- /**
- Special level signifying inherited behaviour, same as {@link
- #INHERITED}. The current value of this string constant is
- null. */
- public static final String NULL = "null";
-
-
-
- /**
- Interpret a resource pointed by a URL and set up log4j accordingly.
-
- The configuration is done relative to the hierarchy
- parameter.
-
- @param url The URL to parse
- @param repository The hierarchy to operation upon.
- */
- void doConfigure(URL url, LoggerRepository repository);
-}
diff --git a/java/src/org/apache/log4j/spi/DefaultRepositorySelector.java b/java/src/org/apache/log4j/spi/DefaultRepositorySelector.java
deleted file mode 100644
index 4b30752..0000000
--- a/java/src/org/apache/log4j/spi/DefaultRepositorySelector.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-
-public class DefaultRepositorySelector implements RepositorySelector {
-
- final LoggerRepository repository;
-
- public
- DefaultRepositorySelector(LoggerRepository repository) {
- this.repository = repository;
- }
-
- public
- LoggerRepository getLoggerRepository() {
- return repository;
- }
-}
-
diff --git a/java/src/org/apache/log4j/spi/ErrorCode.java b/java/src/org/apache/log4j/spi/ErrorCode.java
deleted file mode 100644
index b0e57f1..0000000
--- a/java/src/org/apache/log4j/spi/ErrorCode.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-
-/**
- This interface defines commonly encoutered error codes.
-
- @author Ceki Gülcü
- @since 0.9.0
- */
-public interface ErrorCode {
-
- public final int GENERIC_FAILURE = 0;
- public final int WRITE_FAILURE = 1;
- public final int FLUSH_FAILURE = 2;
- public final int CLOSE_FAILURE = 3;
- public final int FILE_OPEN_FAILURE = 4;
- public final int MISSING_LAYOUT = 5;
- public final int ADDRESS_PARSE_FAILURE = 6;
-}
diff --git a/java/src/org/apache/log4j/spi/ErrorHandler.java b/java/src/org/apache/log4j/spi/ErrorHandler.java
deleted file mode 100644
index d629a2d..0000000
--- a/java/src/org/apache/log4j/spi/ErrorHandler.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Logger;
-
-
-/**
- Appenders may delegate their error handling to
- ErrorHandlers.
-
- Error handling is a particularly tedious to get right because by
- definition errors are hard to predict and to reproduce.
-
-
-
Please take the time to contact the author in case you discover
- that errors are not properly handled. You are most welcome to
- suggest new error handling policies or criticize existing policies.
-
-
- @author Ceki Gülcü
-
-*/
-public interface ErrorHandler extends OptionHandler {
-
- /**
- Add a reference to a logger to which the failing appender might
- be attached to. The failing appender will be searched and
- replaced only in the loggers you add through this method.
-
- @param logger One of the loggers that will be searched for the failing
- appender in view of replacement.
-
- @since 1.2 */
- void setLogger(Logger logger);
-
-
- /**
- Equivalent to the {@link #error(String, Exception, int,
- LoggingEvent event)} with the the event parameteter set to
- null.
-
- */
- void error(String message, Exception e, int errorCode);
-
- /**
- This method is normally used to just print the error message
- passed as a parameter.
- */
- void error(String message);
-
- /**
- This method is invoked to handle the error.
-
- @param message The message assoicated with the error.
- @param e The Exption that was thrown when the error occured.
- @param errorCode The error code associated with the error.
- @param event The logging event that the failing appender is asked
- to log.
-
- @since 1.2 */
- void error(String message, Exception e, int errorCode, LoggingEvent event);
-
- /**
- Set the appender for which errors are handled. This method is
- usually called when the error handler is configured.
-
- @since 1.2 */
- void setAppender(Appender appender);
-
- /**
- Set the appender to falkback upon in case of failure.
-
- @since 1.2 */
- void setBackupAppender(Appender appender);
-}
diff --git a/java/src/org/apache/log4j/spi/Filter.java b/java/src/org/apache/log4j/spi/Filter.java
deleted file mode 100644
index 7bddbe8..0000000
--- a/java/src/org/apache/log4j/spi/Filter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-
-
-/**
- Users should extend this class to implement customized logging
- event filtering. Note that {@link org.apache.log4j.Category} and {@link
- org.apache.log4j.AppenderSkeleton}, the parent class of all standard
- appenders, have built-in filtering rules. It is suggested that you
- first use and understand the built-in rules before rushing to write
- your own custom filters.
-
-
This abstract class assumes and also imposes that filters be
- organized in a linear chain. The {@link #decide
- decide(LoggingEvent)} method of each filter is called sequentially,
- in the order of their addition to the chain.
-
-
The {@link #decide decide(LoggingEvent)} method must return one
- of the integer constants {@link #DENY}, {@link #NEUTRAL} or {@link
- #ACCEPT}.
-
-
If the value {@link #DENY} is returned, then the log event is
- dropped immediately without consulting with the remaining
- filters.
-
-
If the value {@link #NEUTRAL} is returned, then the next filter
- in the chain is consulted. If there are no more filters in the
- chain, then the log event is logged. Thus, in the presence of no
- filters, the default behaviour is to log all logging events.
-
-
If the value {@link #ACCEPT} is returned, then the log
- event is logged without consulting the remaining filters.
-
-
The philosophy of log4j filters is largely inspired from the
- Linux ipchains.
-
-
Note that filtering is only supported by the {@link
- org.apache.log4j.xml.DOMConfigurator DOMConfigurator}. The {@link
- org.apache.log4j.PropertyConfigurator PropertyConfigurator} does not
- support filters.
-
- @author Ceki Gülcü
- @since 0.9.0 */
-public abstract class Filter implements OptionHandler {
-
- /**
- Points to the next filter in the filter chain.
-
- @deprecated As of 1.2.12, use {@link #getNext} and {@link #setNext} instead
- */
- public Filter next;
-
- /**
- The log event must be dropped immediately without consulting
- with the remaining filters, if any, in the chain. */
- public static final int DENY = -1;
-
- /**
- This filter is neutral with respect to the log event. The
- remaining filters, if any, should be consulted for a final decision.
- */
- public static final int NEUTRAL = 0;
-
- /**
- The log event must be logged immediately without consulting with
- the remaining filters, if any, in the chain. */
- public static final int ACCEPT = 1;
-
-
- /**
- Usually filters options become active when set. We provide a
- default do-nothing implementation for convenience.
- */
- public
- void activateOptions() {
- }
-
-
-
- /**
-
If the decision is DENY, then the event will be
- dropped. If the decision is NEUTRAL, then the next
- filter, if any, will be invoked. If the decision is ACCEPT then
- the event will be logged without consulting with other filters in
- the chain.
-
- @param event The LoggingEvent to decide upon.
- @return decision The decision of the filter. */
- abstract
- public
- int decide(LoggingEvent event);
-
- /**
- * Set the next filter pointer.
- */
- public void setNext(Filter next) {
- this.next = next;
- }
-
- /**
- * Return the pointer to the next filter;
- */
- public Filter getNext() {
- return next;
- }
-
-}
diff --git a/java/src/org/apache/log4j/spi/HierarchyEventListener.java b/java/src/org/apache/log4j/spi/HierarchyEventListener.java
deleted file mode 100644
index 77a0efd..0000000
--- a/java/src/org/apache/log4j/spi/HierarchyEventListener.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Category;
-
-/**
- Listen to events occuring within a {@link
- org.apache.log4j.Hierarchy Hierarchy}.
-
- @author Ceki Gülcü
- @since 1.2
-
- */
-public interface HierarchyEventListener {
-
-
- //public
- //void categoryCreationEvent(Category cat);
-
-
- public
- void addAppenderEvent(Category cat, Appender appender);
-
- public
- void removeAppenderEvent(Category cat, Appender appender);
-
-
-}
diff --git a/java/src/org/apache/log4j/spi/LocationInfo.java b/java/src/org/apache/log4j/spi/LocationInfo.java
deleted file mode 100644
index 55ee5c3..0000000
--- a/java/src/org/apache/log4j/spi/LocationInfo.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Mathias Rupprecht
-
-package org.apache.log4j.spi;
-
-import org.apache.log4j.Layout;
-import org.apache.log4j.helpers.LogLog;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.InterruptedIOException;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
-/**
- The internal representation of caller location information.
-
- @since 0.8.3
-*/
-public class LocationInfo implements java.io.Serializable {
-
- /**
- Caller's line number.
- */
- transient String lineNumber;
- /**
- Caller's file name.
- */
- transient String fileName;
- /**
- Caller's fully qualified class name.
- */
- transient String className;
- /**
- Caller's method name.
- */
- transient String methodName;
- /**
- All available caller information, in the format
- fully.qualified.classname.of.caller.methodName(Filename.java:line)
- */
- public String fullInfo;
-
- private static StringWriter sw = new StringWriter();
- private static PrintWriter pw = new PrintWriter(sw);
-
- private static Method getStackTraceMethod;
- private static Method getClassNameMethod;
- private static Method getMethodNameMethod;
- private static Method getFileNameMethod;
- private static Method getLineNumberMethod;
-
-
- /**
- When location information is not available the constant
- NA is returned. Current value of this string
- constant is ?. */
- public final static String NA = "?";
-
- static final long serialVersionUID = -1325822038990805636L;
-
- /**
- * NA_LOCATION_INFO is provided for compatibility with log4j 1.3.
- * @since 1.2.15
- */
- public static final LocationInfo NA_LOCATION_INFO =
- new LocationInfo(NA, NA, NA, NA);
-
-
-
- // Check if we are running in IBM's visual age.
- static boolean inVisualAge = false;
- static {
- try {
- inVisualAge = Class.forName("com.ibm.uvm.tools.DebugSupport") != null;
- LogLog.debug("Detected IBM VisualAge environment.");
- } catch(Throwable e) {
- // nothing to do
- }
- try {
- Class[] noArgs = null;
- getStackTraceMethod = Throwable.class.getMethod("getStackTrace", noArgs);
- Class stackTraceElementClass = Class.forName("java.lang.StackTraceElement");
- getClassNameMethod = stackTraceElementClass.getMethod("getClassName", noArgs);
- getMethodNameMethod = stackTraceElementClass.getMethod("getMethodName", noArgs);
- getFileNameMethod = stackTraceElementClass.getMethod("getFileName", noArgs);
- getLineNumberMethod = stackTraceElementClass.getMethod("getLineNumber", noArgs);
- } catch(ClassNotFoundException ex) {
- LogLog.debug("LocationInfo will use pre-JDK 1.4 methods to determine location.");
- } catch(NoSuchMethodException ex) {
- LogLog.debug("LocationInfo will use pre-JDK 1.4 methods to determine location.");
- }
- }
-
- /**
- Instantiate location information based on a Throwable. We
- expect the Throwable t, to be in the format
-
-
- java.lang.Throwable
- ...
- at org.apache.log4j.PatternLayout.format(PatternLayout.java:413)
- at org.apache.log4j.FileAppender.doAppend(FileAppender.java:183)
- at org.apache.log4j.Category.callAppenders(Category.java:131)
- at org.apache.log4j.Category.log(Category.java:512)
- at callers.fully.qualified.className.methodName(FileName.java:74)
- ...
-
-
- However, we can also deal with JIT compilers that "lose" the
- location information, especially between the parentheses.
- @param t throwable used to determine location, may be null.
- @param fqnOfCallingClass class name of first class considered part of
- the logging framework. Location will be site that calls a method on this class.
-
- */
- public LocationInfo(Throwable t, String fqnOfCallingClass) {
- if(t == null || fqnOfCallingClass == null)
- return;
- if (getLineNumberMethod != null) {
- try {
- Object[] noArgs = null;
- Object[] elements = (Object[]) getStackTraceMethod.invoke(t, noArgs);
- String prevClass = NA;
- for(int i = elements.length - 1; i >= 0; i--) {
- String thisClass = (String) getClassNameMethod.invoke(elements[i], noArgs);
- if(fqnOfCallingClass.equals(thisClass)) {
- int caller = i + 1;
- if (caller < elements.length) {
- className = prevClass;
- methodName = (String) getMethodNameMethod.invoke(elements[caller], noArgs);
- fileName = (String) getFileNameMethod.invoke(elements[caller], noArgs);
- if (fileName == null) {
- fileName = NA;
- }
- int line = ((Integer) getLineNumberMethod.invoke(elements[caller], noArgs)).intValue();
- if (line < 0) {
- lineNumber = NA;
- } else {
- lineNumber = String.valueOf(line);
- }
- StringBuffer buf = new StringBuffer();
- buf.append(className);
- buf.append(".");
- buf.append(methodName);
- buf.append("(");
- buf.append(fileName);
- buf.append(":");
- buf.append(lineNumber);
- buf.append(")");
- this.fullInfo = buf.toString();
- }
- return;
- }
- prevClass = thisClass;
- }
- return;
- } catch(IllegalAccessException ex) {
- LogLog.debug("LocationInfo failed using JDK 1.4 methods", ex);
- } catch(InvocationTargetException ex) {
- if (ex.getTargetException() instanceof InterruptedException
- || ex.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.debug("LocationInfo failed using JDK 1.4 methods", ex);
- } catch(RuntimeException ex) {
- LogLog.debug("LocationInfo failed using JDK 1.4 methods", ex);
- }
- }
-
- String s;
- // Protect against multiple access to sw.
- synchronized(sw) {
- t.printStackTrace(pw);
- s = sw.toString();
- sw.getBuffer().setLength(0);
- }
- //System.out.println("s is ["+s+"].");
- int ibegin, iend;
-
- // Given the current structure of the package, the line
- // containing "org.apache.log4j.Category." should be printed just
- // before the caller.
-
- // This method of searching may not be fastest but it's safer
- // than counting the stack depth which is not guaranteed to be
- // constant across JVM implementations.
- ibegin = s.lastIndexOf(fqnOfCallingClass);
- if(ibegin == -1)
- return;
-
- //
- // if the next character after the class name exists
- // but is not a period, see if the classname is
- // followed by a period earlier in the trace.
- // Minimizes mistakeningly matching on a class whose
- // name is a substring of the desired class.
- // See bug 44888.
- if (ibegin + fqnOfCallingClass.length() < s.length() &&
- s.charAt(ibegin + fqnOfCallingClass.length()) != '.') {
- int i = s.lastIndexOf(fqnOfCallingClass + ".");
- if (i != -1) {
- ibegin = i;
- }
- }
-
-
- ibegin = s.indexOf(Layout.LINE_SEP, ibegin);
- if(ibegin == -1)
- return;
- ibegin+= Layout.LINE_SEP_LEN;
-
- // determine end of line
- iend = s.indexOf(Layout.LINE_SEP, ibegin);
- if(iend == -1)
- return;
-
- // VA has a different stack trace format which doesn't
- // need to skip the inital 'at'
- if(!inVisualAge) {
- // back up to first blank character
- ibegin = s.lastIndexOf("at ", iend);
- if(ibegin == -1)
- return;
- // Add 3 to skip "at ";
- ibegin += 3;
- }
- // everything between is the requested stack item
- this.fullInfo = s.substring(ibegin, iend);
- }
-
- /**
- * Appends a location fragment to a buffer to build the
- * full location info.
- * @param buf StringBuffer to receive content.
- * @param fragment fragment of location (class, method, file, line),
- * if null the value of NA will be appended.
- * @since 1.2.15
- */
- private static final void appendFragment(final StringBuffer buf,
- final String fragment) {
- if (fragment == null) {
- buf.append(NA);
- } else {
- buf.append(fragment);
- }
- }
-
- /**
- * Create new instance.
- * @param file source file name
- * @param classname class name
- * @param method method
- * @param line source line number
- *
- * @since 1.2.15
- */
- public LocationInfo(
- final String file,
- final String classname,
- final String method,
- final String line) {
- this.fileName = file;
- this.className = classname;
- this.methodName = method;
- this.lineNumber = line;
- StringBuffer buf = new StringBuffer();
- appendFragment(buf, classname);
- buf.append(".");
- appendFragment(buf, method);
- buf.append("(");
- appendFragment(buf, file);
- buf.append(":");
- appendFragment(buf, line);
- buf.append(")");
- this.fullInfo = buf.toString();
- }
-
- /**
- Return the fully qualified class name of the caller making the
- logging request.
- */
- public
- String getClassName() {
- if(fullInfo == null) return NA;
- if(className == null) {
- // Starting the search from '(' is safer because there is
- // potentially a dot between the parentheses.
- int iend = fullInfo.lastIndexOf('(');
- if(iend == -1)
- className = NA;
- else {
- iend =fullInfo.lastIndexOf('.', iend);
-
- // This is because a stack trace in VisualAge looks like:
-
- //java.lang.RuntimeException
- // java.lang.Throwable()
- // java.lang.Exception()
- // java.lang.RuntimeException()
- // void test.test.B.print()
- // void test.test.A.printIndirect()
- // void test.test.Run.main(java.lang.String [])
- int ibegin = 0;
- if (inVisualAge) {
- ibegin = fullInfo.lastIndexOf(' ', iend)+1;
- }
-
- if(iend == -1)
- className = NA;
- else
- className = this.fullInfo.substring(ibegin, iend);
- }
- }
- return className;
- }
-
- /**
- Return the file name of the caller.
-
-
This information is not always available.
- */
- public
- String getFileName() {
- if(fullInfo == null) return NA;
-
- if(fileName == null) {
- int iend = fullInfo.lastIndexOf(':');
- if(iend == -1)
- fileName = NA;
- else {
- int ibegin = fullInfo.lastIndexOf('(', iend - 1);
- fileName = this.fullInfo.substring(ibegin + 1, iend);
- }
- }
- return fileName;
- }
-
- /**
- Returns the line number of the caller.
-
-
This information is not always available.
- */
- public
- String getLineNumber() {
- if(fullInfo == null) return NA;
-
- if(lineNumber == null) {
- int iend = fullInfo.lastIndexOf(')');
- int ibegin = fullInfo.lastIndexOf(':', iend -1);
- if(ibegin == -1)
- lineNumber = NA;
- else
- lineNumber = this.fullInfo.substring(ibegin + 1, iend);
- }
- return lineNumber;
- }
-
- /**
- Returns the method name of the caller.
- */
- public
- String getMethodName() {
- if(fullInfo == null) return NA;
- if(methodName == null) {
- int iend = fullInfo.lastIndexOf('(');
- int ibegin = fullInfo.lastIndexOf('.', iend);
- if(ibegin == -1)
- methodName = NA;
- else
- methodName = this.fullInfo.substring(ibegin + 1, iend);
- }
- return methodName;
- }
-}
diff --git a/java/src/org/apache/log4j/spi/LoggerFactory.java b/java/src/org/apache/log4j/spi/LoggerFactory.java
deleted file mode 100644
index 568c41f..0000000
--- a/java/src/org/apache/log4j/spi/LoggerFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Logger;
-
-/**
-
- Implement this interface to create new instances of Logger or
- a sub-class of Logger.
-
-
See examples/subclass/MyLogger.java for an example.
-
- @author Ceki Gülcü
- @since version 0.8.5
-
- */
-public interface LoggerFactory {
-
- public
- Logger makeNewLoggerInstance(String name);
-
-}
diff --git a/java/src/org/apache/log4j/spi/LoggerRepository.java b/java/src/org/apache/log4j/spi/LoggerRepository.java
deleted file mode 100644
index 9ca156b..0000000
--- a/java/src/org/apache/log4j/spi/LoggerRepository.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import java.util.Enumeration;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Category;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-
-/**
- A LoggerRepository is used to create and retrieve
- Loggers. The relation between loggers in a repository
- depends on the repository but typically loggers are arranged in a
- named hierarchy.
-
-
In addition to the creational methods, a
- LoggerRepository can be queried for existing loggers,
- can act as a point of registry for events related to loggers.
-
- @author Ceki Gülcü
- @since 1.2 */
-public interface LoggerRepository {
-
- /**
- Add a {@link HierarchyEventListener} event to the repository.
- */
- public
- void addHierarchyEventListener(HierarchyEventListener listener);
-
- /**
- Returns whether this repository is disabled for a given
- level. The answer depends on the repository threshold and the
- level parameter. See also {@link #setThreshold}
- method. */
- boolean isDisabled(int level);
-
- /**
- Set the repository-wide threshold. All logging requests below the
- threshold are immediately dropped. By default, the threshold is
- set to Level.ALL which has the lowest possible rank. */
- public
- void setThreshold(Level level);
-
- /**
- Another form of {@link #setThreshold(Level)} accepting a string
- parameter instead of a Level. */
- public
- void setThreshold(String val);
-
- public
- void emitNoAppenderWarning(Category cat);
-
- /**
- Get the repository-wide threshold. See {@link
- #setThreshold(Level)} for an explanation. */
- public
- Level getThreshold();
-
- public
- Logger getLogger(String name);
-
- public
- Logger getLogger(String name, LoggerFactory factory);
-
- public
- Logger getRootLogger();
-
- public
- abstract
- Logger exists(String name);
-
- public
- abstract
- void shutdown();
-
- public
- Enumeration getCurrentLoggers();
-
- /**
- Deprecated. Please use {@link #getCurrentLoggers} instead. */
- public
- Enumeration getCurrentCategories();
-
-
- public
- abstract
- void fireAddAppenderEvent(Category logger, Appender appender);
-
- public
- abstract
- void resetConfiguration();
-
-}
diff --git a/java/src/org/apache/log4j/spi/LoggingEvent.java b/java/src/org/apache/log4j/spi/LoggingEvent.java
deleted file mode 100644
index 2bacb50..0000000
--- a/java/src/org/apache/log4j/spi/LoggingEvent.java
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import java.io.InterruptedIOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.log4j.Category;
-import org.apache.log4j.Level;
-import org.apache.log4j.MDC;
-import org.apache.log4j.NDC;
-import org.apache.log4j.Priority;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.LogLog;
-
-// Contributors: Nelson Minar
-// Wolf Siberski
-// Anders Kristensen
-
-/**
- The internal representation of logging events. When an affirmative
- decision is made to log then a LoggingEvent instance
- is created. This instance is passed around to the different log4j
- components.
-
- This class is of concern to those wishing to extend log4j.
-
- @author Ceki Gülcü
- @author James P. Cakalic
-
- @since 0.8.2 */
-public class LoggingEvent implements java.io.Serializable {
-
- private static long startTime = System.currentTimeMillis();
-
- /** Fully qualified name of the calling category class. */
- transient public final String fqnOfCategoryClass;
-
- /**
- * The category of the logging event. This field is not serialized
- * for performance reasons.
- *
- *
It is set by the LoggingEvent constructor or set by a remote
- * entity after deserialization.
- *
- * @deprecated This field will be marked as private or be completely
- * removed in future releases. Please do not use it.
- * */
- transient private Category logger;
-
- /**
- *
The category (logger) name.
- *
- * @deprecated This field will be marked as private in future
- * releases. Please do not access it directly. Use the {@link
- * #getLoggerName} method instead.
-
- * */
- final public String categoryName;
-
- /**
- * Level of logging event. Level cannot be serializable because it
- * is a flyweight. Due to its special seralization it cannot be
- * declared final either.
- *
- *
This field should not be accessed directly. You shoud use the
- * {@link #getLevel} method instead.
- *
- * @deprecated This field will be marked as private in future
- * releases. Please do not access it directly. Use the {@link
- * #getLevel} method instead.
- * */
- transient public Priority level;
-
- /** The nested diagnostic context (NDC) of logging event. */
- private String ndc;
-
- /** The mapped diagnostic context (MDC) of logging event. */
- private Hashtable mdcCopy;
-
-
- /** Have we tried to do an NDC lookup? If we did, there is no need
- * to do it again. Note that its value is always false when
- * serialized. Thus, a receiving SocketNode will never use it's own
- * (incorrect) NDC. See also writeObject method. */
- private boolean ndcLookupRequired = true;
-
-
- /** Have we tried to do an MDC lookup? If we did, there is no need
- * to do it again. Note that its value is always false when
- * serialized. See also the getMDC and getMDCCopy methods. */
- private boolean mdcCopyLookupRequired = true;
-
- /** The application supplied message of logging event. */
- transient private Object message;
-
- /** The application supplied message rendered through the log4j
- objet rendering mechanism.*/
- private String renderedMessage;
-
- /** The name of thread in which this logging event was generated. */
- private String threadName;
-
-
- /** This
- variable contains information about this event's throwable
- */
- private ThrowableInformation throwableInfo;
-
- /** The number of milliseconds elapsed from 1/1/1970 until logging event
- was created. */
- public final long timeStamp;
- /** Location information for the caller. */
- private LocationInfo locationInfo;
-
- // Serialization
- static final long serialVersionUID = -868428216207166145L;
-
- static final Integer[] PARAM_ARRAY = new Integer[1];
- static final String TO_LEVEL = "toLevel";
- static final Class[] TO_LEVEL_PARAMS = new Class[] {int.class};
- static final Hashtable methodCache = new Hashtable(3); // use a tiny table
-
- /**
- Instantiate a LoggingEvent from the supplied parameters.
-
-
Except {@link #timeStamp} all the other fields of
- LoggingEvent are filled when actually needed.
-
- @param logger The logger generating this event.
- @param level The level of this event.
- @param message The message of this event.
- @param throwable The throwable of this event. */
- public LoggingEvent(String fqnOfCategoryClass, Category logger,
- Priority level, Object message, Throwable throwable) {
- this.fqnOfCategoryClass = fqnOfCategoryClass;
- this.logger = logger;
- this.categoryName = logger.getName();
- this.level = level;
- this.message = message;
- if(throwable != null) {
- this.throwableInfo = new ThrowableInformation(throwable, logger);
- }
- timeStamp = System.currentTimeMillis();
- }
-
- /**
- Instantiate a LoggingEvent from the supplied parameters.
-
-
Except {@link #timeStamp} all the other fields of
- LoggingEvent are filled when actually needed.
-
- @param logger The logger generating this event.
- @param timeStamp the timestamp of this logging event
- @param level The level of this event.
- @param message The message of this event.
- @param throwable The throwable of this event. */
- public LoggingEvent(String fqnOfCategoryClass, Category logger,
- long timeStamp, Priority level, Object message,
- Throwable throwable) {
- this.fqnOfCategoryClass = fqnOfCategoryClass;
- this.logger = logger;
- this.categoryName = logger.getName();
- this.level = level;
- this.message = message;
- if(throwable != null) {
- this.throwableInfo = new ThrowableInformation(throwable, logger);
- }
-
- this.timeStamp = timeStamp;
- }
-
- /**
- Create new instance.
- @since 1.2.15
- @param fqnOfCategoryClass Fully qualified class name
- of Logger implementation.
- @param logger The logger generating this event.
- @param timeStamp the timestamp of this logging event
- @param level The level of this event.
- @param message The message of this event.
- @param threadName thread name
- @param throwable The throwable of this event.
- @param ndc Nested diagnostic context
- @param info Location info
- @param properties MDC properties
- */
- public LoggingEvent(final String fqnOfCategoryClass,
- final Category logger,
- final long timeStamp,
- final Level level,
- final Object message,
- final String threadName,
- final ThrowableInformation throwable,
- final String ndc,
- final LocationInfo info,
- final java.util.Map properties) {
- super();
- this.fqnOfCategoryClass = fqnOfCategoryClass;
- this.logger = logger;
- if (logger != null) {
- categoryName = logger.getName();
- } else {
- categoryName = null;
- }
- this.level = level;
- this.message = message;
- if(throwable != null) {
- this.throwableInfo = throwable;
- }
-
- this.timeStamp = timeStamp;
- this.threadName = threadName;
- ndcLookupRequired = false;
- this.ndc = ndc;
- this.locationInfo = info;
- mdcCopyLookupRequired = false;
- if (properties != null) {
- mdcCopy = new java.util.Hashtable(properties);
- }
- }
-
-
- /**
- Set the location information for this logging event. The collected
- information is cached for future use.
- */
- public LocationInfo getLocationInformation() {
- if(locationInfo == null) {
- locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass);
- }
- return locationInfo;
- }
-
- /**
- * Return the level of this event. Use this form instead of directly
- * accessing the level field. */
- public Level getLevel() {
- return (Level) level;
- }
-
- /**
- * Return the name of the logger. Use this form instead of directly
- * accessing the categoryName field.
- */
- public String getLoggerName() {
- return categoryName;
- }
-
- /**
- * Gets the logger of the event.
- * Use should be restricted to cloning events.
- * @since 1.2.15
- */
- public Category getLogger() {
- return logger;
- }
-
- /**
- Return the message for this logging event.
-
-
Before serialization, the returned object is the message
- passed by the user to generate the logging event. After
- serialization, the returned value equals the String form of the
- message possibly after object rendering.
-
- @since 1.1 */
- public
- Object getMessage() {
- if(message != null) {
- return message;
- } else {
- return getRenderedMessage();
- }
- }
-
- /**
- * This method returns the NDC for this event. It will return the
- * correct content even if the event was generated in a different
- * thread or even on a different machine. The {@link NDC#get} method
- * should never be called directly. */
- public
- String getNDC() {
- if(ndcLookupRequired) {
- ndcLookupRequired = false;
- ndc = NDC.get();
- }
- return ndc;
- }
-
-
- /**
- Returns the the context corresponding to the key
- parameter. If there is a local MDC copy, possibly because we are
- in a logging server or running inside AsyncAppender, then we
- search for the key in MDC copy, if a value is found it is
- returned. Otherwise, if the search in MDC copy returns a null
- result, then the current thread's MDC is used.
-
-
Note that both the local MDC copy and the current
- thread's MDC are searched.
-
- */
- public
- Object getMDC(String key) {
- Object r;
- // Note the mdcCopy is used if it exists. Otherwise we use the MDC
- // that is associated with the thread.
- if(mdcCopy != null) {
- r = mdcCopy.get(key);
- if(r != null) {
- return r;
- }
- }
- return MDC.get(key);
- }
-
- /**
- Obtain a copy of this thread's MDC prior to serialization or
- asynchronous logging.
- */
- public
- void getMDCCopy() {
- if(mdcCopyLookupRequired) {
- mdcCopyLookupRequired = false;
- // the clone call is required for asynchronous logging.
- // See also bug #5932.
- Hashtable t = (Hashtable) MDC.getContext();
- if(t != null) {
- mdcCopy = (Hashtable) t.clone();
- }
- }
- }
-
- public
- String getRenderedMessage() {
- if(renderedMessage == null && message != null) {
- if(message instanceof String)
- renderedMessage = (String) message;
- else {
- LoggerRepository repository = logger.getLoggerRepository();
-
- if(repository instanceof RendererSupport) {
- RendererSupport rs = (RendererSupport) repository;
- renderedMessage= rs.getRendererMap().findAndRender(message);
- } else {
- renderedMessage = message.toString();
- }
- }
- }
- return renderedMessage;
- }
-
- /**
- Returns the time when the application started, in milliseconds
- elapsed since 01.01.1970. */
- public static long getStartTime() {
- return startTime;
- }
-
- public
- String getThreadName() {
- if(threadName == null)
- threadName = (Thread.currentThread()).getName();
- return threadName;
- }
-
- /**
- Returns the throwable information contained within this
- event. May be null if there is no such information.
-
-
Note that the {@link Throwable} object contained within a
- {@link ThrowableInformation} does not survive serialization.
-
- @since 1.1 */
- public
- ThrowableInformation getThrowableInformation() {
- return throwableInfo;
- }
-
- /**
- Return this event's throwable's string[] representaion.
- */
- public
- String[] getThrowableStrRep() {
-
- if(throwableInfo == null)
- return null;
- else
- return throwableInfo.getThrowableStrRep();
- }
-
-
- private
- void readLevel(ObjectInputStream ois)
- throws java.io.IOException, ClassNotFoundException {
-
- int p = ois.readInt();
- try {
- String className = (String) ois.readObject();
- if(className == null) {
- level = Level.toLevel(p);
- } else {
- Method m = (Method) methodCache.get(className);
- if(m == null) {
- Class clazz = Loader.loadClass(className);
- // Note that we use Class.getDeclaredMethod instead of
- // Class.getMethod. This assumes that the Level subclass
- // implements the toLevel(int) method which is a
- // requirement. Actually, it does not make sense for Level
- // subclasses NOT to implement this method. Also note that
- // only Level can be subclassed and not Priority.
- m = clazz.getDeclaredMethod(TO_LEVEL, TO_LEVEL_PARAMS);
- methodCache.put(className, m);
- }
- PARAM_ARRAY[0] = new Integer(p);
- level = (Level) m.invoke(null, PARAM_ARRAY);
- }
- } catch(InvocationTargetException e) {
- if (e.getTargetException() instanceof InterruptedException
- || e.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.warn("Level deserialization failed, reverting to default.", e);
- level = Level.toLevel(p);
- } catch(NoSuchMethodException e) {
- LogLog.warn("Level deserialization failed, reverting to default.", e);
- level = Level.toLevel(p);
- } catch(IllegalAccessException e) {
- LogLog.warn("Level deserialization failed, reverting to default.", e);
- level = Level.toLevel(p);
- } catch(RuntimeException e) {
- LogLog.warn("Level deserialization failed, reverting to default.", e);
- level = Level.toLevel(p);
- }
- }
-
- private void readObject(ObjectInputStream ois)
- throws java.io.IOException, ClassNotFoundException {
- ois.defaultReadObject();
- readLevel(ois);
-
- // Make sure that no location info is available to Layouts
- if(locationInfo == null)
- locationInfo = new LocationInfo(null, null);
- }
-
- private
- void writeObject(ObjectOutputStream oos) throws java.io.IOException {
- // Aside from returning the current thread name the wgetThreadName
- // method sets the threadName variable.
- this.getThreadName();
-
- // This sets the renders the message in case it wasn't up to now.
- this.getRenderedMessage();
-
- // This call has a side effect of setting this.ndc and
- // setting ndcLookupRequired to false if not already false.
- this.getNDC();
-
- // This call has a side effect of setting this.mdcCopy and
- // setting mdcLookupRequired to false if not already false.
- this.getMDCCopy();
-
- // This sets the throwable sting representation of the event throwable.
- this.getThrowableStrRep();
-
- oos.defaultWriteObject();
-
- // serialize this event's level
- writeLevel(oos);
- }
-
- private
- void writeLevel(ObjectOutputStream oos) throws java.io.IOException {
-
- oos.writeInt(level.toInt());
-
- Class clazz = level.getClass();
- if(clazz == Level.class) {
- oos.writeObject(null);
- } else {
- // writing directly the Class object would be nicer, except that
- // serialized a Class object can not be read back by JDK
- // 1.1.x. We have to resort to this hack instead.
- oos.writeObject(clazz.getName());
- }
- }
-
- /**
- * Set value for MDC property.
- * This adds the specified MDC property to the event.
- * Access to the MDC is not synchronized, so this
- * method should only be called when it is known that
- * no other threads are accessing the MDC.
- * @since 1.2.15
- * @param propName
- * @param propValue
- */
- public final void setProperty(final String propName,
- final String propValue) {
- if (mdcCopy == null) {
- getMDCCopy();
- }
- if (mdcCopy == null) {
- mdcCopy = new Hashtable();
- }
- mdcCopy.put(propName, propValue);
- }
-
- /**
- * Return a property for this event. The return value can be null.
- *
- * Equivalent to getMDC(String) in log4j 1.2. Provided
- * for compatibility with log4j 1.3.
- *
- * @param key property name
- * @return property value or null if property not set
- * @since 1.2.15
- */
- public final String getProperty(final String key) {
- Object value = getMDC(key);
- String retval = null;
- if (value != null) {
- retval = value.toString();
- }
- return retval;
- }
-
- /**
- * Check for the existence of location information without creating it
- * (a byproduct of calling getLocationInformation).
- * @return true if location information has been extracted.
- * @since 1.2.15
- */
- public final boolean locationInformationExists() {
- return (locationInfo != null);
- }
-
- /**
- * Getter for the event's time stamp. The time stamp is calculated starting
- * from 1970-01-01 GMT.
- * @return timestamp
- *
- * @since 1.2.15
- */
- public final long getTimeStamp() {
- return timeStamp;
- }
-
- /**
- * Returns the set of the key values in the properties
- * for the event.
- *
- * The returned set is unmodifiable by the caller.
- *
- * Provided for compatibility with log4j 1.3
- *
- * @return Set an unmodifiable set of the property keys.
- * @since 1.2.15
- */
- public Set getPropertyKeySet() {
- return getProperties().keySet();
- }
-
- /**
- * Returns the set of properties
- * for the event.
- *
- * The returned set is unmodifiable by the caller.
- *
- * Provided for compatibility with log4j 1.3
- *
- * @return Set an unmodifiable map of the properties.
- * @since 1.2.15
- */
- public Map getProperties() {
- getMDCCopy();
- Map properties;
- if (mdcCopy == null) {
- properties = new HashMap();
- } else {
- properties = mdcCopy;
- }
- return Collections.unmodifiableMap(properties);
- }
-
- /**
- * Get the fully qualified name of the calling logger sub-class/wrapper.
- * Provided for compatibility with log4j 1.3
- * @return fully qualified class name, may be null.
- * @since 1.2.15
- */
- public String getFQNOfLoggerClass() {
- return fqnOfCategoryClass;
- }
-
-
- /**
- * This removes the specified MDC property from the event.
- * Access to the MDC is not synchronized, so this
- * method should only be called when it is known that
- * no other threads are accessing the MDC.
- * @param propName the property name to remove
- * @since 1.2.16
- */
- public Object removeProperty(String propName) {
- if (mdcCopy == null) {
- getMDCCopy();
- }
- if (mdcCopy == null) {
- mdcCopy = new Hashtable();
- }
- return mdcCopy.remove(propName);
- }
-}
diff --git a/java/src/org/apache/log4j/spi/NOPLogger.java b/java/src/org/apache/log4j/spi/NOPLogger.java
deleted file mode 100644
index 38b1514..0000000
--- a/java/src/org/apache/log4j/spi/NOPLogger.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.Priority;
-
-import java.util.Enumeration;
-import java.util.ResourceBundle;
-import java.util.Vector;
-
-/**
- * No-operation implementation of Logger used by NOPLoggerRepository.
- * @since 1.2.15
- */
-public final class NOPLogger extends Logger {
- /**
- * Create instance of Logger.
- * @param repo repository, may not be null.
- * @param name name, may not be null, use "root" for root logger.
- */
- public NOPLogger(NOPLoggerRepository repo, final String name) {
- super(name);
- this.repository = repo;
- this.level = Level.OFF;
- this.parent = this;
- }
-
- /** {@inheritDoc} */
- public void addAppender(final Appender newAppender) {
- }
-
- /** {@inheritDoc} */
- public void assertLog(final boolean assertion, final String msg) {
- }
-
-
- /** {@inheritDoc} */
- public void callAppenders(final LoggingEvent event) {
- }
-
- /** {@inheritDoc} */
- void closeNestedAppenders() {
- }
-
- /** {@inheritDoc} */
- public void debug(final Object message) {
- }
-
-
- /** {@inheritDoc} */
- public void debug(final Object message, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public void error(final Object message) {
- }
-
- /** {@inheritDoc} */
- public void error(final Object message, final Throwable t) {
- }
-
-
- /** {@inheritDoc} */
- public void fatal(final Object message) {
- }
-
- /** {@inheritDoc} */
- public void fatal(final Object message, final Throwable t) {
- }
-
-
- /** {@inheritDoc} */
- public Enumeration getAllAppenders() {
- return new Vector().elements();
- }
-
- /** {@inheritDoc} */
- public Appender getAppender(final String name) {
- return null;
- }
-
- /** {@inheritDoc} */
- public Level getEffectiveLevel() {
- return Level.OFF;
- }
-
- /** {@inheritDoc} */
- public Priority getChainedPriority() {
- return getEffectiveLevel();
- }
-
- /** {@inheritDoc} */
- public ResourceBundle getResourceBundle() {
- return null;
- }
-
-
- /** {@inheritDoc} */
- public void info(final Object message) {
- }
-
- /** {@inheritDoc} */
- public void info(final Object message, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public boolean isAttached(Appender appender) {
- return false;
- }
-
- /** {@inheritDoc} */
- public boolean isDebugEnabled() {
- return false;
- }
-
- /** {@inheritDoc} */
- public boolean isEnabledFor(final Priority level) {
- return false;
- }
-
- /** {@inheritDoc} */
- public boolean isInfoEnabled() {
- return false;
- }
-
-
- /** {@inheritDoc} */
- public void l7dlog(final Priority priority, final String key, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public void l7dlog(final Priority priority, final String key, final Object[] params, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public void log(final Priority priority, final Object message, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public void log(final Priority priority, final Object message) {
- }
-
- /** {@inheritDoc} */
- public void log(final String callerFQCN, final Priority level, final Object message, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public void removeAllAppenders() {
- }
-
-
- /** {@inheritDoc} */
- public void removeAppender(Appender appender) {
- }
-
- /** {@inheritDoc} */
- public void removeAppender(final String name) {
- }
-
- /** {@inheritDoc} */
- public void setLevel(final Level level) {
- }
-
-
- /** {@inheritDoc} */
- public void setPriority(final Priority priority) {
- }
-
- /** {@inheritDoc} */
- public void setResourceBundle(final ResourceBundle bundle) {
- }
-
- /** {@inheritDoc} */
- public void warn(final Object message) {
- }
-
- /** {@inheritDoc} */
- public void warn(final Object message, final Throwable t) {
- }
-
- /** {@inheritDoc} */
- public void trace(Object message) {
- }
-
- /** {@inheritDoc} */
- public void trace(Object message, Throwable t) {
- }
-
- /** {@inheritDoc} */
- public boolean isTraceEnabled() {
- return false;
- }
-
-
-}
diff --git a/java/src/org/apache/log4j/spi/NOPLoggerRepository.java b/java/src/org/apache/log4j/spi/NOPLoggerRepository.java
deleted file mode 100644
index bdb6ed9..0000000
--- a/java/src/org/apache/log4j/spi/NOPLoggerRepository.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.Category;
-import org.apache.log4j.Logger;
-import org.apache.log4j.Appender;
-
-import java.util.Enumeration;
-import java.util.Vector;
-
-/**
- * No-operation implementation of LoggerRepository which is used when
- * LogManager.repositorySelector is erroneously nulled during class reloading.
- * @since 1.2.15
- */
-public final class NOPLoggerRepository implements LoggerRepository {
- /**
- * {@inheritDoc}
- */
- public void addHierarchyEventListener(final HierarchyEventListener listener) {
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean isDisabled(final int level) {
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- public void setThreshold(final Level level) {
- }
-
- /**
- * {@inheritDoc}
- */
- public void setThreshold(final String val) {
- }
-
- /**
- * {@inheritDoc}
- */
- public void emitNoAppenderWarning(final Category cat) {
- }
-
- /**
- * {@inheritDoc}
- */
- public Level getThreshold() {
- return Level.OFF;
- }
-
- /**
- * {@inheritDoc}
- */
- public Logger getLogger(final String name) {
- return new NOPLogger(this, name);
- }
-
- /**
- * {@inheritDoc}
- */
- public Logger getLogger(final String name, final LoggerFactory factory) {
- return new NOPLogger(this, name);
- }
-
- /**
- * {@inheritDoc}
- */
- public Logger getRootLogger() {
- return new NOPLogger(this, "root");
- }
-
- /**
- * {@inheritDoc}
- */
- public Logger exists(final String name) {
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- public void shutdown() {
- }
-
- /**
- * {@inheritDoc}
- */
- public Enumeration getCurrentLoggers() {
- return new Vector().elements();
- }
-
- /**
- * {@inheritDoc}
- */
- public Enumeration getCurrentCategories() {
- return getCurrentLoggers();
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void fireAddAppenderEvent(Category logger, Appender appender) {
- }
-
- /**
- * {@inheritDoc}
- */
- public void resetConfiguration() {
- }
-}
diff --git a/java/src/org/apache/log4j/spi/NullWriter.java b/java/src/org/apache/log4j/spi/NullWriter.java
deleted file mode 100644
index a578910..0000000
--- a/java/src/org/apache/log4j/spi/NullWriter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-import java.io.Writer;
-
-/**
- * NullWriter is an obsolete class provided only for
- * binary compatibility with earlier versions of log4j and should not be used.
- *
- * @deprecated
- */
-class NullWriter extends Writer {
-
- public void close() {
- // blank
- }
-
- public void flush() {
- // blank
- }
-
- public void write(char[] cbuf, int off, int len) {
- // blank
- }
-}
diff --git a/java/src/org/apache/log4j/spi/OptionHandler.java b/java/src/org/apache/log4j/spi/OptionHandler.java
deleted file mode 100644
index 2c90226..0000000
--- a/java/src/org/apache/log4j/spi/OptionHandler.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-
-/**
- A string based interface to configure package components.
-
- @author Ceki Gülcü
- @author Anders Kristensen
- @since 0.8.1
- */
-public interface OptionHandler {
-
- /**
- Activate the options that were previously set with calls to option
- setters.
-
-
This allows to defer activiation of the options until all
- options have been set. This is required for components which have
- related options that remain ambigous until all are set.
-
-
For example, the FileAppender has the {@link
- org.apache.log4j.FileAppender#setFile File} and {@link
- org.apache.log4j.FileAppender#setAppend Append} options both of
- which are ambigous until the other is also set. */
- void activateOptions();
-
- /**
- Return list of strings that the OptionHandler instance recognizes.
-
- @deprecated We now use JavaBeans style getters/setters.
- */
- // String[] getOptionStrings();
-
- /**
- Set option to value.
-
-
The handling of each option depends on the OptionHandler
- instance. Some options may become active immediately whereas
- other may be activated only when {@link #activateOptions} is
- called.
-
- @deprecated We now use JavaBeans style getters/setters.
- */
- //void setOption(String option, String value);
-}
diff --git a/java/src/org/apache/log4j/spi/RendererSupport.java b/java/src/org/apache/log4j/spi/RendererSupport.java
deleted file mode 100644
index 9d69faa..0000000
--- a/java/src/org/apache/log4j/spi/RendererSupport.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.or.ObjectRenderer;
-import org.apache.log4j.or.RendererMap;
-
-
-public interface RendererSupport {
-
- public
- RendererMap getRendererMap();
-
- public
- void setRenderer(Class renderedClass, ObjectRenderer renderer);
-
-}
diff --git a/java/src/org/apache/log4j/spi/RepositorySelector.java b/java/src/org/apache/log4j/spi/RepositorySelector.java
deleted file mode 100644
index 9a70d62..0000000
--- a/java/src/org/apache/log4j/spi/RepositorySelector.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-
-/**
-
- The LogManager uses one (and only one)
- RepositorySelector implementation to select the
- {@link LoggerRepository} for a particular application context.
-
-
It is the responsability of the RepositorySelector
- implementation to track the application context. Log4j makes no
- assumptions about the application context or on its management.
-
-
See also {@link org.apache.log4j.LogManager LogManager}.
-
- @author Ceki Gülcü
- @since 1.2
-
- */
-public interface RepositorySelector {
-
- /**
- Returns a {@link LoggerRepository} depending on the
- context. Implementors must make sure that a valid (non-null)
- LoggerRepository is returned.
- */
- public
- LoggerRepository getLoggerRepository();
-}
-
diff --git a/java/src/org/apache/log4j/spi/RootCategory.java b/java/src/org/apache/log4j/spi/RootCategory.java
deleted file mode 100644
index 9954791..0000000
--- a/java/src/org/apache/log4j/spi/RootCategory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.LogLog;
-
-// Contibutors: Mathias Bogaert
-
-/**
- * @deprecated Replaced by {@link RootLogger}.
- */
-final public class RootCategory extends Logger {
-
- /**
- The root category names itself as "root". However, the root
- category cannot be retrieved by name.
- */
- public
- RootCategory(Level level) {
- super("root");
- setLevel(level);
- }
-
-
- /**
- Return the assigned level value without walking the category
- hierarchy.
- */
- final
- public
- Level getChainedLevel() {
- return level;
- }
-
- /**
- Setting a null value to the level of the root category may have catastrophic
- results. We prevent this here.
-
- @since 0.8.3 */
- final
- public
- void setLevel(Level level) {
- if(level == null) {
- LogLog.error("You have tried to set a null level to root.",
- new Throwable());
- }
- else {
- this.level = level;
- }
- }
-
- final
- public
- void setPriority(Level level) {
- setLevel(level);
- }
-
-
-}
diff --git a/java/src/org/apache/log4j/spi/RootLogger.java b/java/src/org/apache/log4j/spi/RootLogger.java
deleted file mode 100644
index a9ffd74..0000000
--- a/java/src/org/apache/log4j/spi/RootLogger.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.LogLog;
-
-
-// Contibutors: Mathias Bogaert
-
-/**
- RootLogger sits at the top of the logger hierachy. It is a
- regular logger except that it provides several guarantees.
-
-
First, it cannot be assigned a null
- level. Second, since root logger cannot have a parent, the
- {@link #getChainedLevel} method always returns the value of the
- level field without walking the hierarchy.
-
- @author Ceki Gülcü
-
- */
-public final class RootLogger extends Logger {
- /**
- The root logger names itself as "root". However, the root
- logger cannot be retrieved by name.
- */
- public RootLogger(Level level) {
- super("root");
- setLevel(level);
- }
-
- /**
- Return the assigned level value without walking the logger
- hierarchy.
- */
- public final Level getChainedLevel() {
- return level;
- }
-
- /**
- Setting a null value to the level of the root logger may have catastrophic
- results. We prevent this here.
-
- @since 0.8.3 */
- public final void setLevel(Level level) {
- if (level == null) {
- LogLog.error(
- "You have tried to set a null level to root.", new Throwable());
- } else {
- this.level = level;
- }
- }
-
-}
diff --git a/java/src/org/apache/log4j/spi/ThrowableInformation.java b/java/src/org/apache/log4j/spi/ThrowableInformation.java
deleted file mode 100644
index 033f18b..0000000
--- a/java/src/org/apache/log4j/spi/ThrowableInformation.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import org.apache.log4j.Category;
-import org.apache.log4j.DefaultThrowableRenderer;
-
-/**
- * ThrowableInformation is log4j's internal representation of
- * throwables. It essentially consists of a string array, called
- * 'rep', where the first element, that is rep[0], represents the
- * string representation of the throwable (i.e. the value you get
- * when you do throwable.toString()) and subsequent elements
- * correspond the stack trace with the top most entry of the stack
- * corresponding to the second entry of the 'rep' array that is
- * rep[1].
- *
- * @author Ceki Gülcü
- *
- * */
-public class ThrowableInformation implements java.io.Serializable {
-
- static final long serialVersionUID = -4748765566864322735L;
-
- private transient Throwable throwable;
- private transient Category category;
- private String[] rep;
-
- public
- ThrowableInformation(Throwable throwable) {
- this.throwable = throwable;
- }
-
- /**
- * Create a new instance.
- * @param throwable throwable, may not be null.
- * @param category category used to obtain ThrowableRenderer, may be null.
- * @since 1.2.16
- */
- public ThrowableInformation(Throwable throwable, Category category) {
- this.throwable = throwable;
- this.category = category;
- }
-
- /**
- * Create new instance.
- * @since 1.2.15
- * @param r String representation of throwable.
- */
- public ThrowableInformation(final String[] r) {
- if (r != null) {
- rep = (String[]) r.clone();
- }
- }
-
-
- public
- Throwable getThrowable() {
- return throwable;
- }
-
- public synchronized String[] getThrowableStrRep() {
- if(rep == null) {
- ThrowableRenderer renderer = null;
- if (category != null) {
- LoggerRepository repo = category.getLoggerRepository();
- if (repo instanceof ThrowableRendererSupport) {
- renderer = ((ThrowableRendererSupport) repo).getThrowableRenderer();
- }
- }
- if (renderer == null) {
- rep = DefaultThrowableRenderer.render(throwable);
- } else {
- rep = renderer.doRender(throwable);
- }
- }
- return (String[]) rep.clone();
- }
-}
-
-
diff --git a/java/src/org/apache/log4j/spi/ThrowableRenderer.java b/java/src/org/apache/log4j/spi/ThrowableRenderer.java
deleted file mode 100644
index 1b83db2..0000000
--- a/java/src/org/apache/log4j/spi/ThrowableRenderer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-/**
- * Implemented by classes that render instances of
- * java.lang.Throwable (exceptions and errors)
- * into a string representation.
- *
- * @since 1.2.16
- */
-public interface ThrowableRenderer {
- /**
- * Render Throwable.
- * @param t throwable, may not be null.
- * @return String representation.
- */
- public String[] doRender(Throwable t);
-}
diff --git a/java/src/org/apache/log4j/spi/ThrowableRendererSupport.java b/java/src/org/apache/log4j/spi/ThrowableRendererSupport.java
deleted file mode 100644
index 08f02a0..0000000
--- a/java/src/org/apache/log4j/spi/ThrowableRendererSupport.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-/**
- * Implemented by logger repositories that support configurable
- * rendering of Throwables.
- *
- * @since 1.2.16
- */
-public interface ThrowableRendererSupport {
- /**
- * Get throwable renderer.
- * @return throwable renderer, may be null.
- */
- ThrowableRenderer getThrowableRenderer();
-
- /**
- * Set throwable renderer.
- * @param renderer renderer, may be null.
- */
- void setThrowableRenderer(ThrowableRenderer renderer);
-}
diff --git a/java/src/org/apache/log4j/spi/TriggeringEventEvaluator.java b/java/src/org/apache/log4j/spi/TriggeringEventEvaluator.java
deleted file mode 100644
index 67f4fcd..0000000
--- a/java/src/org/apache/log4j/spi/TriggeringEventEvaluator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-/**
-
- Implementions of this interface allow certain appenders to decide
- when to perform an appender specific action.
-
-
For example the {@link org.apache.log4j.net.SMTPAppender} sends
- an email when the {@link #isTriggeringEvent} method returns
- true and adds the event to an internal buffer when the
- returned result is false.
-
- @author Ceki Gülcü
- @since version 1.0
-
- */
-public interface TriggeringEventEvaluator {
-
- /**
- Is this the triggering event?
- */
- public boolean isTriggeringEvent(LoggingEvent event);
-}
diff --git a/java/src/org/apache/log4j/spi/VectorWriter.java b/java/src/org/apache/log4j/spi/VectorWriter.java
deleted file mode 100644
index 3e28860..0000000
--- a/java/src/org/apache/log4j/spi/VectorWriter.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.spi;
-
-import java.io.PrintWriter;
-import java.util.Vector;
-
-/**
- * VectorWriter is an obsolete class provided only for
- * binary compatibility with earlier versions of log4j and should not be used.
- *
- * @deprecated
- */
-class VectorWriter extends PrintWriter {
-
- private Vector v;
-
- /**
- * @deprecated
- */
- VectorWriter() {
- super(new NullWriter());
- v = new Vector();
- }
-
- public void print(Object o) {
- v.addElement(String.valueOf(o));
- }
-
- public void print(char[] chars) {
- v.addElement(new String(chars));
- }
-
- public void print(String s) {
- v.addElement(s);
- }
-
- public void println(Object o) {
- v.addElement(String.valueOf(o));
- }
-
- // JDK 1.1.x apprenly uses this form of println while in
- // printStackTrace()
- public
- void println(char[] chars) {
- v.addElement(new String(chars));
- }
-
- public
- void println(String s) {
- v.addElement(s);
- }
-
- public void write(char[] chars) {
- v.addElement(new String(chars));
- }
-
- public void write(char[] chars, int off, int len) {
- v.addElement(new String(chars, off, len));
- }
-
- public void write(String s, int off, int len) {
- v.addElement(s.substring(off, off+len));
- }
-
- public void write(String s) {
- v.addElement(s);
- }
-
- public String[] toStringArray() {
- int len = v.size();
- String[] sa = new String[len];
- for(int i = 0; i < len; i++) {
- sa[i] = (String) v.elementAt(i);
- }
- return sa;
- }
-
-}
-
diff --git a/java/src/org/apache/log4j/spi/package.html b/java/src/org/apache/log4j/spi/package.html
deleted file mode 100644
index 1205833..0000000
--- a/java/src/org/apache/log4j/spi/package.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-Contains part of the System Programming Interface (SPI) needed to
-extend log4j.
-
-
-
-
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/varia/DenyAllFilter.java b/java/src/org/apache/log4j/varia/DenyAllFilter.java
deleted file mode 100644
index 6c9e949..0000000
--- a/java/src/org/apache/log4j/varia/DenyAllFilter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.spi.Filter;
-import org.apache.log4j.spi.LoggingEvent;
-
-
-/**
- This filter drops all logging events.
-
- You can add this filter to the end of a filter chain to
- switch from the default "accept all unless instructed otherwise"
- filtering behaviour to a "deny all unless instructed otherwise"
- behaviour.
-
-
- @author Ceki Gülcü
-
- @since 0.9.0 */
-public class DenyAllFilter extends Filter {
-
- /**
- Returns null as there are no options.
-
- @deprecated We now use JavaBeans introspection to configure
- components. Options strings are no longer needed.
- */
- public
- String[] getOptionStrings() {
- return null;
- }
-
-
- /**
- No options to set.
-
- @deprecated Use the setter method for the option directly instead
- of the generic setOption method.
- */
- public
- void setOption(String key, String value) {
- }
-
- /**
- Always returns the integer constant {@link Filter#DENY}
- regardless of the {@link LoggingEvent} parameter.
-
- @param event The LoggingEvent to filter.
- @return Always returns {@link Filter#DENY}.
- */
- public
- int decide(LoggingEvent event) {
- return Filter.DENY;
- }
-}
-
diff --git a/java/src/org/apache/log4j/varia/ExternallyRolledFileAppender.java b/java/src/org/apache/log4j/varia/ExternallyRolledFileAppender.java
deleted file mode 100644
index 26e7d84..0000000
--- a/java/src/org/apache/log4j/varia/ExternallyRolledFileAppender.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import org.apache.log4j.RollingFileAppender;
-import org.apache.log4j.helpers.LogLog;
-
-/**
- This appender listens on a socket on the port specified by the
- Port property for a "RollOver" message. When such a message
- is received, the underlying log file is rolled over and an
- acknowledgment message is sent back to the process initiating the
- roll over.
-
-
This method of triggering roll over has the advantage of being
- operating system independent, fast and reliable.
-
-
A simple application {@link Roller} is provided to initiate the
- roll over.
-
-
Note that the initiator is not authenticated. Anyone can trigger
- a rollover. In production environments, it is recommended that you
- add some form of protection to prevent undesired rollovers.
-
-
- @author Ceki Gülcü
- @since version 0.9.0 */
-public class ExternallyRolledFileAppender extends RollingFileAppender {
-
- /**
- The string constant sent to initiate a roll over. Current value of
- this string constant is RollOver.
- */
- static final public String ROLL_OVER = "RollOver";
-
- /**
- The string constant sent to acknowledge a roll over. Current value of
- this string constant is OK.
- */
- static final public String OK = "OK";
-
- int port = 0;
- HUP hup;
-
- /**
- The default constructor does nothing but calls its super-class
- constructor. */
- public
- ExternallyRolledFileAppender() {
- }
-
- /**
- The Port [roperty is used for setting the port for
- listening to external roll over messages.
- */
- public
- void setPort(int port) {
- this.port = port;
- }
-
- /**
- Returns value of the Port option.
- */
- public
- int getPort() {
- return port;
- }
-
- /**
- Start listening on the port specified by a preceding call to
- {@link #setPort}. */
- public
- void activateOptions() {
- super.activateOptions();
- if(port != 0) {
- if(hup != null) {
- hup.interrupt();
- }
- hup = new HUP(this, port);
- hup.setDaemon(true);
- hup.start();
- }
- }
-}
-
-
-class HUP extends Thread {
-
- int port;
- ExternallyRolledFileAppender er;
-
- HUP(ExternallyRolledFileAppender er, int port) {
- this.er = er;
- this.port = port;
- }
-
- public
- void run() {
- while(!isInterrupted()) {
- try {
- ServerSocket serverSocket = new ServerSocket(port);
- while(true) {
- Socket socket = serverSocket.accept();
- LogLog.debug("Connected to client at " + socket.getInetAddress());
- new Thread(new HUPNode(socket, er), "ExternallyRolledFileAppender-HUP").start();
- }
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- } catch(RuntimeException e) {
- e.printStackTrace();
- }
- }
- }
-}
-
-class HUPNode implements Runnable {
-
- Socket socket;
- DataInputStream dis;
- DataOutputStream dos;
- ExternallyRolledFileAppender er;
-
- public
- HUPNode(Socket socket, ExternallyRolledFileAppender er) {
- this.socket = socket;
- this.er = er;
- try {
- dis = new DataInputStream(socket.getInputStream());
- dos = new DataOutputStream(socket.getOutputStream());
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- } catch(RuntimeException e) {
- e.printStackTrace();
- }
- }
-
- public void run() {
- try {
- String line = dis.readUTF();
- LogLog.debug("Got external roll over signal.");
- if(ExternallyRolledFileAppender.ROLL_OVER.equals(line)) {
- synchronized(er) {
- er.rollOver();
- }
- dos.writeUTF(ExternallyRolledFileAppender.OK);
- }
- else {
- dos.writeUTF("Expecting [RollOver] string.");
- }
- dos.close();
- } catch(InterruptedIOException e) {
- Thread.currentThread().interrupt();
- LogLog.error("Unexpected exception. Exiting HUPNode.", e);
- } catch(IOException e) {
- LogLog.error("Unexpected exception. Exiting HUPNode.", e);
- } catch(RuntimeException e) {
- LogLog.error("Unexpected exception. Exiting HUPNode.", e);
- }
- }
-}
-
diff --git a/java/src/org/apache/log4j/varia/FallbackErrorHandler.java b/java/src/org/apache/log4j/varia/FallbackErrorHandler.java
deleted file mode 100644
index 7cbc87d..0000000
--- a/java/src/org/apache/log4j/varia/FallbackErrorHandler.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.Appender;
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.LogLog;
-import java.util.Vector;
-import java.io.InterruptedIOException;
-
-/**
- *
- * The FallbackErrorHandler implements the ErrorHandler
- * interface such that a secondary appender may be specified. This
- * secondary appender takes over if the primary appender fails for
- * whatever reason.
- *
- *
The error message is printed on System.err, and
- * logged in the new secondary appender.
- *
- * @author Ceki Gücü
- * */
-public class FallbackErrorHandler implements ErrorHandler {
-
-
- Appender backup;
- Appender primary;
- Vector loggers;
-
- public FallbackErrorHandler() {
- }
-
-
- /**
- Adds the logger passed as parameter to the list of
- loggers that we need to search for in case of appender failure.
- */
- public
- void setLogger(Logger logger) {
- LogLog.debug("FB: Adding logger [" + logger.getName() + "].");
- if(loggers == null) {
- loggers = new Vector();
- }
- loggers.addElement(logger);
- }
-
-
- /**
- No options to activate.
- */
- public
- void activateOptions() {
- }
-
-
- /**
- Prints the message and the stack trace of the exception on
- System.err. */
- public
- void error(String message, Exception e, int errorCode) {
- error(message, e, errorCode, null);
- }
-
- /**
- Prints the message and the stack trace of the exception on
- System.err.
- */
- public
- void error(String message, Exception e, int errorCode, LoggingEvent event) {
- if (e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.debug("FB: The following error reported: " + message, e);
- LogLog.debug("FB: INITIATING FALLBACK PROCEDURE.");
- if (loggers != null) {
- for(int i = 0; i < loggers.size(); i++) {
- Logger l = (Logger) loggers.elementAt(i);
- LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger ["
- +l.getName() + "].");
- LogLog.debug("FB: Replacing ["+primary.getName()+"] by ["
- + backup.getName() + "] in logger ["+ l.getName() +"].");
- l.removeAppender(primary);
- LogLog.debug("FB: Adding appender ["+backup.getName()+"] to logger "
- + l.getName());
- l.addAppender(backup);
- }
- }
- }
-
-
- /**
- Print a the error message passed as parameter on
- System.err.
- */
- public
- void error(String message) {
- //if(firstTime) {
- //LogLog.error(message);
- //firstTime = false;
- //}
- }
-
- /**
- The appender to which this error handler is attached.
- */
- public
- void setAppender(Appender primary) {
- LogLog.debug("FB: Setting primary appender to [" + primary.getName() + "].");
- this.primary = primary;
- }
-
- /**
- Set the backup appender.
- */
- public
- void setBackupAppender(Appender backup) {
- LogLog.debug("FB: Setting backup appender to [" + backup.getName() + "].");
- this.backup = backup;
- }
-
-}
diff --git a/java/src/org/apache/log4j/varia/LevelMatchFilter.java b/java/src/org/apache/log4j/varia/LevelMatchFilter.java
deleted file mode 100644
index 832ca29..0000000
--- a/java/src/org/apache/log4j/varia/LevelMatchFilter.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.Filter;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.helpers.OptionConverter;
-
-/**
- This is a very simple filter based on level matching.
-
-
The filter admits two options LevelToMatch and
- AcceptOnMatch. If there is an exact match between the value
- of the LevelToMatch option and the level of the {@link
- LoggingEvent}, then the {@link #decide} method returns {@link
- Filter#ACCEPT} in case the AcceptOnMatch option value is set
- to true, if it is false then {@link
- Filter#DENY} is returned. If there is no match, {@link
- Filter#NEUTRAL} is returned.
-
- @author Ceki Gülcü
-
- @since 1.2 */
-public class LevelMatchFilter extends Filter {
-
- /**
- Do we return ACCEPT when a match occurs. Default is
- true. */
- boolean acceptOnMatch = true;
-
- /**
- */
- Level levelToMatch;
-
-
- public
- void setLevelToMatch(String level) {
- levelToMatch = OptionConverter.toLevel(level, null);
- }
-
- public
- String getLevelToMatch() {
- return levelToMatch == null ? null : levelToMatch.toString();
- }
-
- public
- void setAcceptOnMatch(boolean acceptOnMatch) {
- this.acceptOnMatch = acceptOnMatch;
- }
-
- public
- boolean getAcceptOnMatch() {
- return acceptOnMatch;
- }
-
-
- /**
- Return the decision of this filter.
-
- Returns {@link Filter#NEUTRAL} if the LevelToMatch option
- is not set or if there is not match. Otherwise, if there is a
- match, then the returned decision is {@link Filter#ACCEPT} if the
- AcceptOnMatch property is set to true. The
- returned decision is {@link Filter#DENY} if the
- AcceptOnMatch property is set to false.
-
- */
- public
- int decide(LoggingEvent event) {
- if(this.levelToMatch == null) {
- return Filter.NEUTRAL;
- }
-
- boolean matchOccured = false;
- if(this.levelToMatch.equals(event.getLevel())) {
- matchOccured = true;
- }
-
- if(matchOccured) {
- if(this.acceptOnMatch)
- return Filter.ACCEPT;
- else
- return Filter.DENY;
- } else {
- return Filter.NEUTRAL;
- }
- }
-}
diff --git a/java/src/org/apache/log4j/varia/LevelRangeFilter.java b/java/src/org/apache/log4j/varia/LevelRangeFilter.java
deleted file mode 100644
index 40994d3..0000000
--- a/java/src/org/apache/log4j/varia/LevelRangeFilter.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.Filter;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- This is a very simple filter based on level matching, which can be
- used to reject messages with priorities outside a certain range.
-
-
The filter admits three options LevelMin, LevelMax
- and AcceptOnMatch.
-
-
If the level of the {@link LoggingEvent} is not between Min and Max
- (inclusive), then {@link Filter#DENY} is returned.
-
-
If the Logging event level is within the specified range, then if
- AcceptOnMatch is true, {@link Filter#ACCEPT} is returned, and if
- AcceptOnMatch is false, {@link Filter#NEUTRAL} is returned.
-
-
If LevelMinw is not defined, then there is no
- minimum acceptable level (ie a level is never rejected for
- being too "low"/unimportant). If LevelMax is not
- defined, then there is no maximum acceptable level (ie a
- level is never rejected for beeing too "high"/important).
-
-
Refer to the {@link
- org.apache.log4j.AppenderSkeleton#setThreshold setThreshold} method
- available to all appenders extending {@link
- org.apache.log4j.AppenderSkeleton} for a more convenient way to
- filter out events by level.
-
- @author Simon Kitching
- @author based on code by Ceki Gülcü
-*/
-public class LevelRangeFilter extends Filter {
-
- /**
- Do we return ACCEPT when a match occurs. Default is
- false, so that later filters get running by default */
- boolean acceptOnMatch = false;
-
- Level levelMin;
- Level levelMax;
-
-
- /**
- Return the decision of this filter.
- */
- public
- int decide(LoggingEvent event) {
- if(this.levelMin != null) {
- if (event.getLevel().isGreaterOrEqual(levelMin) == false) {
- // level of event is less than minimum
- return Filter.DENY;
- }
- }
-
- if(this.levelMax != null) {
- if (event.getLevel().toInt() > levelMax.toInt()) {
- // level of event is greater than maximum
- // Alas, there is no Level.isGreater method. and using
- // a combo of isGreaterOrEqual && !Equal seems worse than
- // checking the int values of the level objects..
- return Filter.DENY;
- }
- }
-
- if (acceptOnMatch) {
- // this filter set up to bypass later filters and always return
- // accept if level in range
- return Filter.ACCEPT;
- }
- else {
- // event is ok for this filter; allow later filters to have a look..
- return Filter.NEUTRAL;
- }
- }
-
- /**
- Get the value of the LevelMax option. */
- public
- Level getLevelMax() {
- return levelMax;
- }
-
-
- /**
- Get the value of the LevelMin option. */
- public
- Level getLevelMin() {
- return levelMin;
- }
-
- /**
- Get the value of the AcceptOnMatch option.
- */
- public
- boolean getAcceptOnMatch() {
- return acceptOnMatch;
- }
-
- /**
- Set the LevelMax option.
- */
- public
- void setLevelMax(Level levelMax) {
- this.levelMax = levelMax;
- }
-
- /**
- Set the LevelMin option.
- */
- public
- void setLevelMin(Level levelMin) {
- this.levelMin = levelMin;
- }
-
- /**
- Set the AcceptOnMatch option.
- */
- public
- void setAcceptOnMatch(boolean acceptOnMatch) {
- this.acceptOnMatch = acceptOnMatch;
- }
-}
-
diff --git a/java/src/org/apache/log4j/varia/NullAppender.java b/java/src/org/apache/log4j/varia/NullAppender.java
deleted file mode 100644
index 778b024..0000000
--- a/java/src/org/apache/log4j/varia/NullAppender.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * A NullAppender merely exists, it never outputs a message to any
- * device.
- * @author Ceki Gülc¨
- */
-public class NullAppender extends AppenderSkeleton {
-
- private static NullAppender instance = new NullAppender();
-
- public NullAppender() {
- }
-
- /**
- * There are no options to acticate.
- * */
- public void activateOptions() {
- }
-
- /**
- * Whenever you can, use this method to retreive an instance instead
- * of instantiating a new one with new.
- * @deprecated Use getNullAppender instead. getInstance should have been static.
- * */
- public NullAppender getInstance() {
- return instance;
- }
-
- /**
- * Whenever you can, use this method to retreive an instance instead
- * of instantiating a new one with new.
- * */
- public static NullAppender getNullAppender() {
- return instance;
- }
-
- public void close() {
- }
-
- /**
- * Does not do anything.
- * */
- public void doAppend(LoggingEvent event) {
- }
-
- /**
- * Does not do anything.
- * */
- protected void append(LoggingEvent event) {
- }
-
- /**
- * NullAppenders do not need a layout.
- * */
- public boolean requiresLayout() {
- return false;
- }
-}
diff --git a/java/src/org/apache/log4j/varia/ReloadingPropertyConfigurator.java b/java/src/org/apache/log4j/varia/ReloadingPropertyConfigurator.java
deleted file mode 100644
index b29e847..0000000
--- a/java/src/org/apache/log4j/varia/ReloadingPropertyConfigurator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.spi.Configurator;
-import java.net.URL;
-import org.apache.log4j.spi.LoggerRepository;
-
-public class ReloadingPropertyConfigurator implements Configurator {
-
-
- PropertyConfigurator delegate = new PropertyConfigurator();
-
-
- public ReloadingPropertyConfigurator() {
- }
-
- public
- void doConfigure(URL url, LoggerRepository repository) {
- }
-
-}
diff --git a/java/src/org/apache/log4j/varia/Roller.java b/java/src/org/apache/log4j/varia/Roller.java
deleted file mode 100644
index 7ef3aee..0000000
--- a/java/src/org/apache/log4j/varia/Roller.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.BasicConfigurator;
-
-import java.io.IOException;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.net.Socket;
-
-/**
- A simple application to send roll over messages to a potentially
- remote {@link ExternallyRolledFileAppender}.
-
-
It takes two arguments, the host_name and
- port_number where the
- ExternallyRolledFileAppender is listening.
-
-
- @author Ceki Gülcü
- @since version 0.9.0 */
-public class Roller {
-
- static Logger cat = Logger.getLogger(Roller.class);
-
-
- static String host;
- static int port;
-
- // Static class.
- Roller() {
- }
-
- /**
- Send a "RollOver" message to
- ExternallyRolledFileAppender on host
- and port.
-
- */
- public
- static
- void main(String argv[]) {
-
- BasicConfigurator.configure();
-
- if(argv.length == 2)
- init(argv[0], argv[1]);
- else
- usage("Wrong number of arguments.");
-
- roll();
- }
-
- static
- void usage(String msg) {
- System.err.println(msg);
- System.err.println( "Usage: java " + Roller.class.getName() +
- "host_name port_number");
- System.exit(1);
- }
-
- static
- void init(String hostArg, String portArg) {
- host = hostArg;
- try {
- port = Integer.parseInt(portArg);
- }
- catch(java.lang.NumberFormatException e) {
- usage("Second argument "+portArg+" is not a valid integer.");
- }
- }
-
- static
- void roll() {
- try {
- Socket socket = new Socket(host, port);
- DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
- DataInputStream dis = new DataInputStream(socket.getInputStream());
- dos.writeUTF(ExternallyRolledFileAppender.ROLL_OVER);
- String rc = dis.readUTF();
- if(ExternallyRolledFileAppender.OK.equals(rc)) {
- cat.info("Roll over signal acknowledged by remote appender.");
- } else {
- cat.warn("Unexpected return code "+rc+" from remote entity.");
- System.exit(2);
- }
- } catch(IOException e) {
- cat.error("Could not send roll signal on host "+host+" port "+port+" .",
- e);
- System.exit(2);
- }
- System.exit(0);
- }
-}
diff --git a/java/src/org/apache/log4j/varia/StringMatchFilter.java b/java/src/org/apache/log4j/varia/StringMatchFilter.java
deleted file mode 100644
index 6ee7ec4..0000000
--- a/java/src/org/apache/log4j/varia/StringMatchFilter.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.varia;
-
-import org.apache.log4j.spi.Filter;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.helpers.OptionConverter;
-
-/**
- * This is a very simple filter based on string matching.
- *
- *
The filter admits two options StringToMatch and
- * AcceptOnMatch. If there is a match between the value of the
- * StringToMatch option and the message of the {@link org.apache.log4j.spi.LoggingEvent},
- * then the {@link #decide(LoggingEvent)} method returns {@link org.apache.log4j.spi.Filter#ACCEPT} if
- * the AcceptOnMatch option value is true, if it is false then
- * {@link org.apache.log4j.spi.Filter#DENY} is returned. If there is no match, {@link
- * org.apache.log4j.spi.Filter#NEUTRAL} is returned.
- *
- * @author Ceki Gülcü
- * @since 0.9.0
- */
-public class StringMatchFilter extends Filter {
-
- /**
- @deprecated Options are now handled using the JavaBeans paradigm.
- This constant is not longer needed and will be removed in the
- near term.
- */
- public static final String STRING_TO_MATCH_OPTION = "StringToMatch";
-
- /**
- @deprecated Options are now handled using the JavaBeans paradigm.
- This constant is not longer needed and will be removed in the
- near term.
- */
- public static final String ACCEPT_ON_MATCH_OPTION = "AcceptOnMatch";
-
- boolean acceptOnMatch = true;
- String stringToMatch;
-
- /**
- @deprecated We now use JavaBeans introspection to configure
- components. Options strings are no longer needed.
- */
- public
- String[] getOptionStrings() {
- return new String[] {STRING_TO_MATCH_OPTION, ACCEPT_ON_MATCH_OPTION};
- }
-
- /**
- @deprecated Use the setter method for the option directly instead
- of the generic setOption method.
- */
- public
- void setOption(String key, String value) {
-
- if(key.equalsIgnoreCase(STRING_TO_MATCH_OPTION)) {
- stringToMatch = value;
- } else if (key.equalsIgnoreCase(ACCEPT_ON_MATCH_OPTION)) {
- acceptOnMatch = OptionConverter.toBoolean(value, acceptOnMatch);
- }
- }
-
- public
- void setStringToMatch(String s) {
- stringToMatch = s;
- }
-
- public
- String getStringToMatch() {
- return stringToMatch;
- }
-
- public
- void setAcceptOnMatch(boolean acceptOnMatch) {
- this.acceptOnMatch = acceptOnMatch;
- }
-
- public
- boolean getAcceptOnMatch() {
- return acceptOnMatch;
- }
-
- /**
- Returns {@link Filter#NEUTRAL} is there is no string match.
- */
- public
- int decide(LoggingEvent event) {
- String msg = event.getRenderedMessage();
-
- if(msg == null || stringToMatch == null)
- return Filter.NEUTRAL;
-
-
- if( msg.indexOf(stringToMatch) == -1 ) {
- return Filter.NEUTRAL;
- } else { // we've got a match
- if(acceptOnMatch) {
- return Filter.ACCEPT;
- } else {
- return Filter.DENY;
- }
- }
- }
-}
diff --git a/java/src/org/apache/log4j/varia/package.html b/java/src/org/apache/log4j/varia/package.html
deleted file mode 100644
index 3495db2..0000000
--- a/java/src/org/apache/log4j/varia/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-Contains various appenders, filters and other odds and ends.
-
-
-
-
-Last modified: Tue Mar 21 20:28:14 MET 2000
-
-
diff --git a/java/src/org/apache/log4j/xml/DOMConfigurator.java b/java/src/org/apache/log4j/xml/DOMConfigurator.java
deleted file mode 100644
index de2963d..0000000
--- a/java/src/org/apache/log4j/xml/DOMConfigurator.java
+++ /dev/null
@@ -1,1123 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.xml;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.Layout;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.config.PropertySetter;
-import org.apache.log4j.helpers.FileWatchdog;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.or.RendererMap;
-import org.apache.log4j.spi.AppenderAttachable;
-import org.apache.log4j.spi.Configurator;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.Filter;
-import org.apache.log4j.spi.LoggerFactory;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.RendererSupport;
-import org.apache.log4j.spi.ThrowableRenderer;
-import org.apache.log4j.spi.ThrowableRendererSupport;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.Reader;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Hashtable;
-import java.util.Properties;
-
-// Contributors: Mark Womack
-// Arun Katkere
-
-/**
- Use this class to initialize the log4j environment using a DOM tree.
-
- The DTD is specified in log4j.dtd.
-
-
Sometimes it is useful to see how log4j is reading configuration
- files. You can enable log4j internal logging by defining the
- log4j.debug variable on the java command
- line. Alternatively, set the debug attribute in the
- log4j:configuration element. As in
-
- <log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">
- ...
- </log4j:configuration>
-
-
- There are sample XML files included in the package.
-
- @author Christopher Taylor
- @author Ceki Gülcü
- @author Anders Kristensen
-
- @since 0.8.3 */
-public class DOMConfigurator implements Configurator {
-
- static final String CONFIGURATION_TAG = "log4j:configuration";
- static final String OLD_CONFIGURATION_TAG = "configuration";
- static final String RENDERER_TAG = "renderer";
- private static final String THROWABLE_RENDERER_TAG = "throwableRenderer";
- static final String APPENDER_TAG = "appender";
- static final String APPENDER_REF_TAG = "appender-ref";
- static final String PARAM_TAG = "param";
- static final String LAYOUT_TAG = "layout";
- static final String CATEGORY = "category";
- static final String LOGGER = "logger";
- static final String LOGGER_REF = "logger-ref";
- static final String CATEGORY_FACTORY_TAG = "categoryFactory";
- static final String LOGGER_FACTORY_TAG = "loggerFactory";
- static final String NAME_ATTR = "name";
- static final String CLASS_ATTR = "class";
- static final String VALUE_ATTR = "value";
- static final String ROOT_TAG = "root";
- static final String ROOT_REF = "root-ref";
- static final String LEVEL_TAG = "level";
- static final String PRIORITY_TAG = "priority";
- static final String FILTER_TAG = "filter";
- static final String ERROR_HANDLER_TAG = "errorHandler";
- static final String REF_ATTR = "ref";
- static final String ADDITIVITY_ATTR = "additivity";
- static final String THRESHOLD_ATTR = "threshold";
- static final String CONFIG_DEBUG_ATTR = "configDebug";
- static final String INTERNAL_DEBUG_ATTR = "debug";
- private static final String RESET_ATTR = "reset";
- static final String RENDERING_CLASS_ATTR = "renderingClass";
- static final String RENDERED_CLASS_ATTR = "renderedClass";
-
- static final String EMPTY_STR = "";
- static final Class[] ONE_STRING_PARAM = new Class[] {String.class};
-
- final static String dbfKey = "javax.xml.parsers.DocumentBuilderFactory";
-
-
- // key: appenderName, value: appender
- Hashtable appenderBag;
-
- Properties props;
- LoggerRepository repository;
-
- protected LoggerFactory catFactory = null;
-
- /**
- No argument constructor.
- */
- public
- DOMConfigurator () {
- appenderBag = new Hashtable();
- }
-
- /**
- Used internally to parse appenders by IDREF name.
- */
- protected
- Appender findAppenderByName(Document doc, String appenderName) {
- Appender appender = (Appender) appenderBag.get(appenderName);
-
- if(appender != null) {
- return appender;
- } else {
- // Doesn't work on DOM Level 1 :
- // Element element = doc.getElementById(appenderName);
-
- // Endre's hack:
- Element element = null;
- NodeList list = doc.getElementsByTagName("appender");
- for (int t=0; t < list.getLength(); t++) {
- Node node = list.item(t);
- NamedNodeMap map= node.getAttributes();
- Node attrNode = map.getNamedItem("name");
- if (appenderName.equals(attrNode.getNodeValue())) {
- element = (Element) node;
- break;
- }
- }
- // Hack finished.
-
- if(element == null) {
- LogLog.error("No appender named ["+appenderName+"] could be found.");
- return null;
- } else {
- appender = parseAppender(element);
- if (appender != null) {
- appenderBag.put(appenderName, appender);
- }
- return appender;
- }
- }
- }
- /**
- Used internally to parse appenders by IDREF element.
- */
- protected
- Appender findAppenderByReference(Element appenderRef) {
- String appenderName = subst(appenderRef.getAttribute(REF_ATTR));
- Document doc = appenderRef.getOwnerDocument();
- return findAppenderByName(doc, appenderName);
- }
-
- /**
- * Delegates unrecognized content to created instance if
- * it supports UnrecognizedElementParser.
- * @since 1.2.15
- * @param instance instance, may be null.
- * @param element element, may not be null.
- * @param props properties
- * @throws IOException thrown if configuration of owner object
- * should be abandoned.
- */
- private static void parseUnrecognizedElement(final Object instance,
- final Element element,
- final Properties props) throws Exception {
- boolean recognized = false;
- if (instance instanceof UnrecognizedElementHandler) {
- recognized = ((UnrecognizedElementHandler) instance).parseUnrecognizedElement(
- element, props);
- }
- if (!recognized) {
- LogLog.warn("Unrecognized element " + element.getNodeName());
- }
- }
-
- /**
- * Delegates unrecognized content to created instance if
- * it supports UnrecognizedElementParser and catches and
- * logs any exception.
- * @since 1.2.15
- * @param instance instance, may be null.
- * @param element element, may not be null.
- * @param props properties
- */
- private static void quietParseUnrecognizedElement(final Object instance,
- final Element element,
- final Properties props) {
- try {
- parseUnrecognizedElement(instance, element, props);
- } catch (Exception ex) {
- if (ex instanceof InterruptedException || ex instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Error in extension content: ", ex);
- }
- }
-
- /**
- Used internally to parse an appender element.
- */
- protected
- Appender parseAppender (Element appenderElement) {
- String className = subst(appenderElement.getAttribute(CLASS_ATTR));
- LogLog.debug("Class name: [" + className+']');
- try {
- Object instance = Loader.loadClass(className).newInstance();
- Appender appender = (Appender)instance;
- PropertySetter propSetter = new PropertySetter(appender);
-
- appender.setName(subst(appenderElement.getAttribute(NAME_ATTR)));
-
- NodeList children = appenderElement.getChildNodes();
- final int length = children.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = children.item(loop);
-
- /* We're only interested in Elements */
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element)currentNode;
-
- // Parse appender parameters
- if (currentElement.getTagName().equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- }
- // Set appender layout
- else if (currentElement.getTagName().equals(LAYOUT_TAG)) {
- appender.setLayout(parseLayout(currentElement));
- }
- // Add filters
- else if (currentElement.getTagName().equals(FILTER_TAG)) {
- parseFilters(currentElement, appender);
- }
- else if (currentElement.getTagName().equals(ERROR_HANDLER_TAG)) {
- parseErrorHandler(currentElement, appender);
- }
- else if (currentElement.getTagName().equals(APPENDER_REF_TAG)) {
- String refName = subst(currentElement.getAttribute(REF_ATTR));
- if(appender instanceof AppenderAttachable) {
- AppenderAttachable aa = (AppenderAttachable) appender;
- LogLog.debug("Attaching appender named ["+ refName+
- "] to appender named ["+ appender.getName()+"].");
- aa.addAppender(findAppenderByReference(currentElement));
- } else {
- LogLog.error("Requesting attachment of appender named ["+
- refName+ "] to appender named ["+ appender.getName()+
- "] which does not implement org.apache.log4j.spi.AppenderAttachable.");
- }
- } else {
- parseUnrecognizedElement(instance, currentElement, props);
- }
- }
- }
- propSetter.activate();
- return appender;
- }
- /* Yes, it's ugly. But all of these exceptions point to the same
- problem: we can't create an Appender */
- catch (Exception oops) {
- if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not create an Appender. Reported error follows.",
- oops);
- return null;
- }
- }
-
- /**
- Used internally to parse an {@link ErrorHandler} element.
- */
- protected
- void parseErrorHandler(Element element, Appender appender) {
- ErrorHandler eh = (ErrorHandler) OptionConverter.instantiateByClassName(
- subst(element.getAttribute(CLASS_ATTR)),
- org.apache.log4j.spi.ErrorHandler.class,
- null);
-
- if(eh != null) {
- eh.setAppender(appender);
-
- PropertySetter propSetter = new PropertySetter(eh);
- NodeList children = element.getChildNodes();
- final int length = children.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = children.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element) currentNode;
- String tagName = currentElement.getTagName();
- if(tagName.equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- } else if(tagName.equals(APPENDER_REF_TAG)) {
- eh.setBackupAppender(findAppenderByReference(currentElement));
- } else if(tagName.equals(LOGGER_REF)) {
- String loggerName = currentElement.getAttribute(REF_ATTR);
- Logger logger = (catFactory == null) ? repository.getLogger(loggerName)
- : repository.getLogger(loggerName, catFactory);
- eh.setLogger(logger);
- } else if(tagName.equals(ROOT_REF)) {
- Logger root = repository.getRootLogger();
- eh.setLogger(root);
- } else {
- quietParseUnrecognizedElement(eh, currentElement, props);
- }
- }
- }
- propSetter.activate();
- appender.setErrorHandler(eh);
- }
- }
-
- /**
- Used internally to parse a filter element.
- */
- protected
- void parseFilters(Element element, Appender appender) {
- String clazz = subst(element.getAttribute(CLASS_ATTR));
- Filter filter = (Filter) OptionConverter.instantiateByClassName(clazz,
- Filter.class, null);
-
- if(filter != null) {
- PropertySetter propSetter = new PropertySetter(filter);
- NodeList children = element.getChildNodes();
- final int length = children.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = children.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element) currentNode;
- String tagName = currentElement.getTagName();
- if(tagName.equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- } else {
- quietParseUnrecognizedElement(filter, currentElement, props);
- }
- }
- }
- propSetter.activate();
- LogLog.debug("Adding filter of type ["+filter.getClass()
- +"] to appender named ["+appender.getName()+"].");
- appender.addFilter(filter);
- }
- }
-
- /**
- Used internally to parse an category element.
- */
- protected
- void parseCategory (Element loggerElement) {
- // Create a new org.apache.log4j.Category object from the element.
- String catName = subst(loggerElement.getAttribute(NAME_ATTR));
-
- Logger cat;
-
- String className = subst(loggerElement.getAttribute(CLASS_ATTR));
-
-
- if(EMPTY_STR.equals(className)) {
- LogLog.debug("Retreiving an instance of org.apache.log4j.Logger.");
- cat = (catFactory == null) ? repository.getLogger(catName) : repository.getLogger(catName, catFactory);
- }
- else {
- LogLog.debug("Desired logger sub-class: ["+className+']');
- try {
- Class clazz = Loader.loadClass(className);
- Method getInstanceMethod = clazz.getMethod("getLogger",
- ONE_STRING_PARAM);
- cat = (Logger) getInstanceMethod.invoke(null, new Object[] {catName});
- } catch (InvocationTargetException oops) {
- if (oops.getTargetException() instanceof InterruptedException
- || oops.getTargetException() instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not retrieve category ["+catName+
- "]. Reported error follows.", oops);
- return;
- } catch (Exception oops) {
- LogLog.error("Could not retrieve category ["+catName+
- "]. Reported error follows.", oops);
- return;
- }
- }
-
- // Setting up a category needs to be an atomic operation, in order
- // to protect potential log operations while category
- // configuration is in progress.
- synchronized(cat) {
- boolean additivity = OptionConverter.toBoolean(
- subst(loggerElement.getAttribute(ADDITIVITY_ATTR)),
- true);
-
- LogLog.debug("Setting ["+cat.getName()+"] additivity to ["+additivity+"].");
- cat.setAdditivity(additivity);
- parseChildrenOfLoggerElement(loggerElement, cat, false);
- }
- }
-
-
- /**
- Used internally to parse the category factory element.
- */
- protected
- void parseCategoryFactory(Element factoryElement) {
- String className = subst(factoryElement.getAttribute(CLASS_ATTR));
-
- if(EMPTY_STR.equals(className)) {
- LogLog.error("Category Factory tag " + CLASS_ATTR + " attribute not found.");
- LogLog.debug("No Category Factory configured.");
- }
- else {
- LogLog.debug("Desired category factory: ["+className+']');
- Object factory = OptionConverter.instantiateByClassName(className,
- LoggerFactory.class,
- null);
- if (factory instanceof LoggerFactory) {
- catFactory = (LoggerFactory) factory;
- } else {
- LogLog.error("Category Factory class " + className + " does not implement org.apache.log4j.LoggerFactory");
- }
- PropertySetter propSetter = new PropertySetter(factory);
-
- Element currentElement = null;
- Node currentNode = null;
- NodeList children = factoryElement.getChildNodes();
- final int length = children.getLength();
-
- for (int loop=0; loop < length; loop++) {
- currentNode = children.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- currentElement = (Element)currentNode;
- if (currentElement.getTagName().equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- } else {
- quietParseUnrecognizedElement(factory, currentElement, props);
- }
- }
- }
- }
- }
-
-
- /**
- Used internally to parse the roor category element.
- */
- protected
- void parseRoot (Element rootElement) {
- Logger root = repository.getRootLogger();
- // category configuration needs to be atomic
- synchronized(root) {
- parseChildrenOfLoggerElement(rootElement, root, true);
- }
- }
-
-
- /**
- Used internally to parse the children of a category element.
- */
- protected
- void parseChildrenOfLoggerElement(Element catElement,
- Logger cat, boolean isRoot) {
-
- PropertySetter propSetter = new PropertySetter(cat);
-
- // Remove all existing appenders from cat. They will be
- // reconstructed if need be.
- cat.removeAllAppenders();
-
-
- NodeList children = catElement.getChildNodes();
- final int length = children.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = children.item(loop);
-
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element) currentNode;
- String tagName = currentElement.getTagName();
-
- if (tagName.equals(APPENDER_REF_TAG)) {
- Element appenderRef = (Element) currentNode;
- Appender appender = findAppenderByReference(appenderRef);
- String refName = subst(appenderRef.getAttribute(REF_ATTR));
- if(appender != null)
- LogLog.debug("Adding appender named ["+ refName+
- "] to category ["+cat.getName()+"].");
- else
- LogLog.debug("Appender named ["+ refName + "] not found.");
-
- cat.addAppender(appender);
-
- } else if(tagName.equals(LEVEL_TAG)) {
- parseLevel(currentElement, cat, isRoot);
- } else if(tagName.equals(PRIORITY_TAG)) {
- parseLevel(currentElement, cat, isRoot);
- } else if(tagName.equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- } else {
- quietParseUnrecognizedElement(cat, currentElement, props);
- }
- }
- }
- propSetter.activate();
- }
-
- /**
- Used internally to parse a layout element.
- */
- protected
- Layout parseLayout (Element layout_element) {
- String className = subst(layout_element.getAttribute(CLASS_ATTR));
- LogLog.debug("Parsing layout of class: \""+className+"\"");
- try {
- Object instance = Loader.loadClass(className).newInstance();
- Layout layout = (Layout)instance;
- PropertySetter propSetter = new PropertySetter(layout);
-
- NodeList params = layout_element.getChildNodes();
- final int length = params.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = (Node)params.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element) currentNode;
- String tagName = currentElement.getTagName();
- if(tagName.equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- } else {
- parseUnrecognizedElement(instance, currentElement, props);
- }
- }
- }
-
- propSetter.activate();
- return layout;
- }
- catch (Exception oops) {
- if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not create the Layout. Reported error follows.",
- oops);
- return null;
- }
- }
-
- protected
- void parseRenderer(Element element) {
- String renderingClass = subst(element.getAttribute(RENDERING_CLASS_ATTR));
- String renderedClass = subst(element.getAttribute(RENDERED_CLASS_ATTR));
- if(repository instanceof RendererSupport) {
- RendererMap.addRenderer((RendererSupport) repository, renderedClass,
- renderingClass);
- }
- }
-
- /**
- * Parses throwable renderer.
- * @param element throwableRenderer element.
- * @return configured throwable renderer.
- * @since 1.2.16.
- */
- protected ThrowableRenderer parseThrowableRenderer(final Element element) {
- String className = subst(element.getAttribute(CLASS_ATTR));
- LogLog.debug("Parsing throwableRenderer of class: \""+className+"\"");
- try {
- Object instance = Loader.loadClass(className).newInstance();
- ThrowableRenderer tr = (ThrowableRenderer)instance;
- PropertySetter propSetter = new PropertySetter(tr);
-
- NodeList params = element.getChildNodes();
- final int length = params.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = (Node)params.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element) currentNode;
- String tagName = currentElement.getTagName();
- if(tagName.equals(PARAM_TAG)) {
- setParameter(currentElement, propSetter);
- } else {
- parseUnrecognizedElement(instance, currentElement, props);
- }
- }
- }
-
- propSetter.activate();
- return tr;
- }
- catch (Exception oops) {
- if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not create the ThrowableRenderer. Reported error follows.",
- oops);
- return null;
- }
- }
-
- /**
- Used internally to parse a level element.
- */
- protected
- void parseLevel(Element element, Logger logger, boolean isRoot) {
- String catName = logger.getName();
- if(isRoot) {
- catName = "root";
- }
-
- String priStr = subst(element.getAttribute(VALUE_ATTR));
- LogLog.debug("Level value for "+catName+" is ["+priStr+"].");
-
- if(INHERITED.equalsIgnoreCase(priStr) || NULL.equalsIgnoreCase(priStr)) {
- if(isRoot) {
- LogLog.error("Root level cannot be inherited. Ignoring directive.");
- } else {
- logger.setLevel(null);
- }
- } else {
- String className = subst(element.getAttribute(CLASS_ATTR));
- if(EMPTY_STR.equals(className)) {
- logger.setLevel(OptionConverter.toLevel(priStr, Level.DEBUG));
- } else {
- LogLog.debug("Desired Level sub-class: ["+className+']');
- try {
- Class clazz = Loader.loadClass(className);
- Method toLevelMethod = clazz.getMethod("toLevel",
- ONE_STRING_PARAM);
- Level pri = (Level) toLevelMethod.invoke(null,
- new Object[] {priStr});
- logger.setLevel(pri);
- } catch (Exception oops) {
- if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- LogLog.error("Could not create level ["+priStr+
- "]. Reported error follows.", oops);
- return;
- }
- }
- }
- LogLog.debug(catName + " level set to " + logger.getLevel());
- }
-
- protected
- void setParameter(Element elem, PropertySetter propSetter) {
- String name = subst(elem.getAttribute(NAME_ATTR));
- String value = (elem.getAttribute(VALUE_ATTR));
- value = subst(OptionConverter.convertSpecialChars(value));
- propSetter.setProperty(name, value);
- }
-
-
- /**
- Configure log4j using a configuration element as
- defined in the log4j.dtd.
-
- */
- static
- public
- void configure (Element element) {
- DOMConfigurator configurator = new DOMConfigurator();
- configurator.doConfigure(element, LogManager.getLoggerRepository());
- }
-
- /**
- Like {@link #configureAndWatch(String, long)} except that the
- default delay as defined by {@link FileWatchdog#DEFAULT_DELAY} is
- used.
-
- @param configFilename A log4j configuration file in XML format.
-
- */
- static
- public
- void configureAndWatch(String configFilename) {
- configureAndWatch(configFilename, FileWatchdog.DEFAULT_DELAY);
- }
-
- /**
- Read the configuration file configFilename if it
- exists. Moreover, a thread will be created that will periodically
- check if configFilename has been created or
- modified. The period is determined by the delay
- argument. If a change or file creation is detected, then
- configFilename is read to configure log4j.
-
- @param configFilename A log4j configuration file in XML format.
- @param delay The delay in milliseconds to wait between each check.
- */
- static
- public
- void configureAndWatch(String configFilename, long delay) {
- XMLWatchdog xdog = new XMLWatchdog(configFilename);
- xdog.setDelay(delay);
- xdog.start();
- }
-
- private interface ParseAction {
- Document parse(final DocumentBuilder parser) throws SAXException, IOException;
- }
-
-
- public
- void doConfigure(final String filename, LoggerRepository repository) {
- ParseAction action = new ParseAction() {
- public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
- return parser.parse(new File(filename));
- }
- public String toString() {
- return "file [" + filename + "]";
- }
- };
- doConfigure(action, repository);
- }
-
-
- public
- void doConfigure(final URL url, LoggerRepository repository) {
- ParseAction action = new ParseAction() {
- public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
- URLConnection uConn = url.openConnection();
- uConn.setUseCaches(false);
- InputSource src = new InputSource(uConn.getInputStream());
- src.setSystemId(url.toString());
- return parser.parse(src);
- }
- public String toString() {
- return "url [" + url.toString() + "]";
- }
- };
- doConfigure(action, repository);
- }
-
- /**
- Configure log4j by reading in a log4j.dtd compliant XML
- configuration file.
-
- */
- public
- void doConfigure(final InputStream inputStream, LoggerRepository repository)
- throws FactoryConfigurationError {
- ParseAction action = new ParseAction() {
- public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
- InputSource inputSource = new InputSource(inputStream);
- inputSource.setSystemId("dummy://log4j.dtd");
- return parser.parse(inputSource);
- }
- public String toString() {
- return "input stream [" + inputStream.toString() + "]";
- }
- };
- doConfigure(action, repository);
- }
-
- /**
- Configure log4j by reading in a log4j.dtd compliant XML
- configuration file.
-
- */
- public
- void doConfigure(final Reader reader, LoggerRepository repository)
- throws FactoryConfigurationError {
- ParseAction action = new ParseAction() {
- public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
- InputSource inputSource = new InputSource(reader);
- inputSource.setSystemId("dummy://log4j.dtd");
- return parser.parse(inputSource);
- }
- public String toString() {
- return "reader [" + reader.toString() + "]";
- }
- };
- doConfigure(action, repository);
- }
-
- /**
- Configure log4j by reading in a log4j.dtd compliant XML
- configuration file.
-
- */
- protected
- void doConfigure(final InputSource inputSource, LoggerRepository repository)
- throws FactoryConfigurationError {
- if (inputSource.getSystemId() == null) {
- inputSource.setSystemId("dummy://log4j.dtd");
- }
- ParseAction action = new ParseAction() {
- public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
- return parser.parse(inputSource);
- }
- public String toString() {
- return "input source [" + inputSource.toString() + "]";
- }
- };
- doConfigure(action, repository);
- }
-
-
- private final void doConfigure(final ParseAction action, final LoggerRepository repository)
- throws FactoryConfigurationError {
- DocumentBuilderFactory dbf = null;
- this.repository = repository;
- try {
- LogLog.debug("System property is :"+
- OptionConverter.getSystemProperty(dbfKey,
- null));
- dbf = DocumentBuilderFactory.newInstance();
- LogLog.debug("Standard DocumentBuilderFactory search succeded.");
- LogLog.debug("DocumentBuilderFactory is: "+dbf.getClass().getName());
- } catch(FactoryConfigurationError fce) {
- Exception e = fce.getException();
- LogLog.debug("Could not instantiate a DocumentBuilderFactory.", e);
- throw fce;
- }
-
- try {
- dbf.setValidating(true);
-
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
-
- docBuilder.setErrorHandler(new SAXErrorHandler());
- docBuilder.setEntityResolver(new Log4jEntityResolver());
-
- Document doc = action.parse(docBuilder);
- parse(doc.getDocumentElement());
- } catch (Exception e) {
- if (e instanceof InterruptedException || e instanceof InterruptedIOException) {
- Thread.currentThread().interrupt();
- }
- // I know this is miserable...
- LogLog.error("Could not parse "+ action.toString() + ".", e);
- }
- }
-
- /**
- Configure by taking in an DOM element.
- */
- public void doConfigure(Element element, LoggerRepository repository) {
- this.repository = repository;
- parse(element);
- }
-
-
- /**
- A static version of {@link #doConfigure(String, LoggerRepository)}. */
- static
- public
- void configure(String filename) throws FactoryConfigurationError {
- new DOMConfigurator().doConfigure(filename,
- LogManager.getLoggerRepository());
- }
-
- /**
- A static version of {@link #doConfigure(URL, LoggerRepository)}.
- */
- static
- public
- void configure(URL url) throws FactoryConfigurationError {
- new DOMConfigurator().doConfigure(url, LogManager.getLoggerRepository());
- }
-
- /**
- Used internally to configure the log4j framework by parsing a DOM
- tree of XML elements based on log4j.dtd.
-
- */
- protected
- void parse(Element element) {
-
- String rootElementName = element.getTagName();
-
- if (!rootElementName.equals(CONFIGURATION_TAG)) {
- if(rootElementName.equals(OLD_CONFIGURATION_TAG)) {
- LogLog.warn("The <"+OLD_CONFIGURATION_TAG+
- "> element has been deprecated.");
- LogLog.warn("Use the <"+CONFIGURATION_TAG+"> element instead.");
- } else {
- LogLog.error("DOM element is - not a <"+CONFIGURATION_TAG+"> element.");
- return;
- }
- }
-
-
- String debugAttrib = subst(element.getAttribute(INTERNAL_DEBUG_ATTR));
-
- LogLog.debug("debug attribute= \"" + debugAttrib +"\".");
- // if the log4j.dtd is not specified in the XML file, then the
- // "debug" attribute is returned as the empty string.
- if(!debugAttrib.equals("") && !debugAttrib.equals("null")) {
- LogLog.setInternalDebugging(OptionConverter.toBoolean(debugAttrib, true));
- } else {
- LogLog.debug("Ignoring " + INTERNAL_DEBUG_ATTR + " attribute.");
- }
-
- //
- // reset repository before configuration if reset="true"
- // on configuration element.
- //
- String resetAttrib = subst(element.getAttribute(RESET_ATTR));
- LogLog.debug("reset attribute= \"" + resetAttrib +"\".");
- if(!("".equals(resetAttrib))) {
- if (OptionConverter.toBoolean(resetAttrib, false)) {
- repository.resetConfiguration();
- }
- }
-
-
-
- String confDebug = subst(element.getAttribute(CONFIG_DEBUG_ATTR));
- if(!confDebug.equals("") && !confDebug.equals("null")) {
- LogLog.warn("The \""+CONFIG_DEBUG_ATTR+"\" attribute is deprecated.");
- LogLog.warn("Use the \""+INTERNAL_DEBUG_ATTR+"\" attribute instead.");
- LogLog.setInternalDebugging(OptionConverter.toBoolean(confDebug, true));
- }
-
- String thresholdStr = subst(element.getAttribute(THRESHOLD_ATTR));
- LogLog.debug("Threshold =\"" + thresholdStr +"\".");
- if(!"".equals(thresholdStr) && !"null".equals(thresholdStr)) {
- repository.setThreshold(thresholdStr);
- }
-
- //Hashtable appenderBag = new Hashtable(11);
-
- /* Building Appender objects, placing them in a local namespace
- for future reference */
-
- // First configure each category factory under the root element.
- // Category factories need to be configured before any of
- // categories they support.
- //
- String tagName = null;
- Element currentElement = null;
- Node currentNode = null;
- NodeList children = element.getChildNodes();
- final int length = children.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- currentNode = children.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- currentElement = (Element) currentNode;
- tagName = currentElement.getTagName();
-
- if (tagName.equals(CATEGORY_FACTORY_TAG) || tagName.equals(LOGGER_FACTORY_TAG)) {
- parseCategoryFactory(currentElement);
- }
- }
- }
-
- for (int loop = 0; loop < length; loop++) {
- currentNode = children.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- currentElement = (Element) currentNode;
- tagName = currentElement.getTagName();
-
- if (tagName.equals(CATEGORY) || tagName.equals(LOGGER)) {
- parseCategory(currentElement);
- } else if (tagName.equals(ROOT_TAG)) {
- parseRoot(currentElement);
- } else if(tagName.equals(RENDERER_TAG)) {
- parseRenderer(currentElement);
- } else if(tagName.equals(THROWABLE_RENDERER_TAG)) {
- if (repository instanceof ThrowableRendererSupport) {
- ThrowableRenderer tr = parseThrowableRenderer(currentElement);
- if (tr != null) {
- ((ThrowableRendererSupport) repository).setThrowableRenderer(tr);
- }
- }
- } else if (!(tagName.equals(APPENDER_TAG)
- || tagName.equals(CATEGORY_FACTORY_TAG)
- || tagName.equals(LOGGER_FACTORY_TAG))) {
- quietParseUnrecognizedElement(repository, currentElement, props);
- }
- }
- }
- }
-
-
- protected
- String subst(final String value) {
- return subst(value, props);
- }
-
- /**
- * Substitutes property value for any references in expression.
- *
- * @param value value from configuration file, may contain
- * literal text, property references or both
- * @param props properties.
- * @return evaluated expression, may still contain expressions
- * if unable to expand.
- * @since 1.2.15
- */
- public static String subst(final String value, final Properties props) {
- try {
- return OptionConverter.substVars(value, props);
- } catch (IllegalArgumentException e) {
- LogLog.warn("Could not perform variable substitution.", e);
- return value;
- }
- }
-
-
- /**
- * Sets a parameter based from configuration file content.
- *
- * @param elem param element, may not be null.
- * @param propSetter property setter, may not be null.
- * @param props properties
- * @since 1.2.15
- */
- public static void setParameter(final Element elem,
- final PropertySetter propSetter,
- final Properties props) {
- String name = subst(elem.getAttribute("name"), props);
- String value = (elem.getAttribute("value"));
- value = subst(OptionConverter.convertSpecialChars(value), props);
- propSetter.setProperty(name, value);
- }
-
- /**
- * Creates an object and processes any nested param elements
- * but does not call activateOptions. If the class also supports
- * UnrecognizedElementParser, the parseUnrecognizedElement method
- * will be call for any child elements other than param.
- *
- * @param element element, may not be null.
- * @param props properties
- * @param expectedClass interface or class expected to be implemented
- * by created class
- * @return created class or null.
- * @throws Exception thrown if the contain object should be abandoned.
- * @since 1.2.15
- */
- public static Object parseElement(final Element element,
- final Properties props,
- final Class expectedClass) throws Exception {
- String clazz = subst(element.getAttribute("class"), props);
- Object instance = OptionConverter.instantiateByClassName(clazz,
- expectedClass, null);
-
- if (instance != null) {
- PropertySetter propSetter = new PropertySetter(instance);
- NodeList children = element.getChildNodes();
- final int length = children.getLength();
-
- for (int loop = 0; loop < length; loop++) {
- Node currentNode = children.item(loop);
- if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
- Element currentElement = (Element) currentNode;
- String tagName = currentElement.getTagName();
- if (tagName.equals("param")) {
- setParameter(currentElement, propSetter, props);
- } else {
- parseUnrecognizedElement(instance, currentElement, props);
- }
- }
- }
- return instance;
- }
- return null;
- }
-
-}
-
-
-class XMLWatchdog extends FileWatchdog {
-
- XMLWatchdog(String filename) {
- super(filename);
- }
-
- /**
- Call {@link DOMConfigurator#configure(String)} with the
- filename to reconfigure log4j. */
- public
- void doOnChange() {
- new DOMConfigurator().doConfigure(filename,
- LogManager.getLoggerRepository());
- }
-}
diff --git a/java/src/org/apache/log4j/xml/Log4jEntityResolver.java b/java/src/org/apache/log4j/xml/Log4jEntityResolver.java
deleted file mode 100644
index 94125a6..0000000
--- a/java/src/org/apache/log4j/xml/Log4jEntityResolver.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.xml;
-
-import org.apache.log4j.helpers.LogLog;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-
-import java.io.InputStream;
-import java.io.ByteArrayInputStream;
-
-/**
- * An {@link EntityResolver} specifically designed to return
- * log4j.dtd which is embedded within the log4j jar
- * file.
- *
- * @author Paul Austin
- * */
-public class Log4jEntityResolver implements EntityResolver {
- private static final String PUBLIC_ID = "-//APACHE//DTD LOG4J 1.2//EN";
-
- public InputSource resolveEntity (String publicId, String systemId) {
- if (systemId.endsWith("log4j.dtd") || PUBLIC_ID.equals(publicId)) {
- Class clazz = getClass();
- InputStream in = clazz.getResourceAsStream("/org/apache/log4j/xml/log4j.dtd");
- if (in == null) {
- LogLog.warn("Could not find [log4j.dtd] using [" + clazz.getClassLoader()
- + "] class loader, parsed without DTD.");
- in = new ByteArrayInputStream(new byte[0]);
- }
- return new InputSource(in);
- } else {
- return null;
- }
- }
-}
diff --git a/java/src/org/apache/log4j/xml/SAXErrorHandler.java b/java/src/org/apache/log4j/xml/SAXErrorHandler.java
deleted file mode 100644
index 43e851b..0000000
--- a/java/src/org/apache/log4j/xml/SAXErrorHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.xml;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXParseException;
-import org.apache.log4j.helpers.LogLog;
-
-public class SAXErrorHandler implements ErrorHandler {
-
- public
- void error(final SAXParseException ex) {
- emitMessage("Continuable parsing error ", ex);
- }
-
- public
- void fatalError(final SAXParseException ex) {
- emitMessage("Fatal parsing error ", ex);
- }
-
- public
- void warning(final SAXParseException ex) {
- emitMessage("Parsing warning ", ex);
- }
-
- private static void emitMessage(final String msg, final SAXParseException ex) {
- LogLog.warn(msg +ex.getLineNumber()+" and column "
- +ex.getColumnNumber());
- LogLog.warn(ex.getMessage(), ex.getException());
- }
-}
diff --git a/java/src/org/apache/log4j/xml/UnrecognizedElementHandler.java b/java/src/org/apache/log4j/xml/UnrecognizedElementHandler.java
deleted file mode 100644
index 463d5d9..0000000
--- a/java/src/org/apache/log4j/xml/UnrecognizedElementHandler.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.log4j.xml;
-
-import org.w3c.dom.Element;
-import java.util.Properties;
-
-/**
- * When implemented by an object configured by DOMConfigurator,
- * the handle method will be called when an unrecognized child
- * element is encountered. Unrecognized child elements of
- * the log4j:configuration element will be dispatched to
- * the logger repository if it supports this interface.
- *
- * @since 1.2.15
- */
-public interface UnrecognizedElementHandler {
- /**
- * Called to inform a configured object when
- * an unrecognized child element is encountered.
- * @param element element, may not be null.
- * @param props properties in force, may be null.
- * @return true if configured object recognized the element
- * @throws Exception throw an exception to prevent activation
- * of the configured object.
- */
- boolean parseUnrecognizedElement(Element element, Properties props) throws Exception;
-}
\ No newline at end of file
diff --git a/java/src/org/apache/log4j/xml/XMLLayout.java b/java/src/org/apache/log4j/xml/XMLLayout.java
deleted file mode 100644
index 2062a80..0000000
--- a/java/src/org/apache/log4j/xml/XMLLayout.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-// Contributors: Mathias Bogaert
-
-package org.apache.log4j.xml;
-
-import org.apache.log4j.Layout;
-import org.apache.log4j.helpers.Transform;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.util.Set;
-import java.util.Arrays;
-
-/**
- * The output of the XMLLayout consists of a series of log4j:event
- * elements as defined in the log4j.dtd. It does not output a
- * complete well-formed XML file. The output is designed to be
- * included as an external entity in a separate file to form
- * a correct XML file.
- *
- * For example, if abc is the name of the file where
- * the XMLLayout ouput goes, then a well-formed XML file would be:
- *
-
- <?xml version="1.0" ?>
-
- <!DOCTYPE log4j:eventSet PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd" [<!ENTITY data SYSTEM "abc">]>
-
- <log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/">
- &data;
- </log4j:eventSet>
-
-
- * This approach enforces the independence of the XMLLayout and the
- * appender where it is embedded.
- *
- *
The version attribute helps components to correctly
- * intrepret output generated by XMLLayout. The value of this
- * attribute should be "1.1" for output generated by log4j versions
- * prior to log4j 1.2 (final release) and "1.2" for relase 1.2 and
- * later.
- *
- * Appenders using this layout should have their encoding
- * set to UTF-8 or UTF-16, otherwise events containing
- * non ASCII characters could result in corrupted
- * log files.
- *
- * @author Ceki Gülcü
- * @since 0.9.0
- * */
-public class XMLLayout extends Layout {
-
- private final int DEFAULT_SIZE = 256;
- private final int UPPER_LIMIT = 2048;
-
- private StringBuffer buf = new StringBuffer(DEFAULT_SIZE);
- private boolean locationInfo = false;
- private boolean properties = false;
-
- /**
- * The LocationInfo option takes a boolean value. By default,
- * it is set to false which means there will be no location
- * information output by this layout. If the the option is set to
- * true, then the file name and line number of the statement at the
- * origin of the log statement will be output.
- *
- *
If you are embedding this layout within an {@link
- * org.apache.log4j.net.SMTPAppender} then make sure to set the
- * LocationInfo option of that appender as well.
- * */
- public void setLocationInfo(boolean flag) {
- locationInfo = flag;
- }
-
- /**
- Returns the current value of the LocationInfo option.
- */
- public boolean getLocationInfo() {
- return locationInfo;
- }
-
- /**
- * Sets whether MDC key-value pairs should be output, default false.
- * @param flag new value.
- * @since 1.2.15
- */
- public void setProperties(final boolean flag) {
- properties = flag;
- }
-
- /**
- * Gets whether MDC key-value pairs should be output.
- * @return true if MDC key-value pairs are output.
- * @since 1.2.15
- */
- public boolean getProperties() {
- return properties;
- }
-
- /** No options to activate. */
- public void activateOptions() {
- }
-
-
- /**
- * Formats a {@link org.apache.log4j.spi.LoggingEvent} in conformance with the log4j.dtd.
- * */
- public String format(final LoggingEvent event) {
-
- // Reset working buffer. If the buffer is too large, then we need a new
- // one in order to avoid the penalty of creating a large array.
- if(buf.capacity() > UPPER_LIMIT) {
- buf = new StringBuffer(DEFAULT_SIZE);
- } else {
- buf.setLength(0);
- }
-
- // We yield to the \r\n heresy.
-
- buf.append("\r\n");
-
- buf.append("\r\n");
-
- String ndc = event.getNDC();
- if(ndc != null) {
- buf.append("\r\n");
- }
-
- String[] s = event.getThrowableStrRep();
- if(s != null) {
- buf.append("\r\n");
- }
-
- if(locationInfo) {
- LocationInfo locationInfo = event.getLocationInformation();
- buf.append("\r\n");
- }
-
- if (properties) {
- Set keySet = event.getPropertyKeySet();
- if (keySet.size() > 0) {
- buf.append("\r\n");
- Object[] keys = keySet.toArray();
- Arrays.sort(keys);
- for (int i = 0; i < keys.length; i++) {
- String key = keys[i].toString();
- Object val = event.getMDC(key);
- if (val != null) {
- buf.append("\r\n");
- }
- }
- buf.append("\r\n");
- }
- }
-
- buf.append("\r\n\r\n");
-
- return buf.toString();
- }
-
- /**
- The XMLLayout prints and does not ignore exceptions. Hence the
- return value false.
- */
- public boolean ignoresThrowable() {
- return false;
- }
-}
diff --git a/java/src/org/apache/log4j/xml/package.html b/java/src/org/apache/log4j/xml/package.html
deleted file mode 100644
index 8a9ed6e..0000000
--- a/java/src/org/apache/log4j/xml/package.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-XML based components.
-
-
-
-
-
-Last modified: Mon Mar 27 21:17:13 MDT 2000
-
-