Merge ac1f043f51639be16817b4cfc06b79492d664000 into ff70aeb6fa2a8b2d724e75211d3c20eed522084d

This commit is contained in:
dbadia 2023-11-05 14:41:38 +00:00 committed by GitHub
commit 55789804aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 192 additions and 2 deletions

View File

@ -6,7 +6,7 @@
<groupId>com.github.prominence</groupId> <groupId>com.github.prominence</groupId>
<artifactId>openweathermap-api</artifactId> <artifactId>openweathermap-api</artifactId>
<version>2.3.0</version> <version>2.4.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Java OpenWeatherMap API</name> <name>Java OpenWeatherMap API</name>
@ -80,7 +80,7 @@
<plugin> <plugin>
<groupId>org.sonatype.plugins</groupId> <groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId> <artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.9</version> <version>1.6.13</version>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<serverId>ossrh</serverId> <serverId>ossrh</serverId>

View File

@ -84,6 +84,18 @@ public class OpenWeatherMapClient {
return new OneCallWeatherRequester(new RequestSettings(apiKey, timeoutSettings)); return new OneCallWeatherRequester(new RequestSettings(apiKey, timeoutSettings));
} }
/**
* One Call 3 API <a href="https://openweathermap.org/api/one-call-3">API</a>.
* Includes a weather summary statement in addition to the information provided by {@link #oneCall()}
* @return requester for retrieving one call weather information for the OneCall 3 API.
*/
@SubscriptionAvailability(plans = ALL)
public OneCallWeatherRequester oneCall3() {
RequestSettings requestSettings = new RequestSettings(apiKey, timeoutSettings);
requestSettings.setUseApi3();
return new OneCallWeatherRequester(requestSettings);
}
/** /**
* Air Pollution <a href="https://openweathermap.org/api/air-pollution">API</a>. * Air Pollution <a href="https://openweathermap.org/api/air-pollution">API</a>.
* Air Pollution API provides current, forecast and historical air pollution data for any coordinates on the globe. * Air Pollution API provides current, forecast and historical air pollution data for any coordinates on the globe.

View File

@ -213,6 +213,7 @@ public class OneCallWeatherResponseMapper {
daily.setMoonPhase(new MoonPhase(moonPhaseNode.asDouble())); daily.setMoonPhase(new MoonPhase(moonPhaseNode.asDouble()));
} }
daily.setSummary(parseSummary(dailyNode));
daily.setWeatherState(parseWeatherState(dailyNode.get("weather").get(0))); daily.setWeatherState(parseWeatherState(dailyNode.get("weather").get(0)));
daily.setTemperature(parseDailyTemperature(dailyNode)); daily.setTemperature(parseDailyTemperature(dailyNode));
daily.setAtmosphericPressure(parsePressure(dailyNode)); daily.setAtmosphericPressure(parsePressure(dailyNode));
@ -439,4 +440,12 @@ public class OneCallWeatherResponseMapper {
return null; return null;
} }
private String parseSummary(JsonNode dailyNode) {
final JsonNode summaryNode = dailyNode.get("summary");
if(summaryNode != null) {
return summaryNode.asText();
}
return null;
}
} }

View File

@ -43,6 +43,7 @@ public class Daily {
private LocalDateTime moonsetTime; private LocalDateTime moonsetTime;
private MoonPhase moonPhase; private MoonPhase moonPhase;
private String summary;
private WeatherState weatherState; private WeatherState weatherState;
private DailyTemperature temperature; private DailyTemperature temperature;
private AtmosphericPressure atmosphericPressure; private AtmosphericPressure atmosphericPressure;
@ -162,6 +163,24 @@ public class Daily {
this.moonPhase = moonPhase; this.moonPhase = moonPhase;
} }
/**
* Gets summary.
*
* @return the summary
*/
public String getSummary() {
return summary;
}
/**
* Sets summary.
*
* @param summary the summary
*/
public void setSummary(String summary) {
this.summary = summary;
}
/** /**
* Gets weather state. * Gets weather state.
* *
@ -435,4 +454,5 @@ public class Daily {
} }
return stringBuilder.toString(); return stringBuilder.toString();
} }
} }

View File

@ -45,6 +45,7 @@ public class RequestSettings {
private Language language = Language.ENGLISH; private Language language = Language.ENGLISH;
private UnitSystem unitSystem = UnitSystem.STANDARD; private UnitSystem unitSystem = UnitSystem.STANDARD;
private boolean useApi3 = false;
public RequestSettings(String apiKey, TimeoutSettings timeoutSettings) { public RequestSettings(String apiKey, TimeoutSettings timeoutSettings) {
this.putRequestParameter(API_KEY_PARAM_NAME, apiKey); this.putRequestParameter(API_KEY_PARAM_NAME, apiKey);
@ -94,6 +95,14 @@ public class RequestSettings {
urlAppenderBuilder.append(appendix); urlAppenderBuilder.append(appendix);
} }
public void setUseApi3() {
this.useApi3 = true;
}
public boolean getUseApi3() {
return this.useApi3;
}
public StringBuilder getUrlAppender() { public StringBuilder getUrlAppender() {
return urlAppenderBuilder; return urlAppenderBuilder;
} }

View File

@ -45,6 +45,7 @@ import java.util.stream.Collectors;
public final class RequestUtils { public final class RequestUtils {
private static final String OWM_URL_BASE = "http://api.openweathermap.org/data/2.5/"; private static final String OWM_URL_BASE = "http://api.openweathermap.org/data/2.5/";
private static final String OWM_URL_BASE_3_0 = "http://api.openweathermap.org/data/3.0/";
private static final Logger logger = LoggerFactory.getLogger(RequestUtils.class); private static final Logger logger = LoggerFactory.getLogger(RequestUtils.class);
@ -53,6 +54,9 @@ public final class RequestUtils {
public static String getResponse(RequestSettings requestSettings) { public static String getResponse(RequestSettings requestSettings) {
StringBuilder requestUrlBuilder = new StringBuilder(OWM_URL_BASE); StringBuilder requestUrlBuilder = new StringBuilder(OWM_URL_BASE);
if(requestSettings.getUseApi3()) {
requestUrlBuilder = new StringBuilder(OWM_URL_BASE_3_0);
}
requestUrlBuilder.append(requestSettings.getUrlAppender()); requestUrlBuilder.append(requestSettings.getUrlAppender());
requestUrlBuilder.append('?'); requestUrlBuilder.append('?');
String parameters = requestSettings.getRequestParameters().entrySet().stream() String parameters = requestSettings.getRequestParameters().entrySet().stream()

View File

@ -0,0 +1,136 @@
/*
* 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.ApiTest;
import com.github.prominence.openweathermap.api.OpenWeatherMapClient;
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.exception.InvalidAuthTokenException;
import com.github.prominence.openweathermap.api.exception.NoDataFoundException;
import com.github.prominence.openweathermap.api.model.Coordinate;
import com.github.prominence.openweathermap.api.model.onecall.current.CurrentWeatherData;
import org.junit.jupiter.api.Test;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import static org.junit.jupiter.api.Assertions.*;
public class CurrentWeatherOneCallApi3IntegrationTest extends ApiTest {
@Test
public void whenRetrieveCurrentOneCallResponseAsJava_thenOk() {
final CurrentWeatherData currentWeatherData = getClient()
.oneCall3()
.current()
.byCoordinate(Coordinate.of(53.54, 27.34))
.language(Language.ENGLISH)
.unitSystem(UnitSystem.METRIC)
.retrieve()
.asJava();
assertNotNull(currentWeatherData);
assertNotNull(currentWeatherData.getDailyList().get(0).getSummary());
}
@Test
public void whenRetrieveCurrentOneCallResponseAsJSON_thenOk() {
final String responseJson = getClient()
.oneCall3()
.current()
.byCoordinate(Coordinate.of(53.54, 27.34))
.language(Language.ENGLISH)
.unitSystem(UnitSystem.METRIC)
.retrieve()
.asJSON();
assertNotNull(responseJson);
assertNotEquals("", responseJson);
}
@Test
public void whenRetrieveCurrentOneCallResponseWithExclusionAsJava_thenOk() {
final CurrentWeatherData currentWeatherData = getClient()
.oneCall3()
.current()
.byCoordinate(Coordinate.of(53.54, 27.34))
.language(Language.ENGLISH)
.unitSystem(UnitSystem.METRIC)
.exclude(OneCallResultOptions.CURRENT, OneCallResultOptions.MINUTELY)
.retrieve()
.asJava();
assertNotNull(currentWeatherData);
assertNull(currentWeatherData.getCurrent());
assertNull(currentWeatherData.getMinutelyList());
assertNotNull(currentWeatherData.getDailyList().get(0).getSummary());
}
@Test
public void whenRetrieveCurrentOneCallAsyncResponseAsJava_thenOk() throws ExecutionException, InterruptedException {
final CompletableFuture<CurrentWeatherData> currentWeatherDataFuture = getClient()
.oneCall3()
.current()
.byCoordinate(Coordinate.of(53.54, 27.34))
.language(Language.ENGLISH)
.unitSystem(UnitSystem.METRIC)
.retrieveAsync()
.asJava();
assertNotNull(currentWeatherDataFuture);
assertNotNull(currentWeatherDataFuture.get());
assertNotNull(currentWeatherDataFuture.get().getDailyList().get(0).getSummary());
}
@Test
public void whenRetrieveCurrentOneCallAsyncResponseAsJSON_thenOk() throws ExecutionException, InterruptedException {
final CompletableFuture<String> responseJsonFuture = getClient()
.oneCall3()
.current()
.byCoordinate(Coordinate.of(53.54, 27.34))
.language(Language.ENGLISH)
.unitSystem(UnitSystem.METRIC)
.retrieveAsync()
.asJSON();
assertNotNull(responseJsonFuture);
final String responseJson = responseJsonFuture.get();
assertNotNull(responseJson);
}
@Test
public void whenRequestOnecallWithInvalidApiKey_thenThrowAnException() {
OpenWeatherMapClient client = new OpenWeatherMapClient("invalidKey");
assertThrows(InvalidAuthTokenException.class, () ->
client
.oneCall3()
.current()
.byCoordinate(Coordinate.of(53.54, 27.34))
.language(Language.ENGLISH)
.unitSystem(UnitSystem.METRIC)
.retrieve()
.asJSON()
);
}
}