CAMEL-9273:Support all free api methods
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/cd6c3d71 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/cd6c3d71 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/cd6c3d71 Branch: refs/heads/master Commit: cd6c3d715edc99d543d56fa0a6737f40e04e9509 Parents: ced55f7 Author: Arno Noordover <a...@noordover.net> Authored: Mon May 23 21:42:12 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed May 25 16:54:34 2016 +0200 ---------------------------------------------------------------------- .../camel/component/weather/WeatherApi.java | 23 +++ .../component/weather/WeatherConfiguration.java | 53 +++++++ .../camel/component/weather/WeatherQuery.java | 86 +++++++++-- .../component/weather/WeatherQueryTest.java | 153 +++++++++++++++++++ 4 files changed, 304 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/cd6c3d71/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherApi.java ---------------------------------------------------------------------- diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherApi.java b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherApi.java new file mode 100644 index 0000000..1b90899 --- /dev/null +++ b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherApi.java @@ -0,0 +1,23 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.weather; + +public enum WeatherApi { + + Current, Station, Hourly, Daily + +} http://git-wip-us.apache.org/repos/asf/camel/blob/cd6c3d71/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConfiguration.java b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConfiguration.java index c569ef3..df8f9df 100644 --- a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConfiguration.java +++ b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConfiguration.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.weather; +import java.util.List; import java.util.Scanner; import org.apache.camel.component.weather.geolocation.FreeGeoIpGeoLocationProvider; @@ -62,6 +63,14 @@ public class WeatherConfiguration { private WeatherLanguage language = en; @UriParam private String headerName; + @UriParam + private String zip; + @UriParam + private List<String> ids; + @UriParam + private Integer cnt; + @UriParam + private WeatherApi weatherApi; @UriParam(label = "proxy") private String proxyHost; @@ -342,4 +351,48 @@ public class WeatherConfiguration { public void setProxyAuthHost(String proxyAuthHost) { this.proxyAuthHost = proxyAuthHost; } + + public String getZip() { + return zip; + } + + /** + * Zip-code, e.g. 94040,us + */ + public void setZip(String zip) { + this.zip = zip; + } + + public List<String> getIds() { + return ids; + } + + /** + * List of id's of city/stations + */ + public void setIds(List<String> ids) { + this.ids = ids; + } + + public Integer getCnt() { + return cnt; + } + + /** + * Number of results to be found + */ + public void setCnt(Integer cnt) { + this.cnt = cnt; + } + + public WeatherApi getWeatherApi() { + return weatherApi; + } + + /** + * The API to be use (current, forecast/3 hour, forecast daily, station + */ + public void setWeatherApi(WeatherApi weatherApi) { + this.weatherApi = weatherApi; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/cd6c3d71/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherQuery.java ---------------------------------------------------------------------- diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherQuery.java b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherQuery.java index 45af6f0..090a88a 100644 --- a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherQuery.java +++ b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherQuery.java @@ -18,6 +18,7 @@ package org.apache.camel.component.weather; import org.apache.camel.component.weather.geolocation.GeoLocation; import org.apache.camel.component.weather.geolocation.GeoLocationProvider; +import org.apache.commons.codec.binary.StringUtils; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; @@ -47,10 +48,12 @@ public class WeatherQuery { public String getQuery(String location) throws Exception { String answer = "http://api.openweathermap.org/data/2.5/"; + boolean point = false; if (weatherConfiguration.getLat() != null && weatherConfiguration.getLon() != null && weatherConfiguration.getRightLon() == null && weatherConfiguration.getTopLat() == null) { - location = "lat=" + weatherConfiguration.getLat() + "&lon=" + weatherConfiguration.getLon(); + location = createLatLonQueryString(); + point = true; } else if (weatherConfiguration.getLat() != null && weatherConfiguration.getLon() != null && weatherConfiguration.getRightLon() != null && weatherConfiguration.getTopLat() != null) { location = "bbox=" + weatherConfiguration.getLon() + "," @@ -58,8 +61,15 @@ public class WeatherQuery { + weatherConfiguration.getRightLon() + "," + weatherConfiguration.getTopLat() + "," + weatherConfiguration.getZoom() + "&cluster=yes"; + } else if (!isEmpty(weatherConfiguration.getZip())) { + location = "zip=" + weatherConfiguration.getZip(); + } else if (weatherConfiguration.getIds() != null && weatherConfiguration.getIds().size() > 0) { + location = "id=" + String.join(",", weatherConfiguration.getIds()); } else if (isEmpty(location) || "current".equals(location)) { - location = getCurrentGeoLocation(); + GeoLocation geoLocation = getCurrentGeoLocation(); + weatherConfiguration.setLat(geoLocation.getLatitude()); + weatherConfiguration.setLon(geoLocation.getLongitude()); + location = createLatLonQueryString(); } else { // assuming the location is a town or country location = "q=" + location; @@ -67,12 +77,13 @@ public class WeatherQuery { location = location + "&lang=" + weatherConfiguration.getLanguage(); - if (weatherConfiguration.getTopLat() != null && weatherConfiguration.getRightLon() != null) { - answer += "box/city?" + location; - } else if (isEmpty(weatherConfiguration.getPeriod())) { - answer += "weather?" + location; - } else { - answer += "forecast/daily?" + location + "&cnt=" + weatherConfiguration.getPeriod(); + String context = createContext(); + answer += context + location; + + if (!isEmpty(weatherConfiguration.getPeriod())) { + answer += "&cnt=" + weatherConfiguration.getPeriod(); + } else if (weatherConfiguration.getCnt() != null) { + answer += "&cnt=" + weatherConfiguration.getCnt(); } // append the desired measurement unit if not the default (which is metric) @@ -93,9 +104,62 @@ public class WeatherQuery { } - String getCurrentGeoLocation() throws Exception { - GeoLocation geoLocation = geoLocationProvider.getCurrentGeoLocation(); - return "lat=" + geoLocation.getLatitude() + "&lon=" + geoLocation.getLongitude(); + private String createContext() { + String answer; + if (isBoxedQuery()) { + if (weatherConfiguration.getWeatherApi() == WeatherApi.Station) { + answer = "box/station?"; + } else { + answer = "box/city?"; + } + } else if (isGeoLocation() && weatherConfiguration.getCnt() != null) { + if (weatherConfiguration.getWeatherApi() == WeatherApi.Station) { + answer = "station/find?"; + } else { + answer = "find?"; + } + } else if (weatherConfiguration.getIds() != null && weatherConfiguration.getIds().size() > 0) { + if (weatherConfiguration.getIds().size() == 1) { + if (!isEmpty(weatherConfiguration.getPeriod())) { + if (weatherConfiguration.getWeatherApi() == WeatherApi.Hourly) { + answer = "forecast?"; + } else { + answer = "forecast/daily?"; + } + } else if (weatherConfiguration.getWeatherApi() == WeatherApi.Station) { + answer = "station?"; + } else { + answer = "weather?"; + } + } else { + answer = "group?"; + } + } else if (isEmpty(weatherConfiguration.getPeriod())) { + answer = "weather?"; + } else { + if (weatherConfiguration.getWeatherApi() == WeatherApi.Hourly) { + answer = "forecast?"; + } else { + answer = "forecast/daily?"; + } + } + return answer; + } + + private boolean isGeoLocation() { + return weatherConfiguration.getLat() != null && weatherConfiguration.getLon() != null; + } + + private String createLatLonQueryString() { + return "lat=" + weatherConfiguration.getLat() + "&lon=" + weatherConfiguration.getLon(); + } + + private boolean isBoxedQuery() { + return weatherConfiguration.getTopLat() != null && weatherConfiguration.getRightLon() != null; + } + + GeoLocation getCurrentGeoLocation() throws Exception { + return geoLocationProvider.getCurrentGeoLocation(); } void setGeoLocationProvider(GeoLocationProvider geoLocationProvider) { http://git-wip-us.apache.org/repos/asf/camel/blob/cd6c3d71/components/camel-weather/src/test/java/org/apache/camel/component/weather/WeatherQueryTest.java ---------------------------------------------------------------------- diff --git a/components/camel-weather/src/test/java/org/apache/camel/component/weather/WeatherQueryTest.java b/components/camel-weather/src/test/java/org/apache/camel/component/weather/WeatherQueryTest.java index ae39322..af9dcec 100644 --- a/components/camel-weather/src/test/java/org/apache/camel/component/weather/WeatherQueryTest.java +++ b/components/camel-weather/src/test/java/org/apache/camel/component/weather/WeatherQueryTest.java @@ -16,6 +16,9 @@ */ package org.apache.camel.component.weather; +import java.util.Arrays; +import java.util.List; + import org.apache.camel.component.weather.geolocation.GeoLocation; import org.apache.camel.component.weather.geolocation.GeoLocationProvider; import org.junit.Before; @@ -64,6 +67,23 @@ public class WeatherQueryTest { } @Test + public void testBoxedStationQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + weatherConfiguration.setLon("4"); + weatherConfiguration.setLat("52"); + weatherConfiguration.setRightLon("6"); + weatherConfiguration.setTopLat("54"); + weatherConfiguration.setZoom(8); + weatherConfiguration.setUnits(WeatherUnits.METRIC); + weatherConfiguration.setAppid(APPID); + weatherConfiguration.setWeatherApi(WeatherApi.Station); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/box/station?bbox=4,52,6,54,8&cluster=yes&lang=en&units=metric&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test public void testLatLonQuery() throws Exception { WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); weatherConfiguration.setLon("4"); @@ -78,6 +98,124 @@ public class WeatherQueryTest { } @Test + public void testZipQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + weatherConfiguration.setZip("2493CJ,nl"); + weatherConfiguration.setMode(WeatherMode.XML); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/weather?zip=2493CJ,nl&lang=nl&mode=xml&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testSingleIdQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + List<String> ids = Arrays.asList("524901"); + weatherConfiguration.setIds(ids); + weatherConfiguration.setMode(WeatherMode.XML); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/weather?id=524901&lang=nl&mode=xml&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testSingleIdDailyForecastQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + List<String> ids = Arrays.asList("524901"); + weatherConfiguration.setIds(ids); + weatherConfiguration.setMode(WeatherMode.XML); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + weatherConfiguration.setPeriod("20"); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/forecast/daily?id=524901&lang=nl&cnt=20&mode=xml&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testSingleIdHourlyForecastQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + List<String> ids = Arrays.asList("524901"); + weatherConfiguration.setIds(ids); + weatherConfiguration.setMode(WeatherMode.XML); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + weatherConfiguration.setWeatherApi(WeatherApi.Hourly); + weatherConfiguration.setPeriod("20"); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/forecast?id=524901&lang=nl&cnt=20&mode=xml&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testSingleIdStationQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + List<String> ids = Arrays.asList("52"); + weatherConfiguration.setIds(ids); + weatherConfiguration.setMode(WeatherMode.JSON); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + weatherConfiguration.setWeatherApi(WeatherApi.Station); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/station?id=52&lang=nl&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testMultiIdQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + List<String> ids = Arrays.asList("524901", "703448"); + weatherConfiguration.setIds(ids); + weatherConfiguration.setMode(WeatherMode.JSON); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/group?id=524901,703448&lang=nl&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testFindInCircleQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + weatherConfiguration.setLat(LATITUDE); + weatherConfiguration.setLon(LONGITUDE); + weatherConfiguration.setCnt(25); + weatherConfiguration.setMode(WeatherMode.JSON); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/find?lat=51.98&lon=4.13&lang=nl&cnt=25&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test + public void testFindStationInCircleQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + weatherConfiguration.setLat(LATITUDE); + weatherConfiguration.setLon(LONGITUDE); + weatherConfiguration.setCnt(25); + weatherConfiguration.setMode(WeatherMode.JSON); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setAppid(APPID); + weatherConfiguration.setWeatherApi(WeatherApi.Station); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/station/find?lat=51.98&lon=4.13&lang=nl&cnt=25&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test public void testCurrentLocationQuery() throws Exception { WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); weatherConfiguration.setMode(WeatherMode.XML); @@ -92,6 +230,21 @@ public class WeatherQueryTest { } @Test + public void testCurrentLocationHourlyQuery() throws Exception { + WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); + weatherConfiguration.setMode(WeatherMode.XML); + weatherConfiguration.setPeriod("3"); + weatherConfiguration.setLanguage(WeatherLanguage.nl); + weatherConfiguration.setUnits(WeatherUnits.IMPERIAL); + weatherConfiguration.setAppid(APPID); + weatherConfiguration.setWeatherApi(WeatherApi.Hourly); + WeatherQuery weatherQuery = new WeatherQuery(weatherConfiguration); + weatherQuery.setGeoLocationProvider(geoLocationProvider); + String query = weatherQuery.getQuery(); + assertThat(query, is("http://api.openweathermap.org/data/2.5/forecast?lat=51.98&lon=4.13&lang=nl&cnt=3&units=imperial&mode=xml&APPID=9162755b2efa555823cfe0451d7fff38")); + } + + @Test public void testCurrentLocationQuery2() throws Exception { WeatherConfiguration weatherConfiguration = new WeatherConfiguration(new WeatherComponent()); weatherConfiguration.setMode(WeatherMode.XML);