Ignore:
Timestamp:
2012-07-11T21:11:08+02:00 (12 years ago)
Author:
simon04
Message:

JOSM/wikipedia: Also check link status on WIWOSM server.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/wikipedia/src/org/wikipedia/WikipediaToggleDialog.java

    r28469 r28470  
    1616import java.util.Collection;
    1717import java.util.Collections;
     18import java.util.HashMap;
    1819import java.util.HashSet;
    19 import java.util.LinkedList;
    2020import java.util.List;
    2121import java.util.Map;
     
    5353import org.openstreetmap.josm.tools.LanguageInfo;
    5454import org.openstreetmap.josm.tools.OpenBrowser;
     55import org.openstreetmap.josm.tools.Utils;
    5556import org.w3c.dom.Document;
    5657import org.w3c.dom.NodeList;
     
    9495                public JLabel getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    9596                    JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    96                     if (articles.contains(((WikipediaEntry) value).name)) {
     97                    final WikipediaEntry entry = (WikipediaEntry) value;
     98                    if (entry.getWiwosmStatus() != null && entry.getWiwosmStatus()) {
     99                        label.setIcon(ImageProvider.getIfAvailable("misc", "grey_check"));
     100                        label.setToolTipText(tr("Available via WIWOSM server"));
     101                    } else if (articles.contains(entry.wikipediaArticle)) {
    97102                        label.setIcon(ImageProvider.getIfAvailable("misc", "green_check"));
     103                        label.setToolTipText(tr("Available in local dataset"));
     104                    } else {
     105                        label.setToolTipText(tr("Not linked yet"));
    98106                    }
    99107                    return label;
     
    107115            if (index >= 0) {
    108116                final String description = ((WikipediaEntry) model.getElementAt(index)).description;
    109                 return description == null ? null : ("<html>" + description + "</html>");
    110             } else {
    111                 return null;
    112             }
     117                if (description != null) {
     118                    return "<html>" + description + "</html>";
     119                }
     120            }
     121            return super.getToolTipText(e);
    113122        }
    114123    };
     
    128137            }
    129138            // decode URL for nicer value
    130             try {
    131                 url = URLDecoder.decode(url, "UTF-8");
    132             } catch (UnsupportedEncodingException ex) {
    133                 throw new IllegalStateException(ex);
    134             }
     139            url = decodeURL(url);
    135140            // extract Wikipedia language and
    136141            final Matcher m = Pattern.compile("https?://(\\w*)\\.wikipedia\\.org/wiki/(.*)").matcher(url);
     
    147152        final String wikipediaLang, wikipediaArticle;
    148153        final LatLon coordinate;
     154        private Boolean wiwosmStatus;
    149155
    150156        public WikipediaEntry(String name, String description, LatLon coordinate) {
     
    170176
    171177        protected final String getHrefFromDescription() {
     178            if (description == null) {
     179                return null;
     180            }
    172181            final Matcher m = Pattern.compile(".*href=\"(.+?)\".*").matcher(description);
    173182            if (m.matches()) {
     
    183192        }
    184193
     194        private void updateWiwosmStatus() {
     195            try {
     196                final String url = "http://toolserver.org/~master/osmjson/getGeoJSON.php?action=check"
     197                        + "&lang=" + wikipediaLang
     198                        + "&article=" + encodeURL(wikipediaArticle);
     199                System.out.println("Wikipedia: GET " + url);
     200                final Scanner scanner = new Scanner(new URL(url).openStream());
     201                wiwosmStatus = scanner.hasNextInt() && scanner.nextInt() == 1;
     202            } catch (IOException ex) {
     203                throw new RuntimeException(ex);
     204            }
     205        }
     206
     207        public void setWiwosmStatus(Boolean wiwosmStatus) {
     208            this.wiwosmStatus = wiwosmStatus;
     209        }
     210
     211        public Boolean getWiwosmStatus() {
     212            return wiwosmStatus;
     213        }
     214
    185215        @Override
    186216        public String toString() {
     
    191221        public int compareTo(WikipediaEntry o) {
    192222            return name.compareTo(o.name);
     223        }
     224    }
     225
     226    private void setWikipediaEntries(Collection<WikipediaEntry> entries) {
     227        Collection<String> articleNames = new ArrayList<String>();
     228        for (WikipediaEntry i : entries) {
     229            articleNames.add(i.wikipediaArticle);
     230        }
     231        final String url = "https://toolserver.org/~simon04/getGeoJSONStatus.php"
     232                + "?lang=" + wikipediaLang.get()
     233                + "&articles=" + encodeURL(Utils.join(",", articleNames));
     234        System.out.println("Wikipedia: GET " + url);
     235        Map<String, Boolean> status = new HashMap<String, Boolean>();
     236
     237        try {
     238            final Scanner scanner = new Scanner(new URL(url).openStream()).useDelimiter("\n");
     239            while (scanner.hasNext()) {
     240                //[article]\t[0|1]
     241                final String line = scanner.next();
     242                final String[] x = line.split("\t");
     243                if (x.length == 2) {
     244                    status.put(x[0], "1".equals(x[1]));
     245                } else {
     246                    System.err.println("Unknown element "+line);
     247                }
     248            }
     249        } catch (Exception ex) {
     250            throw new RuntimeException(ex);
     251        }
     252
     253        model.clear();
     254        for (WikipediaEntry i : entries) {
     255            i.setWiwosmStatus(status.get(i.wikipediaArticle));
     256            model.addElement(i);
    193257        }
    194258    }
     
    220284                NodeList nodes = (NodeList) xpathPlacemark.evaluate(doc, XPathConstants.NODESET);
    221285                // construct WikipediaEntry for each XML element
    222                 List<WikipediaEntry> entries = new LinkedList<WikipediaEntry>();
     286                List<WikipediaEntry> entries = new ArrayList<WikipediaEntry>(nodes.getLength());
    223287                for (int i = 0; i < nodes.getLength(); i++) {
    224288                    final String[] coord = xpathCoord.evaluate(nodes.item(i)).split(",");
     
    233297                Collections.sort(entries);
    234298                // add entries to list model
    235                 model.clear();
    236                 for (WikipediaEntry i : entries) {
    237                     model.addElement(i);
    238                 }
     299                setWikipediaEntries(entries);
    239300            } catch (Exception ex) {
    240301                throw new RuntimeException(ex);
     
    259320                        + "wikilang=" + wikipediaLang.get()
    260321                        + "&wikifam=.wikipedia.org"
    261                         + "&basecat=" + URLEncoder.encode(category, "UTF-8")
     322                        + "&basecat=" + encodeURL(category)
    262323                        + "&basedeep=3&templates=&mode=al&format=csv";
    263324                System.out.println("Wikipedia: GET " + url);
    264325                final Scanner scanner = new Scanner(new URL(url).openStream()).useDelimiter("\n");
    265                 if (scanner.hasNext()) {
    266                     model.clear();
    267                 }
     326                final List<WikipediaEntry> entries = new ArrayList<WikipediaEntry>();
    268327                while (scanner.hasNext()) {
    269328                    final String article = scanner.next().split("\t")[1].replace("_", " ");
    270                     model.addElement(new WikipediaEntry(article, wikipediaLang.get(), article));
    271                 }
     329                    entries.add(new WikipediaEntry(article, wikipediaLang.get(), article));
     330                }
     331                Collections.sort(entries);
     332                setWikipediaEntries(entries);
    272333            } catch (IOException ex) {
    273334                throw new RuntimeException(ex);
     
    291352                    url = entry.getHrefFromDescription();
    292353                } else {
    293                     url = "http://" + entry.wikipediaLang + ".wikipedia.org/wiki/" + entry.wikipediaArticle.replace(" ", "_");
     354                    url = "http://" + entry.wikipediaLang + ".wikipedia.org/wiki/"
     355                            + encodeURL(entry.wikipediaArticle.replace(" ", "_"));
    294356                }
    295357                System.out.println("Wikipedia: opening " + url);
     
    362424        } else if (wp != null) {
    363425            //wikipedia=[lang]:[article]
    364             try {
    365                 String[] item = URLDecoder.decode(wp, "UTF-8").split(":", 2);
    366                 if (item.length == 2 && wikipediaLang.get().equals(item[0])) {
    367                     r.add(item[1].replace("_", " "));
    368                 }
    369             } catch (UnsupportedEncodingException ex) {
    370                 throw new IllegalStateException(ex);
     426            String[] item = decodeURL(wp).split(":", 2);
     427            if (item.length == 2 && wikipediaLang.get().equals(item[0])) {
     428                r.add(item[1].replace("_", " "));
    371429            }
    372430        }
     
    382440            //wikipedia:[lang]=[lang]:[article]
    383441            //wikipedia:[lang]=[article]
    384             try {
    385                 String[] item = URLDecoder.decode(wpLang, "UTF-8").split(":", 2);
    386                 r.add(item[item.length == 2 ? 1 : 0].replace("_", " "));
    387             } catch (UnsupportedEncodingException ex) {
    388                 throw new IllegalStateException(ex);
    389             }
     442            String[] item = decodeURL(wpLang).split(":", 2);
     443            r.add(item[item.length == 2 ? 1 : 0].replace("_", " "));
    390444        }
    391445        return r;
     
    419473        list.repaint();
    420474    }
     475
     476    public static String decodeURL(String url) {
     477        try {
     478            return URLDecoder.decode(url, "UTF-8");
     479        } catch (UnsupportedEncodingException ex) {
     480            throw new IllegalStateException(ex);
     481        }
     482    }
     483
     484    public static String encodeURL(String url) {
     485        try {
     486            return URLEncoder.encode(url, "UTF-8");
     487        } catch (UnsupportedEncodingException ex) {
     488            throw new IllegalStateException(ex);
     489        }
     490    }
    421491}
Note: See TracChangeset for help on using the changeset viewer.