package dk.daoas.daoadresseservice; import java.util.List; import com.google.code.geocoder.Geocoder; import com.google.code.geocoder.GeocoderRequestBuilder; import com.google.code.geocoder.model.GeocodeResponse; import com.google.code.geocoder.model.GeocoderAddressComponent; import com.google.code.geocoder.model.GeocoderRequest; import com.google.code.geocoder.model.GeocoderResult; import com.google.code.geocoder.model.GeocoderStatus; import dk.daoas.daoadresseservice.admin.ServiceConfig; import dk.daoas.daoadresseservice.beans.SearchResult; import dk.thoerup.circuitbreaker.CircuitBreaker; import dk.thoerup.circuitbreaker.CircuitBreakerManager; import dk.thoerup.circuitbreaker.CircuitInvocation; public class GoogleStreetnameHelper implements StreetnameHelper { ServiceConfig conf; public GoogleStreetnameHelper(ServiceConfig conf) { this.conf = conf; } @Override public String proposeStreetName(SearchResult result, int postnr, String vejnavn) { if (conf.useGoogle == false) return null; result.google = true; try { GoogleInvocation wrapper = new GoogleInvocation( conf, postnr, vejnavn ); CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("google"); result.googleVej = (String) breaker.invoke(wrapper); return result.googleVej; } catch (Exception e) { System.out.println( "GoogleError: " + e.getClass().getName() +" / "+ e.getMessage() ); } return null; } static class GoogleInvocation implements CircuitInvocation { ServiceConfig conf; int postnr; String vejnavn; public GoogleInvocation(ServiceConfig conf, int postnr, String vejnavn) { this.conf = conf; this.postnr= postnr; this.vejnavn = vejnavn; } @Override public String proceed() throws Exception { final Geocoder geocoder; if ( conf.googleApiKey != null ) { geocoder = new Geocoder(conf.googleApiUser, conf.googleApiKey); //Throws InvalidKeyException } else { geocoder = new Geocoder(); } //TimingHelper timer = new TimingHelper(); String search = vejnavn + ", " + postnr + ", Denmark"; GeocoderRequest geocoderRequest = new GeocoderRequestBuilder().setAddress(search).setLanguage("en").getGeocoderRequest(); GeocodeResponse geocoderResponse = geocoder.geocode(geocoderRequest); //timer.printElapsed("Google elapsed"); //System.out.println( "Status: >" + geocoderResponse.getStatus() + "<"); if ( geocoderResponse.getStatus() != GeocoderStatus.OK) { if (geocoderResponse.getStatus() == GeocoderStatus.ZERO_RESULTS) { return null; } else { System.out.println("Google responded with " + geocoderResponse.getStatus() ); //Hvis det er alvorlige fejl skal vi afbryde med exception og trigger circuitbreakeren throw new Exception("Google responded with " + geocoderResponse.getStatus() ); } } List resList = geocoderResponse.getResults(); //System.out.println( "Count: " + resList.size() ); if (resList.size() != 1) { return null; } GeocoderResult res = resList.get(0); List compList = res.getAddressComponents(); for (GeocoderAddressComponent c : compList) { //System.out.println(c); if (c.getTypes().contains("route")) { return c.getLongName(); } } return null; } } }