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 b9963b4e..372d01ac 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 @@ -7,7 +7,7 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; -import java.util.Arrays; +import java.util.List; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -52,13 +52,13 @@ public void run(String... args) throws Exception { postActivityProfile(); // Get Activity Profiles - ResponseEntity response = + ResponseEntity> response = client.getActivityProfiles(r -> r.activityId("https://example.com/activity/1")) .block(); // Print the each returned activity profile id to the console - Arrays.asList(response.getBody()).forEach(id -> System.out.println(id)); + response.getBody().stream().forEach(id -> System.out.println(id)); } private void postActivityProfile() { 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 14348d59..42f53b03 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 @@ -5,7 +5,7 @@ package dev.learning.xapi.samples.getagentprofiles; import dev.learning.xapi.client.XapiClient; -import java.util.Arrays; +import java.util.List; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -47,13 +47,13 @@ public static void main(String[] args) { public void run(String... args) throws Exception { // Get Profiles - ResponseEntity response = client + ResponseEntity> response = client .getAgentProfiles(r -> r.agent(a -> a.name("A N Other").mbox("mailto:another@example.com"))) .block(); // Print the each returned profile id to the console - Arrays.asList(response.getBody()).forEach(id -> System.out.println(id)); + response.getBody().stream().forEach(id -> System.out.println(id)); } 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 b5dc8c54..eeea9379 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 @@ -7,7 +7,7 @@ import dev.learning.xapi.client.XapiClient; import dev.learning.xapi.samples.core.ExampleState; import java.time.Instant; -import java.util.Arrays; +import java.util.List; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -53,7 +53,7 @@ public void run(String... args) throws Exception { postState(); // Get States - ResponseEntity response = client + ResponseEntity> response = client .getStates(r -> r.activityId("https://example.com/activity/1") .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -63,7 +63,7 @@ public void run(String... args) throws Exception { .block(); // Print the each returned state id to the console - Arrays.asList(response.getBody()).forEach(id -> System.out.println(id)); + response.getBody().stream().forEach(id -> System.out.println(id)); } 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 1a3bc262..0c45c6a3 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 @@ -5,6 +5,8 @@ package dev.learning.xapi.client; import dev.learning.xapi.model.Statement; +import java.util.Arrays; +import java.util.List; import java.util.Map; import lombok.Builder; import lombok.Getter; @@ -24,7 +26,7 @@ @Getter public class PostStatementsRequest implements Request { - private final Statement[] statements; + private final List statements; @Override public HttpMethod getMethod() { @@ -54,10 +56,24 @@ public static class Builder { * * @see PostStatementsRequest#statements */ - public Builder statements(Statement... statements) { + public Builder statements(List statements) { this.statements = statements; return this; } + + /** + * Sets the statements. + * + * @param statements The statements of the PostStatementsRequest. + * + * @return This builder + * + * @see PostStatementsRequest#statements + */ + public Builder statements(Statement... statements) { + this.statements = Arrays.asList(statements); + return this; + } } diff --git a/xapi-client/src/main/java/dev/learning/xapi/client/XapiClient.java b/xapi-client/src/main/java/dev/learning/xapi/client/XapiClient.java index 91331ada..faab2a37 100644 --- a/xapi-client/src/main/java/dev/learning/xapi/client/XapiClient.java +++ b/xapi-client/src/main/java/dev/learning/xapi/client/XapiClient.java @@ -10,9 +10,11 @@ import dev.learning.xapi.model.Statement; import dev.learning.xapi.model.StatementResult; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.UUID; import java.util.function.Consumer; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.ResponseEntity; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -32,6 +34,14 @@ public class XapiClient { private final WebClient webClient; + private static final ParameterizedTypeReference< + List> LIST_UUID_TYPE = new ParameterizedTypeReference<>() { + }; + + private static final ParameterizedTypeReference< + List> LIST_STRING_TYPE = new ParameterizedTypeReference<>() { + }; + /** * Default constructor for XapiClient. * @@ -116,9 +126,9 @@ public Mono> postStatement(PostStatementRequest request) { .retrieve() - .toEntity(UUID[].class) + .toEntity(LIST_UUID_TYPE) - .map(i -> ResponseEntity.ok().headers(i.getHeaders()).body(i.getBody()[0])); + .map(i -> ResponseEntity.ok().headers(i.getHeaders()).body(i.getBody().get(0))); } @@ -151,7 +161,7 @@ public Mono> postStatement(Consumer> postStatements(PostStatementsRequest request) { + public Mono>> postStatements(PostStatementsRequest request) { Map queryParams = new HashMap<>(); @@ -165,7 +175,7 @@ public Mono> postStatements(PostStatementsRequest request .retrieve() - .toEntity(UUID[].class); + .toEntity(LIST_UUID_TYPE); } @@ -179,7 +189,7 @@ public Mono> postStatements(PostStatementsRequest request * * @return the ResponseEntity */ - public Mono> postStatements( + public Mono>> postStatements( Consumer request) { final PostStatementsRequest.Builder builder = PostStatementsRequest.builder(); @@ -572,7 +582,7 @@ public Mono> deleteState( * * @return the ResponseEntity */ - public Mono> getStates(GetStatesRequest request) { + public Mono>> getStates(GetStatesRequest request) { Map queryParams = new HashMap<>(); @@ -584,7 +594,7 @@ public Mono> getStates(GetStatesRequest request) { .retrieve() - .toEntity(String[].class); + .toEntity(LIST_STRING_TYPE); } @@ -600,7 +610,7 @@ public Mono> getStates(GetStatesRequest request) { * * @return the ResponseEntity */ - public Mono> getStates( + public Mono>> getStates( Consumer> request) { final GetStatesRequest.Builder builder = GetStatesRequest.builder(); @@ -964,7 +974,7 @@ public Mono> postAgentProfile( * * @return the ResponseEntity */ - public Mono> getAgentProfiles(GetAgentProfilesRequest request) { + public Mono>> getAgentProfiles(GetAgentProfilesRequest request) { Map queryParams = new HashMap<>(); @@ -976,7 +986,7 @@ public Mono> getAgentProfiles(GetAgentProfilesRequest r .retrieve() - .toEntity(String[].class); + .toEntity(LIST_STRING_TYPE); } @@ -989,7 +999,7 @@ public Mono> getAgentProfiles(GetAgentProfilesRequest r * * @return the ResponseEntity */ - public Mono> getAgentProfiles( + public Mono>> getAgentProfiles( Consumer request) { final GetAgentProfilesRequest.Builder builder = GetAgentProfilesRequest.builder(); @@ -1220,8 +1230,9 @@ public Mono> deleteActivityProfile( * @param request The parameters of the get activity profiles request * * @return the ResponseEntity - */ - public Mono> getActivityProfiles(GetActivityProfilesRequest request) { + */ + public Mono>> getActivityProfiles( + GetActivityProfilesRequest request) { Map queryParams = new HashMap<>(); @@ -1233,7 +1244,7 @@ public Mono> getActivityProfiles(GetActivityProfilesReq .retrieve() - .toEntity(String[].class); + .toEntity(LIST_STRING_TYPE); } @@ -1250,7 +1261,7 @@ public Mono> getActivityProfiles(GetActivityProfilesReq * * @return the ResponseEntity */ - public Mono> getActivityProfiles( + public Mono>> getActivityProfiles( Consumer request) { final GetActivityProfilesRequest.Builder builder = GetActivityProfilesRequest.builder(); 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 6feeb2a0..29642283 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 @@ -15,6 +15,8 @@ import dev.learning.xapi.model.Verb; import java.net.URI; import java.time.Instant; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.UUID; import lombok.Getter; @@ -164,7 +166,7 @@ void whenPostingStatementsThenMethodIsPost() throws InterruptedException { final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); - final Statement statements[] = { attemptedStatement, passedStatement }; + final List statements = Arrays.asList(attemptedStatement, passedStatement); // When posting Statements client.postStatements(r -> r.statements(statements)).block(); @@ -193,7 +195,7 @@ void whenPostingStatementsThenBodyIsExpected() throws InterruptedException { final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); - final Statement statements[] = { attemptedStatement, passedStatement }; + final List statements = Arrays.asList(attemptedStatement, passedStatement); // When Posting Statements client.postStatements(r -> r.statements(statements)).block(); @@ -223,7 +225,7 @@ void whenPostingStatementsThenContentTypeHeaderIsApplicationJson() throws Interr final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); - final Statement statements[] = { attemptedStatement, passedStatement }; + final List statements = Arrays.asList(attemptedStatement, passedStatement); // When Posting Statements client.postStatements(r -> r.statements(statements)).block(); @@ -255,14 +257,14 @@ void whenPostingStatementsThenResponseBodyIsInstanceOfUUIDArray() throws Interru final Statement passedStatement = attemptedStatement.toBuilder().verb(Verb.PASSED).build(); - final Statement statements[] = { attemptedStatement, passedStatement }; + final List statements = Arrays.asList(attemptedStatement, passedStatement); // When Posting Statements final ResponseEntity< - UUID[]> response = client.postStatements(r -> r.statements(statements)).block(); + List> response = client.postStatements(r -> r.statements(statements)).block(); // Then Response Body Is Instance Of UUID Array - assertThat(response.getBody(), instanceOf(UUID[].class)); + assertThat(response.getBody(), instanceOf(List.class)); } // Posting a Statement @@ -1178,7 +1180,7 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsInstanceOfString .addHeader("Content-Type", "application/json; charset=utf-8")); // When Getting Multiple States - final ResponseEntity response = client + final ResponseEntity> response = client .getStates(r -> r.activityId("https://example.com/activity/1") .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -1188,7 +1190,7 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsInstanceOfString .block(); // Then Body Is Instance Of String Array - assertThat(response.getBody(), instanceOf(String[].class)); + assertThat(response.getBody(), instanceOf(List.class)); } @Test @@ -1201,7 +1203,7 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsExpected() .addHeader("Content-Type", "application/json; charset=utf-8")); // When Getting Multiple States - final ResponseEntity response = client + final ResponseEntity> response = client .getStates(r -> r.activityId("https://example.com/activity/1") .agent(a -> a.name("A N Other").mbox("mailto:another@example.com")) @@ -1211,7 +1213,7 @@ void givenMultipleStatesExistWhenGettingMultipleStatesThenBodyIsExpected() .block(); // Then Body Is Expected - assertThat(response.getBody(), is(new String[] { "State1", "State2", "State3" })); + assertThat(response.getBody(), is(Arrays.asList( "State1", "State2", "State3" ))); } // Deleting Multiple States diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/About.java b/xapi-model/src/main/java/dev/learning/xapi/model/About.java index 564bcc13..f73a02ab 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/About.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/About.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import java.net.URI; import java.util.LinkedHashMap; +import java.util.List; import lombok.Builder; import lombok.Value; @@ -26,7 +27,7 @@ @JsonInclude(Include.NON_EMPTY) public class About { - private String[] version; + private List version; private LinkedHashMap extensions; diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/ActivityDefinition.java b/xapi-model/src/main/java/dev/learning/xapi/model/ActivityDefinition.java index 79b94009..ec9c9d49 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/ActivityDefinition.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/ActivityDefinition.java @@ -8,7 +8,6 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; @@ -60,32 +59,32 @@ public class ActivityDefinition { * A pattern representing the correct response to the interaction. The structure of this pattern * varies depending on the interactionType. */ - private String[] correctResponsesPattern; + private List correctResponsesPattern; /** * A list of the options available in the interaction for selection or ordering. */ - private InteractionComponent[] choices; + private List choices; /** * A list of the options on the likert scale. */ - private InteractionComponent[] scale; + private List scale; /** * Lists of sources to be matched. */ - private InteractionComponent[] source; + private List source; /** * Lists of targets to be matched. */ - private InteractionComponent[] target; + private List target; /** * A list of the elements making up the performance interaction. */ - private InteractionComponent[] steps; + private List steps; /** * A map of other properties as needed. @@ -171,15 +170,9 @@ public Builder addChoice(Consumer interactionCompo public Builder addChoice(InteractionComponent interactionComponent) { if (choices == null) { - choices = new InteractionComponent[] {interactionComponent}; - - return this; + choices = new ArrayList<>(); } - - final List list = new ArrayList<>(Arrays.asList(choices)); - list.add(interactionComponent); - choices = list.toArray(choices); - + choices.add(interactionComponent); return this; } diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/ContextActivities.java b/xapi-model/src/main/java/dev/learning/xapi/model/ContextActivities.java index c4bdf9ac..af174038 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/ContextActivities.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/ContextActivities.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import jakarta.validation.Valid; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.function.Consumer; import lombok.Builder; @@ -34,28 +33,28 @@ public class ContextActivities { */ @Valid @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - private Activity[] parent; + private List parent; /** * Activities with an indirect relation to the Activity which is the Object of the Statement. */ @Valid @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - private Activity[] grouping; + private List grouping; /** * Activities used to categorize the Statement. */ @Valid @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - private Activity[] category; + private List category; /** * Activities that do not fit one of the other properties. */ @Valid @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - private Activity[] other; + private List other; // **Warning** do not add fields that are not required by the xAPI specification. @@ -96,14 +95,10 @@ public Builder addParent(Consumer activity) { public Builder addParent(Activity activity) { if (parent == null) { - parent = new Activity[] {activity}; - - return this; + parent = new ArrayList<>(); } - - final List list = new ArrayList<>(Arrays.asList(parent)); - list.add(activity); - parent = list.toArray(parent); + + parent.add(activity); return this; @@ -139,15 +134,11 @@ public Builder addGrouping(Consumer activity) { public Builder addGrouping(Activity activity) { if (grouping == null) { - grouping = new Activity[] {activity}; - - return this; + grouping = new ArrayList<>(); } - final List list = new ArrayList<>(Arrays.asList(grouping)); - list.add(activity); - grouping = list.toArray(grouping); - + grouping.add(activity); + return this; } @@ -182,14 +173,10 @@ public Builder addCategory(Consumer activity) { public Builder addCategory(Activity activity) { if (category == null) { - category = new Activity[] {activity}; - - return this; + category = new ArrayList<>(); } - final List list = new ArrayList<>(Arrays.asList(category)); - list.add(activity); - category = list.toArray(category); + category.add(activity); return this; @@ -225,14 +212,10 @@ public Builder addOther(Consumer activity) { public Builder addOther(Activity activity) { if (other == null) { - other = new Activity[] {activity}; - - return this; + other = new ArrayList<>(); } - final List list = new ArrayList<>(Arrays.asList(other)); - list.add(activity); - other = list.toArray(other); + other.add(activity); return this; diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/Group.java b/xapi-model/src/main/java/dev/learning/xapi/model/Group.java index c7c3cf79..15f61da9 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/Group.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/Group.java @@ -7,7 +7,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.Valid; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.function.Consumer; import lombok.AllArgsConstructor; @@ -35,7 +34,7 @@ public class Group extends Actor { */ @Valid @JsonFormat(without = {JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY}) - private final Agent[] member; + private final List member; // **Warning** do not add fields that are not required by the xAPI specification. @@ -77,14 +76,10 @@ public Builder addMember(Consumer> member) { public Builder addMember(Agent agent) { if (member == null) { - member = new Agent[] {agent}; - - return self(); + member = new ArrayList<>(); } - final List list = new ArrayList<>(Arrays.asList(member)); - list.add(agent); - member = list.toArray(member); + member.add(agent); return self(); diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/Person.java b/xapi-model/src/main/java/dev/learning/xapi/model/Person.java index e24ed74d..936e380c 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/Person.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/Person.java @@ -11,7 +11,6 @@ import jakarta.validation.Valid; import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.function.Consumer; import lombok.Builder; @@ -39,29 +38,29 @@ public class Person { /** * List of names. */ - private String[] name; + private List name; /** * List of e-mail addresses. */ - private String[] mbox; + private List mbox; /** * List of the SHA1 hashes of mailto IRIs. */ @JsonProperty("mbox_sha1sum") - private String[] mboxSha1sum; + private List mboxSha1sum; /** * List of openids that uniquely identify the Agents retrieved. */ - private URI[] openid; + private List openid; /** * List of accounts. */ @Valid - private Account[] account; + private List account; // **Warning** do not add fields that are not required by the xAPI specification. @@ -101,14 +100,10 @@ public Builder addAccount(Consumer account) { */ public Builder addAccount(Account account) { if (this.account == null) { - this.account = new Account[] {account}; - - return this; + this.account = new ArrayList(); } - final List list = new ArrayList<>(Arrays.asList(this.account)); - list.add(account); - this.account = list.toArray(this.account); + this.account.add(account); return this; diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/Statement.java b/xapi-model/src/main/java/dev/learning/xapi/model/Statement.java index 9bda92ce..2887f22f 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/Statement.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/Statement.java @@ -11,6 +11,7 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import java.time.Instant; +import java.util.List; import java.util.UUID; import java.util.function.Consumer; import lombok.Builder; @@ -92,7 +93,7 @@ public class Statement { * Headers for Attachments to the Statement. */ @JsonFormat(without = {JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY}) - private Attachment[] attachments; + private List attachments; // **Warning** do not add fields that are not required by the xAPI specification. diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/StatementResult.java b/xapi-model/src/main/java/dev/learning/xapi/model/StatementResult.java index 481cca81..e28d58a1 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/StatementResult.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/StatementResult.java @@ -8,7 +8,6 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.function.Consumer; import lombok.Builder; @@ -34,7 +33,7 @@ public class StatementResult { * List of Statements. Where no matching Statements are found, this property will contain an empty * array. */ - private Statement[] statements; + private List statements; /** * Relative IRL that can be used to fetch more results. @@ -92,14 +91,10 @@ public Builder addStatement(Consumer statement) { public Builder addStatement(Statement statement) { if (statements == null) { - statements = new Statement[] {statement}; - - return this; + statements = new ArrayList<>(); } - final List list = new ArrayList<>(Arrays.asList(statements)); - list.add(statement); - statements = list.toArray(statements); + statements.add(statement); return this; diff --git a/xapi-model/src/main/java/dev/learning/xapi/model/SubStatement.java b/xapi-model/src/main/java/dev/learning/xapi/model/SubStatement.java index d5e10f07..176548f5 100644 --- a/xapi-model/src/main/java/dev/learning/xapi/model/SubStatement.java +++ b/xapi-model/src/main/java/dev/learning/xapi/model/SubStatement.java @@ -7,6 +7,7 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import java.time.Instant; +import java.util.List; import java.util.function.Consumer; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -67,7 +68,7 @@ public class SubStatement implements StatementObject { * Headers for Attachments to the Statement. */ @Valid - private Attachment[] attachments; + private List attachments; // **Warning** do not add fields that are not required by the xAPI specification. diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/AboutTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/AboutTests.java index 1d1ed608..3c8e7ddd 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/AboutTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/AboutTests.java @@ -12,6 +12,8 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -51,7 +53,7 @@ void whenDeserializingAboutWithVersionThenVersionIsExpected() throws IOException final About result = objectMapper.readValue(file, About.class); // Then Version Is Expected - assertThat(result.getVersion(), is(new String[] {"1.0"})); + assertThat(result.getVersion(), is(Collections.singletonList("1.0"))); } @@ -65,7 +67,7 @@ void whenDeserializingAboutWithMultipleVersionsThenMultipleVersionsAreExpected() final About result = objectMapper.readValue(file, About.class); // Then Multiple Versions Are Expected - assertThat(result.getVersion(), is(new String[] {"1.0", "1.0.1"})); + assertThat(result.getVersion(), is(Arrays.asList("1.0", "1.0.1"))); } @@ -92,7 +94,7 @@ void whenDeserializingAboutWithVersionAsNumberThenVersionIsExpected() throws IOE final About result = objectMapper.readValue(file, About.class); // Then Version Is Expected - assertThat(result.getVersion(), is(new String[] {"1.0"})); + assertThat(result.getVersion(), is(Collections.singletonList("1.0"))); } @Test @@ -100,7 +102,7 @@ void whenSerializingAboutThenResultIsEqualToExpectedJson() throws IOException { final About about = About.builder() - .version(new String[] {"1.0"}) + .version(Collections.singletonList("1.0")) .build(); @@ -121,7 +123,7 @@ void whenSerializingAboutWithExtensionsThenResultIsEqualToExpectedJson() throws final About about = About.builder() - .version(new String[] {"1.0"}) + .version(Collections.singletonList("1.0")) .extensions(extensions) @@ -144,7 +146,7 @@ void whenCallingToStringThenResultIsExpected() throws IOException { final About about = About.builder() - .version(new String[] {"1.0"}) + .version(Collections.singletonList("1.0")) .extensions(extensions) diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/ActivityDefinitionTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/ActivityDefinitionTests.java index 78159b71..e8f848a1 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/ActivityDefinitionTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/ActivityDefinitionTests.java @@ -14,6 +14,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import java.util.Collections; import java.util.Locale; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -84,8 +85,8 @@ void whenDeserializingActivityDefinitionThenCorrectResponsesPatternIsExpected() final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then CorrectResponsesPattern Is Expected - assertThat(result.getCorrectResponsesPattern(), is(new String[] { - "{case_matters=false}{lang=en}To store and provide access to learning experiences."})); + assertThat(result.getCorrectResponsesPattern(), is(Collections.singletonList( + "{case_matters=false}{lang=en}To store and provide access to learning experiences."))); } @@ -172,7 +173,7 @@ void whenDeserializingActivityDefinitionWithChoicesThenChoicesIDIsExpected() thr final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Choices ID Is Expected - assertThat(result.getChoices()[0].getId(), is("1")); + assertThat(result.getChoices().get(0).getId(), is("1")); } @@ -187,7 +188,7 @@ void whenDeserializingActivityDefinitionWithChoicesThenChoicesDescriptionIsExpec final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Choices Description Is Expected - assertThat(result.getChoices()[0].getDescription().get(Locale.ENGLISH), + assertThat(result.getChoices().get(0).getDescription().get(Locale.ENGLISH), is("Does the xAPI include the concept of statements?")); } @@ -202,7 +203,7 @@ void whenDeserializingActivityDefinitionWithScaledThenScaleIDIsExpected() throws final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Scale ID Is Expected - assertThat(result.getScale()[0].getId(), is("1")); + assertThat(result.getScale().get(0).getId(), is("1")); } @@ -217,7 +218,7 @@ void whenDeserializingActivityDefinitionWithScaledThenScaleDescriptionIsExpected final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Scale Description Is Expected - assertThat(result.getScale()[0].getDescription().get(Locale.ENGLISH), + assertThat(result.getScale().get(0).getDescription().get(Locale.ENGLISH), is("Does the xAPI include the concept of statements?")); } @@ -232,7 +233,7 @@ void whenDeserializingActivityDefinitionWithSourceThenSourceIDIsExpected() throw final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Source ID Is Expected - assertThat(result.getSource()[0].getId(), is("1")); + assertThat(result.getSource().get(0).getId(), is("1")); } @@ -247,7 +248,7 @@ void whenDeserializingActivityDefinitionWithSourceThenSourceDescriptionIsExpecte final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Source Description Is Expected - assertThat(result.getSource()[0].getDescription().get(Locale.ENGLISH), + assertThat(result.getSource().get(0).getDescription().get(Locale.ENGLISH), is("Does the xAPI include the concept of statements?")); } @@ -262,7 +263,7 @@ void whenDeserializingActivityDefinitionWithTargetThenTargetIDIsExpected() throw final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Target ID Is Expected - assertThat(result.getTarget()[0].getId(), is("1")); + assertThat(result.getTarget().get(0).getId(), is("1")); } @@ -277,7 +278,7 @@ void whenDeserializingActivityDefinitionWithTargetThenTargetDescriptionIsExpecte final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Target Description Is Expected - assertThat(result.getTarget()[0].getDescription().get(Locale.ENGLISH), + assertThat(result.getTarget().get(0).getDescription().get(Locale.ENGLISH), is("Does the xAPI include the concept of statements?")); } @@ -292,7 +293,7 @@ void whenDeserializingActivityDefinitionWithStepsThenStepsIDIsExpected() throws final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Steps ID Is Expected - assertThat(result.getSteps()[0].getId(), is("1")); + assertThat(result.getSteps().get(0).getId(), is("1")); } @@ -307,7 +308,7 @@ void whenDeserializingActivityDefinitionWithStepsThenStepsDescriptionIsExpected( final ActivityDefinition result = objectMapper.readValue(file, ActivityDefinition.class); // Then Steps Description Is Expected - assertThat(result.getSteps()[0].getDescription().get(Locale.ENGLISH), + assertThat(result.getSteps().get(0).getDescription().get(Locale.ENGLISH), is("Does the xAPI include the concept of statements?")); } @@ -324,7 +325,7 @@ void whenSerializingActivityDefinitionOfInteractionTypeTrueFalseThenResultIsEqua .interactionType(InteractionType.TRUE_FALSE) - .correctResponsesPattern(new String[] {"true"}) + .correctResponsesPattern(Collections.singletonList("true")) .type(URI.create("http://adlnet.gov/expapi/activities/cmi.interaction")) @@ -352,7 +353,7 @@ void whenSerializingActivityDefinitionOfInteractionTypeChoiceThenResultIsEqualTo .interactionType(InteractionType.CHOICE) - .correctResponsesPattern(new String[] {"golf[,]tetris"}) + .correctResponsesPattern(Collections.singletonList("golf[,]tetris")) .addChoice(c -> c.id("golf").addDescription(Locale.ENGLISH, "Golf Example")) @@ -405,7 +406,7 @@ void whenBuildingActivityDefinitionWithTwoNameValuesThenNameLanguageMapHasTwoEnt .interactionType(InteractionType.TRUE_FALSE) - .correctResponsesPattern(new String[] {"true"}) + .correctResponsesPattern(Collections.singletonList("true")) .type(URI.create("http://adlnet.gov/expapi/activities/cmi.interaction")) @@ -430,7 +431,7 @@ void whenBuildingActivityDefinitionWithTwoDescriptionValuesThenDescriptionLangua .interactionType(InteractionType.TRUE_FALSE) - .correctResponsesPattern(new String[] {"true"}) + .correctResponsesPattern(Collections.singletonList("true")) .type(URI.create("http://adlnet.gov/expapi/activities/cmi.interaction")) diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/ContextActivitiesTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/ContextActivitiesTests.java index 95eecf32..7b725d82 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/ContextActivitiesTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/ContextActivitiesTests.java @@ -5,7 +5,7 @@ package dev.learning.xapi.model; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.arrayWithSize; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import com.fasterxml.jackson.databind.JsonNode; @@ -51,7 +51,7 @@ void whenDeserializingContextActivitiesThenParentIsInstanceOfActivity() throws E final ContextActivities result = objectMapper.readValue(file, ContextActivities.class); // Then Parent Is Instance Of Activity - assertThat(result.getParent()[0], instanceOf(Activity.class)); + assertThat(result.getParent().get(0), instanceOf(Activity.class)); } @@ -64,7 +64,7 @@ void whenDeserializingContextActivitiesThenGroupingIsInstanceOfActivity() throws final ContextActivities result = objectMapper.readValue(file, ContextActivities.class); // Then Grouping Is Instance Of Activity - assertThat(result.getGrouping()[0], instanceOf(Activity.class)); + assertThat(result.getGrouping().get(0), instanceOf(Activity.class)); } @@ -77,7 +77,7 @@ void whenDeserializingContextActivitiesThenCategoryIsInstanceOfActivity() throws final ContextActivities result = objectMapper.readValue(file, ContextActivities.class); // Then Category Is Instance Of Activity - assertThat(result.getCategory()[0], instanceOf(Activity.class)); + assertThat(result.getCategory().get(0), instanceOf(Activity.class)); } @@ -90,7 +90,7 @@ void whenDeserializingContextActivitiesThenOtherIsInstanceOfActivity() throws Ex final ContextActivities result = objectMapper.readValue(file, ContextActivities.class); // Then Other Is Instance Of Activity - assertThat(result.getOther()[0], instanceOf(Activity.class)); + assertThat(result.getOther().get(0), instanceOf(Activity.class)); } @@ -136,7 +136,7 @@ void whenCallingToStringThenResultIsExpected() throws IOException { } @Test - void whenBuildingContextActivitiesWithTwoParentsThenParentIsArrayWithSizeTwo() + void whenBuildingContextActivitiesWithTwoParentsThenParentIshasSizeTwo() throws IOException { // When Building ContextActivities With Two Parents @@ -149,12 +149,12 @@ void whenBuildingContextActivitiesWithTwoParentsThenParentIsArrayWithSizeTwo() .build(); // Then Parent Is Array With Size Two - assertThat(contextActivities.getParent(), arrayWithSize(2)); + assertThat(contextActivities.getParent(), hasSize(2)); } @Test - void whenBuildingContextActivitiesWithTwoGroupingThenGroupingIsArrayWithSizeTwo() + void whenBuildingContextActivitiesWithTwoGroupingThenGroupingIshasSizeTwo() throws IOException { // When Building ContextActivities With Two Groupings @@ -167,12 +167,12 @@ void whenBuildingContextActivitiesWithTwoGroupingThenGroupingIsArrayWithSizeTwo( .build(); // Then Grouping Is Array With Size Two - assertThat(contextActivities.getGrouping(), arrayWithSize(2)); + assertThat(contextActivities.getGrouping(), hasSize(2)); } @Test - void whenBuildingContextActivitiesWithTwoOtherThenOtherIsArrayWithSizeTwo() throws IOException { + void whenBuildingContextActivitiesWithTwoOtherThenOtherIshasSizeTwo() throws IOException { // When Building ContextActivities With Two Others final ContextActivities contextActivities = ContextActivities.builder() @@ -184,12 +184,12 @@ void whenBuildingContextActivitiesWithTwoOtherThenOtherIsArrayWithSizeTwo() thro .build(); // Then Other Is Array With Size Two - assertThat(contextActivities.getOther(), arrayWithSize(2)); + assertThat(contextActivities.getOther(), hasSize(2)); } @Test - void whenBuildingContextActivitiesWithTwoCategoriesThenCategoryIsArrayWithSizeTwo() + void whenBuildingContextActivitiesWithTwoCategoriesThenCategoryIshasSizeTwo() throws IOException { // When Building ContextActivities With Two Categories @@ -202,12 +202,12 @@ void whenBuildingContextActivitiesWithTwoCategoriesThenCategoryIsArrayWithSizeTw .build(); // Then Category Is Array With Size Two - assertThat(contextActivities.getCategory(), arrayWithSize(2)); + assertThat(contextActivities.getCategory(), hasSize(2)); } @Test - void whenBuildingContextActivitiesWithTwoParentsWithSameIdThenParentIsArrayWithSizeTwo() + void whenBuildingContextActivitiesWithTwoParentsWithSameIdThenParentIshasSizeTwo() throws IOException { // When Building ContextActivities With Two Parents With Same Id @@ -220,7 +220,7 @@ void whenBuildingContextActivitiesWithTwoParentsWithSameIdThenParentIsArrayWithS .build(); // Then Parent Is Array With Size Two - assertThat(contextActivities.getParent(), arrayWithSize(2)); + assertThat(contextActivities.getParent(), hasSize(2)); } diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/GroupTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/GroupTests.java index 0765f1ea..f706aa70 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/GroupTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/GroupTests.java @@ -64,7 +64,7 @@ void whenDeserializingGroupThenMemberIsInstanceOfAgent() throws IOException { final Group result = objectMapper.readValue(file, Group.class); // Then Member Is Instance Of Agent - assertThat(result.getMember()[0], instanceOf(Agent.class)); + assertThat(result.getMember().get(0), instanceOf(Agent.class)); } @Test diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/PersonTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/PersonTests.java index 131e5ecb..68d8be5f 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/PersonTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/PersonTests.java @@ -12,6 +12,8 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import java.util.Collections; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.util.ResourceUtils; @@ -49,7 +51,7 @@ void whenDeserializingPersonWhenDeserializedThenNameIsExpected() throws Exceptio final Person result = objectMapper.readValue(file, Person.class); // Then Name Is Expected - assertThat(result.getName(), is(new String[] {"Normal Person"})); + assertThat(result.getName(), is(Collections.singletonList("Normal Person"))); } @@ -62,7 +64,7 @@ void whenDeserializingPersonWhenDeserializedThenMboxIsExpected() throws Exceptio final Person result = objectMapper.readValue(file, Person.class); // Then Mbox Is Expected - assertThat(result.getMbox(), is(new String[] {"normal.person@normal.mail"})); + assertThat(result.getMbox(), is(Collections.singletonList("normal.person@normal.mail"))); } @@ -75,7 +77,7 @@ void whenDeserializingPersonWhenDeserializedThenShaSumIsExpected() throws Except final Person result = objectMapper.readValue(file, Person.class); // Then ShaSum Is Expected - assertThat(result.getMboxSha1sum(), is(new String[] {"123"})); + assertThat(result.getMboxSha1sum(), is(Collections.singletonList("123"))); } @@ -88,7 +90,7 @@ void whenDeserializingPersonWhenDeserializedThenOpenidIsExpected() throws Except final Person result = objectMapper.readValue(file, Person.class); // Then Openid Is Expected - assertThat(result.getOpenid(), is(new URI[] {URI.create("https://example.com")})); + assertThat(result.getOpenid(), is(Collections.singletonList(URI.create("https://example.com")))); } @@ -101,7 +103,7 @@ void whenDeserializingPersonThenAccountIsInstanceOfAccount() throws Exception { final Person result = objectMapper.readValue(file, Person.class); // Then Account Is Instance Of Account - assertThat(result.getAccount()[0], instanceOf(Account.class)); + assertThat(result.getAccount().get(0), instanceOf(Account.class)); } @@ -110,13 +112,13 @@ void whenSerializingPersonThenResultIsEqualToExpectedJson() throws IOException { final Person person = Person.builder() - .name(new String[] {"Normal Person"}) + .name(Collections.singletonList("Normal Person")) - .mbox(new String[] {"normal.person@normal.mail"}) + .mbox(Collections.singletonList("normal.person@normal.mail")) - .mboxSha1sum(new String[] {"123"}) + .mboxSha1sum(Collections.singletonList("123")) - .openid(new URI[] {URI.create("https://example.com")}) + .openid(Collections.singletonList(URI.create("https://example.com"))) .addAccount(a -> a.name("example1").homePage(URI.create("https://example.com"))) diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/StatementResultTest.java b/xapi-model/src/test/java/dev/learning/xapi/model/StatementResultTest.java index 30e7d985..45c6e3a2 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/StatementResultTest.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/StatementResultTest.java @@ -5,7 +5,7 @@ package dev.learning.xapi.model; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.arrayWithSize; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import com.fasterxml.jackson.databind.JsonNode; @@ -52,7 +52,7 @@ void whenDeserializingStatementResultThenStatementsIsInstanceOfStatement() throw final StatementResult result = objectMapper.readValue(file, StatementResult.class); // Then Statements Is Instance Of Statement - assertThat(result.getStatements()[0], instanceOf(Statement.class)); + assertThat(result.getStatements().get(0), instanceOf(Statement.class)); } @@ -128,7 +128,7 @@ void whenBuildingStatementResultWithTwoStatementsThenStatmentsIsArrayWithSizeTwo .build(); // Then Statments Is Array With Size Two - assertThat(statementResult.getStatements(), arrayWithSize(2)); + assertThat(statementResult.getStatements(), hasSize(2)); } diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/StatementTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/StatementTests.java index d3c4d3b0..e3fe087b 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/StatementTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/StatementTests.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.net.URI; import java.time.Instant; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Set; @@ -197,7 +198,7 @@ void whenDeserializingStatementWithAttachmentsThenAttachmentsIsInstanceOfAttachm final Statement result = objectMapper.readValue(file, Statement.class); // Then Attachments Is Instance Of Attachment - assertThat(result.getAttachments()[0], instanceOf(Attachment.class)); + assertThat(result.getAttachments().get(0), instanceOf(Attachment.class)); } @@ -306,7 +307,7 @@ void whenSerializingStatementThenResultIsEqualToExpectedJson() throws IOExceptio .extensions(extensions))) - .attachments(new Attachment[] {attachment}) + .attachments(Collections.singletonList(attachment)) .version("1.0.0") diff --git a/xapi-model/src/test/java/dev/learning/xapi/model/SubStatementTests.java b/xapi-model/src/test/java/dev/learning/xapi/model/SubStatementTests.java index 47f6214c..d9bdaf61 100644 --- a/xapi-model/src/test/java/dev/learning/xapi/model/SubStatementTests.java +++ b/xapi-model/src/test/java/dev/learning/xapi/model/SubStatementTests.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.net.URI; import java.time.Instant; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Locale; import java.util.UUID; @@ -133,7 +134,7 @@ void whenDeserializingSubStatementThenAttachmentsIsInstanceOfAttachment() throws final SubStatement result = objectMapper.readValue(file, SubStatement.class); // Then Attachments Is Instance Of Attachment - assertThat(result.getAttachments()[0], instanceOf(Attachment.class)); + assertThat(result.getAttachments().get(0), instanceOf(Attachment.class)); } @@ -260,13 +261,13 @@ void whenSerializingSubStatementThenResultIsEqualToExpectedJson() throws IOExcep final ContextActivities contextActivities = ContextActivities.builder() - .parent(new Activity[] {activity}) + .parent(Collections.singletonList(activity)) - .grouping(new Activity[] {activity}) + .grouping(Collections.singletonList(activity)) - .category(new Activity[] {activity}) + .category(Collections.singletonList(activity)) - .other(new Activity[] {activity}).build(); + .other(Collections.singletonList(activity)).build(); final LinkedHashMap extensions = new LinkedHashMap<>(); extensions.put(URI.create("http://url"), "www.example.com"); @@ -323,7 +324,7 @@ void whenSerializingSubStatementThenResultIsEqualToExpectedJson() throws IOExcep .context(context) - .attachments(new Attachment[] {attachment}) + .attachments(Collections.singletonList(attachment)) .build();