001: package org.apache.velocity.runtime.log;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.util.Vector;
023: import java.util.Iterator;
024: import org.apache.velocity.runtime.RuntimeServices;
025:
026: /**
027: * Pre-init logger. I believe that this was suggested by
028: * Carsten Ziegeler <cziegeler@sundn.de> and
029: * Jeroen C. van Gelderen. If this isn't correct, let me
030: * know as this was a good idea...
031: *
032: * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
033: * @author <a href="mailto:nbubna@apache.org">Nathan Bubna</a>
034: * @version $Id: HoldingLogChute.java 463298 2006-10-12 16:10:32Z henning $
035: */
036: class HoldingLogChute implements LogChute {
037: private Vector pendingMessages = new Vector();
038:
039: /**
040: * @see org.apache.velocity.runtime.log.LogChute#init(org.apache.velocity.runtime.RuntimeServices)
041: */
042: public void init(RuntimeServices rs) throws Exception {
043: }
044:
045: /**
046: * Logs messages. All we do is store them until 'later'.
047: *
048: * @param level severity level
049: * @param message complete error message
050: */
051: public void log(int level, String message) {
052: synchronized (this ) {
053: Object[] data = new Object[2];
054: // TODO: JDK 1.4+ -> valueOf()
055: data[0] = new Integer(level);
056: data[1] = message;
057: pendingMessages.addElement(data);
058: }
059: }
060:
061: /**
062: * Logs messages and errors. All we do is store them until 'later'.
063: *
064: * @param level severity level
065: * @param message complete error message
066: * @param t the accompanying java.lang.Throwable
067: */
068: public void log(int level, String message, Throwable t) {
069: synchronized (this ) {
070: Object[] data = new Object[3];
071: // TODO: JDK 1.4+ -> valueOf()
072: data[0] = new Integer(level);
073: data[1] = message;
074: data[2] = t;
075: pendingMessages.addElement(data);
076: }
077: }
078:
079: /**
080: * @see org.apache.velocity.runtime.log.LogChute#isLevelEnabled(int)
081: */
082: public boolean isLevelEnabled(int level) {
083: return true;
084: }
085:
086: /**
087: * Dumps the log messages this chute is holding into a new chute
088: * @param newChute
089: */
090: public void transferTo(LogChute newChute) {
091: synchronized (this ) {
092: if (!pendingMessages.isEmpty()) {
093: // iterate and log each individual message...
094: for (Iterator i = pendingMessages.iterator(); i
095: .hasNext();) {
096: Object[] data = (Object[]) i.next();
097: int level = ((Integer) data[0]).intValue();
098: String message = (String) data[1];
099: if (data.length == 2) {
100: newChute.log(level, message);
101: } else {
102: newChute.log(level, message,
103: (Throwable) data[2]);
104: }
105: }
106: }
107: }
108: }
109:
110: }
|