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.LogEvent;
058: import org.apache.log.format.Formatter;
059:
060: /**
061: * Abstract output target.
062: * Any new output target that is writing to a single connected
063: * resource should extend this class directly or indirectly.
064: *
065: * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
066: * @author <a href="mailto:peter@apache.org">Peter Donald</a>
067: */
068: public abstract class AbstractOutputTarget extends AbstractTarget {
069: /**
070: * Formatter for target.
071: *
072: * @deprecated You should not be directly accessing this attribute
073: * as it will become private next release
074: */
075: protected Formatter m_formatter;
076:
077: /**
078: * Parameterless constructor.
079: */
080: public AbstractOutputTarget() {
081: }
082:
083: /**
084: * Creation of a new abstract output target instance.
085: * @param formatter the formatter to apply
086: */
087: public AbstractOutputTarget(final Formatter formatter) {
088: m_formatter = formatter;
089: }
090:
091: /**
092: * Retrieve the associated formatter.
093: *
094: * @return the formatter
095: * @deprecated Access to formatter is not advised and this method will be removed
096: * in future iterations. It remains only for backwards compatability.
097: */
098: public synchronized Formatter getFormatter() {
099: return m_formatter;
100: }
101:
102: /**
103: * Set the formatter.
104: *
105: * @param formatter the formatter
106: * @deprecated In future this method will become protected access.
107: */
108: public synchronized void setFormatter(final Formatter formatter) {
109: writeTail();
110: m_formatter = formatter;
111: writeHead();
112: }
113:
114: /**
115: * Abstract method to write data.
116: *
117: * @param data the data to be output
118: */
119: protected void write(final String data) {
120: output(data);
121: }
122:
123: /**
124: * Abstract method that will output event.
125: *
126: * @param data the data to be output
127: * @deprecated User should overide write() instead of output(). Output exists
128: * for backwards compatability and will be removed in future.
129: */
130: protected void output(final String data) {
131: }
132:
133: /**
134: * Process a log event.
135: * @param event the event to process
136: */
137: protected void doProcessEvent(LogEvent event) {
138: final String data = format(event);
139: write(data);
140: }
141:
142: /**
143: * Startup log session.
144: *
145: */
146: protected synchronized void open() {
147: if (!isOpen()) {
148: super .open();
149: writeHead();
150: }
151: }
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: writeTail();
161: super .close();
162: }
163: }
164:
165: /**
166: * Helper method to format an event into a string, using the formatter if available.
167: *
168: * @param event the LogEvent
169: * @return the formatted string
170: */
171: private String format(final LogEvent event) {
172: if (null != m_formatter) {
173: return m_formatter.format(event);
174: } else {
175: return event.toString();
176: }
177: }
178:
179: /**
180: * Helper method to write out log head.
181: * The head initiates a session of logging.
182: */
183: private void writeHead() {
184: if (!isOpen()) {
185: return;
186: }
187:
188: final String head = getHead();
189: if (null != head) {
190: write(head);
191: }
192: }
193:
194: /**
195: * Helper method to write out log tail.
196: * The tail completes a session of logging.
197: */
198: private void writeTail() {
199: if (!isOpen()) {
200: return;
201: }
202:
203: final String tail = getTail();
204: if (null != tail) {
205: write(tail);
206: }
207: }
208:
209: /**
210: * Helper method to retrieve head for log session.
211: * TODO: Extract from formatter
212: *
213: * @return the head string
214: */
215: private String getHead() {
216: return null;
217: }
218:
219: /**
220: * Helper method to retrieve tail for log session.
221: * TODO: Extract from formatter
222: *
223: * @return the head string
224: */
225: private String getTail() {
226: return null;
227: }
228: }
|