View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
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              	KSErrorDialog.show(e);
55              }
56          });
57      }
58  
59      public static void show(final Throwable error) {
60          final KSLightBox lightbox = new KSLightBox();
61  
62          final VerticalPanel panel = new VerticalPanel();
63          panel.addStyleName("KS-Error-Dialog");
64  
65          final KSLabel title = new KSLabel(context.getMessage(MessagesRequired.DIALOG_TITLE.toString()));
66          title.addStyleName("KS-Error-Dialog-Title");
67  
68          final KSLabel errorDescriptionLabel = new KSLabel(context.getMessage(MessagesRequired.ERROR_DESCRIPTION.toString()));
69          errorDescriptionLabel.addStyleName("KS-Error-Dialog-Label");
70  
71          final SimplePanel errorDescriptionPanel = new SimplePanel();
72          errorDescriptionPanel.addStyleName("KS-Error-Dialog-Panel");
73  
74          final KSTextArea errorDescription = new KSTextArea();
75          errorDescription.setText(getErrorDescription(error));
76          errorDescription.addStyleName("KS-Error-Dialog-TextArea");
77          errorDescription.setReadOnly(true);
78          //errorDescription.setEnabled(false);
79          errorDescriptionPanel.add(errorDescription);
80  
81  /*        final KSLabel describeActionLabel = new KSLabel(context.getMessage(MessagesRequired.DESCRIBE_ACTION.toString()));
82          describeActionLabel.addStyleName(KSStyles.KS_ERROR_DIALOG_LABEL);
83  
84          final SimplePanel actionDescriptionPanel = new SimplePanel();
85          actionDescriptionPanel.addStyleName(KSStyles.KS_ERROR_DIALOG_PANEL);
86  
87          final KSTextArea actionDescription = new KSTextArea();
88          actionDescription.addStyleName(KSStyles.KS_ERROR_DIALOG_TEXTAREA);
89          actionDescriptionPanel.add(actionDescription);
90  */
91          final OkGroup buttonPanel = new OkGroup(new Callback<OkEnum>(){
92  
93              @Override
94              public void exec(OkEnum result) {
95                  switch(result){
96                      case Ok:
97                          DeferredCommand.addCommand(new Command() {
98                              public void execute() {
99                                  sendReport(error/*, actionDescription.getText()*/);
100                                 lightbox.hide();
101                             }
102                         });
103                         break;
104                 }
105             }
106         });
107 
108         panel.add(title);
109         panel.add(errorDescriptionLabel);
110         panel.add(errorDescriptionPanel);
111 //        panel.add(describeActionLabel);
112 //        panel.add(actionDescriptionPanel);
113         panel.add(buttonPanel);
114 
115         panel.setSize("100", "100");
116 
117         lightbox.setWidget(panel);
118         lightbox.setSize(440, 200);
119         lightbox.show();
120 
121     }
122 
123     private static String getErrorDescription(Throwable error) {
124         // TODO maybe retrieve more error info
125         return error.getMessage();
126     }
127 
128     private static void sendReport(final Throwable error/*, final String actionDescription*/) {
129         // TODO actually gather client context info, such as browser version, user id, etc
130         Logger.getClientContextInfo().put("logType", "clientError");
131 //        Logger.getClientContextInfo().put("actionDescription", actionDescription);
132         Logger.error("Uncaught exception", error);
133         Logger.sendLogs();
134 
135         // hack, clear out context info, should probably find a better way of doing this
136         Logger.getClientContextInfo().clear();
137     }
138 
139 }