001: /* ====================================================================
002: * The Apache Software License, Version 1.1
003: *
004: * Copyright (c) 1997-2003 The Apache Software Foundation. All rights
005: * reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * 1. Redistributions of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The end-user documentation included with the redistribution,
020: * if any, must include the following acknowledgment:
021: * "This product includes software developed by the
022: * Apache Software Foundation (http://www.apache.org/)."
023: * Alternately, this acknowledgment may appear in the software
024: * itself, if and wherever such third-party acknowledgments
025: * normally appear.
026: *
027: * 4. The names "Jakarta", "Avalon", and "Apache Software Foundation"
028: * must not be used to endorse or promote products derived from this
029: * software without prior written permission. For written
030: * permission, please contact apache@apache.org.
031: *
032: * 5. Products derived from this software may not be called "Apache",
033: * nor may "Apache" appear in their name, without prior written
034: * permission of the Apache Software Foundation.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
040: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: * ====================================================================
049: *
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the Apache Software Foundation. For more
052: * information on the Apache Software Foundation, please see
053: * <http://www.apache.org/>.
054: */
055: package org.apache.log.output;
056:
057: import org.apache.log.ErrorAware;
058: import org.apache.log.ErrorHandler;
059: import org.apache.log.LogEvent;
060: import org.apache.log.LogTarget;
061: import org.apache.log.util.DefaultErrorHandler;
062:
063: /**
064: * Abstract target.
065: *
066: * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
067: * @author <a href="mailto:peter@apache.org">Peter Donald</a>
068: */
069: public abstract class AbstractTarget implements LogTarget, ErrorAware {
070: private static final ErrorHandler DEFAULT_ERROR_HANDLER = new DefaultErrorHandler();
071:
072: ///ErrorHandler used by target to delegate Error handling
073: private ErrorHandler m_errorHandler = DEFAULT_ERROR_HANDLER;
074:
075: ///Flag indicating that log session is finished (aka target has been closed)
076: private boolean m_isOpen;
077:
078: /**
079: * AbstractTarget constructor.
080: */
081: public AbstractTarget() {
082: }
083:
084: /**
085: * AbstractTarget constructor.
086: * @param errorHandler the error handler
087: */
088: public AbstractTarget(final ErrorHandler errorHandler) {
089: if (errorHandler == null) {
090: throw new NullPointerException(
091: "errorHandler specified cannot be null");
092: }
093: setErrorHandler(errorHandler);
094: }
095:
096: /**
097: * Provide component with ErrorHandler.
098: *
099: * @param errorHandler the errorHandler
100: */
101: public synchronized void setErrorHandler(
102: final ErrorHandler errorHandler) {
103: m_errorHandler = errorHandler;
104: }
105:
106: /**
107: * Return the open state of the target.
108: * @return TRUE if the target is open else FALSE
109: */
110: protected synchronized boolean isOpen() {
111: return m_isOpen;
112: }
113:
114: /**
115: * Startup log session.
116: */
117: protected synchronized void open() {
118: if (!isOpen()) {
119: m_isOpen = true;
120: }
121: }
122:
123: /**
124: * Process a log event, via formatting and outputting it.
125: *
126: * @param event the log event
127: */
128: public synchronized void processEvent(final LogEvent event) {
129: if (!isOpen()) {
130: getErrorHandler().error("Writing event to closed stream.",
131: null, event);
132: return;
133: }
134:
135: try {
136: doProcessEvent(event);
137: } catch (final Throwable throwable) {
138: getErrorHandler().error("Unknown error writing event.",
139: throwable, event);
140: }
141: }
142:
143: /**
144: * Process a log event, via formatting and outputting it.
145: * This should be overidden by subclasses.
146: *
147: * @param event the log event
148: * @exception Exception if an event processing error occurs
149: */
150: protected abstract void doProcessEvent(LogEvent event)
151: throws Exception;
152:
153: /**
154: * Shutdown target.
155: * Attempting to write to target after close() will cause errors to be logged.
156: *
157: */
158: public synchronized void close() {
159: if (isOpen()) {
160: m_isOpen = false;
161: }
162: }
163:
164: /**
165: * Helper method to retrieve ErrorHandler for subclasses.
166: *
167: * @return the ErrorHandler
168: */
169: protected final ErrorHandler getErrorHandler() {
170: return m_errorHandler;
171: }
172:
173: /**
174: * Helper method to write error messages to error handler.
175: *
176: * @param message the error message
177: * @param throwable the exception if any
178: * @deprecated Use getErrorHandler().error(...) directly
179: */
180: protected final void error(final String message,
181: final Throwable throwable) {
182: getErrorHandler().error(message, throwable, null);
183: }
184: }
|