diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index 3c0af51131..96f9e2911d 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -66,6 +66,18 @@ reactive-streams ${reactive.stream.version} + + + + com.squareup.retrofit2 + retrofit + ${retrofit.version} + + + com.squareup.retrofit2 + converter-gson + ${retrofit.version} + @@ -76,6 +88,7 @@ 1.0.3 9.4.19.v20190610 2.2.11 + 2.3.0 5.1.9.RELEASE 1.0.3 3.2.12.RELEASE diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApi.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApi.java new file mode 100644 index 0000000000..5356c12b26 --- /dev/null +++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApi.java @@ -0,0 +1,19 @@ +package com.baeldung.retrofit.dynamic; + +import com.baeldung.retrofit.models.Contributor; +import com.baeldung.retrofit.models.Repository; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; +import retrofit2.http.Url; + +import java.util.List; + +public interface GitHubDynamicApi { + + @GET + Call> reposList(@Url String url); + + @GET("{fullUrl}") + Call> contributorsList(@Path(value = "fullUrl", encoded = true) String fullUrl); +} diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiApp.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiApp.java new file mode 100644 index 0000000000..06f6b3cef7 --- /dev/null +++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiApp.java @@ -0,0 +1,13 @@ +package com.baeldung.retrofit.dynamic; + +import java.io.IOException; +import java.util.List; + +public class GitHubDynamicApiApp { + + public static void main(String[] args) throws IOException { + String url = "https://api.github.com/users/eugenp/repos"; + List topContributors = new GitHubDynamicApiService().getTopContributors(url); + topContributors.forEach(System.out::println); + } +} diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiService.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiService.java new file mode 100644 index 0000000000..cb8e95f2d5 --- /dev/null +++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiService.java @@ -0,0 +1,44 @@ +package com.baeldung.retrofit.dynamic; + +import com.baeldung.retrofit.models.Contributor; +import com.baeldung.retrofit.models.Repository; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +class GitHubDynamicApiService { + + private GitHubDynamicApi gitHubDynamicApi; + + GitHubDynamicApiService() { + Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build(); + + gitHubDynamicApi = retrofit.create(GitHubDynamicApi.class); + } + + List getTopContributors(String url) throws IOException { + List repos = gitHubDynamicApi.reposList(url).execute().body(); + + repos = repos != null ? repos : Collections.emptyList(); + + return repos.stream().flatMap(repo -> getContributors("repos/eugenp/"+repo+"/contributors")).sorted((a, b) -> b.getContributions() - a.getContributions()).map(com.baeldung.retrofit.models.Contributor::getName).distinct().sorted().collect(Collectors.toList()); + } + + private Stream getContributors(String fullUrl) { + List contributors = null; + try { + contributors = gitHubDynamicApi.contributorsList(fullUrl).execute().body(); + } catch (IOException e) { + e.printStackTrace(); + } + + contributors = contributors != null ? contributors : Collections.emptyList(); + + return contributors.stream().filter(c -> c.getContributions() > 100); + } +} diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Contributor.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Contributor.java new file mode 100644 index 0000000000..f98b19de96 --- /dev/null +++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Contributor.java @@ -0,0 +1,33 @@ +package com.baeldung.retrofit.models; + +import com.google.gson.annotations.SerializedName; + +public class Contributor { + + @SerializedName("login") + private String name; + + private Integer contributions; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getContributions() { + return contributions; + } + + public void setContributions(Integer contributions) { + this.contributions = contributions; + } + + @Override + public String toString() { + return "Contributer [name=" + name + ", contributions=" + contributions + "]"; + } + +} diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Repository.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Repository.java new file mode 100644 index 0000000000..6bc91eb772 --- /dev/null +++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Repository.java @@ -0,0 +1,30 @@ +package com.baeldung.retrofit.models; + +public class Repository { + + private String name; + + private String description; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + return "Repository [name=" + name + ", description=" + description + "]"; + } + +}