From 4bd88567c7d9df0892ba7798fce8cacc20bb4031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Mon, 20 Mar 2023 15:24:13 +0000 Subject: [PATCH 1/9] Add Spring like auto-configuration --- README.md | 15 ++++ .../DeleteActivityProfileApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../DeleteAgentProfileApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../deletestate/DeleteStateApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../deletestates/DeleteStatesApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../samples/getabout/GetAboutApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../GetActivityProfileApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../GetActivityProfilesApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../getactivity/GetActivityApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../GetAgentProfileApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../GetAgentProfilesApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../getagents/GetAgentsApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../GetMoreStatementsApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../samples/getstate/GetStateApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../getstatement/GetStatementApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../GetStatementsApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../getstates/GetStatesApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../GetVoidedStatementApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../PostActivityProfileApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../PostAgentProfileApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../poststate/PostStateApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../PostStatementApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../PostStatementsApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../PutActivityProfileApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../PutAgentProfileApplication.java | 22 ++---- .../src/main/resources/application.properties | 3 + .../samples/putstate/PutStateApplication.java | 21 ++---- .../src/main/resources/application.properties | 3 + .../XapiClientAutoConfiguration.java | 53 ++++++++++++++ .../configuration/XapiClientConfigurer.java | 22 ++++++ .../configuration/XapiClientProperties.java | 53 ++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../learning/xapi/client/XapiClientTests.java | 6 +- .../XapiClientConfigurationTest.java | 71 +++++++++++++++++++ .../XapiClientConfigurationTest2.java | 69 ++++++++++++++++++ 58 files changed, 461 insertions(+), 440 deletions(-) create mode 100644 samples/delete-activity-profile/src/main/resources/application.properties create mode 100644 samples/delete-agent-profile/src/main/resources/application.properties create mode 100644 samples/delete-state/src/main/resources/application.properties create mode 100644 samples/delete-states/src/main/resources/application.properties create mode 100644 samples/get-about/src/main/resources/application.properties create mode 100644 samples/get-activity-profile/src/main/resources/application.properties create mode 100644 samples/get-activity-profiles/src/main/resources/application.properties create mode 100644 samples/get-activity/src/main/resources/application.properties create mode 100644 samples/get-agent-profile/src/main/resources/application.properties create mode 100644 samples/get-agent-profiles/src/main/resources/application.properties create mode 100644 samples/get-agents/src/main/resources/application.properties create mode 100644 samples/get-more-statements/src/main/resources/application.properties create mode 100644 samples/get-state/src/main/resources/application.properties create mode 100644 samples/get-statement/src/main/resources/application.properties create mode 100644 samples/get-statements/src/main/resources/application.properties create mode 100644 samples/get-states/src/main/resources/application.properties create mode 100644 samples/get-voided-statement/src/main/resources/application.properties create mode 100644 samples/post-activity-profile/src/main/resources/application.properties create mode 100644 samples/post-agent-profile/src/main/resources/application.properties create mode 100644 samples/post-state/src/main/resources/application.properties create mode 100644 samples/post-statement/src/main/resources/application.properties create mode 100644 samples/post-statements/src/main/resources/application.properties create mode 100644 samples/put-activity-profile/src/main/resources/application.properties create mode 100644 samples/put-agent-profile/src/main/resources/application.properties create mode 100644 samples/put-state/src/main/resources/application.properties create mode 100644 xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java create mode 100644 xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java create mode 100644 xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java create mode 100644 xapi-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java create mode 100644 xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java diff --git a/README.md b/README.md index b7972572..f8be66d3 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,21 @@ To use the xAPI Java Client include the appropriate XML in the `dependencies` se ``` +### Configuration + +The xAPI Java Client has a Spring AutoConfiguration bean which picks up the following properties from the environment: + +``` +xapi.client.baseUrl +xapi.client.username +xapi.client.password +xapi.client.authorization +``` + +Set `xapi.client.baseUrl` to your xApi LRS endpoint. Use `xapi.client.username` and `xapi.client.password` for basic authorization, or set the whole authorization header via `xapi.client.authorization`. (The latter has precedence if both method is used) + +If you need more specific customization (eg. your LRS needs specific headers, or you want to set the authorization header dynamically) you can create a custom configurer by implementing the `XapiClientConfigurer` interface. + ### Statement Resource The xAPI Java Client allows applications to store and fetch xAPI [Statements](https://github.com/adlnet/xAPI-Spec/blob/master/xAPI-Data.md#statements). diff --git a/samples/delete-activity-profile/src/main/java/dev/learning/xapi/samples/deleteactivityprofile/DeleteActivityProfileApplication.java b/samples/delete-activity-profile/src/main/java/dev/learning/xapi/samples/deleteactivityprofile/DeleteActivityProfileApplication.java index 2ed768ed..cad056d0 100644 --- a/samples/delete-activity-profile/src/main/java/dev/learning/xapi/samples/deleteactivityprofile/DeleteActivityProfileApplication.java +++ b/samples/delete-activity-profile/src/main/java/dev/learning/xapi/samples/deleteactivityprofile/DeleteActivityProfileApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to delete an activity profile. @@ -20,24 +20,11 @@ @SpringBootApplication public class DeleteActivityProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public DeleteActivityProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(DeleteActivityProfileApplication.class, args).close(); diff --git a/samples/delete-activity-profile/src/main/resources/application.properties b/samples/delete-activity-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/delete-activity-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/delete-agent-profile/src/main/java/dev/learning/xapi/samples/deleteagentprofile/DeleteAgentProfileApplication.java b/samples/delete-agent-profile/src/main/java/dev/learning/xapi/samples/deleteagentprofile/DeleteAgentProfileApplication.java index 18dce5a6..f22a5486 100644 --- a/samples/delete-agent-profile/src/main/java/dev/learning/xapi/samples/deleteagentprofile/DeleteAgentProfileApplication.java +++ b/samples/delete-agent-profile/src/main/java/dev/learning/xapi/samples/deleteagentprofile/DeleteAgentProfileApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to delete an agent profile. @@ -20,24 +20,11 @@ @SpringBootApplication public class DeleteAgentProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public DeleteAgentProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(DeleteAgentProfileApplication.class, args).close(); diff --git a/samples/delete-agent-profile/src/main/resources/application.properties b/samples/delete-agent-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/delete-agent-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/delete-state/src/main/java/dev/learning/xapi/samples/deletestate/DeleteStateApplication.java b/samples/delete-state/src/main/java/dev/learning/xapi/samples/deletestate/DeleteStateApplication.java index d980a2ef..fda47d8b 100644 --- a/samples/delete-state/src/main/java/dev/learning/xapi/samples/deletestate/DeleteStateApplication.java +++ b/samples/delete-state/src/main/java/dev/learning/xapi/samples/deletestate/DeleteStateApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to delete a state. @@ -20,24 +20,11 @@ @SpringBootApplication public class DeleteStateApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public DeleteStateApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(DeleteStateApplication.class, args).close(); diff --git a/samples/delete-state/src/main/resources/application.properties b/samples/delete-state/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/delete-state/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/delete-states/src/main/java/dev/learning/xapi/samples/deletestates/DeleteStatesApplication.java b/samples/delete-states/src/main/java/dev/learning/xapi/samples/deletestates/DeleteStatesApplication.java index 865f63bb..596cd656 100644 --- a/samples/delete-states/src/main/java/dev/learning/xapi/samples/deletestates/DeleteStatesApplication.java +++ b/samples/delete-states/src/main/java/dev/learning/xapi/samples/deletestates/DeleteStatesApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to delete multiple states. @@ -20,24 +20,11 @@ @SpringBootApplication public class DeleteStatesApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public DeleteStatesApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(DeleteStatesApplication.class, args).close(); diff --git a/samples/delete-states/src/main/resources/application.properties b/samples/delete-states/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/delete-states/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-about/src/main/java/dev/learning/xapi/samples/getabout/GetAboutApplication.java b/samples/get-about/src/main/java/dev/learning/xapi/samples/getabout/GetAboutApplication.java index 266b9b1b..dabe3866 100644 --- a/samples/get-about/src/main/java/dev/learning/xapi/samples/getabout/GetAboutApplication.java +++ b/samples/get-about/src/main/java/dev/learning/xapi/samples/getabout/GetAboutApplication.java @@ -6,11 +6,11 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.model.About; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get about. @@ -20,24 +20,11 @@ @SpringBootApplication public class GetAboutApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetAboutApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetAboutApplication.class, args).close(); diff --git a/samples/get-about/src/main/resources/application.properties b/samples/get-about/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-about/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-activity-profile/src/main/java/dev/learning/xapi/samples/getactivityprofile/GetActivityProfileApplication.java b/samples/get-activity-profile/src/main/java/dev/learning/xapi/samples/getactivityprofile/GetActivityProfileApplication.java index ffeb0a91..af7ccde5 100644 --- a/samples/get-activity-profile/src/main/java/dev/learning/xapi/samples/getactivityprofile/GetActivityProfileApplication.java +++ b/samples/get-activity-profile/src/main/java/dev/learning/xapi/samples/getactivityprofile/GetActivityProfileApplication.java @@ -7,11 +7,11 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get an activity profile. @@ -21,24 +21,11 @@ @SpringBootApplication public class GetActivityProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetActivityProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetActivityProfileApplication.class, args).close(); diff --git a/samples/get-activity-profile/src/main/resources/application.properties b/samples/get-activity-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-activity-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-activity-profiles/src/main/java/dev/learning/xapi/samples/getactivityprofiles/GetActivityProfilesApplication.java b/samples/get-activity-profiles/src/main/java/dev/learning/xapi/samples/getactivityprofiles/GetActivityProfilesApplication.java index 372d01ac..8fe82a06 100644 --- a/samples/get-activity-profiles/src/main/java/dev/learning/xapi/samples/getactivityprofiles/GetActivityProfilesApplication.java +++ b/samples/get-activity-profiles/src/main/java/dev/learning/xapi/samples/getactivityprofiles/GetActivityProfilesApplication.java @@ -8,11 +8,11 @@ import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get activity profiles. @@ -22,24 +22,11 @@ @SpringBootApplication public class GetActivityProfilesApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetActivityProfilesApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetActivityProfilesApplication.class, args).close(); diff --git a/samples/get-activity-profiles/src/main/resources/application.properties b/samples/get-activity-profiles/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-activity-profiles/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-activity/src/main/java/dev/learning/xapi/samples/getactivity/GetActivityApplication.java b/samples/get-activity/src/main/java/dev/learning/xapi/samples/getactivity/GetActivityApplication.java index e286739c..2a88c2a0 100644 --- a/samples/get-activity/src/main/java/dev/learning/xapi/samples/getactivity/GetActivityApplication.java +++ b/samples/get-activity/src/main/java/dev/learning/xapi/samples/getactivity/GetActivityApplication.java @@ -10,11 +10,11 @@ import java.net.URI; import java.util.Locale; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get an activity. @@ -24,25 +24,11 @@ @SpringBootApplication public class GetActivityApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetActivityApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetActivityApplication.class, args).close(); diff --git a/samples/get-activity/src/main/resources/application.properties b/samples/get-activity/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-activity/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-agent-profile/src/main/java/dev/learning/xapi/samples/getagentprofile/GetAgentProfileApplication.java b/samples/get-agent-profile/src/main/java/dev/learning/xapi/samples/getagentprofile/GetAgentProfileApplication.java index 680aa707..d66d5a09 100644 --- a/samples/get-agent-profile/src/main/java/dev/learning/xapi/samples/getagentprofile/GetAgentProfileApplication.java +++ b/samples/get-agent-profile/src/main/java/dev/learning/xapi/samples/getagentprofile/GetAgentProfileApplication.java @@ -7,11 +7,11 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get a agent profile. @@ -21,24 +21,11 @@ @SpringBootApplication public class GetAgentProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetAgentProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetAgentProfileApplication.class, args).close(); diff --git a/samples/get-agent-profile/src/main/resources/application.properties b/samples/get-agent-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-agent-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-agent-profiles/src/main/java/dev/learning/xapi/samples/getagentprofiles/GetAgentProfilesApplication.java b/samples/get-agent-profiles/src/main/java/dev/learning/xapi/samples/getagentprofiles/GetAgentProfilesApplication.java index 42f53b03..a5dc1005 100644 --- a/samples/get-agent-profiles/src/main/java/dev/learning/xapi/samples/getagentprofiles/GetAgentProfilesApplication.java +++ b/samples/get-agent-profiles/src/main/java/dev/learning/xapi/samples/getagentprofiles/GetAgentProfilesApplication.java @@ -6,11 +6,11 @@ import dev.learning.xapi.client.XapiClient; import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get a agent profile. @@ -20,24 +20,11 @@ @SpringBootApplication public class GetAgentProfilesApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetAgentProfilesApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetAgentProfilesApplication.class, args).close(); diff --git a/samples/get-agent-profiles/src/main/resources/application.properties b/samples/get-agent-profiles/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-agent-profiles/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-agents/src/main/java/dev/learning/xapi/samples/getagents/GetAgentsApplication.java b/samples/get-agents/src/main/java/dev/learning/xapi/samples/getagents/GetAgentsApplication.java index 1ea23bfc..fa42db31 100644 --- a/samples/get-agents/src/main/java/dev/learning/xapi/samples/getagents/GetAgentsApplication.java +++ b/samples/get-agents/src/main/java/dev/learning/xapi/samples/getagents/GetAgentsApplication.java @@ -9,11 +9,11 @@ import dev.learning.xapi.model.Verb; import java.util.Locale; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get agents. @@ -23,25 +23,11 @@ @SpringBootApplication public class GetAgentsApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetAgentsApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetAgentsApplication.class, args).close(); diff --git a/samples/get-agents/src/main/resources/application.properties b/samples/get-agents/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-agents/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-more-statements/src/main/java/dev/learning/xapi/samples/getmorestatements/GetMoreStatementsApplication.java b/samples/get-more-statements/src/main/java/dev/learning/xapi/samples/getmorestatements/GetMoreStatementsApplication.java index 87306915..87b1fddb 100644 --- a/samples/get-more-statements/src/main/java/dev/learning/xapi/samples/getmorestatements/GetMoreStatementsApplication.java +++ b/samples/get-more-statements/src/main/java/dev/learning/xapi/samples/getmorestatements/GetMoreStatementsApplication.java @@ -7,11 +7,11 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.model.StatementResult; import java.util.Arrays; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get more multiple statements. @@ -21,25 +21,11 @@ @SpringBootApplication public class GetMoreStatementsApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetMoreStatementsApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetMoreStatementsApplication.class, args).close(); diff --git a/samples/get-more-statements/src/main/resources/application.properties b/samples/get-more-statements/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-more-statements/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-state/src/main/java/dev/learning/xapi/samples/getstate/GetStateApplication.java b/samples/get-state/src/main/java/dev/learning/xapi/samples/getstate/GetStateApplication.java index 53a81a01..a5b57372 100644 --- a/samples/get-state/src/main/java/dev/learning/xapi/samples/getstate/GetStateApplication.java +++ b/samples/get-state/src/main/java/dev/learning/xapi/samples/getstate/GetStateApplication.java @@ -7,11 +7,11 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get a state. @@ -21,25 +21,11 @@ @SpringBootApplication public class GetStateApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetStateApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetStateApplication.class, args).close(); diff --git a/samples/get-state/src/main/resources/application.properties b/samples/get-state/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-state/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-statement/src/main/java/dev/learning/xapi/samples/getstatement/GetStatementApplication.java b/samples/get-statement/src/main/java/dev/learning/xapi/samples/getstatement/GetStatementApplication.java index 66a4a4ba..392a33eb 100644 --- a/samples/get-statement/src/main/java/dev/learning/xapi/samples/getstatement/GetStatementApplication.java +++ b/samples/get-statement/src/main/java/dev/learning/xapi/samples/getstatement/GetStatementApplication.java @@ -9,11 +9,11 @@ import dev.learning.xapi.model.Verb; import java.util.Locale; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get a statement. @@ -23,25 +23,11 @@ @SpringBootApplication public class GetStatementApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetStatementApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetStatementApplication.class, args).close(); diff --git a/samples/get-statement/src/main/resources/application.properties b/samples/get-statement/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-statement/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-statements/src/main/java/dev/learning/xapi/samples/getstatements/GetStatementsApplication.java b/samples/get-statements/src/main/java/dev/learning/xapi/samples/getstatements/GetStatementsApplication.java index 507919cd..e04a6de7 100644 --- a/samples/get-statements/src/main/java/dev/learning/xapi/samples/getstatements/GetStatementsApplication.java +++ b/samples/get-statements/src/main/java/dev/learning/xapi/samples/getstatements/GetStatementsApplication.java @@ -8,11 +8,11 @@ import dev.learning.xapi.model.StatementResult; import dev.learning.xapi.model.Verb; import java.util.Arrays; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get multiple statements. @@ -22,25 +22,11 @@ @SpringBootApplication public class GetStatementsApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetStatementsApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetStatementsApplication.class, args).close(); diff --git a/samples/get-statements/src/main/resources/application.properties b/samples/get-statements/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-statements/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-states/src/main/java/dev/learning/xapi/samples/getstates/GetStatesApplication.java b/samples/get-states/src/main/java/dev/learning/xapi/samples/getstates/GetStatesApplication.java index eeea9379..7a3b6dba 100644 --- a/samples/get-states/src/main/java/dev/learning/xapi/samples/getstates/GetStatesApplication.java +++ b/samples/get-states/src/main/java/dev/learning/xapi/samples/getstates/GetStatesApplication.java @@ -8,11 +8,11 @@ import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get states. @@ -22,25 +22,11 @@ @SpringBootApplication public class GetStatesApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetStatesApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetStatesApplication.class, args).close(); diff --git a/samples/get-states/src/main/resources/application.properties b/samples/get-states/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-states/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/get-voided-statement/src/main/java/dev/learning/xapi/samples/getvoidedstatement/GetVoidedStatementApplication.java b/samples/get-voided-statement/src/main/java/dev/learning/xapi/samples/getvoidedstatement/GetVoidedStatementApplication.java index 00b19f0a..e9cb54b2 100644 --- a/samples/get-voided-statement/src/main/java/dev/learning/xapi/samples/getvoidedstatement/GetVoidedStatementApplication.java +++ b/samples/get-voided-statement/src/main/java/dev/learning/xapi/samples/getvoidedstatement/GetVoidedStatementApplication.java @@ -9,11 +9,11 @@ import dev.learning.xapi.model.Verb; import java.util.Locale; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to get a voided statement. @@ -23,25 +23,11 @@ @SpringBootApplication public class GetVoidedStatementApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public GetVoidedStatementApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(GetVoidedStatementApplication.class, args).close(); diff --git a/samples/get-voided-statement/src/main/resources/application.properties b/samples/get-voided-statement/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/get-voided-statement/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/post-activity-profile/src/main/java/dev/learning/xapi/samples/postactivityprofile/PostActivityProfileApplication.java b/samples/post-activity-profile/src/main/java/dev/learning/xapi/samples/postactivityprofile/PostActivityProfileApplication.java index c5f01176..a3953064 100644 --- a/samples/post-activity-profile/src/main/java/dev/learning/xapi/samples/postactivityprofile/PostActivityProfileApplication.java +++ b/samples/post-activity-profile/src/main/java/dev/learning/xapi/samples/postactivityprofile/PostActivityProfileApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to post an activity profile. @@ -20,24 +20,11 @@ @SpringBootApplication public class PostActivityProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PostActivityProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PostActivityProfileApplication.class, args).close(); diff --git a/samples/post-activity-profile/src/main/resources/application.properties b/samples/post-activity-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/post-activity-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/post-agent-profile/src/main/java/dev/learning/xapi/samples/postagentprofile/PostAgentProfileApplication.java b/samples/post-agent-profile/src/main/java/dev/learning/xapi/samples/postagentprofile/PostAgentProfileApplication.java index 1a51d47b..a7a6cc2e 100644 --- a/samples/post-agent-profile/src/main/java/dev/learning/xapi/samples/postagentprofile/PostAgentProfileApplication.java +++ b/samples/post-agent-profile/src/main/java/dev/learning/xapi/samples/postagentprofile/PostAgentProfileApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to post an agent profile. @@ -20,25 +20,11 @@ @SpringBootApplication public class PostAgentProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PostAgentProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PostAgentProfileApplication.class, args).close(); diff --git a/samples/post-agent-profile/src/main/resources/application.properties b/samples/post-agent-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/post-agent-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/post-state/src/main/java/dev/learning/xapi/samples/poststate/PostStateApplication.java b/samples/post-state/src/main/java/dev/learning/xapi/samples/poststate/PostStateApplication.java index 8b24c0be..8ec13ef9 100644 --- a/samples/post-state/src/main/java/dev/learning/xapi/samples/poststate/PostStateApplication.java +++ b/samples/post-state/src/main/java/dev/learning/xapi/samples/poststate/PostStateApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to post a state. @@ -20,25 +20,11 @@ @SpringBootApplication public class PostStateApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PostStateApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PostStateApplication.class, args).close(); diff --git a/samples/post-state/src/main/resources/application.properties b/samples/post-state/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/post-state/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/post-statement/src/main/java/dev/learning/xapi/samples/poststatement/PostStatementApplication.java b/samples/post-statement/src/main/java/dev/learning/xapi/samples/poststatement/PostStatementApplication.java index 161b01dd..9ee12747 100644 --- a/samples/post-statement/src/main/java/dev/learning/xapi/samples/poststatement/PostStatementApplication.java +++ b/samples/post-statement/src/main/java/dev/learning/xapi/samples/poststatement/PostStatementApplication.java @@ -8,11 +8,11 @@ import dev.learning.xapi.model.Verb; import java.util.Locale; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to post a statement. @@ -22,24 +22,11 @@ @SpringBootApplication public class PostStatementApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PostStatementApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PostStatementApplication.class, args).close(); diff --git a/samples/post-statement/src/main/resources/application.properties b/samples/post-statement/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/post-statement/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/post-statements/src/main/java/dev/learning/xapi/samples/poststatements/PostStatementsApplication.java b/samples/post-statements/src/main/java/dev/learning/xapi/samples/poststatements/PostStatementsApplication.java index 2b6c717f..f94615ba 100644 --- a/samples/post-statements/src/main/java/dev/learning/xapi/samples/poststatements/PostStatementsApplication.java +++ b/samples/post-statements/src/main/java/dev/learning/xapi/samples/poststatements/PostStatementsApplication.java @@ -8,10 +8,10 @@ import dev.learning.xapi.model.Statement; import dev.learning.xapi.model.Verb; import java.util.Locale; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to post multiple statements. @@ -21,24 +21,11 @@ @SpringBootApplication public class PostStatementsApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PostStatementsApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PostStatementsApplication.class, args).close(); diff --git a/samples/post-statements/src/main/resources/application.properties b/samples/post-statements/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/post-statements/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/put-activity-profile/src/main/java/dev/learning/xapi/samples/putactivityprofile/PutActivityProfileApplication.java b/samples/put-activity-profile/src/main/java/dev/learning/xapi/samples/putactivityprofile/PutActivityProfileApplication.java index 8c3850b6..1fc185e0 100644 --- a/samples/put-activity-profile/src/main/java/dev/learning/xapi/samples/putactivityprofile/PutActivityProfileApplication.java +++ b/samples/put-activity-profile/src/main/java/dev/learning/xapi/samples/putactivityprofile/PutActivityProfileApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to put an activity profile. @@ -20,24 +20,11 @@ @SpringBootApplication public class PutActivityProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PutActivityProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PutActivityProfileApplication.class, args).close(); diff --git a/samples/put-activity-profile/src/main/resources/application.properties b/samples/put-activity-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/put-activity-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/put-agent-profile/src/main/java/dev/learning/xapi/samples/putagentprofile/PutAgentProfileApplication.java b/samples/put-agent-profile/src/main/java/dev/learning/xapi/samples/putagentprofile/PutAgentProfileApplication.java index 524f70ab..7e435046 100644 --- a/samples/put-agent-profile/src/main/java/dev/learning/xapi/samples/putagentprofile/PutAgentProfileApplication.java +++ b/samples/put-agent-profile/src/main/java/dev/learning/xapi/samples/putagentprofile/PutAgentProfileApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to put an agent profile. @@ -20,25 +20,11 @@ @SpringBootApplication public class PutAgentProfileApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PutAgentProfileApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PutAgentProfileApplication.class, args).close(); diff --git a/samples/put-agent-profile/src/main/resources/application.properties b/samples/put-agent-profile/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/put-agent-profile/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/samples/put-state/src/main/java/dev/learning/xapi/samples/putstate/PutStateApplication.java b/samples/put-state/src/main/java/dev/learning/xapi/samples/putstate/PutStateApplication.java index 4ec7209e..e40b0658 100644 --- a/samples/put-state/src/main/java/dev/learning/xapi/samples/putstate/PutStateApplication.java +++ b/samples/put-state/src/main/java/dev/learning/xapi/samples/putstate/PutStateApplication.java @@ -7,10 +7,10 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.function.client.WebClient; /** * Sample using xAPI client to put a state. @@ -20,24 +20,11 @@ @SpringBootApplication public class PutStateApplication implements CommandLineRunner { - private final XapiClient client; - /** - * Constructor for application. In this sample the WebClient.Builder instance is injected by the - * Spring Framework. + * Default xAPI client. Properties are picked automatically from application.properties. */ - public PutStateApplication(WebClient.Builder webClientBuilder) { - - webClientBuilder - // Change for the URL of your LRS - .baseUrl("https://example.com/xapi/") - // Set the Authorization value - .defaultHeader("Authorization", "") - - .build(); - - client = new XapiClient(webClientBuilder); - } + @Autowired + private XapiClient client; public static void main(String[] args) { SpringApplication.run(PutStateApplication.class, args).close(); diff --git a/samples/put-state/src/main/resources/application.properties b/samples/put-state/src/main/resources/application.properties new file mode 100644 index 00000000..de20217a --- /dev/null +++ b/samples/put-state/src/main/resources/application.properties @@ -0,0 +1,3 @@ +xapi.client.username = admin +xapi.client.password = password +xapi.client.baseUrl = https://example.com/xapi/ diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java new file mode 100644 index 00000000..91203aa8 --- /dev/null +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java @@ -0,0 +1,53 @@ +/* + * Copyright 2016-2019 Berry Cloud Ltd. All rights reserved. + */ + +package dev.learning.xapi.client.configuration; + +import dev.learning.xapi.client.XapiClient; +import java.util.Base64; +import java.util.List; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.web.reactive.function.client.WebClient; + +/** + * Auto-configure {@link XapiClient}. + * + * @author István Rátkai (Selindek) + */ +@Configuration +@EnableConfigurationProperties(XapiClientProperties.class) +public class XapiClientAutoConfiguration { + + /** + * Creates a default xAPI client bean. + */ + @Bean + @ConditionalOnMissingBean + public XapiClient xapiClient(XapiClientProperties properties, WebClient.Builder builder, + List configurers) { + + if (properties.getAuthorization() != null) { + builder.defaultHeader(HttpHeaders.AUTHORIZATION, properties.getAuthorization()); + + } else if (properties.getUsername() != null && properties.getPassword() != null) { + final var auth = "basic " + Base64.getEncoder() + .encodeToString((properties.getUsername() + ":" + properties.getPassword()).getBytes()); + builder.defaultHeader(HttpHeaders.AUTHORIZATION, auth); + } + + if (properties.getBaseUrl() != null) { + builder.baseUrl(properties.getBaseUrl()); + } + + configurers.forEach(c -> c.accept(builder)); + + return new XapiClient(builder); + + } + +} diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java new file mode 100644 index 00000000..b3c72c82 --- /dev/null +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java @@ -0,0 +1,22 @@ +/* + * Copyright 2016-2019 Berry Cloud Ltd. All rights reserved. + */ + +package dev.learning.xapi.client.configuration; + +import dev.learning.xapi.client.XapiClient; +import io.netty.util.internal.shaded.org.jctools.queues.MessagePassingQueue.Consumer; +import org.springframework.web.reactive.function.client.WebClient; + +/** + * Interface for {@link XapiClient} configurers. + *

+ * {@link XapiClient} is basically an extension of {@link WebClient}, so all custom configuration + * can be done via a {@link Builder} object. + *

+ * + * @author István Rátkai (Selindek) + */ +public interface XapiClientConfigurer extends Consumer { + +} diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java new file mode 100644 index 00000000..2f2f70a3 --- /dev/null +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java @@ -0,0 +1,53 @@ +/* + * Copyright 2016-2019 Berry Cloud Ltd. All rights reserved. + */ + +package dev.learning.xapi.client.configuration; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Xapi client properties. + * + * @author István Rátkai (Selindek) + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "xapi.client") +public class XapiClientProperties { + + /** + * The base URL for the xAPI client requests. + */ + private String baseUrl; + + /** + * Username for basic authorization header. + *

+ * Used only if {@link XapiClientProperties#password} is also set, AND + * {@link XapiClientProperties#authorization} is NOT set. + *

+ */ + private String username; + + /** + * Password for basic authorization header. + *

+ * Used only if {@link XapiClientProperties#username} is also set, AND + * {@link XapiClientProperties#authorization} is NOT set. + *

+ */ + private String password; + + /** + * Authorization header. + *

+ * This property has precedence over the {@link XapiClientProperties#username} and + * {@link XapiClientProperties#password} properties. + *

+ */ + private String authorization; + +} diff --git a/xapi-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xapi-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..51915d65 --- /dev/null +++ b/xapi-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +dev.learning.xapi.client.configuration.XapiClientAutoConfiguration diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java b/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java index 29642283..c4ed867d 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java @@ -195,10 +195,8 @@ void whenPostingStatementsThenBodyIsExpected() throws InterruptedException { final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); - final List statements = Arrays.asList(attemptedStatement, passedStatement); - // When Posting Statements - client.postStatements(r -> r.statements(statements)).block(); + client.postStatements(r -> r.statements(attemptedStatement, passedStatement)).block(); final RecordedRequest recordedRequest = mockWebServer.takeRequest(); @@ -1213,7 +1211,7 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsExpected() .block(); // Then Body Is Expected - assertThat(response.getBody(), is(Arrays.asList( "State1", "State2", "State3" ))); + assertThat(response.getBody(), is(Arrays.asList("State1", "State2", "State3"))); } // Deleting Multiple States diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java new file mode 100644 index 00000000..d2858cea --- /dev/null +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java @@ -0,0 +1,71 @@ +/* + * Copyright 2016rue-2023 Berry Cloud Ltd. All rights reserved. + */ +package dev.learning.xapi.client.configuration; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import dev.learning.xapi.client.XapiClient; +import dev.learning.xapi.client.configuration.XapiClientConfigurationTest.XapiTestClientConfiguration; +import java.io.IOException; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient.Builder; + +/** + * XapiClientConfiguration Test. + * + * @author István Rátkai (Selindek) + */ +@DisplayName("XapiClientConfiguration Test") +@SpringBootTest( + classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class, + XapiTestClientConfiguration.class }, + properties = { "xapi.client.username = fred", "xapi.client.password = 1234", + "xapi.client.baseUrl = localhost:8080/xapi/" }) +class XapiClientConfigurationTest { + + @Autowired + private XapiClient client; + + private static MockWebServer mockWebServer; + + @Service + static class XapiTestClientConfiguration implements XapiClientConfigurer { + + @Override + public void accept(Builder builder) { + mockWebServer = new MockWebServer(); + try { + mockWebServer.start(); + } catch (final IOException e) { + } + builder.baseUrl(mockWebServer.url("").toString()); + + } + + } + + @Test + void whenConfiguringXapiClientThenAuthenticationIsSet() throws InterruptedException { + + // When Configuring XapiClient + mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); + client.getStatement(r -> r.id("4df42866-40e7-45b6-bf7c-8d5fccbdccd6")).block(); + final RecordedRequest recordedRequest = mockWebServer.takeRequest(); + + // Then Authorization Is Set + assertThat(recordedRequest.getHeaders().get(HttpHeaders.AUTHORIZATION), + is("basic ZnJlZDoxMjM0")); + } + +} diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java new file mode 100644 index 00000000..43d6dbe0 --- /dev/null +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java @@ -0,0 +1,69 @@ +/* + * Copyright 2016rue-2023 Berry Cloud Ltd. All rights reserved. + */ +package dev.learning.xapi.client.configuration; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import dev.learning.xapi.client.XapiClient; +import dev.learning.xapi.client.configuration.XapiClientConfigurationTest2.XapiTestClientConfiguration2; +import java.io.IOException; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient.Builder; + +/** + * XapiClientConfiguration Test. + * + * @author István Rátkai (Selindek) + */ +@DisplayName("XapiClientConfigurationTest2 Test") +@SpringBootTest( + classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class, + XapiTestClientConfiguration2.class }, + properties = "xapi.client.authorization = bearer 1234") +class XapiClientConfigurationTest2 { + + @Autowired + private XapiClient client; + + private static MockWebServer mockWebServer; + + @Service + static class XapiTestClientConfiguration2 implements XapiClientConfigurer { + + @Override + public void accept(Builder builder) { + mockWebServer = new MockWebServer(); + try { + mockWebServer.start(); + } catch (final IOException e) { + } + builder.baseUrl(mockWebServer.url("").toString()); + + } + + } + + @Test + void whenConfiguringXapiClientThenAuthenticationIsSet() throws InterruptedException { + + // When Configuring XapiClient + mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); + client.getStatement(r -> r.id("4df42866-40e7-45b6-bf7c-8d5fccbdccd6")).block(); + final RecordedRequest recordedRequest = mockWebServer.takeRequest(); + + // Then Authorization Is Set + assertThat(recordedRequest.getHeaders().get(HttpHeaders.AUTHORIZATION), is("bearer 1234")); + } + +} From 0e5971d3c4c27db29b6103df6eef88c87e10ccde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Mon, 20 Mar 2023 15:30:30 +0000 Subject: [PATCH 2/9] fsi --- ...rationTest2.java => XapiClientConfiguration2Test.java} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename xapi-client/src/test/java/dev/learning/xapi/client/configuration/{XapiClientConfigurationTest2.java => XapiClientConfiguration2Test.java} (92%) diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java similarity index 92% rename from xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java rename to xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java index 43d6dbe0..1fa07bf4 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest2.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java @@ -7,7 +7,7 @@ import static org.hamcrest.core.Is.is; import dev.learning.xapi.client.XapiClient; -import dev.learning.xapi.client.configuration.XapiClientConfigurationTest2.XapiTestClientConfiguration2; +import dev.learning.xapi.client.configuration.XapiClientConfiguration2Test.XapiTestClientConfiguration2; import java.io.IOException; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; @@ -22,16 +22,16 @@ import org.springframework.web.reactive.function.client.WebClient.Builder; /** - * XapiClientConfiguration Test. + * XapiClientConfiguration2 Test. * * @author István Rátkai (Selindek) */ -@DisplayName("XapiClientConfigurationTest2 Test") +@DisplayName("XapiClientConfiguration2Test Test") @SpringBootTest( classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class, XapiTestClientConfiguration2.class }, properties = "xapi.client.authorization = bearer 1234") -class XapiClientConfigurationTest2 { +class XapiClientConfiguration2Test { @Autowired private XapiClient client; From 8ec2fbd444237e9f6e039280860eea9cd9aaa3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Tue, 21 Mar 2023 08:54:21 +0000 Subject: [PATCH 3/9] small improvement --- .../xapi/client/configuration/XapiClientConfigurer.java | 2 ++ .../client/configuration/XapiClientConfiguration2Test.java | 3 --- .../xapi/client/configuration/XapiClientConfigurationTest.java | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java index b3c72c82..eb5ef2d7 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientConfigurer.java @@ -6,6 +6,7 @@ import dev.learning.xapi.client.XapiClient; import io.netty.util.internal.shaded.org.jctools.queues.MessagePassingQueue.Consumer; +import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; /** @@ -17,6 +18,7 @@ * * @author István Rátkai (Selindek) */ +@Component public interface XapiClientConfigurer extends Consumer { } diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java index 1fa07bf4..f7a27801 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java @@ -18,7 +18,6 @@ import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient.Builder; /** @@ -38,7 +37,6 @@ class XapiClientConfiguration2Test { private static MockWebServer mockWebServer; - @Service static class XapiTestClientConfiguration2 implements XapiClientConfigurer { @Override @@ -49,7 +47,6 @@ public void accept(Builder builder) { } catch (final IOException e) { } builder.baseUrl(mockWebServer.url("").toString()); - } } diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java index d2858cea..db08fbae 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java @@ -18,7 +18,6 @@ import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient.Builder; /** @@ -39,7 +38,6 @@ class XapiClientConfigurationTest { private static MockWebServer mockWebServer; - @Service static class XapiTestClientConfiguration implements XapiClientConfigurer { @Override From 9db98840b6c476cf02a0e3d297b1934e0e6592be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Tue, 21 Mar 2023 10:40:41 +0000 Subject: [PATCH 4/9] add requested fixes --- README.md | 16 ++--- .../XapiClientAutoConfiguration.java | 2 +- .../configuration/XapiClientProperties.java | 3 +- .../learning/xapi/client/XapiClientTests.java | 2 +- ...ntAutoConfigurationAuthorizationTest.java} | 16 +++-- ...apiClientAutoConfigurationBaseUrlTest.java | 59 +++++++++++++++++++ ...utoConfigurationUsernamePasswordTest.java} | 21 ++++--- 7 files changed, 95 insertions(+), 24 deletions(-) rename xapi-client/src/test/java/dev/learning/xapi/client/configuration/{XapiClientConfiguration2Test.java => XapiClientAutoConfigurationAuthorizationTest.java} (80%) create mode 100644 xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java rename xapi-client/src/test/java/dev/learning/xapi/client/configuration/{XapiClientConfigurationTest.java => XapiClientAutoConfigurationUsernamePasswordTest.java} (75%) diff --git a/README.md b/README.md index f8be66d3..d3b83a62 100644 --- a/README.md +++ b/README.md @@ -34,16 +34,16 @@ To use the xAPI Java Client include the appropriate XML in the `dependencies` se ### Configuration -The xAPI Java Client has a Spring AutoConfiguration bean which picks up the following properties from the environment: +The xAPI Java Client has a Spring AutoConfiguration bean which picks up the following properties: -``` -xapi.client.baseUrl -xapi.client.username -xapi.client.password -xapi.client.authorization -``` +| Property | Description | +| ----------------------------- | ------------------------------------------------------------------ | +| xapi.client.baseUrl | The base url of the LRS endpoint | +| xapi.client.username | Username for basic authorization header | +| xapi.client.password | Password for basic authorization header | +| xapi.client.authorization | Authorization header (has precedence over the above properties) | -Set `xapi.client.baseUrl` to your xApi LRS endpoint. Use `xapi.client.username` and `xapi.client.password` for basic authorization, or set the whole authorization header via `xapi.client.authorization`. (The latter has precedence if both method is used) +Properties can be set using any [external configuration](https://docs.spring.io/spring-boot/docs/2.4.5/reference/htmlsingle/#boot-features-external-config) method supported by Spring Boot. If you need more specific customization (eg. your LRS needs specific headers, or you want to set the authorization header dynamically) you can create a custom configurer by implementing the `XapiClientConfigurer` interface. diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java index 91203aa8..cb61f5b2 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java @@ -41,7 +41,7 @@ public XapiClient xapiClient(XapiClientProperties properties, WebClient.Builder } if (properties.getBaseUrl() != null) { - builder.baseUrl(properties.getBaseUrl()); + builder.baseUrl(properties.getBaseUrl().toString()); } configurers.forEach(c -> c.accept(builder)); diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java index 2f2f70a3..3aa9b474 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java @@ -4,6 +4,7 @@ package dev.learning.xapi.client.configuration; +import java.net.URI; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -21,7 +22,7 @@ public class XapiClientProperties { /** * The base URL for the xAPI client requests. */ - private String baseUrl; + private URI baseUrl; /** * Username for basic authorization header. diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java b/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java index c4ed867d..41911d65 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2016rue-2023 Berry Cloud Ltd. All rights reserved. + * Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. */ package dev.learning.xapi.client; diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationAuthorizationTest.java similarity index 80% rename from xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java rename to xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationAuthorizationTest.java index f7a27801..b2138ce9 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfiguration2Test.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationAuthorizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016rue-2023 Berry Cloud Ltd. All rights reserved. + * Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. */ package dev.learning.xapi.client.configuration; @@ -7,11 +7,12 @@ import static org.hamcrest.core.Is.is; import dev.learning.xapi.client.XapiClient; -import dev.learning.xapi.client.configuration.XapiClientConfiguration2Test.XapiTestClientConfiguration2; +import dev.learning.xapi.client.configuration.XapiClientAutoConfigurationAuthorizationTest.XapiTestClientConfiguration2; import java.io.IOException; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,16 +22,16 @@ import org.springframework.web.reactive.function.client.WebClient.Builder; /** - * XapiClientConfiguration2 Test. + * XapiClientAutoConfigurationAuthorization Test. * * @author István Rátkai (Selindek) */ -@DisplayName("XapiClientConfiguration2Test Test") +@DisplayName("XapiClientAutoConfigurationAuthorization Test") @SpringBootTest( classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class, XapiTestClientConfiguration2.class }, properties = "xapi.client.authorization = bearer 1234") -class XapiClientConfiguration2Test { +class XapiClientAutoConfigurationAuthorizationTest { @Autowired private XapiClient client; @@ -51,6 +52,11 @@ public void accept(Builder builder) { } + @AfterAll + static void tearDown() throws Exception { + mockWebServer.shutdown(); + } + @Test void whenConfiguringXapiClientThenAuthenticationIsSet() throws InterruptedException { diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java new file mode 100644 index 00000000..7751a007 --- /dev/null +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. + */ +package dev.learning.xapi.client.configuration; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import dev.learning.xapi.client.XapiClient; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * XapiClientAutoConfigurationBaseUrl Test. + * + * @author István Rátkai (Selindek) + */ +@DisplayName("XapiClientAutoConfigurationBaseUrl Test") +@SpringBootTest(classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class }, + properties = { "xapi.client.baseUrl = http://127.0.0.1:55123/" }) +class XapiClientAutoConfigurationBaseUrlTest { + + @Autowired + private XapiClient client; + + private static MockWebServer mockWebServer; + + @BeforeAll + static void setUp() throws Exception { + mockWebServer = new MockWebServer(); + mockWebServer.start(55123); + } + + @AfterAll + static void tearDown() throws Exception { + mockWebServer.shutdown(); + } + + @Test + void whenConfiguringXapiClientThenBaseUrlIsSet() throws InterruptedException { + + // When Configuring XapiClient + mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); + client.getStatement(r -> r.id("4df42866-40e7-45b6-bf7c-8d5fccbdccd6")).block(); + final RecordedRequest recordedRequest = mockWebServer.takeRequest(); + + // Then BaseUrl Is Set (Request was sent to the proper url) + assertThat(recordedRequest.getMethod(), is("GET")); + } + +} diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationUsernamePasswordTest.java similarity index 75% rename from xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java rename to xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationUsernamePasswordTest.java index db08fbae..a2942a65 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientConfigurationTest.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationUsernamePasswordTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016rue-2023 Berry Cloud Ltd. All rights reserved. + * Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. */ package dev.learning.xapi.client.configuration; @@ -7,11 +7,12 @@ import static org.hamcrest.core.Is.is; import dev.learning.xapi.client.XapiClient; -import dev.learning.xapi.client.configuration.XapiClientConfigurationTest.XapiTestClientConfiguration; +import dev.learning.xapi.client.configuration.XapiClientAutoConfigurationUsernamePasswordTest.XapiTestClientConfiguration; import java.io.IOException; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,17 +22,16 @@ import org.springframework.web.reactive.function.client.WebClient.Builder; /** - * XapiClientConfiguration Test. + * XapiClientAutoConfigurationUsernamePassword Test. * * @author István Rátkai (Selindek) */ -@DisplayName("XapiClientConfiguration Test") +@DisplayName("XapiClientAutoConfigurationUsernamePassword Test") @SpringBootTest( classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class, XapiTestClientConfiguration.class }, - properties = { "xapi.client.username = fred", "xapi.client.password = 1234", - "xapi.client.baseUrl = localhost:8080/xapi/" }) -class XapiClientConfigurationTest { + properties = { "xapi.client.username = username", "xapi.client.password = password" }) +class XapiClientAutoConfigurationUsernamePasswordTest { @Autowired private XapiClient client; @@ -53,6 +53,11 @@ public void accept(Builder builder) { } + @AfterAll + static void tearDown() throws Exception { + mockWebServer.shutdown(); + } + @Test void whenConfiguringXapiClientThenAuthenticationIsSet() throws InterruptedException { @@ -63,7 +68,7 @@ void whenConfiguringXapiClientThenAuthenticationIsSet() throws InterruptedExcept // Then Authorization Is Set assertThat(recordedRequest.getHeaders().get(HttpHeaders.AUTHORIZATION), - is("basic ZnJlZDoxMjM0")); + is("basic dXNlcm5hbWU6cGFzc3dvcmQ=")); } } From 3136cf0ee98ace845b588e0f5df3e70b748d7d0c Mon Sep 17 00:00:00 2001 From: Thomas Turrell-Croft Date: Tue, 21 Mar 2023 12:14:13 +0000 Subject: [PATCH 5/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3b83a62..429021b2 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The xAPI Java Client has a Spring AutoConfiguration bean which picks up the foll | xapi.client.baseUrl | The base url of the LRS endpoint | | xapi.client.username | Username for basic authorization header | | xapi.client.password | Password for basic authorization header | -| xapi.client.authorization | Authorization header (has precedence over the above properties) | +| xapi.client.authorization | Authorization header (has precedence over the username and password properties) | Properties can be set using any [external configuration](https://docs.spring.io/spring-boot/docs/2.4.5/reference/htmlsingle/#boot-features-external-config) method supported by Spring Boot. From dfb625d651eb844f301b1df57ce28f52002f10cf Mon Sep 17 00:00:00 2001 From: Thomas Turrell-Croft Date: Tue, 21 Mar 2023 12:43:07 +0000 Subject: [PATCH 6/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 429021b2..3e7f1a56 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ The xAPI Java Client has a Spring AutoConfiguration bean which picks up the foll | xapi.client.password | Password for basic authorization header | | xapi.client.authorization | Authorization header (has precedence over the username and password properties) | -Properties can be set using any [external configuration](https://docs.spring.io/spring-boot/docs/2.4.5/reference/htmlsingle/#boot-features-external-config) method supported by Spring Boot. +Properties can be set using any [external configuration](https://docs.spring.io/spring-boot/docs/3.0.4/reference/htmlsingle/#features.external-config.files) method supported by Spring Boot. If you need more specific customization (eg. your LRS needs specific headers, or you want to set the authorization header dynamically) you can create a custom configurer by implementing the `XapiClientConfigurer` interface. From af7fd0227e12a42fdb49a90408037303f7357abc Mon Sep 17 00:00:00 2001 From: Thomas Turrell-Croft Date: Tue, 21 Mar 2023 12:47:08 +0000 Subject: [PATCH 7/9] Apply suggestions from code review --- .../xapi/client/configuration/XapiClientAutoConfiguration.java | 2 +- .../xapi/client/configuration/XapiClientProperties.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java index cb61f5b2..a3868b9e 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 Berry Cloud Ltd. All rights reserved. + * Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. */ package dev.learning.xapi.client.configuration; diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java index 3aa9b474..53570525 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/configuration/XapiClientProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 Berry Cloud Ltd. All rights reserved. + * Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. */ package dev.learning.xapi.client.configuration; From 9bb29218a3cd803348c67d82e18ee766cb28d9cd Mon Sep 17 00:00:00 2001 From: Thomas Turrell-Croft Date: Tue, 21 Mar 2023 14:11:13 +0000 Subject: [PATCH 8/9] tip --- .../learning/xapi/client/XapiClientTests.java | 96 ++++++++++++------- 1 file changed, 61 insertions(+), 35 deletions(-) diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java b/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java index 41911d65..2300b3ee 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/XapiClientTests.java @@ -30,7 +30,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.web.reactive.function.client.WebClient; /** @@ -105,8 +104,8 @@ void whenGettingStatementThenBodyIsInstanceOfStatement() throws InterruptedExcep .addHeader("Content-Type", "application/json; charset=utf-8")); // When Getting Statement - final var response = client.getStatement(r -> r.id("4df42866-40e7-45b6-bf7c-8d5fccbdccd6")) - .block(); + final var response = + client.getStatement(r -> r.id("4df42866-40e7-45b6-bf7c-8d5fccbdccd6")).block(); // Then Body Is Instance Of Statement assertThat(response.getBody(), instanceOf(Statement.class)); @@ -153,7 +152,7 @@ void whenPostingStatementsThenMethodIsPost() throws InterruptedException { mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); - final Statement attemptedStatement = Statement.builder() + final var attemptedStatement = Statement.builder() .actor(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -164,7 +163,7 @@ void whenPostingStatementsThenMethodIsPost() throws InterruptedException { .build(); - final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); + final var passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); final List statements = Arrays.asList(attemptedStatement, passedStatement); @@ -177,12 +176,13 @@ void whenPostingStatementsThenMethodIsPost() throws InterruptedException { assertThat(recordedRequest.getMethod(), is("POST")); } + @Test void whenPostingStatementsThenBodyIsExpected() throws InterruptedException { mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); - final Statement attemptedStatement = Statement.builder() + final var attemptedStatement = Statement.builder() .actor(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -193,7 +193,7 @@ void whenPostingStatementsThenBodyIsExpected() throws InterruptedException { .build(); - final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); + final var passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); // When Posting Statements client.postStatements(r -> r.statements(attemptedStatement, passedStatement)).block(); @@ -205,12 +205,43 @@ void whenPostingStatementsThenBodyIsExpected() throws InterruptedException { "[{\"actor\":{\"objectType\":\"Agent\",\"name\":\"A N Other\",\"mbox\":\"mailto:another@example.com\"},\"verb\":{\"id\":\"http://adlnet.gov/expapi/verbs/attempted\",\"display\":{\"und\":\"attempted\"}},\"object\":{\"objectType\":\"Activity\",\"id\":\"https://example.com/activity/simplestatement\",\"definition\":{\"name\":{\"en\":\"Simple Statement\"}}}},{\"actor\":{\"objectType\":\"Agent\",\"name\":\"A N Other\",\"mbox\":\"mailto:another@example.com\"},\"verb\":{\"id\":\"http://adlnet.gov/expapi/verbs/passed\",\"display\":{\"und\":\"passed\"}},\"object\":{\"objectType\":\"Activity\",\"id\":\"https://example.com/activity/simplestatement\",\"definition\":{\"name\":{\"en\":\"Simple Statement\"}}}}]")); } + + @Test + void whenPostingStatementsArrayThenBodyIsExpected() throws InterruptedException { + + mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); + + final var attemptedStatement = Statement.builder() + + .actor(a -> a.name("A N Other").mbox("mailto:another@example.com")) + + .verb(Verb.ATTEMPTED) + + .activityObject(o -> o.id("https://example.com/activity/simplestatement") + .definition(d -> d.addName(Locale.ENGLISH, "Simple Statement"))) + + .build(); + + final var passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); + + final List statements = Arrays.asList(attemptedStatement, passedStatement); + + // When Posting Statements Array + client.postStatements(r -> r.statements(statements)).block(); + + final RecordedRequest recordedRequest = mockWebServer.takeRequest(); + + // Then Body Is Expected + assertThat(recordedRequest.getBody().readUtf8(), is( + "[{\"actor\":{\"objectType\":\"Agent\",\"name\":\"A N Other\",\"mbox\":\"mailto:another@example.com\"},\"verb\":{\"id\":\"http://adlnet.gov/expapi/verbs/attempted\",\"display\":{\"und\":\"attempted\"}},\"object\":{\"objectType\":\"Activity\",\"id\":\"https://example.com/activity/simplestatement\",\"definition\":{\"name\":{\"en\":\"Simple Statement\"}}}},{\"actor\":{\"objectType\":\"Agent\",\"name\":\"A N Other\",\"mbox\":\"mailto:another@example.com\"},\"verb\":{\"id\":\"http://adlnet.gov/expapi/verbs/passed\",\"display\":{\"und\":\"passed\"}},\"object\":{\"objectType\":\"Activity\",\"id\":\"https://example.com/activity/simplestatement\",\"definition\":{\"name\":{\"en\":\"Simple Statement\"}}}}]")); + } + @Test void whenPostingStatementsThenContentTypeHeaderIsApplicationJson() throws InterruptedException { mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); - final Statement attemptedStatement = Statement.builder() + final var attemptedStatement = Statement.builder() .actor(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -221,7 +252,7 @@ void whenPostingStatementsThenContentTypeHeaderIsApplicationJson() throws Interr .build(); - final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); + final var passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); final List statements = Arrays.asList(attemptedStatement, passedStatement); @@ -242,7 +273,7 @@ void whenPostingStatementsThenResponseBodyIsInstanceOfUUIDArray() throws Interru "[\"2eb84e56-441a-492c-9d7b-f8e9ddd3e15d\",\"19a74a3f-7354-4254-aa4a-1c39ab4f2ca7\"]") .addHeader("Content-Type", "application/json")); - final Statement attemptedStatement = Statement.builder() + final var attemptedStatement = Statement.builder() .actor(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -253,13 +284,12 @@ void whenPostingStatementsThenResponseBodyIsInstanceOfUUIDArray() throws Interru .build(); - final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); + final var passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); final List statements = Arrays.asList(attemptedStatement, passedStatement); // When Posting Statements - final ResponseEntity< - List> response = client.postStatements(r -> r.statements(statements)).block(); + final var response = client.postStatements(r -> r.statements(statements)).block(); // Then Response Body Is Instance Of UUID Array assertThat(response.getBody(), instanceOf(List.class)); @@ -662,14 +692,13 @@ void givenStateContentTypeIsTextPlainWhenGettingStateThenBodyIsInstanceOfString( .addHeader("Content-Type", "text/plain; charset=utf-8")); // When Getting State - final ResponseEntity response = client - .getState(r -> r.activityId("https://example.com/activity/1") + final var response = client.getState(r -> r.activityId("https://example.com/activity/1") - .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) + .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) - .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6") + .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6") - .stateId("bookmark"), String.class) + .stateId("bookmark"), String.class) .block(); @@ -686,14 +715,13 @@ void givenStateContentTypeIsTextPlainWhenGettingStateThenBodyIsExpected() .addHeader("Content-Type", "text/plain; charset=utf-8")); // When Getting State - final ResponseEntity response = client - .getState(r -> r.activityId("https://example.com/activity/1") + final var response = client.getState(r -> r.activityId("https://example.com/activity/1") - .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) + .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) - .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6") + .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6") - .stateId("bookmark"), String.class) + .stateId("bookmark"), String.class) .block(); @@ -1178,12 +1206,11 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsInstanceOfString .addHeader("Content-Type", "application/json; charset=utf-8")); // When Getting Multiple States - final ResponseEntity> response = client - .getStates(r -> r.activityId("https://example.com/activity/1") + final var response = client.getStates(r -> r.activityId("https://example.com/activity/1") - .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) + .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) - .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6")) + .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6")) .block(); @@ -1201,12 +1228,11 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsExpected() .addHeader("Content-Type", "application/json; charset=utf-8")); // When Getting Multiple States - final ResponseEntity> response = client - .getStates(r -> r.activityId("https://example.com/activity/1") + final var response = client.getStates(r -> r.activityId("https://example.com/activity/1") - .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) + .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) - .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6")) + .registration("67828e3a-d116-4e18-8af3-2d2c59e27be6")) .block(); @@ -1772,8 +1798,8 @@ void whenGettingAgentsThenBodyIsInstanceOfPerson() throws InterruptedException { .addHeader("Content-Type", "application/json; charset=utf-8")); // When Getting Agents - final var response = client.getAgents(r -> r.agent(a -> a.mbox("mailto:another@example.com"))) - .block(); + final var response = + client.getAgents(r -> r.agent(a -> a.mbox("mailto:another@example.com"))).block(); // Then Body Is Instance Of Activity assertThat(response.getBody(), instanceOf(Person.class)); @@ -1877,7 +1903,7 @@ void givenActivityProfileContentTypeIsTextPlainWhenGettingActivityProfileThenBod .addHeader("Content-Type", "text/plain; charset=utf-8")); // When Getting ActivityProfile - final ResponseEntity response = client + final var response = client .getActivityProfile(r -> r.activityId("https://example.com/activity/1") .profileId("bookmark"), String.class) @@ -1897,7 +1923,7 @@ void givenActivityProfileContentTypeIsTextPlainWhenGettingActivityProfileThenBod .addHeader("Content-Type", "text/plain; charset=utf-8")); // When Getting ActivityProfile - final ResponseEntity response = client + final var response = client .getActivityProfile(r -> r.activityId("https://example.com/activity/1") .profileId("bookmark"), String.class) From 4dd89e7601b10afd624577f7f96f563e738cf5bc Mon Sep 17 00:00:00 2001 From: Thomas Turrell-Croft Date: Tue, 21 Mar 2023 17:46:25 +0000 Subject: [PATCH 9/9] tip --- .../dev/learning/xapi/client/GetStatementRequest.java | 2 +- .../dev/learning/xapi/client/GetStatementsRequest.java | 2 +- .../xapi/client/GetVoidedStatementRequest.java | 2 +- .../dev/learning/xapi/client/PostStatementRequest.java | 2 +- .../learning/xapi/client/PostStatementsRequest.java | 2 +- .../java/dev/learning/xapi/client/StatesRequest.java | 2 +- .../XapiClientAutoConfigurationBaseUrlTest.java | 10 +++++----- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementRequest.java b/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementRequest.java index 0a284073..ec25885b 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementRequest.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementRequest.java @@ -42,7 +42,7 @@ public HttpMethod getMethod() { @Override public UriBuilder url(UriBuilder uriBuilder, Map queryParams) { - return uriBuilder.path("statements") + return uriBuilder.path("/statements") .queryParam("statementId", id) diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementsRequest.java b/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementsRequest.java index 4eb1a5d4..4b5bd133 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementsRequest.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/GetStatementsRequest.java @@ -68,7 +68,7 @@ public UriBuilder url(UriBuilder uriBuilder, Map queryParams) { // All queryParams are optional - uriBuilder.path("statements"); + uriBuilder.path("/statements"); if (agent != null) { queryParams.put("agent", agentToJsonString()); diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/GetVoidedStatementRequest.java b/xapi-client/src/main/java/dev/learning/xapi/client/GetVoidedStatementRequest.java index 8164bce6..49e21ee6 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/GetVoidedStatementRequest.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/GetVoidedStatementRequest.java @@ -29,7 +29,7 @@ public class GetVoidedStatementRequest extends GetStatementRequest { @Override public UriBuilder url(UriBuilder uriBuilder, Map queryParams) { - return uriBuilder.path("statements") + return uriBuilder.path("/statements") .queryParam("voidedStatementId", id) diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementRequest.java b/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementRequest.java index 864e66ec..1cafb1b6 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementRequest.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementRequest.java @@ -35,7 +35,7 @@ public HttpMethod getMethod() { @Override public UriBuilder url(UriBuilder uriBuilder, Map queryParams) { - return uriBuilder.path("statements"); + return uriBuilder.path("/statements"); } diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementsRequest.java b/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementsRequest.java index 054241da..8e9751d9 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementsRequest.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/PostStatementsRequest.java @@ -36,7 +36,7 @@ public HttpMethod getMethod() { @Override public UriBuilder url(UriBuilder uriBuilder, Map queryParams) { - return uriBuilder.path("statements"); + return uriBuilder.path("/statements"); } diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/StatesRequest.java b/xapi-client/src/main/java/dev/learning/xapi/client/StatesRequest.java index cbe165a4..07fee652 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/StatesRequest.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/StatesRequest.java @@ -55,7 +55,7 @@ public UriBuilder url(UriBuilder uriBuilder, Map queryParams) { queryParams.put("activityId", activityId); queryParams.put("agent", agentToJsonString()); - return uriBuilder.path("activities/state") + return uriBuilder.path("/activities/state") .queryParam("activityId", "{activityId}") diff --git a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java index 7751a007..f8d936c5 100644 --- a/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java +++ b/xapi-client/src/test/java/dev/learning/xapi/client/configuration/XapiClientAutoConfigurationBaseUrlTest.java @@ -9,7 +9,6 @@ import dev.learning.xapi.client.XapiClient; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; @@ -24,8 +23,8 @@ * @author István Rátkai (Selindek) */ @DisplayName("XapiClientAutoConfigurationBaseUrl Test") -@SpringBootTest(classes = { XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class }, - properties = { "xapi.client.baseUrl = http://127.0.0.1:55123/" }) +@SpringBootTest(classes = {XapiClientAutoConfiguration.class, WebClientAutoConfiguration.class}, + properties = {"xapi.client.baseUrl = http://127.0.0.1:55123/"}) class XapiClientAutoConfigurationBaseUrlTest { @Autowired @@ -50,10 +49,11 @@ void whenConfiguringXapiClientThenBaseUrlIsSet() throws InterruptedException { // When Configuring XapiClient mockWebServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); client.getStatement(r -> r.id("4df42866-40e7-45b6-bf7c-8d5fccbdccd6")).block(); - final RecordedRequest recordedRequest = mockWebServer.takeRequest(); + final var recordedRequest = mockWebServer.takeRequest(); // Then BaseUrl Is Set (Request was sent to the proper url) - assertThat(recordedRequest.getMethod(), is("GET")); + assertThat(recordedRequest.getRequestUrl().toString(), + is("http://localhost:55123/statements?statementId=4df42866-40e7-45b6-bf7c-8d5fccbdccd6")); } }