From 2196a9006f48b8f01b8e3a8654e3a974a0fdfd11 Mon Sep 17 00:00:00 2001 From: Thomas Rubini <74205383+ThomasRubini@users.noreply.github.com> Date: Tue, 13 Dec 2022 22:43:56 +0100 Subject: [PATCH] make searchPackage return a CompletableFuture --- .../distribution/ArchDistribution.java | 50 ++++++++++--------- .../distribution/Distribution.java | 2 +- .../distribution/FedoraDistribution.java | 48 +++++++++--------- src/test/java/fr/packageviewer/ArchTest.java | 8 +-- 4 files changed, 56 insertions(+), 52 deletions(-) diff --git a/src/main/java/fr/packageviewer/distribution/ArchDistribution.java b/src/main/java/fr/packageviewer/distribution/ArchDistribution.java index 2c7edb8..d3a6725 100644 --- a/src/main/java/fr/packageviewer/distribution/ArchDistribution.java +++ b/src/main/java/fr/packageviewer/distribution/ArchDistribution.java @@ -71,44 +71,46 @@ public CompletableFuture>> getPackageFromAPI(String pa } - /** * Search for a package and return a list of packages * @param packageName the package name to search * @return */ - public List searchPackage(String packageName){ + public CompletableFuture> searchPackage(String packageName){ HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://archlinux.org/packages/search/json/?q="+packageName)) .build(); - HttpResponse response; - try{ - response = client.send(request, HttpResponse.BodyHandlers.ofString()); - }catch(IOException|InterruptedException e){ - e.printStackTrace(); + CompletableFuture> futureSearchedPackages = new CompletableFuture<>(); + + client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenAccept(result->{ + + List searchedPackagesList = new ArrayList<>(); + JSONObject json = new JSONObject(result.body()); + + // iterate for every package in the list + for (Object searchResultObj : json.getJSONArray("results")) { + // convert object into String + JSONObject searchResultJson = (JSONObject) searchResultObj; + // add package into to list + searchedPackagesList.add(new SearchedPackage( + searchResultJson.getString("pkgname"), + searchResultJson.getString("pkgver"), + searchResultJson.getString("repo"), + searchResultJson.getString("pkgdesc") + )); + } + futureSearchedPackages.complete(searchedPackagesList); + }).exceptionally(error->{ + error.printStackTrace(); + futureSearchedPackages.complete(Collections.emptyList()); return null; - } + }); - JSONObject json = new JSONObject(response.body()); - List searchedPackagesList = new ArrayList<>(); - // iterate for every package in the list - for (Object searchResultObj : json.getJSONArray("results")) { - // convert object into String - JSONObject searchResultJson = (JSONObject) searchResultObj; - // add package into to list - searchedPackagesList.add(new SearchedPackage( - searchResultJson.getString("pkgname"), - searchResultJson.getString("pkgver"), - searchResultJson.getString("repo"), - searchResultJson.getString("pkgdesc") - )); - } - - return searchedPackagesList; + return futureSearchedPackages; } } diff --git a/src/main/java/fr/packageviewer/distribution/Distribution.java b/src/main/java/fr/packageviewer/distribution/Distribution.java index 33d6d47..36e6c83 100644 --- a/src/main/java/fr/packageviewer/distribution/Distribution.java +++ b/src/main/java/fr/packageviewer/distribution/Distribution.java @@ -7,6 +7,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; public interface Distribution { - List searchPackage(String packageName); + CompletableFuture> searchPackage(String packageName); CompletableFuture getPackageTree(String packageName, int depth); } diff --git a/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java b/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java index 0875599..5fe0dc4 100644 --- a/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java +++ b/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java @@ -75,7 +75,7 @@ public class FedoraDistribution extends AsyncRequestsParser implements Distribut } @Override - public List searchPackage(String packageName) { + public CompletableFuture> searchPackage(String packageName) { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() @@ -84,29 +84,31 @@ public class FedoraDistribution extends AsyncRequestsParser implements Distribut + packageName + "*")) .build(); - HttpResponse response; - try { - response = client.send(request, HttpResponse.BodyHandlers.ofString()); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); + CompletableFuture> futureSearchedPackages = new CompletableFuture<>(); + + client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenAccept(result->{ + JSONObject json = new JSONObject(result.body()); + + List searchedPackagesList = new ArrayList<>(); + + // iterate for every package in the list + for (Object searchResultObj : json.getJSONArray("projects")) { + // convert object into String + JSONObject searchResultJson = (JSONObject) searchResultObj; + // add package into to list + searchedPackagesList.add(new SearchedPackage( + searchResultJson.getString("neofetch"), + null, + searchResultJson.getString("fullname"), + searchResultJson.getString("description"))); + } + futureSearchedPackages.complete(searchedPackagesList); + }).exceptionally(error->{ + error.printStackTrace(); + futureSearchedPackages.complete(Collections.emptyList()); return null; - } + }); - JSONObject json = new JSONObject(response.body()); - - List searchedPackagesList = new ArrayList<>(); - - // iterate for every package in the list - for (Object searchResultObj : json.getJSONArray("projects")) { - // convert object into String - JSONObject searchResultJson = (JSONObject) searchResultObj; - // add package into to list - searchedPackagesList.add(new SearchedPackage( - searchResultJson.getString("neofetch"), - null, - searchResultJson.getString("fullname"), - searchResultJson.getString("description"))); - } - return searchedPackagesList; + return futureSearchedPackages; } } diff --git a/src/test/java/fr/packageviewer/ArchTest.java b/src/test/java/fr/packageviewer/ArchTest.java index e67feaa..62f5ba0 100644 --- a/src/test/java/fr/packageviewer/ArchTest.java +++ b/src/test/java/fr/packageviewer/ArchTest.java @@ -67,14 +67,14 @@ public class ArchTest { } @Test - public void testThatBashSearchReturnsResults() { + public void testThatBashSearchReturnsResults() throws ExecutionException, InterruptedException { Distribution arch = new ArchDistribution(); - Assertions.assertNotEquals(arch.searchPackage("bash").size(), 0); + Assertions.assertNotEquals(arch.searchPackage("bash").get().size(), 0); } @Test - public void testThatBashSearchContainsBash() { + public void testThatBashSearchContainsBash() throws ExecutionException, InterruptedException { Distribution arch = new ArchDistribution(); - for(SearchedPackage pack : arch.searchPackage("bash")){ + for(SearchedPackage pack : arch.searchPackage("bash").get()){ if(pack.getName().equals("bash")){ Assertions.assertTrue(true); return;