Skip to content

Commit

Permalink
Weather
Browse files Browse the repository at this point in the history
  • Loading branch information
Pastor committed Oct 19, 2024
1 parent 2d901d6 commit 3b9c830
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 0 deletions.
13 changes: 13 additions & 0 deletions vol3/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,17 @@
<name>vol3</name>
<description>Модуль №3</description>

<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>

</project>
15 changes: 15 additions & 0 deletions vol3/src/main/java/ru/mifi/practice/val3/cont/Deserializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.mifi.practice.val3.cont;

import com.google.gson.Gson;

public interface Deserializer {
<T> T deserialize(String text, Class<T> clazz);

final class GsonDeserializer implements Deserializer {
private final Gson gson = new Gson();

public <T> T deserialize(String text, Class<T> clazz) {
return gson.fromJson(text, clazz);
}
}
}
50 changes: 50 additions & 0 deletions vol3/src/main/java/ru/mifi/practice/val3/cont/Http.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package ru.mifi.practice.val3.cont;

import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;

import java.io.IOException;
import java.util.Objects;
import java.util.Optional;

public interface Http {
<T> Optional<T> get(String url, Class<T> clazz);

String urlencode(String url);

final class Ok implements Http {
private final OkHttpClient client = new OkHttpClient.Builder().build();
private final Deserializer deserializer;

public Ok(Deserializer deserializer) {
this.deserializer = deserializer;
}

@Override
public <T> Optional<T> get(String url, Class<T> clazz) {
Request request = new Request.Builder().url(url).get().build();
try (Response response = client.newCall(request).execute()) {
ResponseBody responseBody = response.body();
if (response.isSuccessful() && responseBody != null) {
try (ResponseBody body = responseBody) {
String content = body.string();
return Optional.of(deserializer.deserialize(content, clazz));
}
} else {
System.err.println(response);
}
} catch (IOException e) {
e.printStackTrace();
}
return Optional.empty();
}

@Override
public String urlencode(String url) {
return Objects.requireNonNull(HttpUrl.parse(url)).toString();
}
}
}
23 changes: 23 additions & 0 deletions vol3/src/main/java/ru/mifi/practice/val3/cont/Location.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.mifi.practice.val3.cont;

import com.google.gson.annotations.SerializedName;

import java.util.Optional;

@FunctionalInterface
public interface Location {

static Location fixed(Place place) {
return () -> Optional.of(place);
}

static Location fixed(float latitude, float longitude) {
return fixed(new Place(latitude, longitude));
}

Optional<Place> get();

record Place(@SerializedName("latitude") float latitude,
@SerializedName("longitude") float longitude) {
}
}
14 changes: 14 additions & 0 deletions vol3/src/main/java/ru/mifi/practice/val3/cont/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.mifi.practice.val3.cont;

import ru.mifi.practice.val3.cont.sevices.OpenMeteo;
import ru.mifi.practice.val3.cont.sevices.WhoIs;

public abstract class Main {
public static void main(String[] args) {
Http http = new Http.Ok(new Deserializer.GsonDeserializer());
Location location = new WhoIs(http);
Weather weather = new OpenMeteo(http);
location.get().flatMap(place -> weather.get(place.latitude(), place.longitude()))
.ifPresent(System.out::println);
}
}
13 changes: 13 additions & 0 deletions vol3/src/main/java/ru/mifi/practice/val3/cont/Weather.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.mifi.practice.val3.cont;

import java.util.Optional;

@FunctionalInterface
public interface Weather {

Optional<Details> get(float latitude, float longitude);

record Details(float temperature, float wind) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ru.mifi.practice.val3.cont.sevices;

import com.google.gson.annotations.SerializedName;
import okhttp3.HttpUrl;
import ru.mifi.practice.val3.cont.Http;
import ru.mifi.practice.val3.cont.Weather;

import java.util.Objects;
import java.util.Optional;

public final class OpenMeteo implements Weather {
private static final String URL = "https://api.open-meteo.com/v1/forecast";
private final Http http;

public OpenMeteo(Http http) {
this.http = http;
}

@Override
public Optional<Details> get(float latitude, float longitude) {
HttpUrl url = Objects.requireNonNull(HttpUrl.parse(URL))
.newBuilder()
.addQueryParameter("latitude", String.valueOf(latitude))
.addQueryParameter("longitude", String.valueOf(longitude))
.addQueryParameter("current", "temperature_2m,wind_speed_10m")
.build();
return http.get(url.toString(), Result.class).map(result -> new Details(
Float.parseFloat(result.current.temperature),
Float.parseFloat(result.current.windSpeed)
));
}

private record Result(@SerializedName("current") Current current) {

}

private record Current(@SerializedName("temperature_2m") String temperature,
@SerializedName("wind_speed_10m") String windSpeed) {

}
}
20 changes: 20 additions & 0 deletions vol3/src/main/java/ru/mifi/practice/val3/cont/sevices/WhoIs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.mifi.practice.val3.cont.sevices;

import ru.mifi.practice.val3.cont.Http;
import ru.mifi.practice.val3.cont.Location;

import java.util.Optional;

public final class WhoIs implements Location {
private static final String URL = "http://ipwho.is";
private final Http http;

public WhoIs(Http http) {
this.http = http;
}

@Override
public Optional<Place> get() {
return http.get(URL, Place.class);
}
}

0 comments on commit 3b9c830

Please sign in to comment.