001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.actions; 003 004 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005 import static org.openstreetmap.josm.tools.I18n.tr; 006 007 import java.awt.Dimension; 008 import java.awt.event.ActionEvent; 009 import java.awt.event.KeyEvent; 010 import java.util.HashSet; 011 import java.util.Map; 012 import java.util.Map.Entry; 013 import java.util.Set; 014 015 import javax.swing.JScrollPane; 016 import javax.swing.JTextArea; 017 018 import org.openstreetmap.josm.Main; 019 import org.openstreetmap.josm.data.Preferences.Setting; 020 import org.openstreetmap.josm.data.Version; 021 import org.openstreetmap.josm.data.osm.DataSet; 022 import org.openstreetmap.josm.data.osm.DatasetConsistencyTest; 023 import org.openstreetmap.josm.gui.ExtendedDialog; 024 import org.openstreetmap.josm.plugins.PluginHandler; 025 import org.openstreetmap.josm.tools.Shortcut; 026 import org.openstreetmap.josm.tools.Utils; 027 028 029 /** 030 * @author xeen 031 * 032 * Opens a dialog with useful status information like version numbers for Java, JOSM and plugins 033 * Also includes preferences with stripped username and password 034 */ 035 public final class ShowStatusReportAction extends JosmAction { 036 public ShowStatusReportAction() { 037 super( 038 tr("Show Status Report"), 039 "clock", 040 tr("Show status report with useful information that can be attached to bugs"), 041 Shortcut.registerShortcut("help:showstatusreport", tr("Help: {0}", 042 tr("Show Status Report")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), false); 043 044 putValue("help", ht("/Action/ShowStatusReport")); 045 putValue("toolbar", "help/showstatusreport"); 046 Main.toolbar.register(this); 047 } 048 049 public static String getReportHeader() 050 { 051 StringBuilder text = new StringBuilder(); 052 text.append(Version.getInstance().getReleaseAttributes()); 053 text.append("\n"); 054 text.append("Identification: " + Version.getInstance().getAgentString()); 055 text.append("\n"); 056 text.append("Memory Usage: "); 057 text.append(Runtime.getRuntime().totalMemory()/1024/1024); 058 text.append(" MB / "); 059 text.append(Runtime.getRuntime().maxMemory()/1024/1024); 060 text.append(" MB ("); 061 text.append(Runtime.getRuntime().freeMemory()/1024/1024); 062 text.append(" MB allocated, but free)"); 063 text.append("\n"); 064 text.append("Java version: " + System.getProperty("java.version") + ", " + System.getProperty("java.vendor") + ", " + System.getProperty("java.vm.name")); 065 text.append("\n"); 066 text.append("Operating system: "+ System.getProperty("os.name")); 067 text.append("\n"); 068 DataSet dataset = Main.main.getCurrentDataSet(); 069 if (dataset != null) { 070 String result = DatasetConsistencyTest.runTests(dataset); 071 if (result.length() == 0) { 072 text.append("Dataset consistency test: No problems found\n"); 073 } else { 074 text.append("\nDataset consistency test:\n"+result+"\n"); 075 } 076 } 077 text.append("\n"); 078 text.append(PluginHandler.getBugReportText()); 079 text.append("\n"); 080 081 return text.toString(); 082 } 083 084 public void actionPerformed(ActionEvent e) { 085 StringBuilder text = new StringBuilder(); 086 text.append(getReportHeader()); 087 try { 088 Map<String, Setting> settings = Main.pref.getAllSettings(); 089 settings.remove("osm-server.username"); 090 settings.remove("osm-server.password"); 091 settings.remove("oauth.access-token.key"); 092 settings.remove("oauth.access-token.secret"); 093 Set<String> keys = new HashSet<String>(settings.keySet()); 094 for (String key : keys) { 095 if (key.startsWith("marker.show")) { 096 settings.remove(key); 097 } 098 } 099 for (Entry<String, Setting> entry : settings.entrySet()) { 100 text.append(entry.getKey()).append("=").append(entry.getValue().getValue().toString()).append("\n"); 101 } 102 } catch (Exception x) { 103 x.printStackTrace(); 104 } 105 106 JTextArea ta = new JTextArea(text.toString()); 107 ta.setWrapStyleWord(true); 108 ta.setLineWrap(true); 109 ta.setEditable(false); 110 JScrollPane sp = new JScrollPane(ta); 111 112 ExtendedDialog ed = new ExtendedDialog(Main.parent, 113 tr("Status Report"), 114 new String[] {tr("Copy to clipboard and close"), tr("Close") }); 115 ed.setButtonIcons(new String[] {"copy.png", "cancel.png" }); 116 ed.setContent(sp, false); 117 ed.setMinimumSize(new Dimension(500, 0)); 118 ed.showDialog(); 119 120 if(ed.getValue() != 1) return; 121 Utils.copyToClipboard(text.toString()); 122 } 123 }