Changeset 3478 in josm


Ignore:
Timestamp:
Aug 29, 2010 2:25:18 PM (3 years ago)
Author:
bastiK
Message:

1) do not show bug report window for bugs that are thrown while bug handling is in progress; 2) do not paint the MapView while bug handling is in progress. (This prevents the cascaded error messages when exceptions is thrown by paint())

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/MapView.java

    r3451 r3478  
    5252import org.openstreetmap.josm.gui.layer.markerlayer.PlayHeadMarker; 
    5353import org.openstreetmap.josm.tools.AudioPlayer; 
     54import org.openstreetmap.josm.tools.BugReportExceptionHandler; 
    5455 
    5556/** 
     
    443444     */ 
    444445    @Override public void paint(Graphics g) { 
     446        if (BugReportExceptionHandler.exceptionHandlingInProgress()) 
     447            return; 
     448 
    445449        if (center == null) 
    446450            return; // no data loaded yet. 
  • trunk/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java

    r3098 r3478  
    3333public final class BugReportExceptionHandler implements Thread.UncaughtExceptionHandler { 
    3434 
     35    private static boolean handlingInProgress = false; 
     36 
    3537    public void uncaughtException(Thread t, Throwable e) { 
    3638        handleException(e); 
     
    4345 
    4446    public static void handleException(Throwable e) { 
    45         e.printStackTrace(); 
    46         if (Main.parent != null) { 
    47             if (e instanceof OutOfMemoryError) { 
    48                 // do not translate the string, as translation may raise an exception 
    49                 JOptionPane.showMessageDialog(Main.parent, "JOSM is out of memory. " + 
    50                         "Strange things may happen.\nPlease restart JOSM with the -Xmx###M option,\n" + 
    51                         "where ### is the number of MB assigned to JOSM (e.g. 256).\n" + 
    52                         "Currently, " + Runtime.getRuntime().maxMemory()/1024/1024 + " MB are available to JOSM.", 
    53                         "Error", 
    54                         JOptionPane.ERROR_MESSAGE 
    55                 ); 
    56                 return; 
    57             } 
    58  
    59             // Give the user a chance to deactivate the plugin which threw the exception (if it 
    60             // was thrown from a plugin) 
    61             // 
    62             PluginHandler.disablePluginAfterException(e); 
    63  
    64             // Then ask for submitting a bug report, for exceptions thrown from a plugin too 
    65             // 
    66             Object[] options = new String[]{tr("Do nothing"), tr("Report Bug")}; 
    67             int answer = JOptionPane.showOptionDialog( 
    68                     Main.parent, 
    69                     "<html>" 
    70                     + tr("An unexpected exception occurred.<br>" + 
    71                             "This is always a coding error. If you are running the latest<br>" + 
    72                             "version of JOSM, please consider being kind and file a bug report." 
    73                     ) 
    74                     + "</html>", 
    75                     tr("Unexpected Exception"), 
    76                     JOptionPane.YES_NO_OPTION, 
    77                     JOptionPane.ERROR_MESSAGE, 
    78                     null, 
    79                     options, options[0] 
    80             ); 
    81             if (answer != 1)  return; 
    82  
    83             try { 
    84                 final int maxlen = 7000; 
    85                 StringWriter stack = new StringWriter(); 
    86                 e.printStackTrace(new PrintWriter(stack)); 
    87  
    88                 String text = ShowStatusReportAction.getReportHeader() 
    89                 + stack.getBuffer().toString(); 
    90                 String urltext = text.replaceAll("\r",""); /* strip useless return chars */ 
    91                 if(urltext.length() > maxlen) 
    92                 { 
    93                     urltext = urltext.substring(0,maxlen); 
    94                     int idx = urltext.lastIndexOf("\n"); 
    95                     /* cut whole line when not loosing too much */ 
    96                     if(maxlen-idx < 200) { 
    97                         urltext = urltext.substring(0,idx+1); 
    98                     } 
    99                     urltext += "...<snip>...\n"; 
     47        if (handlingInProgress) 
     48            return;                  // we do not handle secondary exceptions, this gets too messy 
     49        handlingInProgress = true; 
     50        try { 
     51            e.printStackTrace(); 
     52            if (Main.parent != null) { 
     53                if (e instanceof OutOfMemoryError) { 
     54                    // do not translate the string, as translation may raise an exception 
     55                    JOptionPane.showMessageDialog(Main.parent, "JOSM is out of memory. " + 
     56                            "Strange things may happen.\nPlease restart JOSM with the -Xmx###M option,\n" + 
     57                            "where ### is the number of MB assigned to JOSM (e.g. 256).\n" + 
     58                            "Currently, " + Runtime.getRuntime().maxMemory()/1024/1024 + " MB are available to JOSM.", 
     59                            "Error", 
     60                            JOptionPane.ERROR_MESSAGE 
     61                    ); 
     62                    return; 
    10063                } 
    10164 
    102                 URL url = new URL("http://josm.openstreetmap.de/josmticket?" + 
    103                         "data="+ 
    104                         Base64.encode( 
    105                                 // To note that it came from this code 
    106                                 "keywords=template_report&" + 
    107                                 "description=" + java.net.URLEncoder.encode( 
    108                                         // Note: This doesn't use tr() intentionally, we want bug reports in English 
    109                                         "What steps will reproduce the problem?\n" 
    110                                         + " 1. \n" 
    111                                         + " 2. \n" 
    112                                         + " 3. \n" 
    113                                         + "\n" 
    114                                         + "What is the expected result?\n\n" 
    115                                         + "What happens instead?\n\n" 
    116                                         + "Please provide any additional information below. Attach a screenshot if\n" 
    117                                         + "possible.\n\n" 
    118                                         + "{{{\n" + urltext + "\n}}}\n", 
    119                                 "UTF-8"))); 
     65                // Give the user a chance to deactivate the plugin which threw the exception (if it 
     66                // was thrown from a plugin) 
     67                // 
     68                PluginHandler.disablePluginAfterException(e); 
    12069 
    121                 JPanel p = new JPanel(new GridBagLayout()); 
    122                 p.add(new JMultilineLabel( 
    123                         tr("You have encountered an error in JOSM. Before you file a bug report " + 
    124                         "make sure you have updated to the latest version of JOSM here:")), GBC.eol()); 
    125                 p.add(new UrlLabel("http://josm.openstreetmap.de/#Download"), GBC.eop().insets(8,0,0,0)); 
    126                 p.add(new JMultilineLabel( 
    127                         tr("You should also update your plugins. If neither of those help please " + 
    128                         "file a bug report in our bugtracker using this link:")), GBC.eol()); 
    129                 p.add(new UrlLabel(url.toString(), "http://josm.openstreetmap.de/josmticket?..."), GBC.eop().insets(8,0,0,0)); 
    130                 p.add(new JMultilineLabel( 
    131                         tr("There the error information provided below should already be " + 
    132                                 "filled in for you. Please include information on how to reproduce " + 
    133                         "the error and try to supply as much detail as possible.")), GBC.eop()); 
    134                 p.add(new JMultilineLabel( 
    135                         tr("Alternatively, if that does not work you can manually fill in the information " + 
    136                         "below at this URL:")), GBC.eol()); 
    137                 p.add(new UrlLabel("http://josm.openstreetmap.de/newticket"), GBC.eop().insets(8,0,0,0)); 
     70                // Then ask for submitting a bug report, for exceptions thrown from a plugin too 
     71                // 
     72                Object[] options = new String[]{tr("Do nothing"), tr("Report Bug")}; 
     73                int answer = JOptionPane.showOptionDialog( 
     74                        Main.parent, 
     75                        "<html>" 
     76                        + tr("An unexpected exception occurred.<br>" + 
     77                                "This is always a coding error. If you are running the latest<br>" + 
     78                                "version of JOSM, please consider being kind and file a bug report." 
     79                        ) 
     80                        + "</html>", 
     81                        tr("Unexpected Exception"), 
     82                        JOptionPane.YES_NO_OPTION, 
     83                        JOptionPane.ERROR_MESSAGE, 
     84                        null, 
     85                        options, options[0] 
     86                ); 
     87                if (answer != 1)  return; 
     88 
    13889                try { 
    139                     Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), new ClipboardOwner(){ 
    140                         public void lostOwnership(Clipboard clipboard, Transferable contents) {} 
    141                     }); 
    142                     p.add(new JLabel(tr("(The text has already been copied to your clipboard.)")), GBC.eop()); 
     90                    final int maxlen = 7000; 
     91                    StringWriter stack = new StringWriter(); 
     92                    e.printStackTrace(new PrintWriter(stack)); 
     93 
     94                    String text = ShowStatusReportAction.getReportHeader() 
     95                    + stack.getBuffer().toString(); 
     96                    String urltext = text.replaceAll("\r",""); /* strip useless return chars */ 
     97                    if(urltext.length() > maxlen) 
     98                    { 
     99                        urltext = urltext.substring(0,maxlen); 
     100                        int idx = urltext.lastIndexOf("\n"); 
     101                        /* cut whole line when not loosing too much */ 
     102                        if(maxlen-idx < 200) { 
     103                            urltext = urltext.substring(0,idx+1); 
     104                        } 
     105                        urltext += "...<snip>...\n"; 
     106                    } 
     107 
     108                    URL url = new URL("http://josm.openstreetmap.de/josmticket?" + 
     109                            "data="+ 
     110                            Base64.encode( 
     111                                    // To note that it came from this code 
     112                                    "keywords=template_report&" + 
     113                                    "description=" + java.net.URLEncoder.encode( 
     114                                            // Note: This doesn't use tr() intentionally, we want bug reports in English 
     115                                            "What steps will reproduce the problem?\n" 
     116                                            + " 1. \n" 
     117                                            + " 2. \n" 
     118                                            + " 3. \n" 
     119                                            + "\n" 
     120                                            + "What is the expected result?\n\n" 
     121                                            + "What happens instead?\n\n" 
     122                                            + "Please provide any additional information below. Attach a screenshot if\n" 
     123                                            + "possible.\n\n" 
     124                                            + "{{{\n" + urltext + "\n}}}\n", 
     125                                    "UTF-8"))); 
     126 
     127                    JPanel p = new JPanel(new GridBagLayout()); 
     128                    p.add(new JMultilineLabel( 
     129                            tr("You have encountered an error in JOSM. Before you file a bug report " + 
     130                            "make sure you have updated to the latest version of JOSM here:")), GBC.eol()); 
     131                    p.add(new UrlLabel("http://josm.openstreetmap.de/#Download"), GBC.eop().insets(8,0,0,0)); 
     132                    p.add(new JMultilineLabel( 
     133                            tr("You should also update your plugins. If neither of those help please " + 
     134                            "file a bug report in our bugtracker using this link:")), GBC.eol()); 
     135                    p.add(new UrlLabel(url.toString(), "http://josm.openstreetmap.de/josmticket?..."), GBC.eop().insets(8,0,0,0)); 
     136                    p.add(new JMultilineLabel( 
     137                            tr("There the error information provided below should already be " + 
     138                                    "filled in for you. Please include information on how to reproduce " + 
     139                            "the error and try to supply as much detail as possible.")), GBC.eop()); 
     140                    p.add(new JMultilineLabel( 
     141                            tr("Alternatively, if that does not work you can manually fill in the information " + 
     142                            "below at this URL:")), GBC.eol()); 
     143                    p.add(new UrlLabel("http://josm.openstreetmap.de/newticket"), GBC.eop().insets(8,0,0,0)); 
     144                    try { 
     145                        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), new ClipboardOwner(){ 
     146                            public void lostOwnership(Clipboard clipboard, Transferable contents) {} 
     147                        }); 
     148                        p.add(new JLabel(tr("(The text has already been copied to your clipboard.)")), GBC.eop()); 
     149                    } 
     150                    catch (RuntimeException x) {} 
     151 
     152                    JTextArea info = new JTextArea(text, 20, 60); 
     153                    info.setCaretPosition(0); 
     154                    info.setEditable(false); 
     155                    p.add(new JScrollPane(info), GBC.eop()); 
     156 
     157                    for (Component c: p.getComponents()) { 
     158                        if (c instanceof JMultilineLabel) { 
     159                            ((JMultilineLabel)c).setMaxWidth(400); 
     160                        } 
     161                    } 
     162 
     163                    JOptionPane.showMessageDialog(Main.parent, p, tr("You have encountered a bug in JOSM"), JOptionPane.ERROR_MESSAGE); 
     164                } catch (Exception e1) { 
     165                    e1.printStackTrace(); 
    143166                } 
    144                 catch (RuntimeException x) {} 
    145  
    146                 JTextArea info = new JTextArea(text, 20, 60); 
    147                 info.setCaretPosition(0); 
    148                 info.setEditable(false); 
    149                 p.add(new JScrollPane(info), GBC.eop()); 
    150  
    151                 for (Component c: p.getComponents()) { 
    152                     if (c instanceof JMultilineLabel) { 
    153                         ((JMultilineLabel)c).setMaxWidth(400); 
    154                     } 
    155                 } 
    156  
    157                 JOptionPane.showMessageDialog(Main.parent, p, tr("You have encountered a bug in JOSM"), JOptionPane.ERROR_MESSAGE); 
    158             } catch (Exception e1) { 
    159                 e1.printStackTrace(); 
    160167            } 
     168        } finally { 
     169            handlingInProgress = false; 
    161170        } 
    162171    } 
     172    public static boolean exceptionHandlingInProgress() { 
     173        return handlingInProgress; 
     174    } 
    163175} 
Note: See TracChangeset for help on using the changeset viewer.