Changeset 1450 in josm for trunk/src/org/openstreetmap
- Timestamp:
- 2009-02-28T20:25:46+01:00 (16 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/GettingStarted.java
r1420 r1450 25 25 26 26 import org.openstreetmap.josm.Main; 27 import org.openstreetmap.josm.io.CacheCustomContent; 27 28 import org.openstreetmap.josm.tools.OpenBrowser; 28 29 import org.openstreetmap.josm.tools.WikiReader; … … 30 31 31 32 public class GettingStarted extends JPanel { 32 33 static private String content = ""; 33 private String content = ""; 34 34 static private String styles = "<style type=\"text/css\">\n"+ 35 35 "body { font-family: sans-serif; font-weight: bold; }\n"+ … … 52 52 } 53 53 54 public class readMOTD implements Callable<String> { 54 /** 55 * This class encapsulates the "reading URL" task and can be executed in background and in 56 * parallel. Since the MOTD is many separate pages this speeds things up quite a lot. If no 57 * localized version is available, it automatically falls back to the international one. 58 */ 59 private class readMOTD implements Callable<String> { 55 60 private boolean isLocalized; 56 61 private boolean isHelp; … … 59 64 private String urlBase; 60 65 61 readMOTD(boolean isLocalized, String urlBase, String urlLoc, String urlIntl, boolean isHelp) { 66 /** 67 * Read a MOTD page 68 * @param isLocalized If true, tries to get localized version as defined in urlLoc 69 * @param urlBase Base URL (i.e. http://www.openstreetmap.de/wiki/) 70 * @param urlLoc Part to append to base URL to receive localized version 71 * @param urlIntl Part to append to base URL to receive international version 72 * @param makeList If true, the URL's contents will be wrapped in a list (<ul><li>) 73 */ 74 readMOTD(boolean isLocalized, String urlBase, String urlLoc, String urlIntl, boolean makeList) { 62 75 this.isLocalized = isLocalized; 63 76 this.urlBase = urlBase; 64 77 this.urlLoc = urlLoc; 65 78 this.urlIntl = urlIntl; 66 this.isHelp = isHelp; 67 } 68 79 this.isHelp = makeList; 80 } 81 82 /* 83 * Does the actual work 84 * @see java.util.concurrent.Callable#call() 85 */ 69 86 public String call() { 70 87 WikiReader wr = new WikiReader(urlBase); 71 88 String content = ""; 72 89 try { 73 // If we hit a non-localized link here, we already know there's no translated version available 90 // If we hit a non-localized link here, we already know there's no translated 91 // version available 74 92 String message = isLocalized ? wr.read(urlLoc) : ""; 75 93 // Look for non-localized version … … 81 99 content += message; 82 100 else 83 content += "<ul><li>"+ message.substring(8).replaceAll("\n *\\* +","</li><li>")+"</li></ul>"; 101 content += "<ul><li>"+ message.substring(8) 102 .replaceAll("\n *\\* +","</li><li>")+"</li></ul>"; 84 103 } catch (IOException ioe) { 85 104 try { … … 87 106 content += wr.read(urlIntl); 88 107 else 89 content += "<ul><li>"+wr.read(urlIntl).substring(8).replaceAll("\n *\\* +","</li><li>")+"</li></ul>"; 108 content += "<ul><li>"+wr.read(urlIntl).substring(8) 109 .replaceAll("\n *\\* +","</li><li>")+"</li></ul>"; 90 110 } catch (IOException ioe2) { 91 111 } … … 96 116 } 97 117 98 private void assignContent() { 99 if (content.length() > 0 && Main.pref.getBoolean("help.displaymotd", true)) return; 100 101 String baseurl = Main.pref.get("help.baseurl", "http://josm.openstreetmap.de"); 102 WikiReader wr = new WikiReader(baseurl); 103 String motdcontent = ""; 104 try { 105 motdcontent = wr.read(baseurl + "/wiki/MessageOfTheDay?format=txt"); 106 } catch (IOException ioe) { 107 motdcontent = "<html>" + styles + "<body><h1>" + 108 "JOSM - " + tr("Java OpenStreetMap Editor") + 109 "</h1>\n<h2 align=\"center\">(" + 110 tr ("Message of the day not available") + 111 ")</h2>"; 112 } 113 114 int myVersion = AboutAction.getVersionNumber(); 115 String languageCode = Main.getLanguageCodeU(); 116 117 // Finds wiki links like (underscores inserted for readability): [wiki:LANGCODE:messageoftheday_CONDITON_REVISION LANGCODE] 118 // Langcode usually consists of two letters describing the language and may be omitted 119 // Condition may be one of the following: > < <= => 120 // Revision is the JOSM version 121 Pattern versionPattern = Pattern.compile("\\[wiki:(?:[A-Z]+:)?MessageOfTheDay(\\>\\=|\\<\\=|\\<|\\>)([0-9]+)\\s*([A-Z]*)\\]", Pattern.CASE_INSENSITIVE); 122 // 1=condition, 2=targetVersion, 3=lang 123 Matcher matcher = versionPattern.matcher(motdcontent); 124 matcher.reset(); 125 126 ArrayList<String[]> links = new ArrayList<String[]>(); 127 String linksList=""; 128 while (matcher.find()) { 129 // Discards all but the selected locale and non-localized links 130 if(!(matcher.group(3)+":").equals(languageCode) && !matcher.group(3).equals("")) 131 continue; 132 133 links.add(new String[] {matcher.group(1), matcher.group(2), matcher.group(3)}); 134 linksList += matcher.group(1)+matcher.group(2)+matcher.group(3)+": "; 135 } 136 137 // We cannot use Main.worker here because it's single-threaded and 138 // setting it to multi-threading will cause problems elsewhere 139 ExecutorService slave = Executors.newCachedThreadPool(); 140 141 ArrayList<Future<String>> linkContent = new ArrayList<Future<String>>(); 142 for(int i=0; i < links.size(); i++) { 143 String[] obj = links.get(i); 144 int targetVersion = Integer.parseInt(obj[1]); 145 String condition = obj[0]; 146 Boolean isLocalized = !obj[2].equals(""); 147 148 // Prefer localized over non-localized links, if they're otherwise the same 149 if(!isLocalized && linksList.indexOf(condition + obj[1] + languageCode + " ") >= 0) 150 continue; 151 152 boolean included = false; 153 154 if(myVersion == 0) 155 included = true; 156 else if(condition.equals(">=")) 157 included=myVersion >= targetVersion; 158 else if(condition.equals(">")) 159 included = myVersion > targetVersion; 160 else if(condition.equals("<")) 161 included=myVersion < targetVersion; 162 else 163 included = myVersion <= targetVersion; 164 165 if(!included) continue; 166 167 boolean isHelp = targetVersion == 1; 168 String urlStart = baseurl + "/wiki/"; 169 String urlEnd = "MessageOfTheDay" + condition + targetVersion + (isHelp ? "" : "?format=txt"); 170 String urlLoc = urlStart + languageCode + urlEnd; 171 String urlIntl = urlStart + urlEnd; 172 173 // This adds all links to the worker which will download them concurrently 174 linkContent.add(slave.submit(new readMOTD(isLocalized, baseurl, urlLoc, urlIntl, isHelp))); 175 } 176 177 for(int i=0; i < linkContent.size(); i++) { 118 /** 119 * Grabs current MOTD from cache or webpage and parses it. 120 */ 121 private class assignContent extends CacheCustomContent { 122 public assignContent() { 123 super("motd.html", CacheCustomContent.INTERVAL_DAILY); 124 } 125 126 final private int myVersion = AboutAction.getVersionNumber(); 127 128 /** 129 * This function gets executed whenever the cached files need updating 130 * @see org.openstreetmap.josm.io.CacheCustomContent#updateData() 131 */ 132 protected byte[] updateData() { 133 String motd = ""; 134 String baseurl = Main.pref.get("help.baseurl", "http://josm.openstreetmap.de"); 135 WikiReader wr = new WikiReader(baseurl); 136 String motdcontent = ""; 178 137 try { 179 content += linkContent.get(i).get(); 180 } catch (Exception e) {} 181 } 182 183 linkContent.clear(); 184 try { 185 slave.shutdown(); 186 } catch(SecurityException x) {} 187 188 189 content = "<html>\n"+ 190 styles + 191 "<h1>JOSM - " + tr("Java OpenStreetMap Editor") + "</h1>\n"+ 192 content+"\n"+ 193 "</html>"; 138 motdcontent = wr.read(baseurl + "/wiki/MessageOfTheDay?format=txt"); 139 } catch (IOException ioe) { 140 motdcontent = "<html>" + styles + "<body><h1>" + 141 "JOSM - " + tr("Java OpenStreetMap Editor") + 142 "</h1>\n<h2 align=\"center\">(" + 143 tr ("Message of the day not available") + 144 ")</h2>"; 145 } 146 147 String languageCode = Main.getLanguageCodeU(); 148 149 // Finds wiki links like (underscores inserted for readability): 150 // [wiki:LANGCODE:messageoftheday_CONDITON_REVISION LANGCODE] 151 // Langcode usually consists of two letters describing the language and may be omitted 152 // Condition may be one of the following: > < <= => 153 // Revision is the JOSM version 154 Pattern versionPattern = Pattern.compile( 155 "\\[wiki:(?:[A-Z]+:)?MessageOfTheDay(\\>\\=|\\<\\=|\\<|\\>)([0-9]+)\\s*([A-Z]*)\\]", 156 Pattern.CASE_INSENSITIVE); 157 // 1=condition, 2=targetVersion, 3=lang 158 Matcher matcher = versionPattern.matcher(motdcontent); 159 matcher.reset(); 160 161 ArrayList<String[]> links = new ArrayList<String[]>(); 162 String linksList=""; 163 while (matcher.find()) { 164 // Discards all but the selected locale and non-localized links 165 if(!(matcher.group(3)+":").equals(languageCode) && !matcher.group(3).equals("")) 166 continue; 167 168 links.add(new String[] {matcher.group(1), matcher.group(2), matcher.group(3)}); 169 linksList += matcher.group(1)+matcher.group(2)+matcher.group(3)+": "; 170 } 171 172 // We cannot use Main.worker here because it's single-threaded and 173 // setting it to multi-threading will cause problems elsewhere 174 ExecutorService slave = Executors.newCachedThreadPool(); 175 176 ArrayList<Future<String>> linkContents = new ArrayList<Future<String>>(); 177 for(int i=0; i < links.size(); i++) { 178 String[] obj = links.get(i); 179 int targetVersion = Integer.parseInt(obj[1]); 180 String condition = obj[0]; 181 Boolean isLocalized = !obj[2].equals(""); 182 183 // Prefer localized over non-localized links, if they're otherwise the same 184 if(!isLocalized && linksList.indexOf(condition + obj[1] + languageCode + " ") >= 0) 185 continue; 186 187 boolean included = false; 188 189 if(myVersion == 0) 190 included = true; 191 else if(condition.equals(">=")) 192 included=myVersion >= targetVersion; 193 else if(condition.equals(">")) 194 included = myVersion > targetVersion; 195 else if(condition.equals("<")) 196 included=myVersion < targetVersion; 197 else 198 included = myVersion <= targetVersion; 199 200 if(!included) continue; 201 202 boolean isHelp = targetVersion == 1; 203 String urlStart = baseurl + "/wiki/"; 204 String urlEnd = "MessageOfTheDay" + condition + targetVersion 205 + (isHelp ? "" : "?format=txt"); 206 String urlLoc = urlStart + languageCode + urlEnd; 207 String urlIntl = urlStart + urlEnd; 208 209 // This adds all links to the worker which will download them concurrently 210 linkContents.add(slave.submit(new readMOTD(isLocalized, baseurl, urlLoc, urlIntl, isHelp))); 211 } 212 // Gets newest version numbers 213 linkContents.add(slave.submit(new readMOTD(false, baseurl, "", 214 baseurl + "/version?format=txt", true))); 215 216 for(int i=0; i < linkContents.size()-1; i++) { 217 try { 218 motd += linkContents.get(i).get(); 219 } catch (Exception e) {} 220 } 221 222 motd = "<html>" 223 + styles 224 + "<h1>JOSM - " 225 + tr("Java OpenStreetMap Editor") 226 + "</h1>" 227 + motd.replace("</html>", "") 228 + getVersionNumber(linkContents.get(linkContents.size()-1)) 229 + "</html>"; 230 231 linkContents.clear(); 232 try { 233 slave.shutdown(); 234 } catch(SecurityException x) {} 235 236 // Save this to prefs in case JOSM is updated so MOTD can be refreshed 237 Main.pref.putInteger("cache.motd.html.version", myVersion); 238 239 return motd.getBytes(); 240 } 241 242 /** 243 * Additionally check if JOSM has been updated and refresh MOTD 244 */ 245 @Override 246 protected boolean isCacheValid() { 247 // We assume a default of myVersion because it only kicks in in two cases: 248 // 1. Not yet written - but so isn't the interval variable, so it gets updated anyway 249 // 2. Cannot be written (e.g. while developing). Obviously we don't want to update 250 // everytime because of something we can't read. 251 return Main.pref.getInteger("cache.motd.html.version", myVersion) == myVersion; 252 } 253 254 /** 255 * Tries to read the version number from a given Future<String> 256 * @param Future<String> that contains the version page 257 * @return String with HTML Code 258 */ 259 private String getVersionNumber(Future<String> linkContent) { 260 try { 261 String str = linkContent.get(); 262 Matcher m = Pattern.compile(".*josm-tested\\.jar: *(\\d+).*", Pattern.DOTALL).matcher(str); 263 m.matches(); 264 int curVersion = Integer.parseInt(m.group(1)); 265 m = Pattern.compile(".*josm-latest\\.jar: *(\\d+).*", Pattern.DOTALL).matcher(str); 266 m.matches(); 267 int latest = Integer.parseInt(m.group(1)); 268 return "<div style=\"text-align:right;font-size:small;font-weight:normal;\">" 269 + "<b>" 270 + (curVersion > myVersion ? tr("Update available") + " — ": "") 271 + tr("Version Details:") + "</b> " 272 + tr("Yours: {2}; Current: {0}; <font style=\"font-size:x-small\">" 273 + "(latest untested: {1} – not recommended)</font>", 274 curVersion, latest, myVersion) 275 + "</div>"; 276 } catch(Exception e) {e.printStackTrace();} 277 278 return ""; 279 } 194 280 } 195 281 282 /** 283 * Initializes getting the MOTD as well as enabling the FileDrop Listener. 284 * Displays a message while the MOTD is downloading. 285 */ 196 286 public GettingStarted() { 197 287 super(new BorderLayout()); … … 212 302 Thread t = new Thread(new Runnable() { 213 303 public void run() { 214 assignContent(); 304 if (content.length() == 0 && Main.pref.getBoolean("help.displaymotd", true)) 305 content = new assignContent().updateIfRequiredString(); 306 215 307 EventQueue.invokeLater(new Runnable() { 216 308 public void run() {
Note:
See TracChangeset
for help on using the changeset viewer.