package de.flower.rmt.service.geocoding; import com.google.gson.Gson; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; import java.net.URLEncoder; import java.util.List; import static de.flower.common.util.Check.*; /** * @author flowerrrr */ @Service public class GoogleGeocodingService implements IGeocodingService { private final static Logger log = LoggerFactory.getLogger(GoogleGeocodingService.class); private final static String format = "json"; @Value("${geocoding.default.region}") private String defaultRegion; @Value("${geocoding.default.language}") private String defaultLanguage; @Override public List<GeocodingResult> geocode(String address) { return geocode(address, defaultRegion, defaultLanguage); } public List<GeocodingResult> geocode(String address, String region, String language) { notBlank(address); notBlank(region); notBlank(language); log.info("Geocoding for [" + address + "]"); HttpGet httpGet = null; try { String params = "address=" + URLEncoder.encode(address, HTTP.UTF_8); // NOTE (flowerrrr - 05.08.11): use region of currently logged in user. params += "®ion=" + region; params += "&language=" + language; params += "&sensor=false"; HttpClient httpClient = new DefaultHttpClient(); httpGet = new HttpGet("http://maps.googleapis.com/maps/api/geocode/" + format + "?" + params); HttpResponse httpResponse = httpClient.execute(httpGet); String response = EntityUtils.toString(httpResponse.getEntity()); Gson gson = new Gson(); GeocodingResponse gr = gson.fromJson(response, GeocodingResponse.class); gr.setJson(response); if ("INVALID_REQUEST".equals(gr.getStatus())) { throw new RuntimeException("Invalid request [" + httpGet.getURI() + "]"); } else if ("ZERO_RESULTS".equals(gr.getStatus())) { gr.getResultList(); } else if (!"OK".equals(gr.getStatus())) { throw new RuntimeException("Invalid geocode response: " + gr.toString()); } log.debug("Geocode result for [" + address + "]: " + gr.getJson()); return gr.getResultList(); } catch (IOException e) { log.error("Error issuing geocode request [" + (httpGet != null ? httpGet.getURI() : "") + "]", e); throw new RuntimeException(e); } } }