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 }