/[projects]/dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/GoogleStreetnameHelper.java
ViewVC logotype

Contents of /dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/GoogleStreetnameHelper.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2567 - (show annotations) (download)
Sun Jun 7 18:09:16 2015 UTC (8 years, 11 months ago) by torben
File size: 3814 byte(s)
use ratelimiter AFTER service health has been checked with circuitbreaker
1 package dk.daoas.daoadresseservice;
2
3 import java.util.List;
4
5 import com.google.code.geocoder.Geocoder;
6 import com.google.code.geocoder.GeocoderRequestBuilder;
7 import com.google.code.geocoder.model.GeocodeResponse;
8 import com.google.code.geocoder.model.GeocoderAddressComponent;
9 import com.google.code.geocoder.model.GeocoderRequest;
10 import com.google.code.geocoder.model.GeocoderResult;
11 import com.google.code.geocoder.model.GeocoderStatus;
12
13 import com.google.common.util.concurrent.RateLimiter;
14
15 import dk.daoas.daoadresseservice.admin.ServiceConfig;
16 import dk.daoas.daoadresseservice.beans.SearchRequest;
17 import dk.daoas.daoadresseservice.beans.SearchResult;
18 import dk.thoerup.circuitbreaker.CircuitBreaker;
19 import dk.thoerup.circuitbreaker.CircuitBreakerManager;
20 import dk.thoerup.circuitbreaker.CircuitInvocation;
21
22 public class GoogleStreetnameHelper implements StreetnameHelper {
23
24 ServiceConfig conf;
25 RateLimiter limiter;
26
27 public GoogleStreetnameHelper(ServiceConfig conf) {
28 this.conf = conf;
29
30 limiter = RateLimiter.create( 10.0 ); //max 10 req /sec
31 }
32
33 @Override
34 public String proposeStreetName(SearchRequest request, SearchResult result) {
35 if (conf.useGoogle == false)
36 return null;
37
38
39 result.google = true;
40
41 try {
42 GoogleInvocation wrapper = new GoogleInvocation( limiter, conf, request.postnr, request.vejnavn );
43 CircuitBreaker breaker = CircuitBreakerManager.getManager().getCircuitBreaker("google");
44
45
46 result.googleVej = (String) breaker.invoke(wrapper);
47 return result.googleVej;
48
49
50 } catch (Exception e) {
51 System.out.println( "GoogleError: " + e.getClass().getName() +" / "+ e.getMessage() );
52 }
53 return null;
54 }
55
56 static class GoogleInvocation implements CircuitInvocation {
57 ServiceConfig conf;
58 int postnr;
59 String vejnavn;
60 RateLimiter limiter;
61
62 public GoogleInvocation(RateLimiter limiter, ServiceConfig conf, int postnr, String vejnavn) {
63 this.limiter = limiter;
64 this.conf = conf;
65 this.postnr= postnr;
66 this.vejnavn = vejnavn;
67
68 }
69
70 @Override
71 public String proceed() throws Exception {
72
73 limiter.acquire();
74
75 final Geocoder geocoder;
76 if ( conf.googleApiKey != null ) {
77 geocoder = new Geocoder(conf.googleApiUser, conf.googleApiKey); //Throws InvalidKeyException
78 } else {
79 geocoder = new Geocoder();
80 }
81 //TimingHelper timer = new TimingHelper();
82
83 String search = vejnavn + ", " + postnr + ", Denmark";
84 GeocoderRequest geocoderRequest = new GeocoderRequestBuilder().setAddress(search).setLanguage("en").getGeocoderRequest();
85 GeocodeResponse geocoderResponse = geocoder.geocode(geocoderRequest);
86
87 //timer.printElapsed("Google elapsed");
88
89 //System.out.println( "Status: >" + geocoderResponse.getStatus() + "<");
90 if ( geocoderResponse.getStatus() != GeocoderStatus.OK) {
91
92 if (geocoderResponse.getStatus() == GeocoderStatus.ZERO_RESULTS) {
93 return null;
94 } else {
95 System.out.println("Google responded with " + geocoderResponse.getStatus() );
96 //Hvis det er alvorlige fejl skal vi afbryde med exception og trigger circuitbreakeren
97 throw new Exception("Google responded with " + geocoderResponse.getStatus() );
98 }
99
100 }
101
102 List<GeocoderResult> resList = geocoderResponse.getResults();
103 //System.out.println( "Count: " + resList.size() );
104
105 if (resList.size() != 1) {
106 return null;
107 }
108 GeocoderResult res = resList.get(0);
109
110 List<GeocoderAddressComponent> compList = res.getAddressComponents();
111 for (GeocoderAddressComponent c : compList) {
112 //System.out.println(c);
113 if (c.getTypes().contains("route")) {
114 return c.getLongName();
115 }
116 }
117 return null;
118 }
119
120 }
121
122
123 }

  ViewVC Help
Powered by ViewVC 1.1.20