001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.openjpa.lib.log;
020:
021: import java.util.ArrayList;
022: import java.util.Arrays;
023: import java.util.Iterator;
024: import java.util.List;
025:
026: import org.apache.openjpa.lib.util.concurrent.CopyOnWriteArrayList;
027:
028: /**
029: * A LogFactory implementation to pass events through multiple
030: * LogFactory implementations(such as log4j and LogPanelFactory).
031: *
032: * @author Steve Kim
033: */
034: public class MultiLogFactory implements LogFactory {
035:
036: private List _delegates;
037:
038: /**
039: * Create an instance with the given delegates.
040: */
041: public MultiLogFactory(LogFactory d1, LogFactory d2) {
042: this (new LogFactory[] { d1, d2 });
043: }
044:
045: /**
046: * Create an instance with the given delegates.
047: */
048: public MultiLogFactory(LogFactory d1, LogFactory d2, LogFactory d3) {
049: this (new LogFactory[] { d1, d2, d3 });
050: }
051:
052: /**
053: * Create an instance with the given delegates.
054: */
055: public MultiLogFactory(LogFactory[] delegates) {
056: _delegates = new CopyOnWriteArrayList(Arrays.asList(delegates));
057: }
058:
059: public void addLogFactory(LogFactory factory) {
060: _delegates.add(factory);
061: }
062:
063: public void removeLogFactory(LogFactory factory) {
064: _delegates.remove(factory);
065: }
066:
067: /**
068: * Returns the delegates that this MultiLogFactory delegates messages to.
069: */
070: public LogFactory[] getDelegates() {
071: return (LogFactory[]) _delegates.toArray(new LogFactory[0]);
072: }
073:
074: /**
075: * Returns a Log impl that combines all logs.
076: */
077: public synchronized Log getLog(String channel) {
078: List logs = new ArrayList(_delegates.size());
079: for (Iterator i = _delegates.iterator(); i.hasNext();) {
080: LogFactory f = (LogFactory) i.next();
081: if (f != null) {
082: Log l = f.getLog(channel);
083: if (l != null)
084: logs.add(l);
085: }
086: }
087: return new MultiLog((Log[]) logs.toArray(new Log[logs.size()]));
088: }
089:
090: /**
091: * Combinatory Log impl.
092: */
093: private static class MultiLog implements Log {
094:
095: private Log[] _logs;
096:
097: public MultiLog(Log[] logs) {
098: _logs = logs;
099: }
100:
101: /**
102: * Return the logs that this log delegates to.
103: */
104: public Log[] getDelegates() {
105: return _logs;
106: }
107:
108: public void trace(Object msg) {
109: for (int i = 0; i < _logs.length; i++)
110: _logs[i].trace(msg);
111: }
112:
113: public void trace(Object msg, Throwable t) {
114: for (int i = 0; i < _logs.length; i++)
115: _logs[i].trace(msg, t);
116: }
117:
118: public void info(Object msg) {
119: for (int i = 0; i < _logs.length; i++)
120: _logs[i].info(msg);
121: }
122:
123: public void info(Object msg, Throwable t) {
124: for (int i = 0; i < _logs.length; i++)
125: _logs[i].info(msg, t);
126: }
127:
128: public void warn(Object msg) {
129: for (int i = 0; i < _logs.length; i++)
130: _logs[i].warn(msg);
131: }
132:
133: public void warn(Object msg, Throwable t) {
134: for (int i = 0; i < _logs.length; i++)
135: _logs[i].warn(msg, t);
136: }
137:
138: public void error(Object msg) {
139: for (int i = 0; i < _logs.length; i++)
140: _logs[i].error(msg);
141: }
142:
143: public void error(Object msg, Throwable t) {
144: for (int i = 0; i < _logs.length; i++)
145: _logs[i].error(msg, t);
146: }
147:
148: public void fatal(Object msg) {
149: for (int i = 0; i < _logs.length; i++)
150: _logs[i].fatal(msg);
151: }
152:
153: public void fatal(Object msg, Throwable t) {
154: for (int i = 0; i < _logs.length; i++)
155: _logs[i].fatal(msg, t);
156: }
157:
158: public boolean isTraceEnabled() {
159: for (int i = 0; i < _logs.length; i++)
160: if (_logs[i].isTraceEnabled())
161: return true;
162: return false;
163: }
164:
165: public boolean isInfoEnabled() {
166: for (int i = 0; i < _logs.length; i++)
167: if (_logs[i].isInfoEnabled())
168: return true;
169: return false;
170: }
171:
172: public boolean isWarnEnabled() {
173: for (int i = 0; i < _logs.length; i++)
174: if (_logs[i].isWarnEnabled())
175: return true;
176: return false;
177: }
178:
179: public boolean isErrorEnabled() {
180: for (int i = 0; i < _logs.length; i++)
181: if (_logs[i].isErrorEnabled())
182: return true;
183: return false;
184: }
185:
186: public boolean isFatalEnabled() {
187: for (int i = 0; i < _logs.length; i++)
188: if (_logs[i].isFatalEnabled())
189: return true;
190: return false;
191: }
192: }
193: }
|