001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.hivemind.service.impl;
016
017 import org.apache.commons.logging.Log;
018 import org.apache.hivemind.service.ClassFabUtils;
019
020 /**
021 * Collection of static methods used by loggers to
022 * log method entry and exit.
023 *
024 * @author Howard Lewis Ship
025 */
026 public class LoggingUtils
027 {
028 private static final int BUFFER_SIZE = 100;
029
030 public static void entry(Log log, String methodName, Object[] args)
031 {
032 StringBuffer buffer = new StringBuffer(BUFFER_SIZE);
033
034 buffer.append("BEGIN ");
035 buffer.append(methodName);
036 buffer.append("(");
037
038 int count = (args == null) ? 0 : args.length;
039
040 for (int i = 0; i < count; i++)
041 {
042 Object arg = args[i];
043
044 if (i > 0)
045 buffer.append(", ");
046
047 convert(buffer, arg);
048 }
049
050 buffer.append(")");
051
052 log.debug(buffer.toString());
053 }
054
055 public static void exit(Log log, String methodName, Object result)
056 {
057 StringBuffer buffer = new StringBuffer(BUFFER_SIZE);
058
059 buffer.append("END ");
060 buffer.append(methodName);
061 buffer.append("() [");
062
063 convert(buffer, result);
064
065 buffer.append("]");
066
067 log.debug(buffer.toString());
068 }
069
070 public static void voidExit(Log log, String methodName)
071 {
072 StringBuffer buffer = new StringBuffer(BUFFER_SIZE);
073
074 buffer.append("END ");
075 buffer.append(methodName);
076 buffer.append("()");
077
078 log.debug(buffer.toString());
079 }
080
081 public static void exception(Log log, String methodName, Throwable t)
082 {
083 StringBuffer buffer = new StringBuffer(BUFFER_SIZE);
084
085 buffer.append("EXCEPTION ");
086 buffer.append(methodName);
087 buffer.append("() -- ");
088
089 buffer.append(t.getClass().getName());
090
091 log.debug(buffer.toString(), t);
092 }
093
094 public static void convert(StringBuffer buffer, Object input)
095 {
096 if (input == null)
097 {
098 buffer.append("<null>");
099 return;
100 }
101
102 // Primitive types, and non-object arrays
103 // use toString(). Less than ideal for int[], etc., but
104 // that's a lot of work for a rare case.
105
106 if (!(input instanceof Object[]))
107 {
108 buffer.append(input.toString());
109 return;
110 }
111
112 buffer.append("(");
113 buffer.append(ClassFabUtils.getJavaClassName(input.getClass()));
114 buffer.append("){");
115
116 Object[] array = (Object[]) input;
117 int count = array.length;
118
119 for (int i = 0; i < count; i++)
120 {
121 if (i > 0)
122 buffer.append(", ");
123
124 // We use convert() again, because it could be a multi-dimensional array
125 // (god help us) where each element must be converted.
126 convert(buffer, array[i]);
127 }
128
129 buffer.append("}");
130 }
131 }