source: josm/trunk/src/org/openstreetmap/josm/gui/GettingStarted.java @ 1507

Last change on this file since 1507 was 1507, checked in by stoecker, 10 years ago

MOTD got much easier. Server does the work now

  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1// License: GPL. See LICENSE file for details.
2
3package org.openstreetmap.josm.gui;
4
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.io.IOException;
8import java.util.ArrayList;
9import java.util.concurrent.Executors;
10import java.util.concurrent.ExecutorService;
11import java.util.concurrent.Callable;
12import java.util.concurrent.Future;
13import java.util.regex.Matcher;
14import java.util.regex.Pattern;
15
16import java.awt.BorderLayout;
17import java.awt.EventQueue;
18
19import javax.swing.JScrollPane;
20import javax.swing.JEditorPane;
21import javax.swing.JPanel;
22import javax.swing.event.HyperlinkEvent;
23import javax.swing.event.HyperlinkListener;
24import javax.swing.border.EmptyBorder;
25
26import org.openstreetmap.josm.Main;
27import org.openstreetmap.josm.io.CacheCustomContent;
28import org.openstreetmap.josm.tools.OpenBrowser;
29import org.openstreetmap.josm.tools.WikiReader;
30import org.openstreetmap.josm.actions.AboutAction;
31
32public class GettingStarted extends JPanel {
33    private String content = "";
34    static private String styles = "<style type=\"text/css\">\n"+
35            "body { font-family: sans-serif; font-weight: bold; }\n"+
36            "h1 {text-align: center;}\n"+
37            "</style>\n";
38
39    public class LinkGeneral extends JEditorPane implements HyperlinkListener {
40        public LinkGeneral(String text) {
41            setContentType("text/html");
42            setText(text);
43            setEditable(false);
44            setOpaque(false);
45            addHyperlinkListener(this);
46        }
47        public void hyperlinkUpdate(HyperlinkEvent e) {
48            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
49                OpenBrowser.displayUrl(e.getDescription());
50            }
51        }
52    }
53
54    /**
55     * Grabs current MOTD from cache or webpage and parses it.
56     */
57    private class assignContent extends CacheCustomContent {
58        public assignContent() {
59            super("motd.html", CacheCustomContent.INTERVAL_DAILY);
60        }
61
62        final private int myVersion = AboutAction.getVersionNumber();
63
64        /**
65         * This function gets executed whenever the cached files need updating
66         * @see org.openstreetmap.josm.io.CacheCustomContent#updateData()
67         */
68        protected byte[] updateData() {
69            String motd = "";
70            String baseurl = Main.pref.get("help.baseurl", "http://josm.openstreetmap.de");
71            WikiReader wr = new WikiReader(baseurl);
72            String vers = "";
73            String languageCode = Main.getLanguageCodeU();
74            try {
75                motd = wr.read(baseurl + "/wiki/"+languageCode+"StartupPage");
76            } catch (IOException ioe) {
77                try {
78                    motd = wr.read(baseurl + "/wiki/StartupPage");
79                } catch (IOException ioe2) {
80                    motd = "<html>" + styles + "<body><h1>" +
81                        "JOSM - " + tr("Java OpenStreetMap Editor") +
82                        "</h1>\n<h2 align=\"center\">(" +
83                        tr("Message of the day not available") +
84                        ")</h2></html>";
85                }
86            }
87            try {
88                vers = wr.read(baseurl + "/version?format=txt");
89                motd = motd.replace("</html>", getVersionNumber(vers)+"</html>");
90            } catch (IOException ioe) {}
91            // Save this to prefs in case JOSM is updated so MOTD can be refreshed
92            Main.pref.putInteger("cache.motd.html.version", myVersion);
93
94            return motd.getBytes();
95        }
96
97        /**
98         * Additionally check if JOSM has been updated and refresh MOTD
99         */
100        @Override
101        protected boolean isCacheValid() {
102            // We assume a default of myVersion because it only kicks in in two cases:
103            // 1. Not yet written - but so isn't the interval variable, so it gets updated anyway
104            // 2. Cannot be written (e.g. while developing). Obviously we don't want to update
105            //    everytime because of something we can't read.
106            return Main.pref.getInteger("cache.motd.html.version", myVersion) == myVersion;
107        }
108
109        /**
110         * Tries to read the version number from a given Future<String>
111         * @param Future<String> that contains the version page
112         * @return String with HTML Code
113         */
114        private String getVersionNumber(String str) {
115            try {
116                Matcher m = Pattern.compile(".*josm-tested\\.jar: *(\\d+).*", Pattern.DOTALL).matcher(str);
117                m.matches();
118                int curVersion = Integer.parseInt(m.group(1));
119                m = Pattern.compile(".*josm-latest\\.jar: *(\\d+).*", Pattern.DOTALL).matcher(str);
120                m.matches();
121                int latest = Integer.parseInt(m.group(1));
122                return "<div style=\"text-align:right;font-size:small;font-weight:normal;\">"
123                + "<b>"
124                + (curVersion > myVersion ? tr("Update available") + " &#151; ": "")
125                + tr("Version Details:") + "</b> "
126                + tr("Yours: {2}; Current: {0}; <font style=\"font-size:x-small\">"
127                + "(latest untested: {1} &#150; not recommended)</font>",
128                curVersion, latest, myVersion)
129                + "</div>";
130            } catch(Exception e) {
131              // e.printStackTrace();
132            }
133
134            return "";
135        }
136    }
137
138    /**
139     * Initializes getting the MOTD as well as enabling the FileDrop Listener.
140     * Displays a message while the MOTD is downloading.
141     */
142    public GettingStarted() {
143        super(new BorderLayout());
144        final LinkGeneral lg = new LinkGeneral(
145            "<html>" +
146            styles +
147            "<h1>" +
148            "JOSM - " +
149            tr("Java OpenStreetMap Editor") +
150            "</h1><h2 align=\"center\">" +
151            tr("Downloading \"Message of the day\"") +
152            "</h2>");
153        JScrollPane scroller = new JScrollPane(lg);
154        scroller.setViewportBorder(new EmptyBorder(10,100,10,100));
155        add(scroller, BorderLayout.CENTER);
156
157        // Asynchronously get MOTD to speed-up JOSM startup
158        Thread t = new Thread(new Runnable() {
159            public void run() {
160                if (content.length() == 0 && Main.pref.getBoolean("help.displaymotd", true))
161                    content = new assignContent().updateIfRequiredString();
162
163                EventQueue.invokeLater(new Runnable() {
164                    public void run() {
165                       lg.setText(content);
166                       //lg.moveCaretPosition(0);
167                    }
168                });
169            }
170        }, "MOTD-Loader");
171        t.setDaemon(true);
172        t.start();
173
174        new FileDrop(scroller);
175    }
176}
Note: See TracBrowser for help on using the repository browser.