001 /** 002 * Copyright 2010 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015 016 package org.kuali.student.common.ui.client.logging; 017 018 import java.util.ArrayList; 019 import java.util.HashMap; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.kuali.student.common.ui.client.application.KSAsyncCallback; 024 import org.kuali.student.common.ui.client.service.LogRpcService; 025 import org.kuali.student.common.ui.client.service.LogRpcServiceAsync; 026 027 import com.google.gwt.core.client.GWT; 028 import com.google.gwt.user.client.Command; 029 import com.google.gwt.user.client.DeferredCommand; 030 031 public class Logger { 032 /** 033 * Default log level is LogLevel.WARN 034 */ 035 static LogLevel logLevel = LogLevel.WARN; 036 static LogBuffer buffer = new LogBuffer(); 037 static Map<String, String> clientContextInfo = new HashMap<String, String>(); 038 static int maxBufferSize = Integer.MAX_VALUE; 039 /** 040 * Sets the maximum buffer size, resizing buffer if necessary. 041 * Can be an expensive operation, avoid frequent use. 042 * @param maxSize 043 */ 044 public static void setMaxBufferSize(int maxSize) { 045 LogBuffer tmp = new LogBuffer(maxSize); 046 for (LogMessage m : buffer.getLogMessages()) { 047 tmp.add(m); 048 } 049 buffer = tmp; 050 } 051 052 public static void setLogLevel(LogLevel level) { 053 logLevel = level; 054 } 055 public static LogLevel getLogLevel() { 056 return logLevel; 057 } 058 public static void log(LogMessage message) { 059 if (message.getLogLevel().getLevel() >= logLevel.getLevel()) { 060 buffer.add(message); 061 } 062 } 063 064 public static void log(LogLevel level, String message) { 065 if (level.getLevel() >= logLevel.getLevel()) { 066 buffer.add(new LogMessage(level, message, (Throwable) null)); 067 } 068 } 069 070 public static void log(LogLevel level, String message, Throwable error) { 071 if (level.getLevel() >= logLevel.getLevel()) { 072 buffer.add(new LogMessage(level, message, error)); 073 } 074 } 075 076 public static void debug(String message) { 077 log(LogLevel.DEBUG, message); 078 } 079 public static void debug(String message, Throwable error) { 080 log(LogLevel.DEBUG, message, error); 081 } 082 083 public static void info(String message) { 084 log(LogLevel.INFO, message); 085 } 086 public static void info(String message, Throwable error) { 087 log(LogLevel.INFO, message, error); 088 } 089 090 public static void warn(String message) { 091 log(LogLevel.WARN, message); 092 } 093 public static void warn(String message, Throwable error) { 094 log(LogLevel.WARN, message, error); 095 } 096 097 public static void error(String message) { 098 log(LogLevel.ERROR, message); 099 } 100 public static void error(String message, Throwable error) { 101 log(LogLevel.ERROR, message, error); 102 } 103 104 public static void fatal(String message) { 105 log(LogLevel.FATAL, message); 106 } 107 public static void fatal(String message, Throwable error) { 108 log(LogLevel.FATAL, message, error); 109 } 110 111 public static void reset() { 112 buffer = new LogBuffer(maxBufferSize); 113 } 114 115 116 117 public static Map<String, String> getClientContextInfo() { 118 return clientContextInfo; 119 } 120 121 public static void sendLogs() { 122 final List<LogMessage> messages = new ArrayList<LogMessage>(buffer.getLogMessages()); 123 final Map<String, String> context = new HashMap<String, String>(clientContextInfo); 124 reset(); 125 DeferredCommand.addCommand(new Command() { 126 public void execute() { 127 String log = formatLog(messages); 128 LogRpcServiceAsync logService = (LogRpcServiceAsync) GWT .create(LogRpcService.class); 129 130 logService.sendLog(context, log, new KSAsyncCallback<Boolean>() { 131 public void handleFailure(Throwable caught) { 132 GWT.log("sendLog Failed", caught); 133 //throw new LogFailedException(caught); 134 } 135 136 public void onSuccess(Boolean result) { 137 // do nothing 138 GWT.log("sendLog OK", null); 139 } 140 }); 141 } 142 }); 143 } 144 145 private static String formatLog(List<LogMessage> messages) { 146 StringBuilder s = new StringBuilder(); 147 for (LogMessage lm : messages) { 148 s.append(lm.getLogLevel().toString()); 149 s.append(":\t"); 150 s.append(lm.getMessage()); 151 Throwable t = lm.getError(); 152 if (t != null) { 153 appendStackTrace(t, s); 154 } 155 } 156 return s.toString(); 157 } 158 159 private static void appendStackTrace(Throwable t, StringBuilder s) { 160 s.append(t.toString()); 161 s.append(": at\n"); 162 StackTraceElement[] stack = t.getStackTrace(); 163 for (StackTraceElement frame : stack) { 164 s.append(frame.toString()); 165 s.append("\n"); 166 } 167 } 168 }