From 241fbd136ca2c8cfa0e84387da315895e9bf22aa Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 04:51:40 +0200 Subject: [PATCH] http-api: Use observables for ItemClient --- .../runelite/http/api/item/ItemClient.java | 139 ++++++++++-------- .../net/runelite/client/game/ItemManager.java | 61 ++++---- 2 files changed, 107 insertions(+), 93 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java index 17784dd67b..2566a9c603 100644 --- a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java @@ -26,6 +26,7 @@ package net.runelite.http.api.item; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; +import io.reactivex.Observable; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; @@ -112,7 +113,7 @@ public class ItemClient } } - public BufferedImage getIcon(int itemId) throws IOException + public Observable getIcon(int itemId) { HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("item") @@ -126,23 +127,26 @@ public class ItemClient .url(url) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.debug("Error grabbing icon {}: {}", itemId, response); - return null; - } + if (!response.isSuccessful()) + { + logger.debug("Error grabbing icon {}: {}", itemId, response); + return null; + } - InputStream in = response.body().byteStream(); - synchronized (ImageIO.class) - { - return ImageIO.read(in); + InputStream in = response.body().byteStream(); + synchronized (ImageIO.class) + { + return Observable.just(ImageIO.read(in)); + } } - } + }); } - public SearchResult search(String itemName) throws IOException + public Observable search(String itemName) { HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("item") @@ -152,28 +156,31 @@ public class ItemClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.debug("Error looking up item {}: {}", itemName, response); - return null; - } + if (!response.isSuccessful()) + { + logger.debug("Error looking up item {}: {}", itemName, response); + return null; + } - InputStream in = response.body().byteStream(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + InputStream in = response.body().byteStream(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class)); + } + catch (JsonParseException ex) + { + return Observable.error(ex); + } + }); } - public ItemPrice[] getPrices() throws IOException + public Observable getPrices() { HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("item") @@ -183,28 +190,32 @@ public class ItemClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.warn("Error looking up prices: {}", response); - return null; - } + if (!response.isSuccessful()) + { + logger.warn("Error looking up prices: {}", response); + return null; + } - InputStream in = response.body().byteStream(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + InputStream in = response.body().byteStream(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class)); + } + catch (JsonParseException ex) + { + return Observable.error(ex); + } + }); } - public Map getStats() throws IOException + public Observable> getStats() { HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder() .addPathSegment("item") @@ -215,27 +226,31 @@ public class ItemClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.warn("Error looking up item stats: {}", response); - return null; + if (!response.isSuccessful()) + { + logger.warn("Error looking up item stats: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + final Type typeToken = new TypeToken>() + { + }.getType(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken)); } - - InputStream in = response.body().byteStream(); - final Type typeToken = new TypeToken>() + catch (JsonParseException ex) { - }.getType(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + return Observable.error(ex); + } + }); } } diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index 34a95e613a..fc6a5f6d90 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -30,9 +30,9 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableMap; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import io.reactivex.schedulers.Schedulers; import java.awt.Color; import java.awt.image.BufferedImage; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; @@ -209,43 +209,42 @@ public class ItemManager private void loadPrices() { - try - { - ItemPrice[] prices = itemClient.getPrices(); - if (prices != null) - { - ImmutableMap.Builder map = ImmutableMap.builderWithExpectedSize(prices.length); - for (ItemPrice price : prices) + itemClient.getPrices() + .subscribeOn(Schedulers.io()) + .subscribe( + (prices) -> { - map.put(price.getId(), price); - } - itemPrices = map.build(); - } + if (prices != null) + { + ImmutableMap.Builder map = ImmutableMap.builderWithExpectedSize(prices.length); + for (ItemPrice price : prices) + { + map.put(price.getId(), price); + } + itemPrices = map.build(); + } - log.debug("Loaded {} prices", itemPrices.size()); - } - catch (IOException e) - { - log.warn("error loading prices!", e); - } + log.debug("Loaded {} prices", itemPrices.size()); + }, + (e) -> log.warn("error loading prices!", e) + ); } private void loadStats() { - try - { - final Map stats = itemClient.getStats(); - if (stats != null) - { - itemStats = ImmutableMap.copyOf(stats); - } + itemClient.getStats() + .subscribeOn(Schedulers.io()) + .subscribe( + (stats) -> { + if (stats != null) + { + itemStats = ImmutableMap.copyOf(stats); + } - log.debug("Loaded {} stats", itemStats.size()); - } - catch (IOException e) - { - log.warn("error loading stats!", e); - } + log.debug("Loaded {} stats", itemStats.size()); + }, + (e) -> log.warn("error loading stats!", e) + ); } private void onGameStateChanged(final GameStateChanged event)