From 6ae281af0d10be002d5d3bfbb7396feb58a67438 Mon Sep 17 00:00:00 2001 From: Alexey Zinchenko Date: Sun, 17 Apr 2022 00:25:07 +0300 Subject: [PATCH] Merged changes from dev branch. --- .github/dependabot.yml | 9 + README.md | 13 +- docs/{SNAPSHOT.md => Release_2.3.0.md} | 154 ++++++++++-------- pom.xml | 16 +- .../api/OpenWeatherMapClient.java | 25 ++- .../TimeoutSettings.java} | 58 ++++--- .../openweathermap/api/enums/Language.java | 4 +- .../openweathermap/api/enums/MoonType.java | 62 +++++++ .../ResponseType.java} | 28 ++-- .../AirPollutionResponseMapper.java | 38 ++--- .../CurrentWeatherResponseMapper.java | 4 +- ...ayThreeHourStepForecastResponseMapper.java | 4 +- .../OneCallWeatherResponseMapper.java | 16 +- .../api/model/onecall/current/Daily.java | 65 +++++++- .../onecall/current/MoonPhase.java} | 59 ++++--- .../api/request/RequestSettings.java | 100 ++++++++++++ .../api/request/RequestUrlBuilder.java | 98 ----------- .../AirPollutionAsyncRequestTerminator.java | 32 +++- ...irPollutionAsyncRequestTerminatorImpl.java | 61 ------- .../AirPollutionRequestCustomizer.java | 29 ++-- .../AirPollutionRequestCustomizerImpl.java | 45 ----- .../AirPollutionRequestTerminator.java | 30 +++- .../AirPollutionRequestTerminatorImpl.java | 59 ------- .../air/pollution/AirPollutionRequester.java | 79 ++++----- .../pollution/AirPollutionRequesterImpl.java | 67 -------- .../CurrentAirPollutionRequester.java | 27 ++- .../ForecastAirPollutionRequester.java} | 30 ++-- .../HistoricalAirPollutionRequester.java} | 33 ++-- .../CurrentAirPollutionRequesterImpl.java | 53 ------ .../ForecastAirPollutionRequester.java | 41 ----- .../ForecastAirPollutionRequesterImpl.java | 53 ------ .../HistoricalAirPollutionRequester.java | 43 ----- .../HistoricalAirPollutionRequesterImpl.java | 55 ------- ...ourStepForecastAsyncRequestTerminator.java | 36 +++- ...tepForecastAsyncRequestTerminatorImpl.java | 69 -------- ...hreeHourStepForecastRequestCustomizer.java | 52 +++--- ...HourStepForecastRequestCustomizerImpl.java | 84 ---------- ...hreeHourStepForecastRequestTerminator.java | 36 +++- ...HourStepForecastRequestTerminatorImpl.java | 67 -------- ...FiveDayThreeHourStepForecastRequester.java | 92 +++++------ ...DayThreeHourStepForecastRequesterImpl.java | 86 ---------- .../onecall/OneCallWeatherRequester.java | 28 ++-- .../onecall/OneCallWeatherRequesterImpl.java | 55 ------- ...lCurrentWeatherAsyncRequestTerminator.java | 32 +++- ...rentWeatherAsyncRequestTerminatorImpl.java | 64 -------- ...neCallCurrentWeatherRequestCustomizer.java | 59 ++++--- ...llCurrentWeatherRequestCustomizerImpl.java | 88 ---------- ...neCallCurrentWeatherRequestTerminator.java | 29 +++- ...llCurrentWeatherRequestTerminatorImpl.java | 62 ------- .../OneCallCurrentWeatherRequester.java | 23 ++- ...storicalWeatherAsyncRequestTerminator.java | 32 +++- ...icalWeatherAsyncRequestTerminatorImpl.java | 64 -------- ...allHistoricalWeatherRequestCustomizer.java | 41 +++-- ...istoricalWeatherRequestCustomizerImpl.java | 70 -------- ...allHistoricalWeatherRequestTerminator.java | 30 +++- ...istoricalWeatherRequestTerminatorImpl.java | 62 ------- .../OneCallHistoricalWeatherRequester.java | 25 ++- .../weather/CurrentWeatherRequester.java | 27 +-- .../weather/CurrentWeatherRequesterImpl.java | 53 ------ ...tipleLocationsCurrentWeatherRequester.java | 53 +++--- ...eLocationsCurrentWeatherRequesterImpl.java | 71 -------- ...eCurrentWeatherAsyncRequestTerminator.java | 36 +++- ...rentWeatherAsyncRequestTerminatorImpl.java | 71 -------- ...CircleCurrentWeatherRequestCustomizer.java | 43 +++-- ...leCurrentWeatherRequestCustomizerImpl.java | 70 -------- ...CircleCurrentWeatherRequestTerminator.java | 36 +++- ...leCurrentWeatherRequestTerminatorImpl.java | 70 -------- ...tCurrentWeatherAsyncRequestTerminator.java | 31 +++- ...rentWeatherAsyncRequestTerminatorImpl.java | 65 -------- ...ResultCurrentWeatherRequestCustomizer.java | 43 +++-- ...ltCurrentWeatherRequestCustomizerImpl.java | 70 -------- ...ResultCurrentWeatherRequestTerminator.java | 30 +++- ...ltCurrentWeatherRequestTerminatorImpl.java | 64 -------- ...SingleLocationCurrentWeatherRequester.java | 92 +++++------ ...leLocationCurrentWeatherRequesterImpl.java | 81 --------- ...tCurrentWeatherAsyncRequestTerminator.java | 46 ++++-- ...rentWeatherAsyncRequestTerminatorImpl.java | 76 --------- ...ResultCurrentWeatherRequestCustomizer.java | 42 +++-- ...ltCurrentWeatherRequestCustomizerImpl.java | 70 -------- ...ResultCurrentWeatherRequestTerminator.java | 46 ++++-- ...ltCurrentWeatherRequestTerminatorImpl.java | 74 --------- .../api/utils/RequestUtils.java | 42 ++++- .../onecall/current/MoonPhaseUnitTest.java | 100 ++++++++++++ .../AirPollutionResponseMapperUnitTest.java | 1 + ...ourStepForecastResponseMapperUnitTest.java | 1 + .../OneCallWeatherResponseMapperUnitTest.java | 1 + .../CurrentWeatherResponseMapperUnitTest.java | 1 + 87 files changed, 1507 insertions(+), 2775 deletions(-) create mode 100644 .github/dependabot.yml rename docs/{SNAPSHOT.md => Release_2.3.0.md} (82%) rename src/main/java/com/github/prominence/openweathermap/api/{request/RequestCustomizer.java => conf/TimeoutSettings.java} (52%) create mode 100644 src/main/java/com/github/prominence/openweathermap/api/enums/MoonType.java rename src/main/java/com/github/prominence/openweathermap/api/{request/AsyncRequestTerminator.java => enums/ResponseType.java} (73%) rename src/main/java/com/github/prominence/openweathermap/api/{request/air/pollution => mapper}/AirPollutionResponseMapper.java (73%) rename src/main/java/com/github/prominence/openweathermap/api/{request/weather => mapper}/CurrentWeatherResponseMapper.java (99%) rename src/main/java/com/github/prominence/openweathermap/api/{request/forecast/free => mapper}/FiveDayThreeHourStepForecastResponseMapper.java (99%) rename src/main/java/com/github/prominence/openweathermap/api/{request/onecall => mapper}/OneCallWeatherResponseMapper.java (95%) rename src/main/java/com/github/prominence/openweathermap/api/{request/RequestTerminator.java => model/onecall/current/MoonPhase.java} (51%) create mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/RequestSettings.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/RequestUrlBuilder.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequesterImpl.java rename src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/{current => }/CurrentAirPollutionRequester.java (59%) rename src/main/java/com/github/prominence/openweathermap/api/request/{onecall/current/OneCallCurrentWeatherRequesterImpl.java => air/pollution/ForecastAirPollutionRequester.java} (54%) rename src/main/java/com/github/prominence/openweathermap/api/request/{onecall/historical/OneCallHistoricalWeatherRequesterImpl.java => air/pollution/HistoricalAirPollutionRequester.java} (51%) delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequester.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequester.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequesterImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminatorImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizerImpl.java delete mode 100644 src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminatorImpl.java create mode 100644 src/test/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhaseUnitTest.java diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..11928a2 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,9 @@ +version: 2 +updates: +- package-ecosystem: maven + directory: "/" + schedule: + interval: daily + time: "03:00" + open-pull-requests-limit: 10 + target-branch: master diff --git a/README.md b/README.md index 9584326..2cbff62 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ Free: * One Call API * Air pollution +Other: +* Request timeout settings + ### Will be implemented later: Free: @@ -26,14 +29,14 @@ Paid: com.github.prominence openweathermap-api - 2.2.0 + 2.3.0 ``` ### Gradle coordinates: ```groovy -compile('com.github.prominence:openweathermap-api:2.2.0') +compile('com.github.prominence:openweathermap-api:2.3.0') ``` ### Documentation @@ -45,14 +48,14 @@ compile('com.github.prominence:openweathermap-api:2.2.0') * [OpenWeatherMap Java API - 2.1.0](docs/Release_2.1.0.md) * [OpenWeatherMap Java API - 2.1.1](docs/Release_2.1.1.md) * [OpenWeatherMap Java API - 2.2.0](docs/Release_2.2.0.md) -* [OpenWeatherMap Java API - SNAPSHOT](docs/SNAPSHOT.md) +* [OpenWeatherMap Java API - 2.3.0](docs/Release_2.3.0.md) ### License MIT -[ci-shield]: https://travis-ci.org/Prominence/openweathermap-java-api.svg?branch=master +[ci-shield]: https://travis-ci.org/Prominence/openweathermap-java-api.svg?branch=dev [ci-link]: https://travis-ci.org/Prominence/openweathermap-java-api -[codecov-shield]: https://codecov.io/gh/Prominence/openweathermap-java-api/branch/master/graph/badge.svg +[codecov-shield]: https://codecov.io/gh/Prominence/openweathermap-java-api/branch/dev/graph/badge.svg [codecov-link]: https://codecov.io/gh/Prominence/openweathermap-java-api diff --git a/docs/SNAPSHOT.md b/docs/Release_2.3.0.md similarity index 82% rename from docs/SNAPSHOT.md rename to docs/Release_2.3.0.md index 328fb27..d1fe83b 100644 --- a/docs/SNAPSHOT.md +++ b/docs/Release_2.3.0.md @@ -4,20 +4,24 @@ * One Call API * Air Pollution + +Other: +* Request timeout settings + ### Maven coordinates: ```xml com.github.prominence openweathermap-api - 2.1.1-SNAPSHOT + 2.3.0 ``` ### Gradle coordinates: ```groovy -compile('com.github.prominence:openweathermap-api:2.1.1-SNAPSHOT') +compile('com.github.prominence:openweathermap-api:2.3.0') ``` ### How to use: @@ -34,6 +38,13 @@ Currently, available APIs are: * `oneCall()` * `airPollution()` +Also, it is possible to set timeouts for the requests on `openWeatherClient` object: +```java +openWeatherClient.setReadTimeout(1000); +openWeatherClient.setConnectTimeout(1000); +``` +Timeout settings are passed to the requesters as a copy. + Default(more or less) customization points: ```java ... @@ -352,22 +363,25 @@ You are able to set preferable options(via chain methods) and execute appropriat `com.github.prominence.openweathermap.api.model.onecall.current.Daily`'s useful public methods(setters are not listed): -| Method | Description | -|-----------------------------------------------|---------------------------------------------------------------------------------------------------| -| `getForecastTime()` | Returns `LocalDateTime` object with weather forecast time. | -| `getSunriseTime()` | Returns `LocalDateTime` object with sunrise time. | -| `getSunsetTime()` | Returns `LocalDateTime` object with sunset time. | -| `getWeatherState()` | Returns `WeatherState` object with basic weather state information. | -| `getTemperature()` | Returns `DailyTemperature` object. Available fields: `value`, `feelsLike`, `dewPoint` and `unit`. | -| `getAtmosphericPressure()` | Returns `AtmosphericPressure` object. Available fields: `seaLevelValue`. | -| `getHumidity()` | Returns `Humidity` object. Available fields: `value` and `unit`. | -| `getWind()` | Returns `Wind` object. Available fields: `speed`, `degrees`, `gust` and `unit`. | -| `getClouds()` | Returns `Clouds` object. Available fields: `value` and `unit`. | -| `getUvIndex()` | Returns UV index value. | -| `getProbabilityOfPrecipitation()` | Returns probability of precipitation(not percentage). | -| `getProbabilityOfPrecipitationPercentage()` | Returns probability of precipitation percentage. | -| `getRain()` | Returns `DailyRain` object. Available fields: `value`. | -| `getSnow()` | Returns `DailySnow` object. Available fields: `value`. | +| Method | Description | +|---------------------------------------------|---------------------------------------------------------------------------------------------------| +| `getForecastTime()` | Returns `LocalDateTime` object with weather forecast time. | +| `getSunriseTime()` | Returns `LocalDateTime` object with sunrise time. | +| `getSunsetTime()` | Returns `LocalDateTime` object with sunset time. | +| `getMoonriseTime()` | Returns `LocalDateTime` object with moonrise time. | +| `getMoonsetTime()` | Returns `LocalDateTime` object with moonset time. | +| `getMoonPhase()` | Returns `MoonPhase` object with `MoonType` info and value. | +| `getWeatherState()` | Returns `WeatherState` object with basic weather state information. | +| `getTemperature()` | Returns `DailyTemperature` object. Available fields: `value`, `feelsLike`, `dewPoint` and `unit`. | +| `getAtmosphericPressure()` | Returns `AtmosphericPressure` object. Available fields: `seaLevelValue`. | +| `getHumidity()` | Returns `Humidity` object. Available fields: `value` and `unit`. | +| `getWind()` | Returns `Wind` object. Available fields: `speed`, `degrees`, `gust` and `unit`. | +| `getClouds()` | Returns `Clouds` object. Available fields: `value` and `unit`. | +| `getUvIndex()` | Returns UV index value. | +| `getProbabilityOfPrecipitation()` | Returns probability of precipitation(not percentage). | +| `getProbabilityOfPrecipitationPercentage()` | Returns probability of precipitation percentage. | +| `getRain()` | Returns `DailyRain` object. Available fields: `value`. | +| `getSnow()` | Returns `DailySnow` object. Available fields: `value`. | `com.github.prominence.openweathermap.api.model.onecall.current.Alert`'s useful public methods(setters are not listed): @@ -475,54 +489,54 @@ final AirPollutionDetails airPollutionDetails = openWeatherClient ### Constants and options #### Language -| Constant | Description | -|-----------------------------------|-------------------------------| -| Language.AFRIKAANS | Afrikaans language. | -| Language.ALBANIAN | ALBANIAN language. | -| Language.ARABIC | Arabic language. | -| Language.AZERBAIJANI | Azerbaijani language. | -| Language.BULGARIAN | Bulgarian language. | -| Language.CATALAN | Catalan language. | -| Language.CZECH | Czech language. | -| Language.DANISH | Danish language. | -| Language.GERMAN | German language. | -| Language.GREEK | Greek language. | -| Language.ENGLISH | English language. | -| Language.BASQUE | Basque language. | -| Language.PERSIAN | Persian (Farsi) language. | -| Language.FINNISH | Finnish language. | -| Language.FRENCH | French language. | -| Language.GALICIAN | Galician language. | -| Language.HEBREW | Hebrew language. | -| Language.HINDI | Hindi language. | -| Language.CROATIAN | Croatian language. | -| Language.HUNGARIAN | Hungarian language. | -| Language.INDONESIAN | Indonesian language. | -| Language.ITALIAN | Italian language. | -| Language.JAPANESE | Japanese language. | -| Language.KOREAN | Korean language. | -| Language.LATVIAN | Latvian language. | -| Language.LITHUANIAN | Lithuanian language. | -| Language.MACEDONIAN | Macedonian language. | -| Language.NORWEGIAN | Norwegian language. | -| Language.DUTCH | Dutch language. | -| Language.POLISH | Polish language. | -| Language.PORTUGUESE | Portuguese language. | -| Language.PORTUGUES_BRAZIL | Português Brasil language. | -| Language.ROMANIAN | Romanian language. | -| Language.RUSSIAN | Russian language. | -| Language.SWEDISH | Swedish language. | -| Language.SLOVAK | Slovak language. | -| Language.SLOVENIAN | Slovenian language. | -| Language.SPANISH | Spanish language. | -| Language.SERBIAN | Serbian language. | -| Language.THAI | Thai language. | -| Language.TURKISH | Turkish language. | -| Language.UKRANIAN | Ukrainian language. | -| Language.VIETNAMESE | Vietnamese language. | -| Language.CHINESE_SIMPLIFIED | Chinese Simplified language. | -| Language.CHINESE_TRADITIONAL | Chinese Traditional language. | -| Language.ZULU | Zulu language. | +| Constant | Description | +|------------------------------|-------------------------------| +| Language.AFRIKAANS | Afrikaans language. | +| Language.ALBANIAN | ALBANIAN language. | +| Language.ARABIC | Arabic language. | +| Language.AZERBAIJANI | Azerbaijani language. | +| Language.BULGARIAN | Bulgarian language. | +| Language.CATALAN | Catalan language. | +| Language.CZECH | Czech language. | +| Language.DANISH | Danish language. | +| Language.GERMAN | German language. | +| Language.GREEK | Greek language. | +| Language.ENGLISH | English language. | +| Language.BASQUE | Basque language. | +| Language.PERSIAN | Persian (Farsi) language. | +| Language.FINNISH | Finnish language. | +| Language.FRENCH | French language. | +| Language.GALICIAN | Galician language. | +| Language.HEBREW | Hebrew language. | +| Language.HINDI | Hindi language. | +| Language.CROATIAN | Croatian language. | +| Language.HUNGARIAN | Hungarian language. | +| Language.INDONESIAN | Indonesian language. | +| Language.ITALIAN | Italian language. | +| Language.JAPANESE | Japanese language. | +| Language.KOREAN | Korean language. | +| Language.LATVIAN | Latvian language. | +| Language.LITHUANIAN | Lithuanian language. | +| Language.MACEDONIAN | Macedonian language. | +| Language.NORWEGIAN | Norwegian language. | +| Language.DUTCH | Dutch language. | +| Language.POLISH | Polish language. | +| Language.PORTUGUESE | Portuguese language. | +| Language.PORTUGUES_BRAZIL | Português Brasil language. | +| Language.ROMANIAN | Romanian language. | +| Language.RUSSIAN | Russian language. | +| Language.SWEDISH | Swedish language. | +| Language.SLOVAK | Slovak language. | +| Language.SLOVENIAN | Slovenian language. | +| Language.SPANISH | Spanish language. | +| Language.SERBIAN | Serbian language. | +| Language.THAI | Thai language. | +| Language.TURKISH | Turkish language. | +| Language.UKRAINIAN | Ukrainian language. | +| Language.VIETNAMESE | Vietnamese language. | +| Language.CHINESE_SIMPLIFIED | Chinese Simplified language. | +| Language.CHINESE_TRADITIONAL | Chinese Traditional language. | +| Language.ZULU | Zulu language. | #### Unit | Constant | Description | @@ -532,7 +546,7 @@ final AirPollutionDetails airPollutionDetails = openWeatherClient | Unit.STANDARD_SYSTEM | Kelvin, meter/sec, hPa, mm(rain, snow). | ### Dependencies -* com.fasterxml.jackson.core:jackson-databind:2.12.2 -* org.slf4j:slf4j-api:1.7.30 (*compile*) -* org.junit.jupiter:junit-jupiter-engine:5.7.1 (*test*) -* org.junit.platform:junit-platform-runner:1.7.1 (*test*) \ No newline at end of file +* com.fasterxml.jackson.core:jackson-databind:2.13.2.2 +* org.slf4j:slf4j-api:1.7.36 (*compile*) +* org.junit.jupiter:junit-jupiter-engine:5.8.2 (*test*) +* org.junit.platform:junit-platform-runner:1.8.2 (*test*) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 168b4f4..ef080eb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.prominence openweathermap-api - 2.2.0 + 2.3.0 jar Java OpenWeatherMap API @@ -104,7 +104,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.2.0 + 3.3.0 8 @@ -120,7 +120,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.6 + 3.0.1 sign-artifacts @@ -134,7 +134,7 @@ org.jacoco jacoco-maven-plugin - 0.8.6 + 0.8.7 @@ -163,25 +163,25 @@ com.fasterxml.jackson.core jackson-databind - 2.12.2 + 2.13.2.2 org.slf4j slf4j-api - 1.7.30 + 1.7.36 compile org.junit.jupiter junit-jupiter-engine - 5.7.1 + 5.8.2 test org.junit.platform junit-platform-runner - 1.7.1 + 1.8.2 \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/OpenWeatherMapClient.java b/src/main/java/com/github/prominence/openweathermap/api/OpenWeatherMapClient.java index 145be6d..c29d1eb 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/OpenWeatherMapClient.java +++ b/src/main/java/com/github/prominence/openweathermap/api/OpenWeatherMapClient.java @@ -23,16 +23,14 @@ package com.github.prominence.openweathermap.api; import com.github.prominence.openweathermap.api.annotation.SubscriptionAvailability; +import com.github.prominence.openweathermap.api.conf.TimeoutSettings; +import com.github.prominence.openweathermap.api.request.RequestSettings; import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequester; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequesterImpl; import com.github.prominence.openweathermap.api.request.forecast.free.FiveDayThreeHourStepForecastRequester; -import com.github.prominence.openweathermap.api.request.forecast.free.FiveDayThreeHourStepForecastRequesterImpl; import com.github.prominence.openweathermap.api.request.onecall.OneCallWeatherRequester; -import com.github.prominence.openweathermap.api.request.onecall.OneCallWeatherRequesterImpl; import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherRequester; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherRequesterImpl; -import static com.github.prominence.openweathermap.api.enums.SubscriptionPlan.*; +import static com.github.prominence.openweathermap.api.enums.SubscriptionPlan.ALL; /** * The main public API client to communicate with OpenWeatherMap services. @@ -40,6 +38,7 @@ import static com.github.prominence.openweathermap.api.enums.SubscriptionPlan.*; */ public class OpenWeatherMapClient { private final String apiKey; + private final TimeoutSettings timeoutSettings = new TimeoutSettings(); /** * Created OpenWeatherMap client object. @@ -49,13 +48,21 @@ public class OpenWeatherMapClient { this.apiKey = apiKey; } + public void setConnectionTimeout(int connectionTimeout) { + timeoutSettings.setConnectionTimeout(connectionTimeout); + } + + public void setReadTimeout(int readTimeout) { + timeoutSettings.setReadTimeout(readTimeout); + } + /** * Current Weather API. * @return requester for retrieving current weather information. */ @SubscriptionAvailability(plans = ALL) public CurrentWeatherRequester currentWeather() { - return new CurrentWeatherRequesterImpl(apiKey); + return new CurrentWeatherRequester(new RequestSettings(apiKey, timeoutSettings)); } /** @@ -64,7 +71,7 @@ public class OpenWeatherMapClient { */ @SubscriptionAvailability(plans = ALL) public FiveDayThreeHourStepForecastRequester forecast5Day3HourStep() { - return new FiveDayThreeHourStepForecastRequesterImpl(apiKey); + return new FiveDayThreeHourStepForecastRequester(new RequestSettings(apiKey, timeoutSettings)); } /** @@ -74,7 +81,7 @@ public class OpenWeatherMapClient { */ @SubscriptionAvailability(plans = ALL) public OneCallWeatherRequester oneCall() { - return new OneCallWeatherRequesterImpl(apiKey); + return new OneCallWeatherRequester(new RequestSettings(apiKey, timeoutSettings)); } /** @@ -84,6 +91,6 @@ public class OpenWeatherMapClient { */ @SubscriptionAvailability(plans = ALL) public AirPollutionRequester airPollution() { - return new AirPollutionRequesterImpl(apiKey); + return new AirPollutionRequester(new RequestSettings(apiKey, timeoutSettings)); } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/RequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/conf/TimeoutSettings.java similarity index 52% rename from src/main/java/com/github/prominence/openweathermap/api/request/RequestCustomizer.java rename to src/main/java/com/github/prominence/openweathermap/api/conf/TimeoutSettings.java index daf544e..45dbd10 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/RequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/conf/TimeoutSettings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,31 +20,39 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request; +package com.github.prominence.openweathermap.api.conf; -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; +public class TimeoutSettings { + private Integer connectionTimeout; + private Integer readTimeout; -/** - * The interface Request customizer. - * - * @param the type parameter - */ -public interface RequestCustomizer> { + public TimeoutSettings() { + this(2000, 2000); + } - /** - * Customize language. - * - * @param language the language - * @return the request customizer - */ - T language(Language language); + public TimeoutSettings(Integer connectionTimeout, Integer readTimeout) { + this.connectionTimeout = connectionTimeout; + this.readTimeout = readTimeout; + } - /** - * Customize unit system. - * - * @param unitSystem the unit system - * @return the request customizer - */ - T unitSystem(UnitSystem unitSystem); -} + public TimeoutSettings(TimeoutSettings from) { + this.connectionTimeout = from.connectionTimeout; + this.readTimeout = from.readTimeout; + } + + public Integer getConnectionTimeout() { + return connectionTimeout; + } + + public void setConnectionTimeout(Integer connectionTimeout) { + this.connectionTimeout = connectionTimeout; + } + + public Integer getReadTimeout() { + return readTimeout; + } + + public void setReadTimeout(Integer readTimeout) { + this.readTimeout = readTimeout; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/enums/Language.java b/src/main/java/com/github/prominence/openweathermap/api/enums/Language.java index 47a82ba..5a84c30 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/enums/Language.java +++ b/src/main/java/com/github/prominence/openweathermap/api/enums/Language.java @@ -233,9 +233,9 @@ public enum Language { TURKISH("tr"), /** - * Ukranian language. + * Ukrainian language. */ - UKRANIAN("uk"), + UKRAINIAN("uk"), /** * Vietnamese language. diff --git a/src/main/java/com/github/prominence/openweathermap/api/enums/MoonType.java b/src/main/java/com/github/prominence/openweathermap/api/enums/MoonType.java new file mode 100644 index 0000000..7fdaa8a --- /dev/null +++ b/src/main/java/com/github/prominence/openweathermap/api/enums/MoonType.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 Alexey Zinchenko + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.github.prominence.openweathermap.api.enums; + +public enum MoonType { + NEW_MOON, + WAXING_CRESCENT, + FIRST_QUARTER_MOON, + WAXING_GIBBOUS, + FULL_MOON, + WANING_GIBBOUS, + LAST_QUARTER_MOON, + WANING_CRESCENT, + INVALID; + + private static final double precision = 0.000001d; + + public static MoonType valueOf(double numericValue) { + if (equals(numericValue, 0) || equals(numericValue, 1)) { + return NEW_MOON; + } else if (equals(numericValue, 0.25)) { + return FIRST_QUARTER_MOON; + } else if (equals(numericValue, 0.5)) { + return FULL_MOON; + } else if (equals(numericValue, 0.75)) { + return LAST_QUARTER_MOON; + } else if (numericValue > 0 && numericValue < 0.25) { + return WAXING_CRESCENT; + } else if (numericValue > 0.25 && numericValue < 0.5) { + return WAXING_GIBBOUS; + } else if (numericValue > 0.5 && numericValue < 0.75) { + return WANING_GIBBOUS; + } else if (numericValue > 0.75 && numericValue < 1) { + return WANING_CRESCENT; + } + return INVALID; + } + + private static boolean equals(double d1, double d2) { + return Math.abs(d1 - d2) < precision; + } +} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/AsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/enums/ResponseType.java similarity index 73% rename from src/main/java/com/github/prominence/openweathermap/api/request/AsyncRequestTerminator.java rename to src/main/java/com/github/prominence/openweathermap/api/enums/ResponseType.java index 099f958..4c70a54 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/AsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/enums/ResponseType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,15 +20,23 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request; +package com.github.prominence.openweathermap.api.enums; -import java.util.concurrent.CompletableFuture; +public enum ResponseType { + HTML("html"), + XML("xml"); -/** - * The interface Async request terminator. - * - * @param the type parameter - * @param the type parameter - */ -public interface AsyncRequestTerminator extends RequestTerminator, CompletableFuture> { + private final String value; + + ResponseType(String value) { + this.value = value; + } + + /** + * Returns language's value. + * @return value. + */ + public String getValue() { + return value; + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapper.java b/src/main/java/com/github/prominence/openweathermap/api/mapper/AirPollutionResponseMapper.java similarity index 73% rename from src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapper.java rename to src/main/java/com/github/prominence/openweathermap/api/mapper/AirPollutionResponseMapper.java index fd9b26e..b6a069e 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapper.java +++ b/src/main/java/com/github/prominence/openweathermap/api/mapper/AirPollutionResponseMapper.java @@ -1,28 +1,26 @@ /* + * Copyright (c) 2022 Alexey Zinchenko * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.air.pollution; +package com.github.prominence.openweathermap.api.mapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapper.java b/src/main/java/com/github/prominence/openweathermap/api/mapper/CurrentWeatherResponseMapper.java similarity index 99% rename from src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapper.java rename to src/main/java/com/github/prominence/openweathermap/api/mapper/CurrentWeatherResponseMapper.java index be74bee..4e4174e 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapper.java +++ b/src/main/java/com/github/prominence/openweathermap/api/mapper/CurrentWeatherResponseMapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.weather; +package com.github.prominence.openweathermap.api.mapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapper.java b/src/main/java/com/github/prominence/openweathermap/api/mapper/FiveDayThreeHourStepForecastResponseMapper.java similarity index 99% rename from src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapper.java rename to src/main/java/com/github/prominence/openweathermap/api/mapper/FiveDayThreeHourStepForecastResponseMapper.java index b728a7c..9517b7a 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapper.java +++ b/src/main/java/com/github/prominence/openweathermap/api/mapper/FiveDayThreeHourStepForecastResponseMapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.forecast.free; +package com.github.prominence.openweathermap.api.mapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapper.java b/src/main/java/com/github/prominence/openweathermap/api/mapper/OneCallWeatherResponseMapper.java similarity index 95% rename from src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapper.java rename to src/main/java/com/github/prominence/openweathermap/api/mapper/OneCallWeatherResponseMapper.java index 7837b94..d3477b4 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapper.java +++ b/src/main/java/com/github/prominence/openweathermap/api/mapper/OneCallWeatherResponseMapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.onecall; +package com.github.prominence.openweathermap.api.mapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -200,6 +200,18 @@ public class OneCallWeatherResponseMapper { daily.setForecastTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(dailyNode.get("dt").asInt()), TimeZone.getDefault().toZoneId())); daily.setSunriseTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(dailyNode.get("sunrise").asInt()), TimeZone.getDefault().toZoneId())); daily.setSunsetTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(dailyNode.get("sunset").asInt()), TimeZone.getDefault().toZoneId())); + final JsonNode moonriseTimeNode = dailyNode.get("moonrise"); + if (moonriseTimeNode != null) { + daily.setMoonriseTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(moonriseTimeNode.asInt()), TimeZone.getDefault().toZoneId())); + } + final JsonNode moonsetTimeNode = dailyNode.get("moonset"); + if (moonsetTimeNode != null) { + daily.setMoonsetTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(moonsetTimeNode.asInt()), TimeZone.getDefault().toZoneId())); + } + final JsonNode moonPhaseNode = dailyNode.get("moon_phase"); + if (moonPhaseNode != null) { + daily.setMoonPhase(new MoonPhase(moonPhaseNode.asDouble())); + } daily.setWeatherState(parseWeatherState(dailyNode.get("weather").get(0))); daily.setTemperature(parseDailyTemperature(dailyNode)); diff --git a/src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/Daily.java b/src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/Daily.java index 4829ce3..e2f8b45 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/Daily.java +++ b/src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/Daily.java @@ -39,6 +39,10 @@ public class Daily { private LocalDateTime sunriseTime; private LocalDateTime sunsetTime; + private LocalDateTime moonriseTime; + private LocalDateTime moonsetTime; + private MoonPhase moonPhase; + private WeatherState weatherState; private DailyTemperature temperature; private AtmosphericPressure atmosphericPressure; @@ -104,6 +108,60 @@ public class Daily { this.sunsetTime = sunsetTime; } + /** + * Gets moonrise time. + * + * @return the moonrise time + */ + public LocalDateTime getMoonriseTime() { + return moonriseTime; + } + + /** + * Sets moonrise time. + * + * @param moonriseTime the moonrise time + */ + public void setMoonriseTime(LocalDateTime moonriseTime) { + this.moonriseTime = moonriseTime; + } + + /** + * Gets moonset time. + * + * @return the moonset time + */ + public LocalDateTime getMoonsetTime() { + return moonsetTime; + } + + /** + * Sets moonset time. + * + * @param moonsetTime the moonset time + */ + public void setMoonsetTime(LocalDateTime moonsetTime) { + this.moonsetTime = moonsetTime; + } + + /** + * Gets moon phase. + * + * @return the moon phase + */ + public MoonPhase getMoonPhase() { + return moonPhase; + } + + /** + * Sets moon phase. + * + * @param moonPhase the moon phase + */ + public void setMoonPhase(MoonPhase moonPhase) { + this.moonPhase = moonPhase; + } + /** * Gets weather state. * @@ -311,6 +369,9 @@ public class Daily { return Objects.equals(forecastTime, daily.forecastTime) && Objects.equals(sunriseTime, daily.sunriseTime) && Objects.equals(sunsetTime, daily.sunsetTime) && + Objects.equals(moonriseTime, daily.moonriseTime) && + Objects.equals(moonsetTime, daily.moonsetTime) && + Objects.equals(moonPhase, daily.moonPhase) && Objects.equals(weatherState, daily.weatherState) && Objects.equals(temperature, daily.temperature) && Objects.equals(atmosphericPressure, daily.atmosphericPressure) && @@ -325,7 +386,7 @@ public class Daily { @Override public int hashCode() { - return Objects.hash(forecastTime, sunriseTime, sunsetTime, weatherState, temperature, atmosphericPressure, humidity, wind, clouds, uvIndex, probabilityOfPrecipitation, rain, snow); + return Objects.hash(forecastTime, sunriseTime, sunsetTime, moonriseTime, moonsetTime, moonPhase, weatherState, temperature, atmosphericPressure, humidity, wind, clouds, uvIndex, probabilityOfPrecipitation, rain, snow); } @Override @@ -355,7 +416,7 @@ public class Daily { } if (clouds != null) { stringBuilder.append(" Clouds: "); - stringBuilder.append(clouds.toString()); + stringBuilder.append(clouds); stringBuilder.append('.'); } if (rain != null) { diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/RequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhase.java similarity index 51% rename from src/main/java/com/github/prominence/openweathermap/api/request/RequestTerminator.java rename to src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhase.java index 20a8f97..62a277f 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/RequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,27 +20,44 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request; +package com.github.prominence.openweathermap.api.model.onecall.current; -/** - * The interface Request terminator. - * - * @param the type parameter - * @param the type parameter - */ -public interface RequestTerminator { +import com.github.prominence.openweathermap.api.enums.MoonType; - /** - * Java object response format. - * - * @return the java object - */ - T asJava(); +import java.util.Objects; - /** - * JSON response format. - * - * @return the JSON string - */ - S asJSON(); +public class MoonPhase { + private final double value; + private final MoonType type; + + public MoonPhase(Double value) { + this.value = value; + this.type = MoonType.valueOf(value); + } + + public Double getValue() { + return value; + } + + public MoonType getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MoonPhase moonPhase = (MoonPhase) o; + return Double.compare(moonPhase.value, value) == 0 && type == moonPhase.type; + } + + @Override + public int hashCode() { + return Objects.hash(value, type); + } + + @Override + public String toString() { + return type.name() + "(" + value + ")"; + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/RequestSettings.java b/src/main/java/com/github/prominence/openweathermap/api/request/RequestSettings.java new file mode 100644 index 0000000..db0b103 --- /dev/null +++ b/src/main/java/com/github/prominence/openweathermap/api/request/RequestSettings.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2022 Alexey Zinchenko + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.github.prominence.openweathermap.api.request; + +import com.github.prominence.openweathermap.api.conf.TimeoutSettings; +import com.github.prominence.openweathermap.api.enums.Language; +import com.github.prominence.openweathermap.api.enums.ResponseType; +import com.github.prominence.openweathermap.api.enums.UnitSystem; + +import java.util.HashMap; +import java.util.Map; + +public class RequestSettings { + + private static final String LANG_PARAM = "lang"; + private static final String UNITS_PARAM = "units"; + private static final String MODE_PARAM = "mode"; + private static final String API_KEY_PARAM_NAME = "appid"; + + private final TimeoutSettings timeoutSettings; + + private final Map requestParameters = new HashMap<>(8); + + private final StringBuilder urlAppenderBuilder = new StringBuilder(""); + + private Language language = Language.ENGLISH; + private UnitSystem unitSystem = UnitSystem.STANDARD; + + public RequestSettings(String apiKey, TimeoutSettings timeoutSettings) { + this.putRequestParameter(API_KEY_PARAM_NAME, apiKey); + // make a copy + this.timeoutSettings = new TimeoutSettings(timeoutSettings); + } + + public TimeoutSettings getTimeoutSettings() { + return timeoutSettings; + } + + public UnitSystem getUnitSystem() { + return unitSystem; + } + + public void setUnitSystem(UnitSystem unitSystem) { + this.putRequestParameter(UNITS_PARAM, unitSystem.getValue()); + this.unitSystem = unitSystem; + } + + public Language getLanguage() { + return language; + } + + public void setLanguage(Language language) { + this.putRequestParameter(LANG_PARAM, language.getValue()); + this.language = language; + } + + public void setResponseType(ResponseType responseType) { + this.putRequestParameter(MODE_PARAM, responseType.getValue()); + } + + public void putRequestParameter(String key, String value) { + this.requestParameters.put(key, value); + } + + public void removeRequestParameter(String key) { + this.requestParameters.remove(key); + } + + public Map getRequestParameters() { + return requestParameters; + } + + public void appendToURL(String appendix) { + urlAppenderBuilder.append(appendix); + } + + public StringBuilder getUrlAppender() { + return urlAppenderBuilder; + } +} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/RequestUrlBuilder.java b/src/main/java/com/github/prominence/openweathermap/api/request/RequestUrlBuilder.java deleted file mode 100644 index 378bfca..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/RequestUrlBuilder.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request; - -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; - -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The type Request url builder. - */ -public class RequestUrlBuilder { - - private static final String API_KEY_PARAM_NAME = "appid"; - - private final StringBuilder builder = new StringBuilder("http://api.openweathermap.org/data/2.5/"); - private final Map requestParameters = new HashMap<>(); - - /** - * Instantiates a new Request url builder. - * - * @param key the API key - */ - public RequestUrlBuilder(String key) { - requestParameters.put(API_KEY_PARAM_NAME, key); - } - - /** - * Appends value. - * - * @param value the value - */ - public void append(String value) { - builder.append(value); - } - - /** - * Adds request parameter. - * - * @param key the key - * @param value the value - */ - public void addRequestParameter(String key, Object value) { - requestParameters.put(key, value); - } - - /** - * Applies customization. - * - * @param language the language - * @param unitSystem the unit system - */ - public void applyCustomization(Language language, UnitSystem unitSystem) { - if (language != null) { - addRequestParameter("lang", language.getValue()); - } - if (unitSystem != null && unitSystem != UnitSystem.STANDARD) { - addRequestParameter("units", unitSystem.getValue()); - } - } - - /** - * Builds url string. - * - * @return the string - */ - public String buildUrl() { - final String joinedParameters = requestParameters.entrySet().stream() - .map(entry -> entry.getKey() + "=" + entry.getValue()) - .collect(Collectors.joining("&")); - builder.append('?'); - builder.append(joinedParameters); - return builder.toString(); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminator.java index 608e60f..06e64e0 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminator.java @@ -24,11 +24,37 @@ package com.github.prominence.openweathermap.api.request.air.pollution; +import com.github.prominence.openweathermap.api.mapper.AirPollutionResponseMapper; import com.github.prominence.openweathermap.api.model.air.pollution.AirPollutionDetails; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; + +import java.util.concurrent.CompletableFuture; /** - * The interface Current air pollution async request terminator. + * The type Air pollution async request terminator. */ -public interface AirPollutionAsyncRequestTerminator extends AsyncRequestTerminator { +public class AirPollutionAsyncRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new Air pollution async request terminator. + * + * @param requestSettings request settings object. + */ + public AirPollutionAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture asJava() { + return CompletableFuture.supplyAsync(() -> new AirPollutionResponseMapper().mapToAirPollution(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminatorImpl.java deleted file mode 100644 index 45ffcd2..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution; - -import com.github.prominence.openweathermap.api.model.air.pollution.AirPollutionDetails; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.concurrent.CompletableFuture; - -/** - * The type Air pollution async request terminator. - */ -public class AirPollutionAsyncRequestTerminatorImpl implements AirPollutionAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Air pollution async request terminator. - * - * @param urlBuilder the url builder - */ - public AirPollutionAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public CompletableFuture asJava() { - return CompletableFuture.supplyAsync(() -> new AirPollutionResponseMapper().mapToAirPollution(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizer.java index d4b35ef..6bd8b3c 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizer.java @@ -24,21 +24,28 @@ package com.github.prominence.openweathermap.api.request.air.pollution; +import com.github.prominence.openweathermap.api.request.RequestSettings; + /** - * The interface Current air pollution request customizer. + * The Air Pollution request customizer. */ -public interface AirPollutionRequestCustomizer { - /** - * Retrieve current air pollution request terminator. - * - * @return the current air pollution request terminator - */ - AirPollutionRequestTerminator retrieve(); +public class AirPollutionRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve async current air pollution async request terminator. + * Instantiates a new Air pollution request customizer. * - * @return the current air pollution async request terminator + * @param requestSettings request settings object. */ - AirPollutionAsyncRequestTerminator retrieveAsync(); + public AirPollutionRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public AirPollutionRequestTerminator retrieve() { + return new AirPollutionRequestTerminator(requestSettings); + } + + public AirPollutionAsyncRequestTerminator retrieveAsync() { + return new AirPollutionAsyncRequestTerminator(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizerImpl.java deleted file mode 100644 index 2c75b81..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestCustomizerImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; - -public class AirPollutionRequestCustomizerImpl implements AirPollutionRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - public AirPollutionRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public AirPollutionRequestTerminator retrieve() { - return new AirPollutionRequestTerminatorImpl(urlBuilder); - } - - @Override - public AirPollutionAsyncRequestTerminator retrieveAsync() { - return new AirPollutionAsyncRequestTerminatorImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminator.java index 64f4870..4aeb066 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminator.java @@ -24,11 +24,35 @@ package com.github.prominence.openweathermap.api.request.air.pollution; +import com.github.prominence.openweathermap.api.mapper.AirPollutionResponseMapper; import com.github.prominence.openweathermap.api.model.air.pollution.AirPollutionDetails; -import com.github.prominence.openweathermap.api.request.RequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; /** - * The interface Current air pollution request terminator. + * The type Air pollution request terminator. */ -public interface AirPollutionRequestTerminator extends RequestTerminator { +public class AirPollutionRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new Air pollution request terminator. + * + * @param requestSettings request settings object. + */ + public AirPollutionRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public AirPollutionDetails asJava() { + return new AirPollutionResponseMapper().mapToAirPollution(getRawResponse()); + } + + public String asJSON() { + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminatorImpl.java deleted file mode 100644 index aae8ac1..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequestTerminatorImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution; - -import com.github.prominence.openweathermap.api.model.air.pollution.AirPollutionDetails; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -/** - * The type Air pollution request terminator. - */ -public class AirPollutionRequestTerminatorImpl implements AirPollutionRequestTerminator { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Air pollution request terminator. - * - * @param urlBuilder the url builder - */ - public AirPollutionRequestTerminatorImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public AirPollutionDetails asJava() { - return new AirPollutionResponseMapper().mapToAirPollution(getRawResponse()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequester.java index e0f4ba3..cb7a913 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequester.java @@ -1,53 +1,58 @@ /* - * Copyright (c) 2021 Alexey Zinchenko * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * * Copyright (c) 2021 Alexey Zinchenko + * * + * * Permission is hereby granted, free of charge, to any person obtaining a copy + * * of this software and associated documentation files (the "Software"), to deal + * * in the Software without restriction, including without limitation the rights + * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * * copies of the Software, and to permit persons to whom the Software is + * * furnished to do so, subject to the following conditions: + * * + * * The above copyright notice and this permission notice shall be included in all + * * copies or substantial portions of the Software. + * * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * * SOFTWARE. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. */ package com.github.prominence.openweathermap.api.request.air.pollution; -import com.github.prominence.openweathermap.api.request.air.pollution.current.CurrentAirPollutionRequester; -import com.github.prominence.openweathermap.api.request.air.pollution.forecast.ForecastAirPollutionRequester; -import com.github.prominence.openweathermap.api.request.air.pollution.historical.HistoricalAirPollutionRequester; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface Air pollution requester. + * The type Air pollution requester. */ -public interface AirPollutionRequester { - /** - * Current current air pollution requester. - * - * @return the current air pollution requester - */ - CurrentAirPollutionRequester current(); +public class AirPollutionRequester { + private final RequestSettings requestSettings; /** - * Forecast forecast air pollution requester. + * Instantiates a new Air pollution requester. * - * @return the forecast air pollution requester + * @param requestSettings request settings object. */ - ForecastAirPollutionRequester forecast(); + public AirPollutionRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } - /** - * Historical historical air pollution requester. - * - * @return the historical air pollution requester - */ - HistoricalAirPollutionRequester historical(); + public CurrentAirPollutionRequester current() { + requestSettings.appendToURL("air_pollution"); + return new CurrentAirPollutionRequester(requestSettings); + } + + public ForecastAirPollutionRequester forecast() { + requestSettings.appendToURL("air_pollution/forecast"); + return new ForecastAirPollutionRequester(requestSettings); + } + + public HistoricalAirPollutionRequester historical() { + requestSettings.appendToURL("air_pollution/history"); + return new HistoricalAirPollutionRequester(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequesterImpl.java deleted file mode 100644 index 0faa6b3..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionRequesterImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.air.pollution.current.CurrentAirPollutionRequester; -import com.github.prominence.openweathermap.api.request.air.pollution.current.CurrentAirPollutionRequesterImpl; -import com.github.prominence.openweathermap.api.request.air.pollution.forecast.ForecastAirPollutionRequester; -import com.github.prominence.openweathermap.api.request.air.pollution.forecast.ForecastAirPollutionRequesterImpl; -import com.github.prominence.openweathermap.api.request.air.pollution.historical.HistoricalAirPollutionRequester; -import com.github.prominence.openweathermap.api.request.air.pollution.historical.HistoricalAirPollutionRequesterImpl; - -/** - * The type Air pollution requester. - */ -public class AirPollutionRequesterImpl implements AirPollutionRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Air pollution requester. - * - * @param apiKey the api key - */ - public AirPollutionRequesterImpl(String apiKey) { - urlBuilder = new RequestUrlBuilder(apiKey); - } - - @Override - public CurrentAirPollutionRequester current() { - urlBuilder.append("air_pollution"); - return new CurrentAirPollutionRequesterImpl(urlBuilder); - } - - @Override - public ForecastAirPollutionRequester forecast() { - urlBuilder.append("air_pollution/forecast"); - return new ForecastAirPollutionRequesterImpl(urlBuilder); - } - - @Override - public HistoricalAirPollutionRequester historical() { - urlBuilder.append("air_pollution/history"); - return new HistoricalAirPollutionRequesterImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/CurrentAirPollutionRequester.java similarity index 59% rename from src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequester.java rename to src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/CurrentAirPollutionRequester.java index f9ef4a4..7ab4630 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/CurrentAirPollutionRequester.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,20 +20,29 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.air.pollution.current; +package com.github.prominence.openweathermap.api.request.air.pollution; import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizer; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface Current air pollution requester. + * The type Current air pollution requester. */ -public interface CurrentAirPollutionRequester { +public class CurrentAirPollutionRequester { + private final RequestSettings requestSettings; + /** - * By coordinate current air pollution request customizer. + * Instantiates a new Current air pollution requester. * - * @param coordinate the coordinate - * @return the current air pollution request customizer + * @param requestSettings request settings object. */ - AirPollutionRequestCustomizer byCoordinate(Coordinate coordinate); + public CurrentAirPollutionRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public AirPollutionRequestCustomizer byCoordinate(Coordinate coordinate) { + requestSettings.putRequestParameter("lat", String.valueOf(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", String.valueOf(coordinate.getLongitude())); + return new AirPollutionRequestCustomizer(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/ForecastAirPollutionRequester.java similarity index 54% rename from src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequesterImpl.java rename to src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/ForecastAirPollutionRequester.java index 3da0121..0dfd06c 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequesterImpl.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/ForecastAirPollutionRequester.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,31 +20,29 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.onecall.current; +package com.github.prominence.openweathermap.api.request.air.pollution; import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The type One call current weather requester. + * The type Forecast air pollution requester. */ -public class OneCallCurrentWeatherRequesterImpl implements OneCallCurrentWeatherRequester { - private final RequestUrlBuilder urlBuilder; +public class ForecastAirPollutionRequester { + private final RequestSettings requestSettings; /** - * Instantiates a new One call current weather requester. + * Instantiates a new Forecast air pollution requester. * - * @param urlBuilder the url builder + * @param requestSettings request settings object. */ - public OneCallCurrentWeatherRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - urlBuilder.append("onecall"); + public ForecastAirPollutionRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; } - @Override - public OneCallCurrentWeatherRequestCustomizer byCoordinate(Coordinate coordinate) { - urlBuilder.addRequestParameter("lat", String.valueOf(coordinate.getLatitude())); - urlBuilder.addRequestParameter("lon", String.valueOf(coordinate.getLongitude())); - return new OneCallCurrentWeatherRequestCustomizerImpl(urlBuilder); + public AirPollutionRequestCustomizer byCoordinate(Coordinate coordinate) { + requestSettings.putRequestParameter("lat", String.valueOf(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", String.valueOf(coordinate.getLongitude())); + return new AirPollutionRequestCustomizer(requestSettings); } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/HistoricalAirPollutionRequester.java similarity index 51% rename from src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequesterImpl.java rename to src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/HistoricalAirPollutionRequester.java index 928b46a..506c8b2 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequesterImpl.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/HistoricalAirPollutionRequester.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Alexey Zinchenko + * Copyright (c) 2022 Alexey Zinchenko * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,32 +20,31 @@ * SOFTWARE. */ -package com.github.prominence.openweathermap.api.request.onecall.historical; +package com.github.prominence.openweathermap.api.request.air.pollution; import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The type One call historical weather requester. + * The type Historical air pollution requester. */ -public class OneCallHistoricalWeatherRequesterImpl implements OneCallHistoricalWeatherRequester { - private final RequestUrlBuilder urlBuilder; +public class HistoricalAirPollutionRequester { + private final RequestSettings requestSettings; /** - * Instantiates a new One call historical weather requester. + * Instantiates a new Historical air pollution requester. * - * @param urlBuilder the url builder + * @param requestSettings request settings object. */ - public OneCallHistoricalWeatherRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - urlBuilder.append("onecall/timemachine"); + public HistoricalAirPollutionRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; } - @Override - public OneCallHistoricalWeatherRequestCustomizer byCoordinateAndTimestamp(Coordinate coordinate, long unixTime) { - urlBuilder.addRequestParameter("lat", coordinate.getLatitude()); - urlBuilder.addRequestParameter("lon", coordinate.getLongitude()); - urlBuilder.addRequestParameter("dt", unixTime); - return new OneCallHistoricalWeatherRequestCustomizerImpl(urlBuilder); + public AirPollutionRequestCustomizer byCoordinateAndPeriod(Coordinate coordinate, long startUnixTime, long endUnixTime) { + requestSettings.putRequestParameter("lat", String.valueOf(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", String.valueOf(coordinate.getLongitude())); + requestSettings.putRequestParameter("start", String.valueOf(startUnixTime)); + requestSettings.putRequestParameter("end", String.valueOf(endUnixTime)); + return new AirPollutionRequestCustomizer(requestSettings); } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequesterImpl.java deleted file mode 100644 index 4b770a0..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/current/CurrentAirPollutionRequesterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution.current; - -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizer; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizerImpl; - -/** - * The type Current air pollution requester. - */ -public class CurrentAirPollutionRequesterImpl implements CurrentAirPollutionRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Current air pollution requester. - * - * @param urlBuilder the url builder - */ - public CurrentAirPollutionRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public AirPollutionRequestCustomizer byCoordinate(Coordinate coordinate) { - urlBuilder.addRequestParameter("lat", String.valueOf(coordinate.getLatitude())); - urlBuilder.addRequestParameter("lon", String.valueOf(coordinate.getLongitude())); - return new AirPollutionRequestCustomizerImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequester.java deleted file mode 100644 index 7dec255..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequester.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution.forecast; - -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizer; - -/** - * The interface Forecast air pollution requester. - */ -public interface ForecastAirPollutionRequester { - /** - * By coordinate forecast air pollution request customizer. - * - * @param coordinate the coordinate - * @return the forecast air pollution request customizer - */ - AirPollutionRequestCustomizer byCoordinate(Coordinate coordinate); -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequesterImpl.java deleted file mode 100644 index 87d5e37..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/forecast/ForecastAirPollutionRequesterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution.forecast; - -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizer; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizerImpl; - -/** - * The type Forecast air pollution requester. - */ -public class ForecastAirPollutionRequesterImpl implements ForecastAirPollutionRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Forecast air pollution requester. - * - * @param urlBuilder the url builder - */ - public ForecastAirPollutionRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public AirPollutionRequestCustomizer byCoordinate(Coordinate coordinate) { - urlBuilder.addRequestParameter("lat", String.valueOf(coordinate.getLatitude())); - urlBuilder.addRequestParameter("lon", String.valueOf(coordinate.getLongitude())); - return new AirPollutionRequestCustomizerImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequester.java deleted file mode 100644 index f06dc1d..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequester.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution.historical; - -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizer; - -/** - * The interface Historical air pollution requester. - */ -public interface HistoricalAirPollutionRequester { - /** - * By coordinate historical air pollution request customizer. - * - * @param coordinate the coordinate - * @param startUnixTime the start unix time - * @param endUnixTime the end unix time - * @return the historical air pollution request customizer - */ - AirPollutionRequestCustomizer byCoordinateAndPeriod(Coordinate coordinate, long startUnixTime, long endUnixTime); -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequesterImpl.java deleted file mode 100644 index 8ea1618..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/air/pollution/historical/HistoricalAirPollutionRequesterImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * * Copyright (c) 2021 Alexey Zinchenko - * * - * * Permission is hereby granted, free of charge, to any person obtaining a copy - * * of this software and associated documentation files (the "Software"), to deal - * * in the Software without restriction, including without limitation the rights - * * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * * copies of the Software, and to permit persons to whom the Software is - * * furnished to do so, subject to the following conditions: - * * - * * The above copyright notice and this permission notice shall be included in all - * * copies or substantial portions of the Software. - * * - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * * SOFTWARE. - * - */ - -package com.github.prominence.openweathermap.api.request.air.pollution.historical; - -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizer; -import com.github.prominence.openweathermap.api.request.air.pollution.AirPollutionRequestCustomizerImpl; - -/** - * The type Historical air pollution requester. - */ -public class HistoricalAirPollutionRequesterImpl implements HistoricalAirPollutionRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Historical air pollution requester. - * - * @param urlBuilder the url builder - */ - public HistoricalAirPollutionRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public AirPollutionRequestCustomizer byCoordinateAndPeriod(Coordinate coordinate, long startUnixTime, long endUnixTime) { - urlBuilder.addRequestParameter("lat", String.valueOf(coordinate.getLatitude())); - urlBuilder.addRequestParameter("lon", String.valueOf(coordinate.getLongitude())); - urlBuilder.addRequestParameter("start", String.valueOf(startUnixTime)); - urlBuilder.addRequestParameter("end", String.valueOf(endUnixTime)); - return new AirPollutionRequestCustomizerImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminator.java index a2eeb14..ea442dc 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminator.java @@ -22,21 +22,43 @@ package com.github.prominence.openweathermap.api.request.forecast.free; +import com.github.prominence.openweathermap.api.enums.ResponseType; +import com.github.prominence.openweathermap.api.mapper.FiveDayThreeHourStepForecastResponseMapper; import com.github.prominence.openweathermap.api.model.forecast.Forecast; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; import java.util.concurrent.CompletableFuture; - /** - * The forecast async request terminator interface. + * Async request terminator. */ -public interface FiveDayThreeHourStepForecastAsyncRequestTerminator extends AsyncRequestTerminator { +public class FiveDayThreeHourStepForecastAsyncRequestTerminator { + private final RequestSettings requestSettings; /** - * XML response format. + * Instantiates a new async request terminator. * - * @return the completable future + * @param requestSettings request settings object. */ - CompletableFuture asXML(); + FiveDayThreeHourStepForecastAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture asJava() { + return CompletableFuture.supplyAsync(() -> new FiveDayThreeHourStepForecastResponseMapper(requestSettings.getUnitSystem()).mapToForecast(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + public CompletableFuture asXML() { + requestSettings.setResponseType(ResponseType.XML); + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl.java deleted file mode 100644 index 8b333e3..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.forecast.free; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.forecast.Forecast; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.concurrent.CompletableFuture; - -/** - * Async request terminator. - */ -public class FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl implements FiveDayThreeHourStepForecastAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new async request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CompletableFuture asJava() { - return CompletableFuture.supplyAsync(() -> new FiveDayThreeHourStepForecastResponseMapper(unitSystem).mapToForecast(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - @Override - public CompletableFuture asXML() { - urlBuilder.addRequestParameter("mode", "xml"); - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizer.java index 1c2960b..33c4ea3 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizer.java @@ -22,31 +22,45 @@ package com.github.prominence.openweathermap.api.request.forecast.free; -import com.github.prominence.openweathermap.api.request.RequestCustomizer; +import com.github.prominence.openweathermap.api.enums.Language; +import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The forecast request customizer interface. + * The forecast request customizer. */ -public interface FiveDayThreeHourStepForecastRequestCustomizer extends RequestCustomizer { - /** - * Count customizer. - * - * @param numberOfTimestamps the number of timestamps - * @return forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer count(int numberOfTimestamps); +public class FiveDayThreeHourStepForecastRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve forecast request terminator. + * Instantiates a new forecast request customizer. * - * @return forecast request terminator + * @param requestSettings request settings object. */ - FiveDayThreeHourStepForecastRequestTerminator retrieve(); + FiveDayThreeHourStepForecastRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } - /** - * Retrieve forecast async request terminator. - * - * @return forecast async request terminator - */ - FiveDayThreeHourStepForecastAsyncRequestTerminator retrieveAsync(); + public FiveDayThreeHourStepForecastRequestCustomizer language(Language language) { + requestSettings.setLanguage(language); + return this; + } + + public FiveDayThreeHourStepForecastRequestCustomizer unitSystem(UnitSystem unitSystem) { + requestSettings.setUnitSystem(unitSystem); + return this; + } + + public FiveDayThreeHourStepForecastRequestCustomizer count(int numberOfTimestamps) { + requestSettings.putRequestParameter("cnt", Integer.toString(numberOfTimestamps)); + return this; + } + + public FiveDayThreeHourStepForecastRequestTerminator retrieve() { + return new FiveDayThreeHourStepForecastRequestTerminator(requestSettings); + } + + public FiveDayThreeHourStepForecastAsyncRequestTerminator retrieveAsync() { + return new FiveDayThreeHourStepForecastAsyncRequestTerminator(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizerImpl.java deleted file mode 100644 index 4e2fbae..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestCustomizerImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.forecast.free; - -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; - -/** - * The forecast request customizer. - */ -public class FiveDayThreeHourStepForecastRequestCustomizerImpl implements FiveDayThreeHourStepForecastRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - private Language language; - private UnitSystem unitSystem = UnitSystem.STANDARD; - private int count = -1; - - /** - * Instantiates a new forecast request customizer. - * - * @param urlBuilder the url builder - */ - FiveDayThreeHourStepForecastRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer language(Language language) { - this.language = language; - return this; - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer unitSystem(UnitSystem unitSystem) { - this.unitSystem = unitSystem; - return this; - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer count(int numberOfTimestamps) { - count = numberOfTimestamps; - return this; - } - - @Override - public FiveDayThreeHourStepForecastRequestTerminator retrieve() { - applyCustomization(); - return new FiveDayThreeHourStepForecastRequestTerminatorImpl(urlBuilder, unitSystem); - } - - @Override - public FiveDayThreeHourStepForecastAsyncRequestTerminator retrieveAsync() { - applyCustomization(); - return new FiveDayThreeHourStepForecastAsyncRequestTerminatorImpl(urlBuilder, unitSystem); - } - - private void applyCustomization() { - urlBuilder.applyCustomization(language, unitSystem); - if (count >= 0) { - urlBuilder.addRequestParameter("cnt", count); - } - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminator.java index 0f07243..16bcf76 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminator.java @@ -22,19 +22,41 @@ package com.github.prominence.openweathermap.api.request.forecast.free; +import com.github.prominence.openweathermap.api.enums.ResponseType; +import com.github.prominence.openweathermap.api.mapper.FiveDayThreeHourStepForecastResponseMapper; import com.github.prominence.openweathermap.api.model.forecast.Forecast; -import com.github.prominence.openweathermap.api.request.RequestTerminator; - +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; /** - * The forecast request terminator interface. + * The forecast request terminator. */ -public interface FiveDayThreeHourStepForecastRequestTerminator extends RequestTerminator { +public class FiveDayThreeHourStepForecastRequestTerminator { + private final RequestSettings requestSettings; /** - * XML response format. + * Instantiates a new forecast request terminator. * - * @return the XML string + * @param requestSettings request settings object. */ - String asXML(); + FiveDayThreeHourStepForecastRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public Forecast asJava() { + return new FiveDayThreeHourStepForecastResponseMapper(requestSettings.getUnitSystem()).mapToForecast(getRawResponse()); + } + + public String asJSON() { + return getRawResponse(); + } + + public String asXML() { + requestSettings.setResponseType(ResponseType.XML); + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminatorImpl.java deleted file mode 100644 index 5011467..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequestTerminatorImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.forecast.free; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.forecast.Forecast; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -/** - * The forecast request terminator. - */ -public class FiveDayThreeHourStepForecastRequestTerminatorImpl implements FiveDayThreeHourStepForecastRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new forecast request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - FiveDayThreeHourStepForecastRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public Forecast asJava() { - return new FiveDayThreeHourStepForecastResponseMapper(unitSystem).mapToForecast(getRawResponse()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - @Override - public String asXML() { - urlBuilder.addRequestParameter("mode", "xml"); - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequester.java index a19211f..54a829f 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequester.java @@ -23,69 +23,57 @@ package com.github.prominence.openweathermap.api.request.forecast.free; import com.github.prominence.openweathermap.api.model.Coordinate; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * An interface for API methods. + * The forecast requester. */ -public interface FiveDayThreeHourStepForecastRequester { +public class FiveDayThreeHourStepForecastRequester { + private final RequestSettings requestSettings; /** - * By city name forecast request customizer. + * Instantiates a new forecast requester. * - * @param cityName the city name - * @return the forecast request customizer + * @param requestSettings request settings object. */ - FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName); + public FiveDayThreeHourStepForecastRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + this.requestSettings.appendToURL("forecast"); + } - /** - * By city name forecast request customizer. - * - * @param cityName the city name - * @param stateCode the state code - * @return the forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName, String stateCode); + public FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName) { + requestSettings.putRequestParameter("q", cityName); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } - /** - * By city name forecast request customizer. - * - * @param cityName the city name - * @param stateCode the state code - * @param countryCode the country code - * @return the forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName, String stateCode, String countryCode); + public FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName, String stateCode) { + requestSettings.putRequestParameter("q", cityName + "," + stateCode); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } - /** - * By city id forecast request customizer. - * - * @param cityId the city id - * @return the forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer byCityId(long cityId); + public FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName, String stateCode, String countryCode) { + requestSettings.putRequestParameter("q", cityName + "," + stateCode + "," + countryCode); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } - /** - * By coordinate forecast request customizer. - * - * @param coordinate the coordinate - * @return the forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer byCoordinate(Coordinate coordinate); + public FiveDayThreeHourStepForecastRequestCustomizer byCityId(long cityId) { + requestSettings.putRequestParameter("id", Long.toString(cityId)); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } - /** - * By zip code and country forecast request customizer. - * - * @param zipCode the zip code - * @param countryCode the country code - * @return the forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer byZipCodeAndCountry(String zipCode, String countryCode); + public FiveDayThreeHourStepForecastRequestCustomizer byCoordinate(Coordinate coordinate) { + requestSettings.putRequestParameter("lat", String.valueOf(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", String.valueOf(coordinate.getLongitude())); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } - /** - * By zip code in USA forecast request customizer. - * - * @param zipCode the zip code - * @return the forecast request customizer - */ - FiveDayThreeHourStepForecastRequestCustomizer byZipCodeInUSA(String zipCode); + public FiveDayThreeHourStepForecastRequestCustomizer byZipCodeAndCountry(String zipCode, String countryCode) { + requestSettings.putRequestParameter("zip", zipCode + "," + countryCode); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } + + public FiveDayThreeHourStepForecastRequestCustomizer byZipCodeInUSA(String zipCode) { + requestSettings.putRequestParameter("zip", zipCode); + return new FiveDayThreeHourStepForecastRequestCustomizer(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequesterImpl.java deleted file mode 100644 index b5a87f2..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastRequesterImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.forecast.free; - -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; - -/** - * The forecast requester. - */ -public class FiveDayThreeHourStepForecastRequesterImpl implements FiveDayThreeHourStepForecastRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new forecast requester. - * - * @param apiKey the api key - */ - public FiveDayThreeHourStepForecastRequesterImpl(String apiKey) { - urlBuilder = new RequestUrlBuilder(apiKey); - urlBuilder.append("forecast"); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName) { - urlBuilder.addRequestParameter("q", cityName); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName, String stateCode) { - urlBuilder.addRequestParameter("q", cityName + "," + stateCode); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byCityName(String cityName, String stateCode, String countryCode) { - urlBuilder.addRequestParameter("q", cityName + "," + stateCode + "," + countryCode); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byCityId(long cityId) { - urlBuilder.addRequestParameter("id", cityId); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byCoordinate(Coordinate coordinate) { - urlBuilder.addRequestParameter("lat", String.valueOf(coordinate.getLatitude())); - urlBuilder.addRequestParameter("lon", String.valueOf(coordinate.getLongitude())); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byZipCodeAndCountry(String zipCode, String countryCode) { - urlBuilder.addRequestParameter("zip", zipCode + "," + countryCode); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } - - @Override - public FiveDayThreeHourStepForecastRequestCustomizer byZipCodeInUSA(String zipCode) { - urlBuilder.addRequestParameter("zip", zipCode); - return new FiveDayThreeHourStepForecastRequestCustomizerImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequester.java index 2b58177..9440d15 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequester.java @@ -22,24 +22,30 @@ package com.github.prominence.openweathermap.api.request.onecall; +import com.github.prominence.openweathermap.api.request.RequestSettings; import com.github.prominence.openweathermap.api.request.onecall.current.OneCallCurrentWeatherRequester; import com.github.prominence.openweathermap.api.request.onecall.historical.OneCallHistoricalWeatherRequester; /** - * The interface One call weather requester. + * The type One call weather requester. */ -public interface OneCallWeatherRequester { - /** - * Current one call current weather requester. - * - * @return the one call current weather requester - */ - OneCallCurrentWeatherRequester current(); +public class OneCallWeatherRequester { + private final RequestSettings requestSettings; /** - * Historical one call historical weather requester. + * Instantiates a new One call weather requester. * - * @return the one call historical weather requester + * @param requestSettings request settings object. */ - OneCallHistoricalWeatherRequester historical(); + public OneCallWeatherRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public OneCallCurrentWeatherRequester current() { + return new OneCallCurrentWeatherRequester(requestSettings); + } + + public OneCallHistoricalWeatherRequester historical() { + return new OneCallHistoricalWeatherRequester(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequesterImpl.java deleted file mode 100644 index d0dddb1..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherRequesterImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.onecall.current.OneCallCurrentWeatherRequester; -import com.github.prominence.openweathermap.api.request.onecall.current.OneCallCurrentWeatherRequesterImpl; -import com.github.prominence.openweathermap.api.request.onecall.historical.OneCallHistoricalWeatherRequester; -import com.github.prominence.openweathermap.api.request.onecall.historical.OneCallHistoricalWeatherRequesterImpl; - -/** - * The type One call weather requester. - */ -public class OneCallWeatherRequesterImpl implements OneCallWeatherRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new One call weather requester. - * - * @param apiKey the api key - */ - public OneCallWeatherRequesterImpl(String apiKey) { - urlBuilder = new RequestUrlBuilder(apiKey); - } - - @Override - public OneCallCurrentWeatherRequester current() { - return new OneCallCurrentWeatherRequesterImpl(urlBuilder); - } - - @Override - public OneCallHistoricalWeatherRequester historical() { - return new OneCallHistoricalWeatherRequesterImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminator.java index 63811e5..d2acb66 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminator.java @@ -22,11 +22,37 @@ package com.github.prominence.openweathermap.api.request.onecall.current; +import com.github.prominence.openweathermap.api.mapper.OneCallWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.onecall.current.CurrentWeatherData; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; + +import java.util.concurrent.CompletableFuture; /** - * The interface One call current weather async request terminator. + * The type One call current weather async request terminator. */ -public interface OneCallCurrentWeatherAsyncRequestTerminator extends AsyncRequestTerminator { +public class OneCallCurrentWeatherAsyncRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new One call current weather async request terminator. + * + * @param requestSettings request settings object. + */ + OneCallCurrentWeatherAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture asJava() { + return CompletableFuture.supplyAsync(() -> new OneCallWeatherResponseMapper(requestSettings.getUnitSystem()).mapToCurrent(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminatorImpl.java deleted file mode 100644 index da2dd81..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall.current; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.onecall.current.CurrentWeatherData; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.onecall.OneCallWeatherResponseMapper; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.concurrent.CompletableFuture; - -/** - * The type One call current weather async request terminator. - */ -public class OneCallCurrentWeatherAsyncRequestTerminatorImpl implements OneCallCurrentWeatherAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new One call current weather async request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - OneCallCurrentWeatherAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CompletableFuture asJava() { - return CompletableFuture.supplyAsync(() -> new OneCallWeatherResponseMapper(unitSystem).mapToCurrent(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizer.java index 33143c4..7ed9b7c 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizer.java @@ -22,32 +22,53 @@ package com.github.prominence.openweathermap.api.request.onecall.current; +import com.github.prominence.openweathermap.api.enums.Language; import com.github.prominence.openweathermap.api.enums.OneCallResultOptions; -import com.github.prominence.openweathermap.api.request.RequestCustomizer; +import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.request.RequestSettings; + +import java.util.stream.Collectors; +import java.util.stream.Stream; /** - * The interface One call current weather request customizer. + * The type One call current weather request customizer. */ -public interface OneCallCurrentWeatherRequestCustomizer extends RequestCustomizer { - /** - * Exclude one call current weather request customizer. - * - * @param excludeOptions the exclude options - * @return the one call current weather request customizer - */ - OneCallCurrentWeatherRequestCustomizer exclude(OneCallResultOptions... excludeOptions); +public class OneCallCurrentWeatherRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve one call current weather request terminator. + * Instantiates a new One call current weather request customizer. * - * @return the one call current weather request terminator + * @param requestSettings request settings object. */ - OneCallCurrentWeatherRequestTerminator retrieve(); + OneCallCurrentWeatherRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } - /** - * Retrieve async one call current weather async request terminator. - * - * @return the one call current weather async request terminator - */ - OneCallCurrentWeatherAsyncRequestTerminator retrieveAsync(); + public OneCallCurrentWeatherRequestCustomizer language(Language language) { + requestSettings.setLanguage(language); + return this; + } + + public OneCallCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { + this.requestSettings.setUnitSystem(unitSystem); + return this; + } + + public OneCallCurrentWeatherRequestCustomizer exclude(OneCallResultOptions... excludeOptions) { + if (excludeOptions != null && excludeOptions.length > 0) { + requestSettings.putRequestParameter("exclude", Stream.of(excludeOptions).map(OneCallResultOptions::getValue).collect(Collectors.joining(","))); + } else { + requestSettings.removeRequestParameter("exclude"); + } + return this; + } + + public OneCallCurrentWeatherRequestTerminator retrieve() { + return new OneCallCurrentWeatherRequestTerminator(requestSettings); + } + + public OneCallCurrentWeatherAsyncRequestTerminator retrieveAsync() { + return new OneCallCurrentWeatherAsyncRequestTerminator(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizerImpl.java deleted file mode 100644 index a55636a..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestCustomizerImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall.current; - -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.OneCallResultOptions; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; - -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * The type One call current weather request customizer. - */ -public class OneCallCurrentWeatherRequestCustomizerImpl implements OneCallCurrentWeatherRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - private Language language; - private UnitSystem unitSystem = UnitSystem.STANDARD; - private OneCallResultOptions[] excludeOptions; - - /** - * Instantiates a new One call current weather request customizer. - * - * @param urlBuilder the url builder - */ - OneCallCurrentWeatherRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public OneCallCurrentWeatherRequestCustomizer language(Language language) { - this.language = language; - return this; - } - - @Override - public OneCallCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { - this.unitSystem = unitSystem; - return this; - } - - @Override - public OneCallCurrentWeatherRequestCustomizer exclude(OneCallResultOptions... excludeOptions) { - this.excludeOptions = excludeOptions; - return this; - } - - @Override - public OneCallCurrentWeatherRequestTerminator retrieve() { - applyCustomization(); - return new OneCallCurrentWeatherRequestTerminatorImpl(urlBuilder, unitSystem); - } - - @Override - public OneCallCurrentWeatherAsyncRequestTerminator retrieveAsync() { - applyCustomization(); - return new OneCallCurrentWeatherAsyncRequestTerminatorImpl(urlBuilder, unitSystem); - } - - private void applyCustomization() { - urlBuilder.applyCustomization(language, unitSystem); - if (excludeOptions != null) { - urlBuilder.addRequestParameter("exclude", Stream.of(excludeOptions).map(OneCallResultOptions::getValue).collect(Collectors.joining(","))); - } - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminator.java index a23d3b1..9cf97ee 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminator.java @@ -22,12 +22,35 @@ package com.github.prominence.openweathermap.api.request.onecall.current; +import com.github.prominence.openweathermap.api.mapper.OneCallWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.onecall.current.CurrentWeatherData; -import com.github.prominence.openweathermap.api.request.RequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; /** - * The interface One call current weather request terminator. + * The type One call current weather request terminator. */ -public interface OneCallCurrentWeatherRequestTerminator extends RequestTerminator { +public class OneCallCurrentWeatherRequestTerminator { + private final RequestSettings requestSettings; + /** + * Instantiates a new One call current weather request terminator. + * + * @param requestSettings request settings object. + */ + OneCallCurrentWeatherRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CurrentWeatherData asJava() { + return new OneCallWeatherResponseMapper(requestSettings.getUnitSystem()).mapToCurrent(getRawResponse()); + } + + public String asJSON() { + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminatorImpl.java deleted file mode 100644 index a2ea7c7..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequestTerminatorImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall.current; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.onecall.current.CurrentWeatherData; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.onecall.OneCallWeatherResponseMapper; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -/** - * The type One call current weather request terminator. - */ -public class OneCallCurrentWeatherRequestTerminatorImpl implements OneCallCurrentWeatherRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new One call current weather request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - OneCallCurrentWeatherRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CurrentWeatherData asJava() { - return new OneCallWeatherResponseMapper(unitSystem).mapToCurrent(getRawResponse()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequester.java index edc40ec..e756bb9 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/current/OneCallCurrentWeatherRequester.java @@ -23,16 +23,27 @@ package com.github.prominence.openweathermap.api.request.onecall.current; import com.github.prominence.openweathermap.api.model.Coordinate; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface One call current weather requester. + * The type One call current weather requester. */ -public interface OneCallCurrentWeatherRequester { +public class OneCallCurrentWeatherRequester { + private final RequestSettings requestSettings; + /** - * By coordinate one call current weather request customizer. + * Instantiates a new One call current weather requester. * - * @param coordinate the coordinate - * @return the one call current weather request customizer + * @param requestSettings request settings object. */ - OneCallCurrentWeatherRequestCustomizer byCoordinate(Coordinate coordinate); + public OneCallCurrentWeatherRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + this.requestSettings.appendToURL("onecall"); + } + + public OneCallCurrentWeatherRequestCustomizer byCoordinate(Coordinate coordinate) { + requestSettings.putRequestParameter("lat", String.valueOf(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", String.valueOf(coordinate.getLongitude())); + return new OneCallCurrentWeatherRequestCustomizer(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminator.java index 7984522..d17ea54 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminator.java @@ -22,11 +22,37 @@ package com.github.prominence.openweathermap.api.request.onecall.historical; +import com.github.prominence.openweathermap.api.mapper.OneCallWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.onecall.historical.HistoricalWeatherData; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; + +import java.util.concurrent.CompletableFuture; /** - * The interface One call historical weather async request terminator. + * The type One call historical weather async request terminator. */ -public interface OneCallHistoricalWeatherAsyncRequestTerminator extends AsyncRequestTerminator { +public class OneCallHistoricalWeatherAsyncRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new One call historical weather async request terminator. + * + * @param requestSettings request settings object. + */ + public OneCallHistoricalWeatherAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture asJava() { + return CompletableFuture.supplyAsync(() -> new OneCallWeatherResponseMapper(requestSettings.getUnitSystem()).mapToHistorical(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminatorImpl.java deleted file mode 100644 index e2dc671..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall.historical; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.onecall.historical.HistoricalWeatherData; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.onecall.OneCallWeatherResponseMapper; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.concurrent.CompletableFuture; - -/** - * The type One call historical weather async request terminator. - */ -public class OneCallHistoricalWeatherAsyncRequestTerminatorImpl implements OneCallHistoricalWeatherAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new One call historical weather async request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - public OneCallHistoricalWeatherAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CompletableFuture asJava() { - return CompletableFuture.supplyAsync(() -> new OneCallWeatherResponseMapper(unitSystem).mapToHistorical(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizer.java index 57ce89f..47b978d 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizer.java @@ -22,23 +22,40 @@ package com.github.prominence.openweathermap.api.request.onecall.historical; -import com.github.prominence.openweathermap.api.request.RequestCustomizer; +import com.github.prominence.openweathermap.api.enums.Language; +import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface One call historical weather request customizer. + * The type One call historical weather request customizer. */ -public interface OneCallHistoricalWeatherRequestCustomizer extends RequestCustomizer { - /** - * Retrieve one call historical weather request terminator. - * - * @return the one call historical weather request terminator - */ - OneCallHistoricalWeatherRequestTerminator retrieve(); +public class OneCallHistoricalWeatherRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve async one call historical weather async request terminator. + * Instantiates a new One call historical weather request customizer. * - * @return the one call historical weather async request terminator + * @param requestSettings request settings object. */ - OneCallHistoricalWeatherAsyncRequestTerminator retrieveAsync(); + public OneCallHistoricalWeatherRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public OneCallHistoricalWeatherRequestCustomizer language(Language language) { + requestSettings.setLanguage(language); + return this; + } + + public OneCallHistoricalWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { + requestSettings.setUnitSystem(unitSystem); + return this; + } + + public OneCallHistoricalWeatherRequestTerminator retrieve() { + return new OneCallHistoricalWeatherRequestTerminator(requestSettings); + } + + public OneCallHistoricalWeatherAsyncRequestTerminator retrieveAsync() { + return new OneCallHistoricalWeatherAsyncRequestTerminator(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizerImpl.java deleted file mode 100644 index f6b109f..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestCustomizerImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall.historical; - -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; - -/** - * The type One call historical weather request customizer. - */ -public class OneCallHistoricalWeatherRequestCustomizerImpl implements OneCallHistoricalWeatherRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - private Language language; - private UnitSystem unitSystem = UnitSystem.STANDARD; - - /** - * Instantiates a new One call historical weather request customizer. - * - * @param urlBuilder the url builder - */ - public OneCallHistoricalWeatherRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public OneCallHistoricalWeatherRequestCustomizer language(Language language) { - this.language = language; - return this; - } - - @Override - public OneCallHistoricalWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { - this.unitSystem = unitSystem; - return this; - } - - @Override - public OneCallHistoricalWeatherRequestTerminator retrieve() { - urlBuilder.applyCustomization(language, unitSystem); - return new OneCallHistoricalWeatherRequestTerminatorImpl(urlBuilder, unitSystem); - } - - @Override - public OneCallHistoricalWeatherAsyncRequestTerminator retrieveAsync() { - urlBuilder.applyCustomization(language, unitSystem); - return new OneCallHistoricalWeatherAsyncRequestTerminatorImpl(urlBuilder, unitSystem); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminator.java index 5ab6405..7c89d9d 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminator.java @@ -22,11 +22,35 @@ package com.github.prominence.openweathermap.api.request.onecall.historical; +import com.github.prominence.openweathermap.api.mapper.OneCallWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.onecall.historical.HistoricalWeatherData; -import com.github.prominence.openweathermap.api.request.RequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.utils.RequestUtils; /** - * The interface One call historical weather request terminator. + * The type One call historical weather request terminator. */ -public interface OneCallHistoricalWeatherRequestTerminator extends RequestTerminator { +public class OneCallHistoricalWeatherRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new One call historical weather request terminator. + * + * @param requestSettings request settings object. + */ + public OneCallHistoricalWeatherRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public HistoricalWeatherData asJava() { + return new OneCallWeatherResponseMapper(requestSettings.getUnitSystem()).mapToHistorical(getRawResponse()); + } + + public String asJSON() { + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminatorImpl.java deleted file mode 100644 index 56a6c72..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequestTerminatorImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.onecall.historical; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.onecall.historical.HistoricalWeatherData; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.onecall.OneCallWeatherResponseMapper; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -/** - * The type One call historical weather request terminator. - */ -public class OneCallHistoricalWeatherRequestTerminatorImpl implements OneCallHistoricalWeatherRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new One call historical weather request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - public OneCallHistoricalWeatherRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public HistoricalWeatherData asJava() { - return new OneCallWeatherResponseMapper(unitSystem).mapToHistorical(getRawResponse()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequester.java index 6cb4849..17a6c95 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/onecall/historical/OneCallHistoricalWeatherRequester.java @@ -23,17 +23,28 @@ package com.github.prominence.openweathermap.api.request.onecall.historical; import com.github.prominence.openweathermap.api.model.Coordinate; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface One call historical weather requester. + * The type One call historical weather requester. */ -public interface OneCallHistoricalWeatherRequester { +public class OneCallHistoricalWeatherRequester { + private final RequestSettings requestSettings; + /** - * By coordinate and timestamp one call historical weather request customizer. + * Instantiates a new One call historical weather requester. * - * @param coordinate the coordinate - * @param unixTime the unix time - * @return the one call historical weather request customizer + * @param requestSettings request settings object. */ - OneCallHistoricalWeatherRequestCustomizer byCoordinateAndTimestamp(Coordinate coordinate, long unixTime); + public OneCallHistoricalWeatherRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + this.requestSettings.appendToURL("onecall/timemachine"); + } + + public OneCallHistoricalWeatherRequestCustomizer byCoordinateAndTimestamp(Coordinate coordinate, long unixTime) { + requestSettings.putRequestParameter("lat", Double.toString(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", Double.toString(coordinate.getLongitude())); + requestSettings.putRequestParameter("dt", Long.toString(unixTime)); + return new OneCallHistoricalWeatherRequestCustomizer(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequester.java index 9c459d4..c56babd 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequester.java @@ -22,25 +22,30 @@ package com.github.prominence.openweathermap.api.request.weather; +import com.github.prominence.openweathermap.api.request.RequestSettings; import com.github.prominence.openweathermap.api.request.weather.multiple.MultipleLocationsCurrentWeatherRequester; import com.github.prominence.openweathermap.api.request.weather.single.SingleLocationCurrentWeatherRequester; /** - * An interface for API methods. + * The type Current weather requester. */ -public interface CurrentWeatherRequester { +public class CurrentWeatherRequester { + private final RequestSettings requestSettings; /** - * Single location current weather requester. + * Instantiates a new Current weather requester. * - * @return the single location current weather requester + * @param requestSettings request settings object. */ - SingleLocationCurrentWeatherRequester single(); + public CurrentWeatherRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } - /** - * Multiple locations current weather requester. - * - * @return the multiple locations current weather requester - */ - MultipleLocationsCurrentWeatherRequester multiple(); + public SingleLocationCurrentWeatherRequester single() { + return new SingleLocationCurrentWeatherRequester(requestSettings); + } + + public MultipleLocationsCurrentWeatherRequester multiple() { + return new MultipleLocationsCurrentWeatherRequester(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequesterImpl.java deleted file mode 100644 index 0b393d6..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherRequesterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.multiple.MultipleLocationsCurrentWeatherRequesterImpl; -import com.github.prominence.openweathermap.api.request.weather.multiple.MultipleLocationsCurrentWeatherRequester; -import com.github.prominence.openweathermap.api.request.weather.single.SingleLocationCurrentWeatherRequesterImpl; -import com.github.prominence.openweathermap.api.request.weather.single.SingleLocationCurrentWeatherRequester; - -/** - * The type Current weather requester. - */ -public class CurrentWeatherRequesterImpl implements CurrentWeatherRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Current weather requester. - * - * @param apiKey the api key - */ - public CurrentWeatherRequesterImpl(String apiKey) { - urlBuilder = new RequestUrlBuilder(apiKey); - } - - public SingleLocationCurrentWeatherRequester single() { - return new SingleLocationCurrentWeatherRequesterImpl(urlBuilder); - } - - public MultipleLocationsCurrentWeatherRequester multiple() { - return new MultipleLocationsCurrentWeatherRequesterImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequester.java index 291674e..724ddbc 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequester.java @@ -24,36 +24,45 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; import com.github.prominence.openweathermap.api.model.Coordinate; import com.github.prominence.openweathermap.api.model.CoordinateRectangle; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface Multiple locations current weather requester. + * The type Multiple locations current weather requester. */ -public interface MultipleLocationsCurrentWeatherRequester { +public class MultipleLocationsCurrentWeatherRequester { + private final RequestSettings requestSettings; /** - * By rectangle multiple result current weather request customizer. + * Instantiates a new Multiple locations current weather requester. * - * @param rectangle the rectangle - * @param zoom the zoom - * @return the multiple result current weather request customizer + * @param requestSettings request settings object. */ - MultipleResultCurrentWeatherRequestCustomizer byRectangle(CoordinateRectangle rectangle, int zoom); + public MultipleLocationsCurrentWeatherRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } - /** - * By cities in cycle multiple result current weather request customizer. - * - * @param point the point - * @return the multiple result cities in circle current weather request customizer - */ - MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer byCitiesInCycle(Coordinate point); + public MultipleResultCurrentWeatherRequestCustomizer byRectangle(CoordinateRectangle rectangle, int zoom) { + String coordinates = rectangle.getFormattedRequestString() + "," + zoom; + requestSettings.appendToURL("box/city"); + requestSettings.putRequestParameter("bbox", coordinates); - /** - * By cities in cycle multiple result current weather request customizer. - * - * @param point the point - * @param citiesCount the cities count - * @return the multiple result cities in circle current weather request customizer - */ - MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer byCitiesInCycle(Coordinate point, int citiesCount); + return new MultipleResultCurrentWeatherRequestCustomizer(requestSettings); + } + public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer byCitiesInCycle(Coordinate point, int citiesCount) { + requestSettings.appendToURL("find"); + requestSettings.putRequestParameter("lat", Double.toString(point.getLatitude())); + requestSettings.putRequestParameter("lon", Double.toString(point.getLongitude())); + requestSettings.putRequestParameter("cnt", Integer.toString(citiesCount)); + + return new MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer(requestSettings); + } + + public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer byCitiesInCycle(Coordinate point) { + requestSettings.appendToURL("find"); + requestSettings.putRequestParameter("lat", Double.toString(point.getLatitude())); + requestSettings.putRequestParameter("lon", Double.toString(point.getLongitude())); + + return new MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequesterImpl.java deleted file mode 100644 index ba105cd..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleLocationsCurrentWeatherRequesterImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.model.Coordinate; -import com.github.prominence.openweathermap.api.model.CoordinateRectangle; - -/** - * The type Multiple locations current weather requester. - */ -public class MultipleLocationsCurrentWeatherRequesterImpl implements MultipleLocationsCurrentWeatherRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Multiple locations current weather requester. - * - * @param urlBuilder the url builder - */ - public MultipleLocationsCurrentWeatherRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public MultipleResultCurrentWeatherRequestCustomizer byRectangle(CoordinateRectangle rectangle, int zoom) { - String coordinates = rectangle.getFormattedRequestString() + "," + zoom; - urlBuilder.append("box/city"); - urlBuilder.addRequestParameter("bbox", coordinates); - - return new MultipleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - @Override - public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer byCitiesInCycle(Coordinate point, int citiesCount) { - urlBuilder.append("find"); - urlBuilder.addRequestParameter("lat", Double.toString(point.getLatitude())); - urlBuilder.addRequestParameter("lon", Double.toString(point.getLongitude())); - urlBuilder.addRequestParameter("cnt", Integer.toString(citiesCount)); - - return new MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - @Override - public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer byCitiesInCycle(Coordinate point) { - urlBuilder.append("find"); - urlBuilder.addRequestParameter("lat", Double.toString(point.getLatitude())); - urlBuilder.addRequestParameter("lon", Double.toString(point.getLongitude())); - - return new MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator.java index 31905d1..bd32b97 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator.java @@ -22,20 +22,44 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; +import com.github.prominence.openweathermap.api.enums.ResponseType; import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; +import com.github.prominence.openweathermap.api.utils.RequestUtils; import java.util.List; import java.util.concurrent.CompletableFuture; /** - * The interface Multiple result current weather async request terminator. + * The type Multiple result current weather async request terminator. */ -public interface MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator extends AsyncRequestTerminator, String> { +public class MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator { + private final RequestSettings requestSettings; + /** - * XML response format. + * Instantiates a new Multiple result current weather async request terminator. * - * @return the completable future + * @param requestSettings request settings object. */ - CompletableFuture asXML(); + MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture> asJava() { + return CompletableFuture.supplyAsync(() -> new CurrentWeatherResponseMapper(requestSettings.getUnitSystem()).getList(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + public CompletableFuture asXML() { + requestSettings.setResponseType(ResponseType.XML); + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl.java deleted file mode 100644 index 189cfb3..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherResponseMapper; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -/** - * The type Multiple result current weather async request terminator. - */ -public class MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl implements MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new Multiple result current weather async request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CompletableFuture> asJava() { - return CompletableFuture.supplyAsync(() -> new CurrentWeatherResponseMapper(unitSystem).getList(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - @Override - public CompletableFuture asXML() { - urlBuilder.addRequestParameter("mode", "xml"); - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer.java index 336b04c..d9663c9 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer.java @@ -22,23 +22,40 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; -import com.github.prominence.openweathermap.api.request.RequestCustomizer; +import com.github.prominence.openweathermap.api.enums.Language; +import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface Multiple result current weather request customizer. + * The type Multiple result current weather request customizer. */ -public interface MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer extends RequestCustomizer { - /** - * Retrieve multiple result current weather request terminator. - * - * @return the multiple result current weather request terminator - */ - MultipleResultCitiesInCircleCurrentWeatherRequestTerminator retrieve(); +public class MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve async multiple result current weather async request terminator. + * Instantiates a new Multiple result current weather request customizer. * - * @return the multiple result current weather async request terminator + * @param requestSettings request settings object. */ - MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator retrieveAsync(); -} + MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer language(Language language) { + requestSettings.setLanguage(language); + return this; + } + + public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { + requestSettings.setUnitSystem(unitSystem); + return this; + } + + public MultipleResultCitiesInCircleCurrentWeatherRequestTerminator retrieve() { + return new MultipleResultCitiesInCircleCurrentWeatherRequestTerminator(requestSettings); + } + + public MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator retrieveAsync() { + return new MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator(requestSettings); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl.java deleted file mode 100644 index b753f5d..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; - -/** - * The type Multiple result current weather request customizer. - */ -public class MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl implements MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - private Language language; - private UnitSystem unitSystem = UnitSystem.STANDARD; - - /** - * Instantiates a new Multiple result current weather request customizer. - * - * @param urlBuilder the url builder - */ - MultipleResultCitiesInCircleCurrentWeatherRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer language(Language language) { - this.language = language; - return this; - } - - @Override - public MultipleResultCitiesInCircleCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { - this.unitSystem = unitSystem; - return this; - } - - @Override - public MultipleResultCitiesInCircleCurrentWeatherRequestTerminator retrieve() { - urlBuilder.applyCustomization(language, unitSystem); - return new MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl(urlBuilder, unitSystem); - } - - @Override - public MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminator retrieveAsync() { - urlBuilder.applyCustomization(language, unitSystem); - return new MultipleResultCitiesInCircleCurrentWeatherAsyncRequestTerminatorImpl(urlBuilder, unitSystem); - } -} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminator.java index dcd1905..6341bf1 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminator.java @@ -22,19 +22,43 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; +import com.github.prominence.openweathermap.api.enums.ResponseType; import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.RequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; +import com.github.prominence.openweathermap.api.utils.RequestUtils; import java.util.List; /** - * The interface Multiple result current weather request terminator. + * The type Multiple result current weather request terminator. */ -public interface MultipleResultCitiesInCircleCurrentWeatherRequestTerminator extends RequestTerminator, String> { +public class MultipleResultCitiesInCircleCurrentWeatherRequestTerminator { + private final RequestSettings requestSettings; + /** - * XML response format. + * Instantiates a new Multiple result current weather request terminator. * - * @return the XML string + * @param requestSettings request settings object. */ - String asXML(); + MultipleResultCitiesInCircleCurrentWeatherRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public List asJava() { + return new CurrentWeatherResponseMapper(requestSettings.getUnitSystem()).getList(getRawResponse()); + } + + public String asJSON() { + return getRawResponse(); + } + + public String asXML() { + requestSettings.setResponseType(ResponseType.XML); + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl.java deleted file mode 100644 index 7e482a2..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherResponseMapper; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.List; - -/** - * The type Multiple result current weather request terminator. - */ -public class MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl implements MultipleResultCitiesInCircleCurrentWeatherRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new Multiple result current weather request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - MultipleResultCitiesInCircleCurrentWeatherRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public List asJava() { - return new CurrentWeatherResponseMapper(unitSystem).getList(getRawResponse()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - @Override - public String asXML() { - urlBuilder.addRequestParameter("mode", "xml"); - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminator.java index 6374a96..3b74133 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminator.java @@ -23,12 +23,37 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; +import com.github.prominence.openweathermap.api.utils.RequestUtils; import java.util.List; +import java.util.concurrent.CompletableFuture; /** - * The interface Multiple result current weather async request terminator. + * The type Multiple result current weather async request terminator. */ -public interface MultipleResultCurrentWeatherAsyncRequestTerminator extends AsyncRequestTerminator, String> { +public class MultipleResultCurrentWeatherAsyncRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new Multiple result current weather async request terminator. + * + * @param requestSettings request settings object. + */ + MultipleResultCurrentWeatherAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture> asJava() { + return CompletableFuture.supplyAsync(() -> new CurrentWeatherResponseMapper(requestSettings.getUnitSystem()).getList(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminatorImpl.java deleted file mode 100644 index e34c195..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherResponseMapper; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -/** - * The type Multiple result current weather async request terminator. - */ -public class MultipleResultCurrentWeatherAsyncRequestTerminatorImpl implements MultipleResultCurrentWeatherAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new Multiple result current weather async request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - MultipleResultCurrentWeatherAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CompletableFuture> asJava() { - return CompletableFuture.supplyAsync(() -> new CurrentWeatherResponseMapper(unitSystem).getList(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizer.java index 651e413..522bcd9 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizer.java @@ -22,23 +22,40 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; -import com.github.prominence.openweathermap.api.request.RequestCustomizer; +import com.github.prominence.openweathermap.api.enums.Language; +import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface Multiple result current weather request customizer. + * The type Multiple result current weather request customizer. */ -public interface MultipleResultCurrentWeatherRequestCustomizer extends RequestCustomizer { - /** - * Retrieve multiple result current weather request terminator. - * - * @return the multiple result current weather request terminator - */ - MultipleResultCurrentWeatherRequestTerminator retrieve(); +public class MultipleResultCurrentWeatherRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve async multiple result current weather async request terminator. + * Instantiates a new Multiple result current weather request customizer. * - * @return the multiple result current weather async request terminator + * @param requestSettings request settings object. */ - MultipleResultCurrentWeatherAsyncRequestTerminator retrieveAsync(); -} + MultipleResultCurrentWeatherRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public MultipleResultCurrentWeatherRequestCustomizer language(Language language) { + requestSettings.setLanguage(language); + return this; + } + + public MultipleResultCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { + requestSettings.setUnitSystem(unitSystem); + return this; + } + + public MultipleResultCurrentWeatherRequestTerminator retrieve() { + return new MultipleResultCurrentWeatherRequestTerminator(requestSettings); + } + + public MultipleResultCurrentWeatherAsyncRequestTerminator retrieveAsync() { + return new MultipleResultCurrentWeatherAsyncRequestTerminator(requestSettings); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizerImpl.java deleted file mode 100644 index 78d14f8..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestCustomizerImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; - -/** - * The type Multiple result current weather request customizer. - */ -public class MultipleResultCurrentWeatherRequestCustomizerImpl implements MultipleResultCurrentWeatherRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - private Language language; - private UnitSystem unitSystem = UnitSystem.STANDARD; - - /** - * Instantiates a new Multiple result current weather request customizer. - * - * @param urlBuilder the url builder - */ - MultipleResultCurrentWeatherRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public MultipleResultCurrentWeatherRequestCustomizer language(Language language) { - this.language = language; - return this; - } - - @Override - public MultipleResultCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { - this.unitSystem = unitSystem; - return this; - } - - @Override - public MultipleResultCurrentWeatherRequestTerminator retrieve() { - urlBuilder.applyCustomization(language, unitSystem); - return new MultipleResultCurrentWeatherRequestTerminatorImpl(urlBuilder, unitSystem); - } - - @Override - public MultipleResultCurrentWeatherAsyncRequestTerminator retrieveAsync() { - urlBuilder.applyCustomization(language, unitSystem); - return new MultipleResultCurrentWeatherAsyncRequestTerminatorImpl(urlBuilder, unitSystem); - } -} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminator.java index aa916f6..1c9859f 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminator.java @@ -23,12 +23,36 @@ package com.github.prominence.openweathermap.api.request.weather.multiple; import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.RequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; +import com.github.prominence.openweathermap.api.utils.RequestUtils; import java.util.List; /** - * The interface Multiple result current weather request terminator. + * The type Multiple result current weather request terminator. */ -public interface MultipleResultCurrentWeatherRequestTerminator extends RequestTerminator, String> { +public class MultipleResultCurrentWeatherRequestTerminator { + private final RequestSettings requestSettings; + + /** + * Instantiates a new Multiple result current weather request terminator. + * + * @param requestSettings request settings object. + */ + MultipleResultCurrentWeatherRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public List asJava() { + return new CurrentWeatherResponseMapper(requestSettings.getUnitSystem()).getList(getRawResponse()); + } + + public String asJSON() { + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminatorImpl.java deleted file mode 100644 index 3cf256a..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/multiple/MultipleResultCurrentWeatherRequestTerminatorImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.multiple; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherResponseMapper; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.List; - -/** - * The type Multiple result current weather request terminator. - */ -public class MultipleResultCurrentWeatherRequestTerminatorImpl implements MultipleResultCurrentWeatherRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new Multiple result current weather request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - MultipleResultCurrentWeatherRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public List asJava() { - return new CurrentWeatherResponseMapper(unitSystem).getList(getRawResponse()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequester.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequester.java index 0dc887a..199a980 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequester.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequester.java @@ -23,69 +23,57 @@ package com.github.prominence.openweathermap.api.request.weather.single; import com.github.prominence.openweathermap.api.model.Coordinate; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The interface Single location current weather requester. + * The type Single location current weather requester. */ -public interface SingleLocationCurrentWeatherRequester { +public class SingleLocationCurrentWeatherRequester { + private final RequestSettings requestSettings; /** - * By city name current weather request customizer. + * Instantiates a new Single location current weather requester. * - * @param cityName the city name - * @return the single result current weather request customizer + * @param requestSettings request settings object. */ - SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName); + public SingleLocationCurrentWeatherRequester(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + this.requestSettings.appendToURL("weather"); + } - /** - * By city name current weather request customizer. - * - * @param cityName the city name - * @param countryCode the country code - * @return the single result current weather request customizer - */ - SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName, String countryCode); + public SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName) { + requestSettings.putRequestParameter("q", cityName); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } - /** - * By city name current weather request customizer. - * - * @param cityName the city name - * @param stateCode the state code - * @param countryCode the country code - * @return the single result current weather request customizer - */ - SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName, String stateCode, String countryCode); + public SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName, String countryCode) { + requestSettings.putRequestParameter("q", cityName + "," + countryCode); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } - /** - * By city id current weather request customizer. - * - * @param cityId the city id - * @return the single result current weather request customizer - */ - SingleResultCurrentWeatherRequestCustomizer byCityId(long cityId); + public SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName, String stateCode, String countryCode) { + requestSettings.putRequestParameter("q", cityName + "," + stateCode + "," + countryCode); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } - /** - * By coordinate current weather request customizer. - * - * @param coordinate the coordinate - * @return the single result current weather request customizer - */ - SingleResultCurrentWeatherRequestCustomizer byCoordinate(Coordinate coordinate); + public SingleResultCurrentWeatherRequestCustomizer byCityId(long cityId) { + requestSettings.putRequestParameter("id", String.valueOf(cityId)); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } - /** - * By zip code and country current weather request customizer. - * - * @param zipCode the zip code - * @param countryCode the country code - * @return the single result current weather request customizer - */ - SingleResultCurrentWeatherRequestCustomizer byZipCodeAndCountry(String zipCode, String countryCode); + public SingleResultCurrentWeatherRequestCustomizer byCoordinate(Coordinate coordinate) { + requestSettings.putRequestParameter("lat", String.valueOf(coordinate.getLatitude())); + requestSettings.putRequestParameter("lon", String.valueOf(coordinate.getLongitude())); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } - /** - * By zip code in usa current weather request customizer. - * - * @param zipCode the zip code - * @return the single result current weather request customizer - */ - SingleResultCurrentWeatherRequestCustomizer byZipCodeInUSA(String zipCode); + public SingleResultCurrentWeatherRequestCustomizer byZipCodeAndCountry(String zipCode, String countryCode) { + requestSettings.putRequestParameter("zip", zipCode + "," + countryCode); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } + + public SingleResultCurrentWeatherRequestCustomizer byZipCodeInUSA(String zipCode) { + requestSettings.putRequestParameter("zip", zipCode); + return new SingleResultCurrentWeatherRequestCustomizer(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequesterImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequesterImpl.java deleted file mode 100644 index e26038b..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleLocationCurrentWeatherRequesterImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.single; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.model.Coordinate; - -/** - * The type Single location current weather requester. - */ -public class SingleLocationCurrentWeatherRequesterImpl implements SingleLocationCurrentWeatherRequester { - private final RequestUrlBuilder urlBuilder; - - /** - * Instantiates a new Single location current weather requester. - * - * @param urlBuilder the url builder - */ - public SingleLocationCurrentWeatherRequesterImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - urlBuilder.append("weather"); - } - - public SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName) { - urlBuilder.addRequestParameter("q", cityName); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - public SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName, String countryCode) { - urlBuilder.addRequestParameter("q", cityName + "," + countryCode); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - @Override - public SingleResultCurrentWeatherRequestCustomizer byCityName(String cityName, String stateCode, String countryCode) { - urlBuilder.addRequestParameter("q", cityName + "," + stateCode + "," + countryCode); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - public SingleResultCurrentWeatherRequestCustomizer byCityId(long cityId) { - urlBuilder.addRequestParameter("id", cityId); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - public SingleResultCurrentWeatherRequestCustomizer byCoordinate(Coordinate coordinate) { - urlBuilder.addRequestParameter("lat", String.valueOf(coordinate.getLatitude())); - urlBuilder.addRequestParameter("lon", String.valueOf(coordinate.getLongitude())); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - public SingleResultCurrentWeatherRequestCustomizer byZipCodeAndCountry(String zipCode, String countryCode) { - urlBuilder.addRequestParameter("zip", zipCode + "," + countryCode); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } - - @Override - public SingleResultCurrentWeatherRequestCustomizer byZipCodeInUSA(String zipCode) { - urlBuilder.addRequestParameter("zip", zipCode); - return new SingleResultCurrentWeatherRequestCustomizerImpl(urlBuilder); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminator.java index 3c4cd61..bfb0136 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminator.java @@ -22,26 +22,48 @@ package com.github.prominence.openweathermap.api.request.weather.single; +import com.github.prominence.openweathermap.api.enums.ResponseType; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.AsyncRequestTerminator; +import com.github.prominence.openweathermap.api.utils.RequestUtils; import java.util.concurrent.CompletableFuture; /** - * The current weather async request terminator interface. + * The type Single result current weather async request terminator. */ -public interface SingleResultCurrentWeatherAsyncRequestTerminator extends AsyncRequestTerminator { - /** - * XML response format. - * - * @return the completable future - */ - CompletableFuture asXML(); +public class SingleResultCurrentWeatherAsyncRequestTerminator { + private final RequestSettings requestSettings; /** - * HTML response format. + * Instantiates a new Single result current weather async request terminator. * - * @return the completable future + * @param requestSettings request settings object. */ - CompletableFuture asHTML(); + SingleResultCurrentWeatherAsyncRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public CompletableFuture asJava() { + return CompletableFuture.supplyAsync(() -> new CurrentWeatherResponseMapper(requestSettings.getUnitSystem()).getSingle(getRawResponse())); + } + + public CompletableFuture asJSON() { + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + public CompletableFuture asXML() { + requestSettings.setResponseType(ResponseType.XML); + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + public CompletableFuture asHTML() { + requestSettings.setResponseType(ResponseType.HTML); + return CompletableFuture.supplyAsync(this::getRawResponse); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminatorImpl.java deleted file mode 100644 index 88f39b2..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherAsyncRequestTerminatorImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.single; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherResponseMapper; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -import java.util.concurrent.CompletableFuture; - -/** - * The type Single result current weather async request terminator. - */ -public class SingleResultCurrentWeatherAsyncRequestTerminatorImpl implements SingleResultCurrentWeatherAsyncRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new Single result current weather async request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - SingleResultCurrentWeatherAsyncRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public CompletableFuture asJava() { - return CompletableFuture.supplyAsync(() -> new CurrentWeatherResponseMapper(unitSystem).getSingle(getRawResponse())); - } - - @Override - public CompletableFuture asJSON() { - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - @Override - public CompletableFuture asXML() { - urlBuilder.addRequestParameter("mode", "xml"); - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - @Override - public CompletableFuture asHTML() { - urlBuilder.addRequestParameter("mode", "html"); - return CompletableFuture.supplyAsync(this::getRawResponse); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizer.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizer.java index 9661cf9..982ffe2 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizer.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizer.java @@ -22,24 +22,40 @@ package com.github.prominence.openweathermap.api.request.weather.single; -import com.github.prominence.openweathermap.api.request.RequestCustomizer; +import com.github.prominence.openweathermap.api.enums.Language; +import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.request.RequestSettings; /** - * The current weather request customizer interface. + * The type Single result current weather request customizer. */ -public interface SingleResultCurrentWeatherRequestCustomizer extends RequestCustomizer { - /** - * Retrieve current weather request terminator. - * - * @return the single result current weather request terminator - */ - SingleResultCurrentWeatherRequestTerminator retrieve(); +public class SingleResultCurrentWeatherRequestCustomizer { + private final RequestSettings requestSettings; /** - * Retrieve current weather async request terminator. + * Instantiates a new Single result current weather request customizer. * - * @return the single result current weather async request terminator + * @param requestSettings request settings object. */ - SingleResultCurrentWeatherAsyncRequestTerminator retrieveAsync(); + SingleResultCurrentWeatherRequestCustomizer(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } -} + public SingleResultCurrentWeatherRequestCustomizer language(Language language) { + requestSettings.setLanguage(language); + return this; + } + + public SingleResultCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { + requestSettings.setUnitSystem(unitSystem); + return this; + } + + public SingleResultCurrentWeatherRequestTerminator retrieve() { + return new SingleResultCurrentWeatherRequestTerminator(requestSettings); + } + + public SingleResultCurrentWeatherAsyncRequestTerminator retrieveAsync() { + return new SingleResultCurrentWeatherAsyncRequestTerminator(requestSettings); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizerImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizerImpl.java deleted file mode 100644 index 2734252..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestCustomizerImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.single; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.enums.Language; -import com.github.prominence.openweathermap.api.enums.UnitSystem; - -/** - * The type Single result current weather request customizer. - */ -public class SingleResultCurrentWeatherRequestCustomizerImpl implements SingleResultCurrentWeatherRequestCustomizer { - private final RequestUrlBuilder urlBuilder; - - private Language language; - private UnitSystem unitSystem = UnitSystem.STANDARD; - - /** - * Instantiates a new Single result current weather request customizer. - * - * @param urlBuilder the url builder - */ - SingleResultCurrentWeatherRequestCustomizerImpl(RequestUrlBuilder urlBuilder) { - this.urlBuilder = urlBuilder; - } - - @Override - public SingleResultCurrentWeatherRequestCustomizer language(Language language) { - this.language = language; - return this; - } - - @Override - public SingleResultCurrentWeatherRequestCustomizer unitSystem(UnitSystem unitSystem) { - this.unitSystem = unitSystem; - return this; - } - - @Override - public SingleResultCurrentWeatherRequestTerminator retrieve() { - urlBuilder.applyCustomization(language, unitSystem); - return new SingleResultCurrentWeatherRequestTerminatorImpl(urlBuilder, unitSystem); - } - - @Override - public SingleResultCurrentWeatherAsyncRequestTerminator retrieveAsync() { - urlBuilder.applyCustomization(language, unitSystem); - return new SingleResultCurrentWeatherAsyncRequestTerminatorImpl(urlBuilder, unitSystem); - } -} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminator.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminator.java index 499091d..3fbc95c 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminator.java +++ b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminator.java @@ -22,24 +22,46 @@ package com.github.prominence.openweathermap.api.request.weather.single; +import com.github.prominence.openweathermap.api.enums.ResponseType; import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.request.RequestTerminator; +import com.github.prominence.openweathermap.api.request.RequestSettings; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; +import com.github.prominence.openweathermap.api.utils.RequestUtils; /** - * The current weather request terminator interface. + * The type Single result current weather request terminator. */ -public interface SingleResultCurrentWeatherRequestTerminator extends RequestTerminator { - /** - * XML response format. - * - * @return the XML string - */ - String asXML(); +public class SingleResultCurrentWeatherRequestTerminator { + private final RequestSettings requestSettings; /** - * HTML response format. + * Instantiates a new Single result current weather request terminator. * - * @return the HTML string + * @param requestSettings request settings object. */ - String asHTML(); + SingleResultCurrentWeatherRequestTerminator(RequestSettings requestSettings) { + this.requestSettings = requestSettings; + } + + public Weather asJava() { + return new CurrentWeatherResponseMapper(requestSettings.getUnitSystem()).getSingle(asJSON()); + } + + public String asJSON() { + return getRawResponse(); + } + + public String asXML() { + requestSettings.setResponseType(ResponseType.XML); + return getRawResponse(); + } + + public String asHTML() { + requestSettings.setResponseType(ResponseType.HTML); + return getRawResponse(); + } + + private String getRawResponse() { + return RequestUtils.getResponse(requestSettings); + } } diff --git a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminatorImpl.java b/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminatorImpl.java deleted file mode 100644 index 65be3ac..0000000 --- a/src/main/java/com/github/prominence/openweathermap/api/request/weather/single/SingleResultCurrentWeatherRequestTerminatorImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2021 Alexey Zinchenko - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.github.prominence.openweathermap.api.request.weather.single; - -import com.github.prominence.openweathermap.api.request.RequestUrlBuilder; -import com.github.prominence.openweathermap.api.request.weather.CurrentWeatherResponseMapper; -import com.github.prominence.openweathermap.api.enums.UnitSystem; -import com.github.prominence.openweathermap.api.model.weather.Weather; -import com.github.prominence.openweathermap.api.utils.RequestUtils; - -/** - * The type Single result current weather request terminator. - */ -public class SingleResultCurrentWeatherRequestTerminatorImpl implements SingleResultCurrentWeatherRequestTerminator { - private final RequestUrlBuilder urlBuilder; - private final UnitSystem unitSystem; - - /** - * Instantiates a new Single result current weather request terminator. - * - * @param urlBuilder the url builder - * @param unitSystem the unit system - */ - SingleResultCurrentWeatherRequestTerminatorImpl(RequestUrlBuilder urlBuilder, UnitSystem unitSystem) { - this.urlBuilder = urlBuilder; - this.unitSystem = unitSystem; - } - - @Override - public Weather asJava() { - return new CurrentWeatherResponseMapper(unitSystem).getSingle(asJSON()); - } - - @Override - public String asJSON() { - return getRawResponse(); - } - - @Override - public String asXML() { - urlBuilder.addRequestParameter("mode", "xml"); - return getRawResponse(); - } - - @Override - public String asHTML() { - urlBuilder.addRequestParameter("mode", "html"); - return getRawResponse(); - } - - private String getRawResponse() { - return RequestUtils.getResponse(urlBuilder.buildUrl()); - } -} diff --git a/src/main/java/com/github/prominence/openweathermap/api/utils/RequestUtils.java b/src/main/java/com/github/prominence/openweathermap/api/utils/RequestUtils.java index ea8cfe5..c20ec6d 100644 --- a/src/main/java/com/github/prominence/openweathermap/api/utils/RequestUtils.java +++ b/src/main/java/com/github/prominence/openweathermap/api/utils/RequestUtils.java @@ -22,8 +22,10 @@ package com.github.prominence.openweathermap.api.utils; +import com.github.prominence.openweathermap.api.conf.TimeoutSettings; import com.github.prominence.openweathermap.api.exception.NoDataFoundException; import com.github.prominence.openweathermap.api.exception.InvalidAuthTokenException; +import com.github.prominence.openweathermap.api.request.RequestSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,17 +37,32 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; /** * Utility class for API calls execution. */ public final class RequestUtils { + private static final String OWM_URL_BASE = "http://api.openweathermap.org/data/2.5/"; + private static final Logger logger = LoggerFactory.getLogger(RequestUtils.class); private RequestUtils() { } + public static String getResponse(RequestSettings requestSettings) { + StringBuilder requestUrlBuilder = new StringBuilder(OWM_URL_BASE); + requestUrlBuilder.append(requestSettings.getUrlAppender()); + requestUrlBuilder.append('?'); + String parameters = requestSettings.getRequestParameters().entrySet().stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .collect(Collectors.joining("&")); + requestUrlBuilder.append(parameters); + + return getResponse(requestUrlBuilder.toString(), requestSettings.getTimeoutSettings()); + } + /** * Executes call to provided API url and retrieves response in String representation. * @@ -54,6 +71,18 @@ public final class RequestUtils { * @throws IllegalArgumentException in case if provided parameter isn't a valid url for {@link URL} instance. */ public static String getResponse(String url) { + return getResponse(url, new TimeoutSettings()); + } + + /** + * Executes call to provided API url and retrieves response in String representation. + * + * @param url the url to make API request. + * @param timeoutSettings an object with timeout settings. + * @return response from the request in String representation. + * @throws IllegalArgumentException in case if provided parameter isn't a valid url for {@link URL} instance. + */ + public static String getResponse(String url, TimeoutSettings timeoutSettings) { URL requestUrl; try { requestUrl = new URL(url); @@ -62,7 +91,7 @@ public final class RequestUtils { throw new IllegalArgumentException(ex); } logger.debug("Executing OpenWeatherMap API request: " + url); - final InputStream requestInputStream = executeRequest(requestUrl); + final InputStream requestInputStream = executeRequest(requestUrl, timeoutSettings); return convertInputStreamToString(requestInputStream); } @@ -75,11 +104,20 @@ public final class RequestUtils { * @throws InvalidAuthTokenException in case if authentication token wasn't set or requested functionality is not permitted for its subscription plan. * @throws NoDataFoundException in case if there is no any data for requested location(s) or request is invalid. */ - private static InputStream executeRequest(URL requestUrl) { + private static InputStream executeRequest(URL requestUrl, TimeoutSettings timeoutSettings) { InputStream resultStream; try { HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); + + if (timeoutSettings.getConnectionTimeout() != null) { + connection.setConnectTimeout(timeoutSettings.getConnectionTimeout()); + } + + if (timeoutSettings.getReadTimeout() != null) { + connection.setReadTimeout(timeoutSettings.getReadTimeout()); + } + connection.setRequestMethod("GET"); switch (connection.getResponseCode()) { diff --git a/src/test/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhaseUnitTest.java b/src/test/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhaseUnitTest.java new file mode 100644 index 0000000..e8b0644 --- /dev/null +++ b/src/test/java/com/github/prominence/openweathermap/api/model/onecall/current/MoonPhaseUnitTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2022 Alexey Zinchenko + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.github.prominence.openweathermap.api.model.onecall.current; + +import com.github.prominence.openweathermap.api.enums.MoonType; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class MoonPhaseUnitTest { + + @Test + public void getValue() { + final MoonPhase moonPhase = new MoonPhase(0.67); + + assertEquals(0.67, moonPhase.getValue(), 0.000001); + } + + @Test + public void getType() { + final MoonPhase newMoon1 = new MoonPhase(0d); + assertEquals(MoonType.NEW_MOON, newMoon1.getType()); + + final MoonPhase newMoon2 = new MoonPhase(1d); + assertEquals(MoonType.NEW_MOON, newMoon2.getType()); + + final MoonPhase firstQuarterMoon = new MoonPhase(0.25d); + assertEquals(MoonType.FIRST_QUARTER_MOON, firstQuarterMoon.getType()); + + final MoonPhase fullMoon = new MoonPhase(0.5d); + assertEquals(MoonType.FULL_MOON, fullMoon.getType()); + + final MoonPhase lastQuarterMoon = new MoonPhase(0.75d); + assertEquals(MoonType.LAST_QUARTER_MOON, lastQuarterMoon.getType()); + + final MoonPhase waxingCrescentMoon = new MoonPhase(0.1d); + assertEquals(MoonType.WAXING_CRESCENT, waxingCrescentMoon.getType()); + + final MoonPhase waxingGibbousMoon = new MoonPhase(0.4d); + assertEquals(MoonType.WAXING_GIBBOUS, waxingGibbousMoon.getType()); + + final MoonPhase waningGibbousMoon = new MoonPhase(0.623d); + assertEquals(MoonType.WANING_GIBBOUS, waningGibbousMoon.getType()); + + final MoonPhase waningCrescentMoon = new MoonPhase(0.9999d); + assertEquals(MoonType.WANING_CRESCENT, waningCrescentMoon.getType()); + } + + @Test + public void getEquals() { + final MoonPhase phase1 = new MoonPhase(0d); + final MoonPhase phase2 = new MoonPhase(0.5d); + + assertNotEquals(phase1, phase2); + + final MoonPhase phase3 = new MoonPhase(0d); + + assertEquals(phase1, phase3); + } + + @Test + public void getHashCode() { + final MoonPhase phase1 = new MoonPhase(0d); + final MoonPhase phase2 = new MoonPhase(0.5d); + + assertNotEquals(phase1.hashCode(), phase2.hashCode()); + + final MoonPhase phase3 = new MoonPhase(0d); + + assertEquals(phase1.hashCode(), phase3.hashCode()); + } + + @Test + public void getToString() { + final MoonPhase phase2 = new MoonPhase(0.5d); + + assertEquals("FULL_MOON(0.5)", phase2.toString()); + } +} diff --git a/src/test/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapperUnitTest.java b/src/test/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapperUnitTest.java index b8c86b2..f065062 100644 --- a/src/test/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapperUnitTest.java +++ b/src/test/java/com/github/prominence/openweathermap/api/request/air/pollution/AirPollutionResponseMapperUnitTest.java @@ -24,6 +24,7 @@ package com.github.prominence.openweathermap.api.request.air.pollution; +import com.github.prominence.openweathermap.api.mapper.AirPollutionResponseMapper; import com.github.prominence.openweathermap.api.model.air.pollution.AirPollutionDetails; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapperUnitTest.java b/src/test/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapperUnitTest.java index 502198c..d8a6ce2 100644 --- a/src/test/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapperUnitTest.java +++ b/src/test/java/com/github/prominence/openweathermap/api/request/forecast/free/FiveDayThreeHourStepForecastResponseMapperUnitTest.java @@ -23,6 +23,7 @@ package com.github.prominence.openweathermap.api.request.forecast.free; import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.mapper.FiveDayThreeHourStepForecastResponseMapper; import com.github.prominence.openweathermap.api.model.forecast.Forecast; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapperUnitTest.java b/src/test/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapperUnitTest.java index 5dab17b..d34b4ac 100644 --- a/src/test/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapperUnitTest.java +++ b/src/test/java/com/github/prominence/openweathermap/api/request/onecall/OneCallWeatherResponseMapperUnitTest.java @@ -23,6 +23,7 @@ package com.github.prominence.openweathermap.api.request.onecall; import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.mapper.OneCallWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.onecall.current.CurrentWeatherData; import com.github.prominence.openweathermap.api.model.onecall.historical.HistoricalWeatherData; import org.junit.jupiter.api.Assertions; diff --git a/src/test/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapperUnitTest.java b/src/test/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapperUnitTest.java index fa44fcf..5fe0b22 100644 --- a/src/test/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapperUnitTest.java +++ b/src/test/java/com/github/prominence/openweathermap/api/request/weather/CurrentWeatherResponseMapperUnitTest.java @@ -23,6 +23,7 @@ package com.github.prominence.openweathermap.api.request.weather; import com.github.prominence.openweathermap.api.enums.UnitSystem; +import com.github.prominence.openweathermap.api.mapper.CurrentWeatherResponseMapper; import com.github.prominence.openweathermap.api.model.weather.Weather; import org.junit.jupiter.api.Test;