make searchPackage return a CompletableFuture

This commit is contained in:
Thomas Rubini 2022-12-13 22:43:56 +01:00
parent ca6e940cae
commit 2196a9006f
No known key found for this signature in database
GPG Key ID: C7D287C8C1CAC373
4 changed files with 56 additions and 52 deletions

View File

@ -71,29 +71,23 @@ public CompletableFuture<Pair<Package, Set<String>>> getPackageFromAPI(String pa
}
/**
* Search for a package and return a list of packages
* @param packageName the package name to search
* @return
*/
public List<SearchedPackage> searchPackage(String packageName){
public CompletableFuture<List<SearchedPackage>> searchPackage(String packageName){
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://archlinux.org/packages/search/json/?q="+packageName))
.build();
HttpResponse<String> response;
try{
response = client.send(request, HttpResponse.BodyHandlers.ofString());
}catch(IOException|InterruptedException e){
e.printStackTrace();
return null;
}
CompletableFuture<List<SearchedPackage>> futureSearchedPackages = new CompletableFuture<>();
JSONObject json = new JSONObject(response.body());
client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenAccept(result->{
List<SearchedPackage> searchedPackagesList = new ArrayList<>();
JSONObject json = new JSONObject(result.body());
// iterate for every package in the list
for (Object searchResultObj : json.getJSONArray("results")) {
@ -107,8 +101,16 @@ public CompletableFuture<Pair<Package, Set<String>>> getPackageFromAPI(String pa
searchResultJson.getString("pkgdesc")
));
}
futureSearchedPackages.complete(searchedPackagesList);
}).exceptionally(error->{
error.printStackTrace();
futureSearchedPackages.complete(Collections.emptyList());
return null;
});
return searchedPackagesList;
return futureSearchedPackages;
}
}

View File

@ -7,6 +7,6 @@ import java.util.List;
import java.util.concurrent.CompletableFuture;
public interface Distribution {
List<SearchedPackage> searchPackage(String packageName);
CompletableFuture<List<SearchedPackage>> searchPackage(String packageName);
CompletableFuture<Package> getPackageTree(String packageName, int depth);
}

View File

@ -75,7 +75,7 @@ public class FedoraDistribution extends AsyncRequestsParser implements Distribut
}
@Override
public List<SearchedPackage> searchPackage(String packageName) {
public CompletableFuture<List<SearchedPackage>> searchPackage(String packageName) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
@ -84,15 +84,10 @@ public class FedoraDistribution extends AsyncRequestsParser implements Distribut
+ packageName + "*"))
.build();
HttpResponse<String> response;
try {
response = client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
return null;
}
CompletableFuture<List<SearchedPackage>> futureSearchedPackages = new CompletableFuture<>();
JSONObject json = new JSONObject(response.body());
client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenAccept(result->{
JSONObject json = new JSONObject(result.body());
List<SearchedPackage> searchedPackagesList = new ArrayList<>();
@ -107,6 +102,13 @@ public class FedoraDistribution extends AsyncRequestsParser implements Distribut
searchResultJson.getString("fullname"),
searchResultJson.getString("description")));
}
return searchedPackagesList;
futureSearchedPackages.complete(searchedPackagesList);
}).exceptionally(error->{
error.printStackTrace();
futureSearchedPackages.complete(Collections.emptyList());
return null;
});
return futureSearchedPackages;
}
}

View File

@ -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;