X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2FSearchWikipediaNames.java;h=5712983394e24882d7b1098a1eeead49d92f41e8;hp=0458943036ed8007ffecb0838bf66c504aff4e6d;hb=7f5ed2be62905bd37717376dc22d09e5ea7edb4d;hpb=b361869e590bbca32664c16ac24d6296926594a5 diff --git a/tim/prune/function/SearchWikipediaNames.java b/tim/prune/function/SearchWikipediaNames.java index 0458943..5712983 100644 --- a/tim/prune/function/SearchWikipediaNames.java +++ b/tim/prune/function/SearchWikipediaNames.java @@ -67,7 +67,7 @@ public class SearchWikipediaNames extends GenericDownloaderFunction JOptionPane.QUESTION_MESSAGE, null, null, ""); if (search != null) { - _searchTerm = search.toString(); + _searchTerm = search.toString().toLowerCase(); if (!_searchTerm.equals("")) { super.begin(); } @@ -81,29 +81,43 @@ public class SearchWikipediaNames extends GenericDownloaderFunction { _statusLabel.setText(I18nManager.getText("confirm.running")); - String descMessage = ""; - InputStream inStream = null; + // Replace awkward characters with character equivalents + final String searchTerm = encodeSearchTerm(_searchTerm); - // language (only de and en available) + // Firstly try the local language String lang = I18nManager.getText("wikipedia.lang"); - if (lang.equals("de") || lang.equals("als")) { - lang = "de"; + submitSearch(searchTerm, lang); + // If we didn't get anything, try a secondary language + if (_trackListModel.isEmpty() && _errorMessage == null && lang.equals("als")) { + submitSearch(searchTerm, "de"); } - else { - lang = "en"; + // If still nothing then try english + if (_trackListModel.isEmpty() && _errorMessage == null && !lang.equals("en")) { + submitSearch(searchTerm, "en"); } - // Replace awkward characters with character equivalents - String searchTerm; - try { - searchTerm = URLEncoder.encode(_searchTerm, "UTF-8"); - } catch (UnsupportedEncodingException e1) { - searchTerm = _searchTerm; + + // Set status label according to error or "none found", leave blank if ok + if (_errorMessage == null && _trackListModel.isEmpty()) { + _errorMessage = I18nManager.getText("dialog.gpsies.nonefound"); } - // Example http://ws.geonames.org/wikipediaSearch?q=london&maxRows=10 - String urlString = "http://api.geonames.org/wikipediaSearch?title=" + searchTerm - + "&maxRows=" + MAX_RESULTS + "&lang=" + lang + "&username=" + GEONAMES_USERNAME; + _statusLabel.setText(_errorMessage == null ? "" : _errorMessage); + } + + /** + * Submit the given search to the server + * @param inSearchTerm search term + * @param inLang language code such as en, de + */ + private void submitSearch(String inSearchTerm, String inLang) + { + // System.out.println("Searching for '" + inSearchTerm + "' with lang: " + inLang); + + String urlString = "http://api.geonames.org/wikipediaSearch?title=" + inSearchTerm + + "&maxRows=" + MAX_RESULTS + "&lang=" + inLang + "&username=" + GEONAMES_USERNAME; // Parse the returned XML with a special handler GetWikipediaXmlHandler xmlHandler = new GetWikipediaXmlHandler(); + InputStream inStream = null; + try { URL url = new URL(urlString); @@ -112,7 +126,7 @@ public class SearchWikipediaNames extends GenericDownloaderFunction saxParser.parse(inStream, xmlHandler); } catch (Exception e) { - descMessage = e.getClass().getName() + " - " + e.getMessage(); + _errorMessage = e.getClass().getName() + " - " + e.getMessage(); } // Close stream and ignore errors try { @@ -122,15 +136,59 @@ public class SearchWikipediaNames extends GenericDownloaderFunction ArrayList trackList = xmlHandler.getTrackList(); // TODO: Do a better job of sorting replies by relevance - use three different lists _trackListModel.addTracks(trackList); + } - // Set status label according to error or "none found", leave blank if ok - if (descMessage.equals("") && (trackList == null || trackList.size() == 0)) { - descMessage = I18nManager.getText("dialog.gpsies.nonefound"); + /** + * Replace tricky characters in the search term and encode the others + * @param inSearchTerm entered search term + * @return modified search term to give to geonames + */ + private static final String encodeSearchTerm(String inSearchTerm) + { + if (inSearchTerm != null && inSearchTerm.length() > 0) + { + // Replace umlauts oe, ue, ae, OE, UE, AE, szlig + StringBuilder sb = new StringBuilder(); + final int numChars = inSearchTerm.length(); + for (int i=0; i