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 }