1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.student.common.ui.client.widgets;
17  
18  
19  import org.kuali.student.common.ui.client.application.Application;
20  import org.kuali.student.common.ui.client.application.ApplicationContext;
21  import org.kuali.student.common.ui.client.logging.Logger;
22  import org.kuali.student.common.ui.client.mvc.Callback;
23  import org.kuali.student.common.ui.client.widgets.buttongroups.OkGroup;
24  import org.kuali.student.common.ui.client.widgets.buttongroups.ButtonEnumerations.OkEnum;
25  
26  import com.google.gwt.core.client.GWT;
27  import com.google.gwt.user.client.Command;
28  import com.google.gwt.user.client.DeferredCommand;
29  import com.google.gwt.user.client.ui.SimplePanel;
30  import com.google.gwt.user.client.ui.VerticalPanel;
31  
32  public class KSErrorDialog {
33  
34      final static ApplicationContext context = Application.getApplicationContext();
35  
36      public enum MessagesRequired {
37          DIALOG_TITLE("errorDialogTitle"),
38          DESCRIBE_ACTION("describeAction"),
39          ERROR_DESCRIPTION("errorDescription");
40  
41          private String messageId;
42          private MessagesRequired(String messageId) {
43              this.messageId = messageId;
44          }
45          public String toString() {
46              return this.messageId;
47          }
48      }
49  
50      public static void bindUncaughtExceptionHandler() {
51          GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
52              public void onUncaughtException(Throwable e) {
53                  GWT.log(e.getMessage(), e);
54                  
55              	KSErrorDialog.show(e);
56              }
57          });
58      }
59  
60      private static String getStackTrace(Throwable t){
61      	StringBuilder sb =  new StringBuilder();
62      	appendStackTrace(t,sb);
63      	return sb.toString();
64      }
65      
66      private static void appendStackTrace(Throwable t, StringBuilder s) {
67          s.append(t.toString());
68          s.append(": at\n");
69          StackTraceElement[] stack = t.getStackTrace();
70          for (StackTraceElement frame : stack) {
71              s.append(frame.toString());
72              s.append("\n");
73          }
74      }
75      
76      public static void show(final Throwable error) {
77          final KSLightBox lightbox = new KSLightBox();
78  
79          final VerticalPanel panel = new VerticalPanel();
80          panel.addStyleName("KS-Error-Dialog");
81  
82          final KSLabel title = new KSLabel(context.getMessage(MessagesRequired.DIALOG_TITLE.toString()));
83          title.addStyleName("KS-Error-Dialog-Title");
84  
85          final KSLabel errorDescriptionLabel = new KSLabel(context.getMessage(MessagesRequired.ERROR_DESCRIPTION.toString()));
86          errorDescriptionLabel.addStyleName("KS-Error-Dialog-Label");
87  
88          final SimplePanel errorDescriptionPanel = new SimplePanel();
89          errorDescriptionPanel.addStyleName("KS-Error-Dialog-Panel");
90  
91          final KSTextArea errorDescription = new KSTextArea();
92          errorDescription.setText(getErrorDescription(error));
93          errorDescription.addStyleName("KS-Error-Dialog-TextArea");
94          errorDescription.setReadOnly(true);
95          
96          errorDescriptionPanel.add(errorDescription);
97  
98  
99  
100 
101 
102 
103 
104 
105 
106 
107 
108         final OkGroup buttonPanel = new OkGroup(new Callback<OkEnum>(){
109 
110             @Override
111             public void exec(OkEnum result) {
112                 switch(result){
113                     case Ok:
114                         DeferredCommand.addCommand(new Command() {
115                             public void execute() {
116                                 sendReport(error
117                                 lightbox.hide();
118                             }
119                         });
120                         break;
121                 }
122             }
123         });
124 
125         lightbox.setNonCaptionHeader(title);
126         panel.add(errorDescriptionLabel);
127         panel.add(errorDescriptionPanel);
128 
129 
130         panel.add(buttonPanel);
131 
132         panel.setSize("100", "100");
133 
134         lightbox.setWidget(panel);
135         lightbox.setSize(440, 200);
136         lightbox.show();
137 
138     }
139 
140     private static String getErrorDescription(Throwable error) {
141         
142         return error.getMessage();
143     }
144 
145     private static void sendReport(final Throwable error
146         
147         Logger.getClientContextInfo().put("logType", "clientError");
148 
149         Logger.error("Uncaught exception", error);
150         Logger.sendLogs();
151 
152         
153         Logger.getClientContextInfo().clear();
154     }
155 
156 }