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    }