package se.cth.hedgehogphoto.geocoding.model; import java.awt.Point; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.logging.Level; import se.cth.hedgehogphoto.log.Log; /** * Creates a valid URL for making a request to * the nominatim-server. * @author Florian Minges */ public class URLCreator { private static URLCreator urlCreator; private StringBuilder builder; private static final String NAMEFINDER_URL = "http://nominatim.openstreetmap.org/"; private static final String XML_FORMAT = "format=xml"; private static final String ADDRESS_DETAILS = "addressdetails=0"; private static final String EMAIL = "email=hedgehogphoto.chalmers@gmail.com"; private static final char AMPERSAND = '&'; private static final String GEOCODING_REQUEST = "search?"; private static final String GEOCODING_QUERY = "q="; private static final String REVERSE_GEOCODING_REQUEST = "reverse?"; private static final String LONGITUDE_QUERY = "lon="; private static final String LATITUDE_QUERY = "lat="; private static final String ZOOM = "zoom=12"; private URLCreator() { } public static synchronized URLCreator getInstance() { if (urlCreator == null) { urlCreator = new URLCreator(); } return urlCreator; } public URL queryGeocodingURL(String query) { initializeStringBuilder(RequestType.GEOCODING_REQUEST); if (query == null) { query = ""; } query = encodeString(query); this.builder.append(GEOCODING_QUERY); this.builder.append(query); try { return new URL(this.builder.toString()); } catch (MalformedURLException e) { Log.getLogger().log(Level.SEVERE, "Failed to create URL \"" + this.builder.toString() + "\".", e); return null; } } public URL queryReverseGeocodingURL(Point.Double coords) { initializeStringBuilder(RequestType.REVERSE_GEOCODING_REQUEST); if (coords == null) { return null; } this.builder.append(URLCreator.LONGITUDE_QUERY); this.builder.append(coords.x); this.builder.append(URLCreator.AMPERSAND); this.builder.append(URLCreator.LATITUDE_QUERY); this.builder.append(coords.y); try { return new URL(this.builder.toString()); } catch (MalformedURLException e) { Log.getLogger().log(Level.SEVERE, "Failed to create URL \"" + this.builder.toString() + "\".", e); return null; } } private String encodeString(String string) { try { return URLEncoder.encode(string, "UTF-8"); } catch(UnsupportedEncodingException e) { Log.getLogger().log(Level.WARNING, "Could not encode \"" + string + "\" with UTF-8."); return string; } } /** * Initializes the string builder so that it contains * all the necessary info that comes apart from the query * itself. */ private void initializeStringBuilder(RequestType requestType) { this.builder = new StringBuilder(URLCreator.NAMEFINDER_URL); switch (requestType) { case GEOCODING_REQUEST: this.builder.append(URLCreator.GEOCODING_REQUEST); prepareBuilder(); break; case REVERSE_GEOCODING_REQUEST: this.builder.append(URLCreator.REVERSE_GEOCODING_REQUEST); prepareBuilderForReverseGeocoding(); break; default: break; } //DO NOT ENCODE } private void prepareBuilderForReverseGeocoding() { this.prepareBuilder(); this.builder.append(URLCreator.ZOOM); this.builder.append(URLCreator.AMPERSAND); } private void prepareBuilder() { this.builder.append(URLCreator.XML_FORMAT); this.builder.append(URLCreator.AMPERSAND); this.builder.append(URLCreator.ADDRESS_DETAILS); this.builder.append(URLCreator.AMPERSAND); this.builder.append(URLCreator.EMAIL); this.builder.append(URLCreator.AMPERSAND); } }