From 80f1df68b799b532898441a901b916569c74f88f Mon Sep 17 00:00:00 2001 From: mayc Date: Mon, 10 Aug 2026 09:47:42 -0400 Subject: [PATCH 1/2] fix: typo MULTIPLE in enum, document context mutation, replace Calendar with LocalDate - Add FAILED_MULTIPLE_MATCHING_SCHEMAS; deprecate FAILED_MULITPLE - Update all 6 test references to corrected enum name - Document that DecisionEngine.process() mutates caller's Map in-place - Replace deprecated Calendar with java.time.LocalDate.now().getYear() - Remove unused Calendar import --- src/main/java/com/imsweb/staging/Staging.java | 6 ++---- .../java/com/imsweb/staging/engine/DecisionEngine.java | 8 ++++++++ .../java/com/imsweb/staging/entities/StagingData.java | 6 ++++++ src/test/java/com/imsweb/staging/cs/CsStagingTest.java | 2 +- src/test/java/com/imsweb/staging/eod/EodStagingTest.java | 2 +- .../imsweb/staging/pediatric/PediatricStagingTest.java | 6 +++--- src/test/java/com/imsweb/staging/tnm/TnmStagingTest.java | 2 +- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/imsweb/staging/Staging.java b/src/main/java/com/imsweb/staging/Staging.java index d8652eb31..46fd4e4ff 100644 --- a/src/main/java/com/imsweb/staging/Staging.java +++ b/src/main/java/com/imsweb/staging/Staging.java @@ -7,7 +7,6 @@ import java.io.InputStream; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -583,7 +582,7 @@ public StagingData stage(StagingData data) { if (schemas.isEmpty()) data.setResult(StagingData.Result.FAILED_NO_MATCHING_SCHEMA); else - data.setResult(StagingData.Result.FAILED_MULITPLE_MATCHING_SCHEMAS); + data.setResult(StagingData.Result.FAILED_MULTIPLE_MATCHING_SCHEMAS); return data; } @@ -682,8 +681,7 @@ private void addContextKeys(Map context) { context.put(CTX_ALGORITHM_VERSION, getVersion()); // put the current year in the context - Calendar now = Calendar.getInstance(); - context.put(CTX_YEAR_CURRENT, String.valueOf(now.get(Calendar.YEAR))); + context.put(CTX_YEAR_CURRENT, String.valueOf(java.time.LocalDate.now().getYear())); } /** diff --git a/src/main/java/com/imsweb/staging/engine/DecisionEngine.java b/src/main/java/com/imsweb/staging/engine/DecisionEngine.java index f6b3bef35..50f88d918 100644 --- a/src/main/java/com/imsweb/staging/engine/DecisionEngine.java +++ b/src/main/java/com/imsweb/staging/engine/DecisionEngine.java @@ -625,6 +625,10 @@ else if (input.getDefaultTable() != null) { /** * Using the supplied context, process a schema. The results will be added to the context. + *

+ * **The context Map is mutated in place.** Input values are trimmed, defaults are resolved, + * and the map's contents are replaced with only the staging outputs by the time this method returns. + * Do not reuse the same Map instance across multiple calls unless you deep-copy it first. * @param schemaId an schema identifier * @param context a Map containing the context * @return a Result @@ -640,6 +644,10 @@ public Result process(String schemaId, Map context) { /** * Using the supplied context, process a schema. The results will be added to the context. + *

+ * **The context Map is mutated in place.** Input values are trimmed, defaults are resolved, + * and the map's contents are replaced with only the staging outputs by the time this method returns. + * Do not reuse the same Map instance across multiple calls unless you deep-copy it first. *

* Input-mapping destination keys on a table path are temporary aliases scoped to that path. They are added before the path is processed and removed afterward. An input-mapping * destination must therefore not be used to preserve a pre-existing context value; any previous value with the same key is overwritten and is not restored. diff --git a/src/main/java/com/imsweb/staging/entities/StagingData.java b/src/main/java/com/imsweb/staging/entities/StagingData.java index e2058e63a..b04a8eb43 100644 --- a/src/main/java/com/imsweb/staging/entities/StagingData.java +++ b/src/main/java/com/imsweb/staging/entities/StagingData.java @@ -42,6 +42,12 @@ public enum Result { FAILED_NO_MATCHING_SCHEMA, // multiple matching schemas were found; a discriminator is probably needed + FAILED_MULTIPLE_MATCHING_SCHEMAS, + + /** + * @deprecated use {@link #FAILED_MULTIPLE_MATCHING_SCHEMAS} + */ + @Deprecated(since = "12.0", forRemoval = true) FAILED_MULITPLE_MATCHING_SCHEMAS, // year of DX out of valid range diff --git a/src/test/java/com/imsweb/staging/cs/CsStagingTest.java b/src/test/java/com/imsweb/staging/cs/CsStagingTest.java index 41701f40c..b222f8351 100644 --- a/src/test/java/com/imsweb/staging/cs/CsStagingTest.java +++ b/src/test/java/com/imsweb/staging/cs/CsStagingTest.java @@ -591,7 +591,7 @@ void testBadLookupInStage() { data.setInput(CsStagingData.CsInput.PRIMARY_SITE, "C111"); data.setInput(CsStagingData.CsInput.HISTOLOGY, "8200"); _STAGING.stage(data); - assertEquals(Result.FAILED_MULITPLE_MATCHING_SCHEMAS, data.getResult()); + assertEquals(Result.FAILED_MULTIPLE_MATCHING_SCHEMAS, data.getResult()); } @Test diff --git a/src/test/java/com/imsweb/staging/eod/EodStagingTest.java b/src/test/java/com/imsweb/staging/eod/EodStagingTest.java index 7f43b88b3..6aa401173 100644 --- a/src/test/java/com/imsweb/staging/eod/EodStagingTest.java +++ b/src/test/java/com/imsweb/staging/eod/EodStagingTest.java @@ -300,7 +300,7 @@ void testBadLookupInStage() { data.setInput(EodInput.PRIMARY_SITE, "C111"); data.setInput(EodInput.HISTOLOGY, "8200"); _STAGING.stage(data); - assertThat(data.getResult()).isEqualTo(Result.FAILED_MULITPLE_MATCHING_SCHEMAS); + assertThat(data.getResult()).isEqualTo(Result.FAILED_MULTIPLE_MATCHING_SCHEMAS); } @Test diff --git a/src/test/java/com/imsweb/staging/pediatric/PediatricStagingTest.java b/src/test/java/com/imsweb/staging/pediatric/PediatricStagingTest.java index a6cd3014f..548942785 100644 --- a/src/test/java/com/imsweb/staging/pediatric/PediatricStagingTest.java +++ b/src/test/java/com/imsweb/staging/pediatric/PediatricStagingTest.java @@ -270,16 +270,16 @@ void testBadLookupInStage() { data.setInput(PediatricInput.PRIMARY_SITE, "C699"); data.setInput(PediatricInput.HISTOLOGY, "9500"); _STAGING.stage(data); - assertThat(data.getResult()).isEqualTo(Result.FAILED_MULITPLE_MATCHING_SCHEMAS); + assertThat(data.getResult()).isEqualTo(Result.FAILED_MULTIPLE_MATCHING_SCHEMAS); // test other constructors _STAGING.stage(new PediatricStagingData("C699", "9500", "15")); - assertThat(data.getResult()).isEqualTo(Result.FAILED_MULITPLE_MATCHING_SCHEMAS); + assertThat(data.getResult()).isEqualTo(Result.FAILED_MULTIPLE_MATCHING_SCHEMAS); data = new PediatricStagingData("C699", "9500"); data.setInput(PediatricInput.AGE_DX, "15"); _STAGING.stage(data); - assertThat(data.getResult()).isEqualTo(Result.FAILED_MULITPLE_MATCHING_SCHEMAS); + assertThat(data.getResult()).isEqualTo(Result.FAILED_MULTIPLE_MATCHING_SCHEMAS); assertThat(data.getInput(PediatricInput.PRIMARY_SITE)).isEqualTo("C699"); assertThat(data.getInput(PediatricInput.HISTOLOGY)).isEqualTo("9500"); diff --git a/src/test/java/com/imsweb/staging/tnm/TnmStagingTest.java b/src/test/java/com/imsweb/staging/tnm/TnmStagingTest.java index 259516ddc..252a5759d 100644 --- a/src/test/java/com/imsweb/staging/tnm/TnmStagingTest.java +++ b/src/test/java/com/imsweb/staging/tnm/TnmStagingTest.java @@ -297,7 +297,7 @@ void testBadLookupInStage() { data.setInput(TnmStagingData.TnmInput.PRIMARY_SITE, "C111"); data.setInput(TnmStagingData.TnmInput.HISTOLOGY, "8200"); _STAGING.stage(data); - assertEquals(Result.FAILED_MULITPLE_MATCHING_SCHEMAS, data.getResult()); + assertEquals(Result.FAILED_MULTIPLE_MATCHING_SCHEMAS, data.getResult()); } @Test From c8324b83c1daec821434ccbb15ce66f2e792eca8 Mon Sep 17 00:00:00 2001 From: mayc Date: Mon, 10 Aug 2026 09:50:49 -0400 Subject: [PATCH 2/2] fix: remove unsafe casts in StagingTableRow - addInput(): replace unchecked List cast with defensive copy loop - addEndpoint(): use instanceof check instead of raw cast, throws IllegalArgumentException on type mismatch --- .../staging/entities/impl/StagingTableRow.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/imsweb/staging/entities/impl/StagingTableRow.java b/src/main/java/com/imsweb/staging/entities/impl/StagingTableRow.java index 460b0739d..b48317b43 100644 --- a/src/main/java/com/imsweb/staging/entities/impl/StagingTableRow.java +++ b/src/main/java/com/imsweb/staging/entities/impl/StagingTableRow.java @@ -46,11 +46,13 @@ public void setInputs(Map> inputs) { * @param key key * @param range range */ - @SuppressWarnings("unchecked") @Override - public void addInput(String key, List range) { - _inputs.put(key, (List)range); - } + public void addInput(String key, List range) { + List staging = new ArrayList<>(); + for (Range r : range) + staging.add((StagingRange)r); + _inputs.put(key, staging); + } @Override @JsonProperty("endpoint") @@ -63,7 +65,9 @@ public void setEndpoints(List endpoints) { } @Override - public void addEndpoint(Endpoint endpoint) { - _endpoints.add((StagingEndpoint)endpoint); - } + public void addEndpoint(Endpoint endpoint) { + if (!(endpoint instanceof StagingEndpoint s)) + throw new IllegalArgumentException("Only StagingEndpoint accepted: " + endpoint.getClass().getName()); + _endpoints.add(s); + } }