From c087eb5aede2f5e80813dca47534b34f6885771f Mon Sep 17 00:00:00 2001 From: Prominence Date: Sun, 8 Jul 2018 01:25:26 +0300 Subject: [PATCH] Added possibility to define number of days for forecast. Code refactoring. --- pom.xml | 13 ++++ .../api/OpenWeatherProviderManager.java | 10 ++- .../exception/InvalidAuthTokenException.java | 2 +- .../provider/AbstractOpenWeatherProvider.java | 77 ++++++++++++------- .../api/provider/ForecastProvider.java | 24 ++++++ 5 files changed, 94 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index a62a3ca..868e47f 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,19 @@ by.prominence.openweater.api 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + com.alibaba diff --git a/src/main/java/by/prominence/openweather/api/OpenWeatherProviderManager.java b/src/main/java/by/prominence/openweather/api/OpenWeatherProviderManager.java index acfc5c0..0219045 100644 --- a/src/main/java/by/prominence/openweather/api/OpenWeatherProviderManager.java +++ b/src/main/java/by/prominence/openweather/api/OpenWeatherProviderManager.java @@ -24,7 +24,6 @@ package by.prominence.openweather.api; import by.prominence.openweather.api.provider.ForecastProvider; import by.prominence.openweather.api.provider.WeatherProvider; -import by.prominence.openweather.api.provider.OpenWeatherProvider; public class OpenWeatherProviderManager { @@ -34,11 +33,16 @@ public class OpenWeatherProviderManager { this.authToken = token; } - public OpenWeatherProvider getWeather() { + public WeatherProvider getWeather() { return new WeatherProvider(authToken); } - public OpenWeatherProvider getForecast() { + + public ForecastProvider getForecast() { return new ForecastProvider(authToken); } + public ForecastProvider getForecast(int amountOfDays) { + return new ForecastProvider(authToken, amountOfDays); + } + } diff --git a/src/main/java/by/prominence/openweather/api/exception/InvalidAuthTokenException.java b/src/main/java/by/prominence/openweather/api/exception/InvalidAuthTokenException.java index 55a8765..5a2d9f5 100644 --- a/src/main/java/by/prominence/openweather/api/exception/InvalidAuthTokenException.java +++ b/src/main/java/by/prominence/openweather/api/exception/InvalidAuthTokenException.java @@ -25,7 +25,7 @@ package by.prominence.openweather.api.exception; public class InvalidAuthTokenException extends Exception { public InvalidAuthTokenException() { - super("Please, check you authentication token! You can get it here: https://home.openweathermap.org/api_keys/."); + super("Check you authentication token! You can get it here: https://home.openweathermap.org/api_keys/. Please, notice that some requests requires non-free subscription plan."); } public InvalidAuthTokenException(String message) { diff --git a/src/main/java/by/prominence/openweather/api/provider/AbstractOpenWeatherProvider.java b/src/main/java/by/prominence/openweather/api/provider/AbstractOpenWeatherProvider.java index caaf63b..01bd261 100644 --- a/src/main/java/by/prominence/openweather/api/provider/AbstractOpenWeatherProvider.java +++ b/src/main/java/by/prominence/openweather/api/provider/AbstractOpenWeatherProvider.java @@ -29,9 +29,12 @@ import by.prominence.openweather.api.model.Coordinates; import by.prominence.openweather.api.model.OpenWeatherResponse; import by.prominence.openweather.api.utils.JsonUtils; +import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URL; +import java.util.Map; public abstract class AbstractOpenWeatherProvider implements OpenWeatherProvider { @@ -82,53 +85,71 @@ public abstract class AbstractOpenWeatherProvider return executeRequest("?zip=" + zipCode + "," + countryCode); } - protected T executeRequest(String parameterString) throws InvalidAuthTokenException, DataNotFoundException { - - String url = getRequestUrl() + parameterString + "&appid=" + authToken; - - if (language != null) { - url += "&lang=" + language; - } - - if (unit != null) { - url += "&units=" + unit; - } - - if (accuracy != null) { - url += "&type=" + accuracy; - } + protected T executeRequest(String requestSpecificParameters) throws InvalidAuthTokenException, DataNotFoundException { T openWeatherResponse = null; try { - URL requestUrl = new URL(url); + URL requestUrl = buildURL(requestSpecificParameters); HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); connection.setRequestMethod("GET"); - if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { - openWeatherResponse = type.cast(JsonUtils.parseJson(connection.getInputStream(), type)); - - if (openWeatherResponse.getResponseCode() == 401) { + switch (connection.getResponseCode()) { + case HttpURLConnection.HTTP_OK: + openWeatherResponse = type.cast(JsonUtils.parseJson(connection.getInputStream(), type)); + break; + case HttpURLConnection.HTTP_UNAUTHORIZED: throw new InvalidAuthTokenException(); - } - - if (openWeatherResponse.getResponseCode() == 404) { + case HttpURLConnection.HTTP_NOT_FOUND: throw new DataNotFoundException(); - } - } else { - throw new DataNotFoundException(); } - } catch (Exception ex) { + } catch (IOException | ClassCastException ex) { ex.printStackTrace(); } return openWeatherResponse; } - private String getRequestUrl() { + protected String getRequestUrl() { return System.OPEN_WEATHER_API_URL + getRequestType(); } + protected Map getAdditionalParameters() { + return null; + } + + private URL buildURL(String requestSpecificParameters) throws MalformedURLException { + + StringBuilder urlBuilder = new StringBuilder(getRequestUrl() + requestSpecificParameters + "&appid=" + authToken); + + if (language != null) { + urlBuilder.append("&lang="); + urlBuilder.append(language); + } + + if (unit != null) { + urlBuilder.append("&units="); + urlBuilder.append(unit); + } + + if (accuracy != null) { + urlBuilder.append("&type="); + urlBuilder.append(accuracy); + } + + Map additionalParameters = getAdditionalParameters(); + if (additionalParameters != null) { + additionalParameters.forEach((key, value) -> { + urlBuilder.append("&"); + urlBuilder.append(key); + urlBuilder.append("="); + urlBuilder.append(value); + }); + } + + return new URL(urlBuilder.toString()); + } + protected abstract String getRequestType(); } diff --git a/src/main/java/by/prominence/openweather/api/provider/ForecastProvider.java b/src/main/java/by/prominence/openweather/api/provider/ForecastProvider.java index be80329..3073f4a 100644 --- a/src/main/java/by/prominence/openweather/api/provider/ForecastProvider.java +++ b/src/main/java/by/prominence/openweather/api/provider/ForecastProvider.java @@ -24,13 +24,37 @@ package by.prominence.openweather.api.provider; import by.prominence.openweather.api.model.forecast.ForecastResponse; +import java.util.HashMap; +import java.util.Map; + public class ForecastProvider extends AbstractOpenWeatherProvider { + private int amountOfDays = -1; + public ForecastProvider(String authToken) { super(authToken); } + public ForecastProvider(String authToken, int amountOfDays) { + super(authToken); + this.amountOfDays = amountOfDays; + } + protected String getRequestType() { + if (amountOfDays != -1) { + return "forecast/daily"; + } return "forecast"; } + + @Override + protected Map getAdditionalParameters() { + Map additionalParameters = null; + if (amountOfDays != -1) { + additionalParameters = new HashMap<>(); + additionalParameters.put("cnt", String.valueOf(amountOfDays)); + } + + return additionalParameters; + } }