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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2567 - (hide 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 torben 2409 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 torben 2566 import com.google.common.util.concurrent.RateLimiter;
14    
15 torben 2409 import dk.daoas.daoadresseservice.admin.ServiceConfig;
16 torben 2411 import dk.daoas.daoadresseservice.beans.SearchRequest;
17 torben 2409 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 torben 2566 RateLimiter limiter;
26    
27 torben 2409 public GoogleStreetnameHelper(ServiceConfig conf) {
28     this.conf = conf;
29 torben 2566
30     limiter = RateLimiter.create( 10.0 ); //max 10 req /sec
31 torben 2409 }
32    
33     @Override
34 torben 2411 public String proposeStreetName(SearchRequest request, SearchResult result) {
35 torben 2409 if (conf.useGoogle == false)
36     return null;
37    
38 torben 2566
39 torben 2409 result.google = true;
40    
41     try {
42 torben 2567 GoogleInvocation wrapper = new GoogleInvocation( limiter, conf, request.postnr, request.vejnavn );
43 torben 2409 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 torben 2567 RateLimiter limiter;
61 torben 2409
62 torben 2567 public GoogleInvocation(RateLimiter limiter, ServiceConfig conf, int postnr, String vejnavn) {
63     this.limiter = limiter;
64 torben 2409 this.conf = conf;
65     this.postnr= postnr;
66     this.vejnavn = vejnavn;
67    
68     }
69    
70     @Override
71     public String proceed() throws Exception {
72 torben 2567
73     limiter.acquire();
74 torben 2409
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