-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
189 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
vol3/src/main/java/ru/mifi/practice/val3/cont/Deserializer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
23
vol3/src/main/java/ru/mifi/practice/val3/cont/Location.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) { | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
13
vol3/src/main/java/ru/mifi/practice/val3/cont/Weather.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) { | ||
|
||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
vol3/src/main/java/ru/mifi/practice/val3/cont/sevices/OpenMeteo.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
20
vol3/src/main/java/ru/mifi/practice/val3/cont/sevices/WhoIs.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |