From 1c59bca201d4c19b47a3a2c1e74c38cd31db3389 Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Tue, 28 Jul 2026 13:08:03 -0400 Subject: [PATCH 1/4] changed statementclientexception to add status code prop. Also updated testcontainers and revealed some old bad dependencies for junit --- pom.xml | 2 +- .../xapi/client/StatementClient.java | 13 +++++++----- .../exception/StatementClientException.java | 21 +++++++++++++++++++ .../model/ActivityDefinitionTest.java | 2 +- .../com/yetanalytics/model/StatementTest.java | 2 +- .../xapi/client/StatementClientTest.java | 6 +++--- .../client/filters/StatementFiltersTest.java | 4 ++-- .../yetanalytics/xapi/model/LangTagTest.java | 6 +++--- .../xapi/util/StatementValidatorTest.java | 4 ++-- .../xapi/util/ValidationUtils.java | 4 ++-- 10 files changed, 44 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index dba4927..7bde40f 100644 --- a/pom.xml +++ b/pom.xml @@ -117,7 +117,7 @@ org.testcontainers testcontainers - 1.20.6 + 2.0.5 test diff --git a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java index d0f13c3..a487175 100644 --- a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java +++ b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java @@ -79,7 +79,8 @@ private List doPost(List statements, URI endpoint) EntityUtils.consumeQuietly(response.getEntity()); throw new StatementClientException(String.format( "Error, Non-200 Status. Received: %s", - response.getStatusLine().getStatusCode())); + response.getStatusLine().getStatusCode()), + response.getStatusLine().getStatusCode()); } } @@ -107,7 +108,7 @@ public List postStatements(List stmts) { } return result; } catch (ParseException | IOException e) { - throw new StatementClientException("Error posting Statements", e); + throw new StatementClientException("Error posting Statements", 0, e); } } @@ -123,7 +124,8 @@ private StatementResult doGetStatementResult(URI endpoint) EntityUtils.consumeQuietly(response.getEntity()); throw new StatementClientException(String.format( "Error, Non-200 Status. Received: %s", - response.getStatusLine().getStatusCode())); + response.getStatusLine().getStatusCode()), + response.getStatusLine().getStatusCode()); } } @@ -139,7 +141,8 @@ private Statement doGetStatement(URI endpoint) EntityUtils.consumeQuietly(response.getEntity()); throw new StatementClientException(String.format( "Error, Non-200 Status. Received: %s", - response.getStatusLine().getStatusCode())); + response.getStatusLine().getStatusCode()), + response.getStatusLine().getStatusCode()); } } @@ -195,7 +198,7 @@ public List getStatements(StatementFilters filters, Integer max) { } } catch (IOException e) { - throw new StatementClientException("Error getting Statements", e); + throw new StatementClientException("Error getting Statements", 0, e); } return statements; } diff --git a/src/main/java/com/yetanalytics/xapi/exception/StatementClientException.java b/src/main/java/com/yetanalytics/xapi/exception/StatementClientException.java index 4b8d05b..ac34159 100644 --- a/src/main/java/com/yetanalytics/xapi/exception/StatementClientException.java +++ b/src/main/java/com/yetanalytics/xapi/exception/StatementClientException.java @@ -1,6 +1,8 @@ package com.yetanalytics.xapi.exception; public class StatementClientException extends RuntimeException { + + private Integer statusCode; public StatementClientException() { super(); @@ -10,14 +12,33 @@ public StatementClientException(String message) { super(message); } + public StatementClientException(String message, Integer status) { + super(message); + this.statusCode = status; + } + public StatementClientException(String message, Throwable cause) { super(message, cause); } + public StatementClientException(String message, Integer status, Throwable cause) { + super(message, cause); + this.statusCode = status; + } + public StatementClientException(Throwable cause) { super(cause); } + public StatementClientException(Integer status, Throwable cause) { + super(cause); + this.statusCode = status; + } + + public Integer getStatusCode() { + return statusCode; + } + @Override public String getMessage() { return "StatementClientException: " + super.getMessage(); diff --git a/src/test/java/com/yetanalytics/model/ActivityDefinitionTest.java b/src/test/java/com/yetanalytics/model/ActivityDefinitionTest.java index 35fdba6..b96f9eb 100644 --- a/src/test/java/com/yetanalytics/model/ActivityDefinitionTest.java +++ b/src/test/java/com/yetanalytics/model/ActivityDefinitionTest.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.List; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/yetanalytics/model/StatementTest.java b/src/test/java/com/yetanalytics/model/StatementTest.java index bd8fc04..5384d57 100644 --- a/src/test/java/com/yetanalytics/model/StatementTest.java +++ b/src/test/java/com/yetanalytics/model/StatementTest.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.UUID; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.semver4j.Semver; diff --git a/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java b/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java index 477ce8d..3e1d478 100644 --- a/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java +++ b/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java @@ -1,8 +1,8 @@ package com.yetanalytics.xapi.client; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; import java.io.IOException; diff --git a/src/test/java/com/yetanalytics/xapi/client/filters/StatementFiltersTest.java b/src/test/java/com/yetanalytics/xapi/client/filters/StatementFiltersTest.java index b52d2b9..a793e1f 100644 --- a/src/test/java/com/yetanalytics/xapi/client/filters/StatementFiltersTest.java +++ b/src/test/java/com/yetanalytics/xapi/client/filters/StatementFiltersTest.java @@ -1,7 +1,7 @@ package com.yetanalytics.xapi.client.filters; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import java.net.URI; import java.util.UUID; diff --git a/src/test/java/com/yetanalytics/xapi/model/LangTagTest.java b/src/test/java/com/yetanalytics/xapi/model/LangTagTest.java index 13c4eed..4185212 100644 --- a/src/test/java/com/yetanalytics/xapi/model/LangTagTest.java +++ b/src/test/java/com/yetanalytics/xapi/model/LangTagTest.java @@ -2,9 +2,9 @@ import java.util.IllformedLocaleException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; public class LangTagTest { diff --git a/src/test/java/com/yetanalytics/xapi/util/StatementValidatorTest.java b/src/test/java/com/yetanalytics/xapi/util/StatementValidatorTest.java index a016f42..371445b 100644 --- a/src/test/java/com/yetanalytics/xapi/util/StatementValidatorTest.java +++ b/src/test/java/com/yetanalytics/xapi/util/StatementValidatorTest.java @@ -1,10 +1,10 @@ package com.yetanalytics.xapi.util; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Set; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.yetanalytics.xapi.model.Activity; import com.yetanalytics.xapi.model.LangTag; diff --git a/src/test/java/com/yetanalytics/xapi/util/ValidationUtils.java b/src/test/java/com/yetanalytics/xapi/util/ValidationUtils.java index f712014..c3621f5 100644 --- a/src/test/java/com/yetanalytics/xapi/util/ValidationUtils.java +++ b/src/test/java/com/yetanalytics/xapi/util/ValidationUtils.java @@ -1,7 +1,7 @@ package com.yetanalytics.xapi.util; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import jakarta.validation.Validation; import jakarta.validation.Validator; From 92e219e26941744cadc61446f3a8f1bf45726b5f Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Tue, 28 Jul 2026 13:10:00 -0400 Subject: [PATCH 2/4] version bump --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7bde40f..4bcc572 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.yetanalytics xapi-tools jar - 0.0.5 + 0.0.6 xAPI Tools Java Serialization Model and Tools for xAPI Standard (IEEE 9274.1.1) https://github.com/yetanalytics/java-xapi-tools From e2d883c84025897d7b07e7113c07cd35ffda423b Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Tue, 28 Jul 2026 14:37:09 -0400 Subject: [PATCH 3/4] cleanup status lines --- .../yetanalytics/xapi/client/StatementClient.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java index a487175..729d3d3 100644 --- a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java +++ b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java @@ -77,10 +77,9 @@ private List doPost(List statements, URI endpoint) new TypeReference>(){}); } else { EntityUtils.consumeQuietly(response.getEntity()); + int statusCode = response.getStatusLine().getStatusCode(); throw new StatementClientException(String.format( - "Error, Non-200 Status. Received: %s", - response.getStatusLine().getStatusCode()), - response.getStatusLine().getStatusCode()); + "Error, Non-200 Status. Received: %s", statusCode), statusCode); } } @@ -122,10 +121,9 @@ private StatementResult doGetStatementResult(URI endpoint) return Mapper.getMapper().readValue(responseBody, StatementResult.class); } else { EntityUtils.consumeQuietly(response.getEntity()); + int statusCode = response.getStatusLine().getStatusCode(); throw new StatementClientException(String.format( - "Error, Non-200 Status. Received: %s", - response.getStatusLine().getStatusCode()), - response.getStatusLine().getStatusCode()); + "Error, Non-200 Status. Received: %s", statusCode), statusCode); } } @@ -139,10 +137,9 @@ private Statement doGetStatement(URI endpoint) return Mapper.getMapper().readValue(responseBody, Statement.class); } else { EntityUtils.consumeQuietly(response.getEntity()); + int statusCode = response.getStatusLine().getStatusCode(); throw new StatementClientException(String.format( - "Error, Non-200 Status. Received: %s", - response.getStatusLine().getStatusCode()), - response.getStatusLine().getStatusCode()); + "Error, Non-200 Status. Received: %s", statusCode), statusCode); } } From 52a1e28ca3390ac35c4b8ee1766255d065eccdf0 Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Thu, 30 Jul 2026 18:33:06 -0400 Subject: [PATCH 4/4] make xapi objects implement serializable for java serial use-cases like jms --- pom.xml | 2 +- src/main/java/com/yetanalytics/xapi/model/JSONObject.java | 4 +++- src/main/java/com/yetanalytics/xapi/model/LangTag.java | 3 ++- src/main/java/com/yetanalytics/xapi/model/XapiDuration.java | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 4bcc572..142bd53 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.yetanalytics xapi-tools jar - 0.0.6 + 0.0.7 xAPI Tools Java Serialization Model and Tools for xAPI Standard (IEEE 9274.1.1) https://github.com/yetanalytics/java-xapi-tools diff --git a/src/main/java/com/yetanalytics/xapi/model/JSONObject.java b/src/main/java/com/yetanalytics/xapi/model/JSONObject.java index 157f6db..a8906e0 100644 --- a/src/main/java/com/yetanalytics/xapi/model/JSONObject.java +++ b/src/main/java/com/yetanalytics/xapi/model/JSONObject.java @@ -1,5 +1,7 @@ package com.yetanalytics.xapi.model; -public interface JSONObject { +import java.io.Serializable; + +public interface JSONObject extends Serializable { public boolean isEmpty(); } diff --git a/src/main/java/com/yetanalytics/xapi/model/LangTag.java b/src/main/java/com/yetanalytics/xapi/model/LangTag.java index eb977c7..b27adf6 100644 --- a/src/main/java/com/yetanalytics/xapi/model/LangTag.java +++ b/src/main/java/com/yetanalytics/xapi/model/LangTag.java @@ -1,5 +1,6 @@ package com.yetanalytics.xapi.model; +import java.io.Serializable; import java.util.IllformedLocaleException; import java.util.Locale; import java.util.Locale.Builder; @@ -14,7 +15,7 @@ * allowing for retrieval of both the original String and the corresponding Locale. */ @JsonInclude(Include.NON_NULL) -public class LangTag { +public class LangTag implements Serializable { private final String languageTagString; private final Locale languageTagLocale; diff --git a/src/main/java/com/yetanalytics/xapi/model/XapiDuration.java b/src/main/java/com/yetanalytics/xapi/model/XapiDuration.java index 73e0076..5eaa363 100644 --- a/src/main/java/com/yetanalytics/xapi/model/XapiDuration.java +++ b/src/main/java/com/yetanalytics/xapi/model/XapiDuration.java @@ -1,5 +1,6 @@ package com.yetanalytics.xapi.model; +import java.io.Serializable; import java.time.Duration; import com.fasterxml.jackson.annotation.JsonCreator; @@ -12,7 +13,7 @@ * allowing for retrieval of the original String. */ @JsonInclude(Include.NON_NULL) -public class XapiDuration { +public class XapiDuration implements Serializable { /** * This constructor takes an 8601 formatted String and converts it to an