001: /*
002: * Copyright (C) The Apache Software Foundation. All rights reserved.
003: *
004: * This software is published under the terms of the Apache Software License
005: * version 1.1, a copy of which has been included with this distribution in
006: * the LICENSE file.
007: */
008: package org.jivesoftware.util.log.output;
009:
010: import org.jivesoftware.util.log.ErrorAware;
011: import org.jivesoftware.util.log.ErrorHandler;
012: import org.jivesoftware.util.log.LogEvent;
013: import org.jivesoftware.util.log.LogTarget;
014:
015: /**
016: * Abstract target.
017: *
018: * @author <a href="mailto:peter@apache.org">Peter Donald</a>
019: */
020: public abstract class AbstractTarget implements LogTarget, ErrorAware {
021:
022: ///ErrorHandler used by target to delegate Error handling
023: private ErrorHandler m_errorHandler;
024:
025: ///Flag indicating that log session is finished (aka target has been closed)
026: private boolean m_isOpen;
027:
028: /**
029: * Provide component with ErrorHandler.
030: *
031: * @param errorHandler the errorHandler
032: */
033: public synchronized void setErrorHandler(
034: final ErrorHandler errorHandler) {
035: m_errorHandler = errorHandler;
036: }
037:
038: protected synchronized boolean isOpen() {
039: return m_isOpen;
040: }
041:
042: /**
043: * Startup log session.
044: */
045: protected synchronized void open() {
046: if (!isOpen()) {
047: m_isOpen = true;
048: }
049: }
050:
051: /**
052: * Process a log event, via formatting and outputting it.
053: *
054: * @param event the log event
055: */
056: public synchronized void processEvent(final LogEvent event) {
057: if (!isOpen()) {
058: getErrorHandler().error("Writing event to closed stream.",
059: null, event);
060: return;
061: }
062:
063: try {
064: doProcessEvent(event);
065: } catch (final Throwable throwable) {
066: getErrorHandler().error("Unknown error writing event.",
067: throwable, event);
068: }
069: }
070:
071: /**
072: * Process a log event, via formatting and outputting it.
073: * This should be overidden by subclasses.
074: *
075: * @param event the log event
076: */
077: protected abstract void doProcessEvent(LogEvent event)
078: throws Exception;
079:
080: /**
081: * Shutdown target.
082: * Attempting to send to target after close() will cause errors to be logged.
083: */
084: public synchronized void close() {
085: if (isOpen()) {
086: m_isOpen = false;
087: }
088: }
089:
090: /**
091: * Helper method to retrieve ErrorHandler for subclasses.
092: *
093: * @return the ErrorHandler
094: */
095: protected final ErrorHandler getErrorHandler() {
096: return m_errorHandler;
097: }
098:
099: /**
100: * Helper method to send error messages to error handler.
101: *
102: * @param message the error message
103: * @param throwable the exception if any
104: * @deprecated Use getErrorHandler().error(...) directly
105: */
106: protected final void error(final String message,
107: final Throwable throwable) {
108: getErrorHandler().error(message, throwable, null);
109: }
110: }
|