1 package org.apache.velocity.runtime.log;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.util.Vector;
23 import java.util.Iterator;
24 import org.apache.velocity.runtime.RuntimeServices;
25
26 /**
27 * Pre-init logger. I believe that this was suggested by
28 * Carsten Ziegeler <cziegeler@sundn.de> and
29 * Jeroen C. van Gelderen. If this isn't correct, let me
30 * know as this was a good idea...
31 *
32 * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
33 * @author <a href="mailto:nbubna@apache.org">Nathan Bubna</a>
34 * @version $Id: HoldingLogChute.java 685685 2008-08-13 21:43:27Z nbubna $
35 * @since 1.5
36 */
37 class HoldingLogChute implements LogChute
38 {
39 private Vector pendingMessages = new Vector();
40 private volatile boolean transferring = false;
41
42 /**
43 * @see org.apache.velocity.runtime.log.LogChute#init(org.apache.velocity.runtime.RuntimeServices)
44 */
45 public void init(RuntimeServices rs) throws Exception
46 {
47 }
48
49 /**
50 * Logs messages. All we do is store them until 'later'.
51 *
52 * @param level severity level
53 * @param message complete error message
54 */
55 public synchronized void log(int level, String message)
56 {
57 if (!transferring)
58 {
59 Object[] data = new Object[2];
60 data[0] = new Integer(level);
61 data[1] = message;
62 pendingMessages.addElement(data);
63 }
64 }
65
66 /**
67 * Logs messages and errors. All we do is store them until 'later'.
68 *
69 * @param level severity level
70 * @param message complete error message
71 * @param t the accompanying java.lang.Throwable
72 */
73 public synchronized void log(int level, String message, Throwable t)
74 {
75 if (!transferring)
76 {
77 Object[] data = new Object[3];
78 data[0] = new Integer(level);
79 data[1] = message;
80 data[2] = t;
81 pendingMessages.addElement(data);
82 }
83 }
84
85 /**
86 * @see org.apache.velocity.runtime.log.LogChute#isLevelEnabled(int)
87 */
88 public boolean isLevelEnabled(int level)
89 {
90 return true;
91 }
92
93 /**
94 * Dumps the log messages this chute is holding into a new chute
95 * @param newChute
96 */
97 public synchronized void transferTo(LogChute newChute)
98 {
99 if (!transferring && !pendingMessages.isEmpty())
100 {
101 // let the other methods know what's up
102 transferring = true;
103
104 // iterate and log each individual message...
105 for(Iterator i = pendingMessages.iterator(); i.hasNext();)
106 {
107 Object[] data = (Object[])i.next();
108 int level = ((Integer)data[0]).intValue();
109 String message = (String)data[1];
110 if (data.length == 2)
111 {
112 newChute.log(level, message);
113 }
114 else
115 {
116 newChute.log(level, message, (Throwable)data[2]);
117 }
118 }
119 }
120 }
121
122 }