From b6e17cd15e74fa3ad96eb181618b7924ca127a60 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 22 Dec 2021 12:46:52 -0500 Subject: [PATCH] http-service: move several hardcoded urls to config Also make an OkHttpClient bean and use it everywhere --- .../service/SpringBootWebApplication.java | 9 ++++-- .../runelite/http/service/account/State.java | 22 ++------------ .../http/service/feed/blog/BlogService.java | 22 +++++++++++--- .../feed/osrsnews/OSRSNewsService.java | 22 +++++++++++--- .../service/feed/twitter/TwitterService.java | 10 +++++-- .../http/service/item/ItemService.java | 29 ++++++++++++------- .../http/service/wiki/WikiPriceService.java | 19 +++++++----- .../http/service/worlds/WorldsService.java | 29 ++++++++++--------- .../src/main/resources/application.yaml | 9 ++++++ .../service/worlds/WorldsServiceTest.java | 4 +-- 10 files changed, 109 insertions(+), 66 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java b/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java index c4d46210b8..6d045b8231 100644 --- a/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java +++ b/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java @@ -68,7 +68,7 @@ import org.sql2o.quirks.NoQuirks; public class SpringBootWebApplication extends SpringBootServletInitializer { @Bean - protected ServletContextListener listener() + protected ServletContextListener listener(OkHttpClient client) { return new ServletContextListener() { @@ -82,7 +82,6 @@ public class SpringBootWebApplication extends SpringBootServletInitializer public void contextDestroyed(ServletContextEvent sce) { // Destroy okhttp client - OkHttpClient client = RuneLiteAPI.CLIENT; client.dispatcher().executorService().shutdown(); client.connectionPool().evictAll(); try @@ -200,6 +199,12 @@ public class SpringBootWebApplication extends SpringBootServletInitializer } } + @Bean + public OkHttpClient okHttpClient() + { + return RuneLiteAPI.CLIENT; + } + public static void main(String[] args) { SpringApplication.run(SpringBootWebApplication.class, args); diff --git a/http-service/src/main/java/net/runelite/http/service/account/State.java b/http-service/src/main/java/net/runelite/http/service/account/State.java index 50b47b2c19..1412efa11a 100644 --- a/http-service/src/main/java/net/runelite/http/service/account/State.java +++ b/http-service/src/main/java/net/runelite/http/service/account/State.java @@ -25,29 +25,11 @@ package net.runelite.http.service.account; import java.util.UUID; +import lombok.Data; +@Data public class State { private UUID uuid; private String apiVersion; - - public UUID getUuid() - { - return uuid; - } - - public void setUuid(UUID uuid) - { - this.uuid = uuid; - } - - public String getApiVersion() - { - return apiVersion; - } - - public void setApiVersion(String apiVersion) - { - this.apiVersion = apiVersion; - } } diff --git a/http-service/src/main/java/net/runelite/http/service/feed/blog/BlogService.java b/http-service/src/main/java/net/runelite/http/service/feed/blog/BlogService.java index 9da6cc171b..72f7938910 100644 --- a/http-service/src/main/java/net/runelite/http/service/feed/blog/BlogService.java +++ b/http-service/src/main/java/net/runelite/http/service/feed/blog/BlogService.java @@ -33,13 +33,15 @@ import java.util.List; import java.util.Locale; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.feed.FeedItem; import net.runelite.http.api.feed.FeedItemType; import net.runelite.http.service.util.exception.InternalServerErrorException; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -50,16 +52,28 @@ import org.xml.sax.SAXException; @Service public class BlogService { - private static final HttpUrl RSS_URL = HttpUrl.parse("https://runelite.net/atom.xml"); private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); + private final OkHttpClient okHttpClient; + private final HttpUrl rssUrl; + + @Autowired + public BlogService( + OkHttpClient okHttpClient, + @Value("${runelite.feed.rssUrl}") String rssUrl + ) + { + this.okHttpClient = okHttpClient; + this.rssUrl = HttpUrl.get(rssUrl); + } + public List getBlogPosts() throws IOException { Request request = new Request.Builder() - .url(RSS_URL) + .url(rssUrl) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { diff --git a/http-service/src/main/java/net/runelite/http/service/feed/osrsnews/OSRSNewsService.java b/http-service/src/main/java/net/runelite/http/service/feed/osrsnews/OSRSNewsService.java index 0ae08bc85c..e53b2d8044 100644 --- a/http-service/src/main/java/net/runelite/http/service/feed/osrsnews/OSRSNewsService.java +++ b/http-service/src/main/java/net/runelite/http/service/feed/osrsnews/OSRSNewsService.java @@ -33,13 +33,15 @@ import java.util.List; import java.util.Locale; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.feed.FeedItem; import net.runelite.http.api.feed.FeedItemType; import net.runelite.http.service.util.exception.InternalServerErrorException; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -50,16 +52,28 @@ import org.xml.sax.SAXException; @Service public class OSRSNewsService { - private static final HttpUrl RSS_URL = HttpUrl.parse("https://services.runescape.com/m=news/latest_news.rss?oldschool=true"); private static final SimpleDateFormat PUB_DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy '00:00:00 GMT'", Locale.US); + private final OkHttpClient okHttpClient; + private final HttpUrl rssUrl; + + @Autowired + public OSRSNewsService( + OkHttpClient okHttpClient, + @Value("${runelite.osrsnews.rssUrl}") String rssUrl + ) + { + this.okHttpClient = okHttpClient; + this.rssUrl = HttpUrl.get(rssUrl); + } + public List getNews() throws IOException { Request request = new Request.Builder() - .url(RSS_URL) + .url(rssUrl) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { diff --git a/http-service/src/main/java/net/runelite/http/service/feed/twitter/TwitterService.java b/http-service/src/main/java/net/runelite/http/service/feed/twitter/TwitterService.java index 5bab4300a3..4b7b026646 100644 --- a/http-service/src/main/java/net/runelite/http/service/feed/twitter/TwitterService.java +++ b/http-service/src/main/java/net/runelite/http/service/feed/twitter/TwitterService.java @@ -39,6 +39,7 @@ import net.runelite.http.api.feed.FeedItemType; import net.runelite.http.service.util.exception.InternalServerErrorException; import okhttp3.FormBody; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; @@ -54,6 +55,7 @@ public class TwitterService private final String credentials; private final String listId; + private final OkHttpClient okHttpClient; private String token; @@ -61,11 +63,13 @@ public class TwitterService public TwitterService( @Value("${runelite.twitter.consumerkey}") String consumerKey, @Value("${runelite.twitter.secretkey}") String consumerSecret, - @Value("${runelite.twitter.listid}") String listId + @Value("${runelite.twitter.listid}") String listId, + OkHttpClient okHttpClient ) { this.credentials = consumerKey + ":" + consumerSecret; this.listId = listId; + this.okHttpClient = okHttpClient; } public List getTweets() throws IOException @@ -91,7 +95,7 @@ public class TwitterService .header("Authorization", "Bearer " + token) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { @@ -143,7 +147,7 @@ public class TwitterService .post(new FormBody.Builder().add("grant_type", "client_credentials").build()) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { diff --git a/http-service/src/main/java/net/runelite/http/service/item/ItemService.java b/http-service/src/main/java/net/runelite/http/service/item/ItemService.java index d25621260e..bc3f03e70c 100644 --- a/http-service/src/main/java/net/runelite/http/service/item/ItemService.java +++ b/http-service/src/main/java/net/runelite/http/service/item/ItemService.java @@ -39,10 +39,12 @@ import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.item.ItemType; import net.runelite.http.service.cache.CacheService; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.sql2o.Connection; @@ -53,10 +55,6 @@ import org.sql2o.Sql2o; @Slf4j public class ItemService { - private static final String BASE = "https://services.runescape.com/m=itemdb_oldschool"; - private static final HttpUrl RS_ITEM_URL = HttpUrl.parse(BASE + "/api/catalogue/detail.json"); - private static final HttpUrl RS_PRICE_URL = HttpUrl.parse(BASE + "/api/graph"); - private static final String CREATE_ITEMS = "CREATE TABLE IF NOT EXISTS `items` (\n" + " `id` int(11) NOT NULL,\n" + " `name` tinytext NOT NULL,\n" @@ -77,16 +75,27 @@ public class ItemService private final Sql2o sql2o; private final CacheService cacheService; + private final OkHttpClient okHttpClient; + private final HttpUrl itemUrl; + private final HttpUrl priceUrl; private int[] tradeableItems; private final Random random = new Random(); @Autowired - public ItemService(@Qualifier("Runelite SQL2O") Sql2o sql2o, - CacheService cacheService) + public ItemService( + @Qualifier("Runelite SQL2O") Sql2o sql2o, + CacheService cacheService, + OkHttpClient okHttpClient, + @Value("${runelite.item.itemUrl}") String itemUrl, + @Value("${runelite.item.priceUrl}") String priceUrl + ) { this.sql2o = sql2o; this.cacheService = cacheService; + this.okHttpClient = okHttpClient; + this.itemUrl = HttpUrl.get(itemUrl); + this.priceUrl = HttpUrl.get(priceUrl); try (Connection con = sql2o.open()) { @@ -195,7 +204,7 @@ public class ItemService private RSItem fetchRSItem(int itemId) throws IOException { - HttpUrl itemUrl = RS_ITEM_URL + HttpUrl itemUrl = this.itemUrl .newBuilder() .addQueryParameter("item", "" + itemId) .build(); @@ -211,7 +220,7 @@ public class ItemService private RSPrices fetchRSPrices(int itemId) throws IOException { - HttpUrl priceUrl = RS_PRICE_URL + HttpUrl priceUrl = this.priceUrl .newBuilder() .addPathSegment(itemId + ".json") .build(); @@ -223,9 +232,9 @@ public class ItemService return fetchJson(request, RSPrices.class); } - private static T fetchJson(Request request, Class clazz) throws IOException + private T fetchJson(Request request, Class clazz) throws IOException { - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response response = okHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { diff --git a/http-service/src/main/java/net/runelite/http/service/wiki/WikiPriceService.java b/http-service/src/main/java/net/runelite/http/service/wiki/WikiPriceService.java index 3167767836..2e32fc1808 100644 --- a/http-service/src/main/java/net/runelite/http/service/wiki/WikiPriceService.java +++ b/http-service/src/main/java/net/runelite/http/service/wiki/WikiPriceService.java @@ -31,6 +31,7 @@ import java.util.Map; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; @@ -57,14 +58,19 @@ public class WikiPriceService ") ENGINE=InnoDB;"; private final Sql2o sql2o; - - @Value("${runelite.wiki.url}") - private String url; + private final OkHttpClient okHttpClient; + private final HttpUrl wikiUrl; @Autowired - public WikiPriceService(@Qualifier("Runelite SQL2O") Sql2o sql2o) + public WikiPriceService( + @Qualifier("Runelite SQL2O") Sql2o sql2o, + OkHttpClient okHttpClient, + @Value("${runelite.wiki.url}") String url + ) { this.sql2o = sql2o; + this.okHttpClient = okHttpClient; + this.wikiUrl = HttpUrl.get(url); try (Connection con = sql2o.open()) { @@ -112,13 +118,12 @@ public class WikiPriceService private PriceResult getPrices() throws IOException { - HttpUrl httpUrl = HttpUrl.parse(url); Request request = new Request.Builder() - .url(httpUrl) + .url(wikiUrl) .header("User-Agent", "RuneLite") .build(); - try (Response responseOk = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response responseOk = okHttpClient.newCall(request).execute()) { if (!responseOk.isSuccessful()) { diff --git a/http-service/src/main/java/net/runelite/http/service/worlds/WorldsService.java b/http-service/src/main/java/net/runelite/http/service/worlds/WorldsService.java index fe85fb35dd..1f8debe7eb 100644 --- a/http-service/src/main/java/net/runelite/http/service/worlds/WorldsService.java +++ b/http-service/src/main/java/net/runelite/http/service/worlds/WorldsService.java @@ -29,21 +29,32 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; -import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldResult; import net.runelite.http.api.worlds.WorldType; import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class WorldsService { - private static final HttpUrl WORLD_URL = HttpUrl.parse("http://www.runescape.com/g=oldscape/slr.ws?order=LPWM"); + private final OkHttpClient okHttpClient; + private final HttpUrl url; - private HttpUrl url = WORLD_URL; + @Autowired + public WorldsService( + OkHttpClient okHttpClient, + @Value("${runelite.worlds.url}") String url + ) + { + this.okHttpClient = okHttpClient; + this.url = HttpUrl.get(url); + } public WorldResult getWorlds() throws IOException { @@ -53,7 +64,7 @@ public class WorldsService byte[] b; - try (Response okresponse = RuneLiteAPI.CLIENT.newCall(okrequest).execute()) + try (Response okresponse = okHttpClient.newCall(okrequest).execute()) { b = okresponse.body().bytes(); } @@ -118,14 +129,4 @@ public class WorldsService return sb.toString(); } - - public HttpUrl getUrl() - { - return url; - } - - public void setUrl(HttpUrl url) - { - this.url = url; - } } diff --git a/http-service/src/main/resources/application.yaml b/http-service/src/main/resources/application.yaml index 9eedd33c01..f77e17ae19 100644 --- a/http-service/src/main/resources/application.yaml +++ b/http-service/src/main/resources/application.yaml @@ -47,3 +47,12 @@ runelite: url: https://prices.runescape.wiki/api/v1/osrs/latest price: cache: 30 # minutes + feed: + rssUrl: https://runelite.net/atom.xml + worlds: + url: http://www.runescape.com/g=oldscape/slr.ws?order=LPWM + osrsnews: + rssUrl: https://services.runescape.com/m=news/latest_news.rss?oldschool=true + item: + itemUrl: https://services.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json + priceUrl: https://services.runescape.com/m=itemdb_oldschool/api/graph \ No newline at end of file diff --git a/http-service/src/test/java/net/runelite/http/service/worlds/WorldsServiceTest.java b/http-service/src/test/java/net/runelite/http/service/worlds/WorldsServiceTest.java index 6d55fc52aa..b6275d7c48 100644 --- a/http-service/src/test/java/net/runelite/http/service/worlds/WorldsServiceTest.java +++ b/http-service/src/test/java/net/runelite/http/service/worlds/WorldsServiceTest.java @@ -29,6 +29,7 @@ import java.io.InputStream; import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldResult; import net.runelite.http.api.worlds.WorldType; +import okhttp3.OkHttpClient; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okio.Buffer; @@ -60,8 +61,7 @@ public class WorldsServiceTest @Test public void testListWorlds() throws Exception { - WorldsService worlds = new WorldsService(); - worlds.setUrl(server.url("/")); + WorldsService worlds = new WorldsService(new OkHttpClient(), server.url("/").toString()); WorldResult worldResult = worlds.getWorlds(); assertEquals(82, worldResult.getWorlds().size());