mattcasters commented on issue #8711:
URL: https://github.com/apache/hop/issues/8711#issuecomment-5918850515

   ## JSON implementation plan — part 3 of 3
   
   [Plan index / part 
1](https://github.com/apache/hop/issues/8711#issuecomment-5918849385)
   
   ---
   
   #### Migration batch: `core`
   
   - `core/src/main/java/org/apache/hop/core/row/IValueMeta.java`
   - `core/src/main/java/org/apache/hop/core/row/JsonRowMeta.java`
   - `core/src/main/java/org/apache/hop/core/row/value/ValueMetaAvroRecord.java`
   - `core/src/main/java/org/apache/hop/core/row/value/ValueMetaBase.java`
   - `core/src/main/java/org/apache/hop/core/row/value/ValueMetaFactory.java`
   - `core/src/main/java/org/apache/hop/core/variables/Variables.java`
   - 
`core/src/main/java/org/apache/hop/metadata/serializer/json/JsonMetadataParser.java`
   - 
`core/src/main/java/org/apache/hop/metadata/serializer/json/JsonMetadataSerializer.java`
   - 
`core/src/test/java/org/apache/hop/core/row/value/ValueMetaAvroRecordTest.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl core -am -Pskip-uitest 
-DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate core JSON 
values from json-simple to Jackson`.
   
   Exact new guard path: 
`core/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`. 
After this batch is GREEN:
   
   ```bash
   git add -- core/src/main/java/org/apache/hop/core/row/IValueMeta.java 
core/src/main/java/org/apache/hop/core/row/JsonRowMeta.java 
core/src/main/java/org/apache/hop/core/row/value/ValueMetaAvroRecord.java 
core/src/main/java/org/apache/hop/core/row/value/ValueMetaBase.java 
core/src/main/java/org/apache/hop/core/row/value/ValueMetaFactory.java 
core/src/main/java/org/apache/hop/core/variables/Variables.java 
core/src/main/java/org/apache/hop/metadata/serializer/json/JsonMetadataParser.java
 
core/src/main/java/org/apache/hop/metadata/serializer/json/JsonMetadataSerializer.java
 core/src/test/java/org/apache/hop/core/row/value/ValueMetaAvroRecordTest.java 
core/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate core JSON values from json-simple to Jackson"
   ```
   
   #### Migration batch: `engine`
   
   - 
`engine/src/main/java/org/apache/hop/core/metadata/SerializableMetadataProvider.java`
   - `engine/src/main/java/org/apache/hop/pipeline/PipelineConfiguration.java`
   - `engine/src/main/java/org/apache/hop/workflow/WorkflowConfiguration.java`
   - `engine/src/main/java/org/apache/hop/www/RegisterPipelineServlet.java`
   - `engine/src/main/java/org/apache/hop/www/RegisterWorkflowServlet.java`
   - 
`engine/src/main/java/org/apache/hop/www/api/v1/resources/MetadataResource.java`
   - `engine/src/main/java/org/apache/hop/www/async/AsyncRunServlet.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl engine -am -Pskip-uitest 
-DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate engine JSON 
values from json-simple to Jackson`.
   
   Exact new guard path: 
`engine/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`. 
After this batch is GREEN:
   
   ```bash
   git add -- 
engine/src/main/java/org/apache/hop/core/metadata/SerializableMetadataProvider.java
 engine/src/main/java/org/apache/hop/pipeline/PipelineConfiguration.java 
engine/src/main/java/org/apache/hop/workflow/WorkflowConfiguration.java 
engine/src/main/java/org/apache/hop/www/RegisterPipelineServlet.java 
engine/src/main/java/org/apache/hop/www/RegisterWorkflowServlet.java 
engine/src/main/java/org/apache/hop/www/api/v1/resources/MetadataResource.java 
engine/src/main/java/org/apache/hop/www/async/AsyncRunServlet.java 
engine/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate engine JSON values from json-simple to Jackson"
   ```
   
   #### Migration batch: `plugins/engines/beam`
   
   - 
`plugins/engines/beam/src/main/java/org/apache/hop/beam/core/transform/TransformFn.java`
   - 
`plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/BeamBigtableInputMeta.java`
   - 
`plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/BeamBigtableOutputMeta.java`
   - 
`plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/BigtableRowToHopRowFn.java`
   - 
`plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/HopToBigtableFn.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/engines/beam -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/engines/beam JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/engines/beam/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/engines/beam/src/main/java/org/apache/hop/beam/core/transform/TransformFn.java
 
plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/BeamBigtableInputMeta.java
 
plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/BeamBigtableOutputMeta.java
 
plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/BigtableRowToHopRowFn.java
 
plugins/engines/beam/src/main/java/org/apache/hop/beam/transforms/bigtable/HopToBigtableFn.java
 
plugins/engines/beam/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/engines/beam JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/misc/git`
   
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/BitbucketRepositoryBrowser.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/BitbucketResourceClient.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitApiHttp.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitHubRepositoryBrowser.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitHubResourceClient.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitIssueActivityMapper.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitJsonLists.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitLabRepositoryBrowser.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitLabResourceClient.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GiteaRepositoryBrowser.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/GiteaResourceClient.java`
   - 
`plugins/misc/git/src/main/java/org/apache/hop/git/provider/LocalGitResourceClient.java`
   - 
`plugins/misc/git/src/test/java/org/apache/hop/git/provider/GitHubResourceClientTest.java`
   - 
`plugins/misc/git/src/test/java/org/apache/hop/git/provider/GitJsonListsTest.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/misc/git -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/misc/git JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/misc/git/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/BitbucketRepositoryBrowser.java
 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/BitbucketResourceClient.java
 plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitApiHttp.java 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitHubRepositoryBrowser.java
 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitHubResourceClient.java
 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitIssueActivityMapper.java
 plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitJsonLists.java 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitLabRepositoryBrowser.java
 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GitLabResourceClient.java
 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GiteaRepositoryBrowser.java
 
plugins/misc/git/src/main/java/org/apache/hop/git/provider/GiteaResourceClient.java
 plugins/misc/git/src/main/java/org/apache/hop/git
 /provider/LocalGitResourceClient.java 
plugins/misc/git/src/test/java/org/apache/hop/git/provider/GitHubResourceClientTest.java
 
plugins/misc/git/src/test/java/org/apache/hop/git/provider/GitJsonListsTest.java
 
plugins/misc/git/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/misc/git JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/misc/projects`
   
   - 
`plugins/misc/projects/src/main/java/org/apache/hop/projects/git/BitbucketRepositoryBrowser.java`
   - 
`plugins/misc/projects/src/main/java/org/apache/hop/projects/git/GitHubRepositoryBrowser.java`
   - 
`plugins/misc/projects/src/main/java/org/apache/hop/projects/git/GitLabRepositoryBrowser.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/misc/projects -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/misc/projects JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/misc/projects/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/misc/projects/src/main/java/org/apache/hop/projects/git/BitbucketRepositoryBrowser.java
 
plugins/misc/projects/src/main/java/org/apache/hop/projects/git/GitHubRepositoryBrowser.java
 
plugins/misc/projects/src/main/java/org/apache/hop/projects/git/GitLabRepositoryBrowser.java
 
plugins/misc/projects/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/misc/projects JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/resolvers/pipeline`
   
   - 
`plugins/resolvers/pipeline/src/main/java/org/apache/hop/resolvers/pipeline/VariableResolverPipeline.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/resolvers/pipeline -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/resolvers/pipeline JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/resolvers/pipeline/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/resolvers/pipeline/src/main/java/org/apache/hop/resolvers/pipeline/VariableResolverPipeline.java
 
plugins/resolvers/pipeline/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/resolvers/pipeline JSON values from 
json-simple to Jackson"
   ```
   
   #### Migration batch: `plugins/tech/ai`
   
   - 
`plugins/tech/ai/src/main/java/org/apache/hop/ai/engine/AiAdvisorMetadataContext.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/ai -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/ai JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/ai/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/ai/src/main/java/org/apache/hop/ai/engine/AiAdvisorMetadataContext.java
 
plugins/tech/ai/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/ai JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/tech/avro`
   
   - 
`plugins/tech/avro/src/main/java/org/apache/hop/avro/transforms/avrodecode/AvroDecodeFieldFinder.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/avro -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/avro JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/avro/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/avro/src/main/java/org/apache/hop/avro/transforms/avrodecode/AvroDecodeFieldFinder.java
 
plugins/tech/avro/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/avro JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/tech/databricks`
   
   - 
`plugins/tech/databricks/src/main/java/org/apache/hop/databricks/client/RestDatabricksFilesClient.java`
   - 
`plugins/tech/databricks/src/main/java/org/apache/hop/databricks/client/RestDatabricksJobsClient.java`
   - 
`plugins/tech/databricks/src/main/java/org/apache/hop/databricks/deploy/DatabricksJobSpecFactory.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/databricks -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/databricks JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/databricks/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/databricks/src/main/java/org/apache/hop/databricks/client/RestDatabricksFilesClient.java
 
plugins/tech/databricks/src/main/java/org/apache/hop/databricks/client/RestDatabricksJobsClient.java
 
plugins/tech/databricks/src/main/java/org/apache/hop/databricks/deploy/DatabricksJobSpecFactory.java
 
plugins/tech/databricks/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/databricks JSON values from json-simple 
to Jackson"
   ```
   
   #### Migration batch: `plugins/tech/elastic`
   
   - 
`plugins/tech/elastic/src/main/java/org/apache/hop/execution/elastic/ElasticExecutionInfoLocation.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/elastic -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/elastic JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/elastic/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/elastic/src/main/java/org/apache/hop/execution/elastic/ElasticExecutionInfoLocation.java
 
plugins/tech/elastic/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/elastic JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/tech/neo4j`
   
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphData.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphNodeData.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphPropertyData.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphRelationshipData.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/model/GraphModel.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/model/arrows/ArrowsAppImporter.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/model/sw/SolutionsWorkbenchImporter.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/shared/NeoHopData.java`
   - 
`plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/transforms/cypher/Cypher.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/neo4j -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/neo4j JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/neo4j/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphData.java 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphNodeData.java
 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphPropertyData.java
 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/core/data/GraphRelationshipData.java
 plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/model/GraphModel.java 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/model/arrows/ArrowsAppImporter.java
 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/model/sw/SolutionsWorkbenchImporter.java
 plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/shared/NeoHopData.java 
plugins/tech/neo4j/src/main/java/org/apache/hop/neo4j/transforms/cypher/Cypher.java
 
plugins/tech/neo4j/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/neo4j JSON values from json-simple to 
Jackson"
   ```
   
   #### Migration batch: `plugins/tech/opensearch`
   
   - 
`plugins/tech/opensearch/src/main/java/org/apache/hop/execution/opensearch/OpenSearchExecutionInfoLocation.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/opensearch -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/opensearch JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/opensearch/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/opensearch/src/main/java/org/apache/hop/execution/opensearch/OpenSearchExecutionInfoLocation.java
 
plugins/tech/opensearch/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/opensearch JSON values from json-simple 
to Jackson"
   ```
   
   #### Migration batch: `plugins/tech/salesforce`
   
   - 
`plugins/tech/salesforce/src/main/java/org/apache/hop/pipeline/transforms/salesforce/SalesforceConnection.java`
   - 
`plugins/tech/salesforce/src/test/java/org/apache/hop/pipeline/transforms/salesforce/SalesforceConnectionRecordExtractionTest.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/tech/salesforce -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/tech/salesforce JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/tech/salesforce/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/tech/salesforce/src/main/java/org/apache/hop/pipeline/transforms/salesforce/SalesforceConnection.java
 
plugins/tech/salesforce/src/test/java/org/apache/hop/pipeline/transforms/salesforce/SalesforceConnectionRecordExtractionTest.java
 
plugins/tech/salesforce/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/tech/salesforce JSON values from json-simple 
to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/execinfo`
   
   - 
`plugins/transforms/execinfo/src/main/java/org/apache/hop/pipeline/transforms/execinfo/ExecInfo.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/execinfo -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/execinfo JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/execinfo/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/execinfo/src/main/java/org/apache/hop/pipeline/transforms/execinfo/ExecInfo.java
 
plugins/transforms/execinfo/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/execinfo JSON values from 
json-simple to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/http`
   
   - 
`plugins/transforms/http/src/main/java/org/apache/hop/pipeline/transforms/http/Http.java`
   - 
`plugins/transforms/http/src/test/java/org/apache/hop/pipeline/transforms/http/HttpTest.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/http -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/http JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/http/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/http/src/main/java/org/apache/hop/pipeline/transforms/http/Http.java
 
plugins/transforms/http/src/test/java/org/apache/hop/pipeline/transforms/http/HttpTest.java
 
plugins/transforms/http/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/http JSON values from json-simple 
to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/httppost`
   
   - 
`plugins/transforms/httppost/src/main/java/org/apache/hop/pipeline/transforms/httppost/HttpPost.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/httppost -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/httppost JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/httppost/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/httppost/src/main/java/org/apache/hop/pipeline/transforms/httppost/HttpPost.java
 
plugins/transforms/httppost/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/httppost JSON values from 
json-simple to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/json`
   
   - 
`plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutput/JsonOutput.java`
   - 
`plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutput/JsonOutputData.java`
   - 
`plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutput/JsonOutputTest.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/json -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/json JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/json/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutput/JsonOutput.java
 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutput/JsonOutputData.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutput/JsonOutputTest.java
 
plugins/transforms/json/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/json JSON values from json-simple 
to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/mergerows`
   
   - 
`plugins/transforms/mergerows/src/main/java/org/apache/hop/pipeline/transforms/mergerows/MergeRows.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/mergerows -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/mergerows JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/mergerows/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/mergerows/src/main/java/org/apache/hop/pipeline/transforms/mergerows/MergeRows.java
 
plugins/transforms/mergerows/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/mergerows JSON values from 
json-simple to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/metadata`
   
   - 
`plugins/transforms/metadata/src/main/java/org/apache/hop/pipeline/transforms/metainput/MetadataInput.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/metadata -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/metadata JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/metadata/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/metadata/src/main/java/org/apache/hop/pipeline/transforms/metainput/MetadataInput.java
 
plugins/transforms/metadata/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/metadata JSON values from 
json-simple to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/rest`
   
   - 
`plugins/transforms/rest/src/main/java/org/apache/hop/pipeline/transforms/rest/Rest.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/rest -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/rest JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/rest/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/rest/src/main/java/org/apache/hop/pipeline/transforms/rest/Rest.java
 
plugins/transforms/rest/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/rest JSON values from json-simple 
to Jackson"
   ```
   
   #### Migration batch: `plugins/transforms/tika`
   
   - 
`plugins/transforms/tika/src/main/java/org/apache/hop/pipeline/transforms/tika/Tika.java`
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl plugins/transforms/tika -am 
-Pskip-uitest -DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected after this batch: real module tests executed, zero failures/errors, 
`BUILD SUCCESS`; source-usage guard for this module green. Commit this module's 
listed files and its guard/behavior tests only, message `Migrate 
plugins/transforms/tika JSON values from json-simple to Jackson`.
   
   Exact new guard path: 
`plugins/transforms/tika/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java`.
 After this batch is GREEN:
   
   ```bash
   git add -- 
plugins/transforms/tika/src/main/java/org/apache/hop/pipeline/transforms/tika/Tika.java
 
plugins/transforms/tika/src/test/java/org/apache/hop/jsonmigration/JsonSimpleUsageTest.java
   git commit -m "Migrate plugins/transforms/tika JSON values from json-simple 
to Jackson"
   ```
   
   ### 6.7 Remove dependency declarations only after every consumer gate is 
green (3 minutes)
   
   - In `core/pom.xml`, delete the entire 
`com.googlecode.json-simple:json-simple` dependency block including its 
exclusions (observed lines 74–83).
   - In `lib/pom.xml`, delete `json-simple.version` and the matching 
dependency-management entry. Do not delete `json-smart.version` or Jayway 
dependencies.
   - Scan packaging manifests and license-attribution inputs for the artifact; 
update only references that ship the removed jar. Do not erase historical 
NOTICE/license material merely because a source import vanished.
   
   RED before deletion: the final classpath still contains the deprecated jar. 
GREEN after deletion: no direct or resolved runtime dependency, all modules 
compile/test and distributions stage without it. Commands (future execution):
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw clean install -DskipTests=false
   ./mvnw -pl core dependency:tree 
-Dincludes=com.googlecode.json-simple:json-simple
   ./mvnw -pl plugins/transforms/json dependency:tree 
-Dincludes=com.googlecode.json-simple:json-simple
   ```
   
   Expected: full build success with tests actually executed; dependency-tree 
commands list **no matching dependency**. Scan the built client and optional 
plugin distributions too; a transitive copy in a staged plugin is not removed 
merely because core's tree is clean. Stage only the two POMs and verified 
packaging inputs; commit message `Remove the deprecated json-simple dependency 
after caller migration`.
   
   ## Phase 7 — final validation and issue close-out
   
   ### 7.1 Focused commands (2 minutes to launch each independent gate)
   
   These literal selectors correspond to methods supplied above; run each once 
for its RED and after its minimal fix for GREEN. No angle-bracket method-name 
placeholders are needed.
   
   ```bash
   json_test RowOutputConverterNullTest
   json_test 'JsonEOutputMetaTest#missingGroupKeyNamesTheMissingField'
   json_test 'JsonEOutputBehaviorTest#missingRuntimeGroupKeyIsAnActionableError'
   json_test 'JsonInputTest#literalRootArrayPathExtractsTheFirstValue'
   json_test 'JsonInputTest#serializedLiteralPathModeStillExtractsRootArray'
   json_test 
'JsonEOutputBehaviorTest#keySuggestionsExcludeLiveOutputAndExistingKeys'
   json_test 'JsonEOutputBehaviorTest#bothKeepsRowShapeAndWritesEveryGroup'
   json_test 'JsonEOutputBehaviorTest#legacyAppendHasNoNewSeparators'
   json_test 'JsonEOutputBehaviorTest#ndjsonAppendEscapesEmbeddedNewlines'
   json_test 'JsonEOutputBehaviorTest#ndjsonSplitsRecordsWithoutOuterArrays'
   json_test 'JsonEOutputBehaviorTest#ndjsonWrapsEachCompleteGroup'
   json_test 
'JsonEOutputBehaviorTest#ndjsonRejectsPrettyPrintingBeforeOpeningFile'
   json_test 'JsonEOutputBehaviorTest#ndjsonRejectsAppendWithoutFinalLf'
   json_test 'JsonEOutputBehaviorTest#disposalClosesAnActiveFileGenerator'
   json_ui_test JsonInputPathOptionsDialogTest
   json_ui_test JsonEOutputDialogTest
   core_test 'HopJsonValueTest,JsonRowMetaMapTest,ValueMetaAvroRecordTest'
   core_test 
'SimpleTimestampFormatTest,ValueMetaTimestampTest,ValueMetaBaseLocaleMinusTest'
   ```
   
   Expected for final runs: every selected test executed, exit 0, 
failures/errors zero. Legacy append, already-supported timestamp, and native 
JSON source characterizations may start green; do not make speculative 
production changes merely to get a RED.
   
   ### 7.2 Full quality and distribution gates
   
   ```bash
   ./mvnw spotless:apply
   git diff --check
   ./tools/with-isolated-display.sh ./mvnw clean install apache-rat:check 
-DskipTests=false
   ./mvnw spotless:check
   ```
   
   Expected: Spotless/RAT clean, test reports actually populated, build 
successful. Use the final assembled distribution, not stale installed jars. 
Ordinary unit tests and SWT UI tests are separate evidence; a passing 
`-Pskip-uitest` run does not establish GUI behavior.
   
   ### 7.3 Run the JSON integration project using the existing supported harness
   
   After the full distribution build, use the documented Docker harness from 
the repository root:
   
   ```bash
   bash integration-tests/scripts/run-tests-docker.sh PROJECT_NAME=json 
KEEP_IMAGES=true
   ```
   
   For a narrower streaming gate:
   
   ```bash
   bash integration-tests/scripts/run-tests-docker.sh PROJECT_NAME=json \
     
TEST_FILTER='0018-enhanced-json-output-streaming,0019-enhanced-json-output-grouped-file'
 KEEP_IMAGES=true
   ```
   
   Expected: the selected workflows pass; verify XML reports under 
`integration-tests/surefire-reports/` because the shell exit alone may not 
capture an individual workflow failure. The JSON project currently contains 
cases 0001–0017, including more than one 0002-named workflow; do not invent a 
total from the highest numeric prefix. Count report testcases programmatically.
   
   If Docker is unavailable, first extract the newly built client distribution 
and supply its **verified real directory** as `HOP_LOCATION`, then run 
`TEST_FILTER='0018-enhanced-json-output-streaming,0019-enhanced-json-output-grouped-file'
 bash integration-tests/scripts/run-tests.sh json`. The script writes output 
and uses system `/tmp` internally; use the Docker harness if the environment 
forbids host `/tmp` writes. Do not edit the integration harness under this 
umbrella simply to bypass its established setup.
   
   ### 7.4 Strengthen memory evidence without introducing a second streaming 
implementation
   
   In `integration-tests/json/main-0018-enhanced-json-output-streaming.hwf`, 
replace its row count 1000000 with 4000000, the last ID with 4000000, the 
object count with 4000001, and its exact byte-size expectation with 
**510888906**. These are computed from the reviewed UTF-8 fixture, not 
estimated. Keep `-Xmx128m`, `ExitOnOutOfMemoryError`, timeout and failure 
detection. The required file is larger than the heap; the original 
retained-tree implementation should fail and the row-streaming implementation 
should succeed. After any schema/pretty-print change, recompute bytes from the 
fixture rather than copying an obsolete number.
   
   This is one separate fixture commit after its pre-/post-PR behavior is 
actually observed, message `Prove enhanced JSON file output exceeds a bounded 
heap`. The current-group buffering limitation still applies and must be 
documented honestly.
   
   ### 7.5 Release-style regression matrix (one 3-minute setup slice per case)
   
   - JSON null, empty String, quoted `"null"`, missing path, repeat fields: 
both system settings, both String-source and JSON-source routes. #4373 must 
preserve actual null, not merely a null-looking preview.
   - Root-array JsonPath: index 0 and a nonzero index; flag false; default true 
still resolves `${PARAM_PATH}`; original metadata path remains unchanged; 
Preview and saved/reloaded pipeline agree.
   - Missing key: runtime + metadata discovery + validation diagnostic; valid 
grouping and input metadata remain intact. A name-bearing expected Hop error, 
not a generic index exception.
   - Enhanced output: zero/one/many items, forced arrays, grouped rows, forced 
single-group arrays, JSON fragments, BOTH versus file-only passthrough, key 
aliases, normal append, split exact boundary and remainder, JSON-size field 
present/absent, non-ASCII values, cancellation and write failure.
   - NDJSON: append twice, embedded CR/LF escaped, invalid boundary rejected 
without modifying bytes, compact output, UTF-8 required, completed groups stay 
together, no trailing empty split file, flag absent retains old behavior, 
enabled XML/JSON round-trip uses the new mode, GUI OK/Cancel/disable state.
   - Scheduler locale: run JSON Input, Calculator constant and Filter Rows 
under nb-NO with ASCII negative inputs, not only in GUI. The existing shared 
conversion test is the unit gate; confirm the release build's hop-run actually 
contains the merged fix.
   - Timestamp: exact six-digit value with matching mask; required-but-missing 
offset fails with conversion error; both JSON Input and Select Values preview 
close without freezing. Leave the freeze portion open if it still reproduces.
   - Migration: metadata save/load and exports, graph/Avro data, HTTP/REST 
header lists, local/synthetic Git provider payloads, Databricks request JSON, 
Bigtable/Beam serialization, JSON Output goldens, native `TYPE_JSON`. No secret 
payloads in failure reports.
   
   ### 7.6 Record dispositions and close the umbrella only with evidence (3 
minutes per issue)
   
   For each child, record: implementation/decision link, current SHA or merged 
PR, exact command, observed outcome, and remaining release limitation. Request 
permission before posting comments, changing checkboxes, or closing issues. 
Future read-back commands are:
   
   ```bash
   for issue in 2569 2570 2572 2929 4344 4373 4395 4644 4907 5167 5313 5953 
7995 8444 8593; do
     gh issue view "$issue" --repo apache/hop --json number,state,url
    done
   gh issue view 8711 --repo apache/hop --json body,state
   ```
   
   Every checkbox requires either a verified resolution or a deliberately 
accepted decline; an open PR or a proposed workaround is not a completed item. 
#4395's decline, #7995's API policy, and any residual #4907 freeze must be 
explicit. If any item remains unresolved, leave #8711 open and report that 
honestly. Do not infer that merging a PR has updated all tracker state; read 
back the exact targets after any authorized external write.
   
   ## Risks, tradeoffs, and open questions
   
   1. **Source baseline anomaly:** literal invalid accessor token must be 
explained/repaired explicitly; passing remote checks cannot substitute for the 
local baseline. None of this plan's snippets has been compiled in plan mode.
   2. **API migration gate:** changing JSONObject public signatures breaks 
binary plugins. Maintainer/release approval is necessary; no compatibility shim 
was invented to hide that cost.
   3. **Current-group memory:** #8713 solves whole-file accumulation for its 
streaming path, but a huge group/forced merged item/output field still grows. A 
fully bounded grouped writer would be another design (incremental group 
arrays/spooling) with separate acceptance criteria, not a casual claim under 
this plan.
   4. **Split semantics:** rows versus complete groups is user-visible. Require 
release documentation and fixture evidence; don't bury it as an implementation 
detail.
   5. **NDJSON format choices:** UTF-8/compact-only and final-LF append 
boundary are proposed conservative semantics. Existing concatenated documents 
are not automatically repaired. VFS append boundary inspection can involve a 
scan when the provider cannot seek.
   6. **Object index access:** JSON objects have no portable positional 
contract. Declining custom syntax is a recommendation requiring an accepted 
disposition, not a unilateral tracker action.
   7. **UI scope:** reuse #8588's helpers, distinguish failure from 
successful-empty fetch, and avoid an unrelated full-form migration. Register 
annotated methods as well as fields in GUI tests.
   8. **Blocked attachment:** #2569's ZIP has not been inspected; no 
sample-specific fix is asserted. Require approved access or the user-supplied 
pipeline before closure.
   9. **Old reports versus current requirements:** native JSON source support, 
timestamp guards/precision and locale parsing already exist in the inspected 
revision. Verify/reproduce before applying redundant fixes.
   10. **Wire compatibility:** Jackson may serialize key 
order/slashes/non-finite numbers/large numbers differently. Pin semantic and 
byte-sensitive consumers explicitly, retain exception causes, and avoid payload 
logging or default typing.
   11. **Planning completeness boundary:** code for the localized features is 
supplied; the migration's repeated method recipe is gated on public-API 
approval and existing consumer contracts. Where a new payload shape or an 
untested freeze appears, stop for a new scoped test/decision rather than guess.
   
   ## Appendix D — complete remaining format compatibility tests
   
   Add these methods to 
`plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputBehaviorTest.java`,
 one test at a time after its preceding slice is green. All helpers are 
provided in Appendix A; the fully qualified XML calls below avoid missing 
imports.
   
   ```java
   @Test
   void ndjsonRejectsUtf16BeforeOpeningFile() throws Exception {
     JsonEOutputMeta meta = meta(JsonEOutputMeta.OperationType.WRITE_TO_FILE);
     meta.setNewlineDelimited(true);
     meta.setEncoding("UTF-16");
     meta.getFileSettings().setDoNotOpenNewFileInit(false);
     try (Harness h = new Harness(meta, rowMeta("payload"), new Object[] 
{"x"})) {
       assertFalse(h.transform.init());
     }
     try (FileObject file = HopVfs.getFileObject(base + "/out.json")) {
       assertFalse(file.exists());
     }
   }
   
   @Test
   void deferredEmptyInputDoesNotCreateAnNdjsonFile() throws Exception {
     JsonEOutputMeta meta = meta(JsonEOutputMeta.OperationType.WRITE_TO_FILE);
     meta.setNewlineDelimited(true);
     try (Harness h = new Harness(meta, rowMeta("payload"))) {
       h.run();
       assertEquals(0, h.written.size());
     }
     try (FileObject file = HopVfs.getFileObject(base + "/out.json")) {
       assertFalse(file.exists());
     }
   }
   
   @Test
   void eagerEmptyInputCreatesAnEmptyNdjsonFile() throws Exception {
     JsonEOutputMeta meta = meta(JsonEOutputMeta.OperationType.WRITE_TO_FILE);
     meta.setNewlineDelimited(true);
     meta.getFileSettings().setDoNotOpenNewFileInit(false);
     try (Harness h = new Harness(meta, rowMeta("payload"))) {
       h.run();
     }
     assertEquals("", read(base + "/out.json"));
   }
   
   @Test
   void ndjsonExactSplitDoesNotCreateAnEmptyRemainder() throws Exception {
     JsonEOutputMeta meta = meta(JsonEOutputMeta.OperationType.WRITE_TO_FILE);
     meta.setNewlineDelimited(true);
     meta.getFileSettings().setSplitOutputAfter(2);
     try (Harness h = new Harness(meta, rowMeta("payload"),
         new Object[] {"x"}, new Object[] {"y"})) {
       h.run();
     }
     assertEquals(payload("x") + "\n" + payload("y") + "\n", read(base + 
"/out_0.json"));
     try (FileObject extra = HopVfs.getFileObject(base + "/out_1.json")) {
       assertFalse(extra.exists());
     }
   }
   
   @Test
   void jsonSizeMetadataMatchesItsGeneratedValue() throws Exception {
     JsonEOutputMeta meta = meta(JsonEOutputMeta.OperationType.OUTPUT_VALUE);
     meta.setJsonSizeFieldName("size");
     try (Harness h = new Harness(meta, rowMeta("payload"), new Object[] 
{"é"})) {
       h.run();
       assertEquals(1, h.written.size());
       var row = h.written.getFirst();
       assertEquals(row.getRowMeta().size(), row.getData().length);
       assertEquals((long) ((String) row.getData()[0]).length(), 
row.getData()[1]);
     }
   }
   
   private static JsonEOutputMeta loadXmlMeta(String xml) throws Exception {
     JsonEOutputMeta loaded = new JsonEOutputMeta();
     org.apache.hop.metadata.serializer.xml.XmlMetadataUtil.deSerializeFromXml(
         org.apache.hop.core.xml.XmlHandler.loadXmlString("<transform>" + xml + 
"</transform>",
             org.apache.hop.pipeline.transform.TransformMeta.XML_TAG),
         JsonEOutputMeta.class, loaded,
         new 
org.apache.hop.metadata.serializer.memory.MemoryMetadataProvider());
     return loaded;
   }
   
   @Test
   void missingNdjsonPropertyKeepsTheRegularJsonFileFormat() throws Exception {
     JsonEOutputMeta original = 
meta(JsonEOutputMeta.OperationType.WRITE_TO_FILE);
     String xml = 
org.apache.hop.metadata.serializer.xml.XmlMetadataUtil.serializeObjectToXml(original)
         .replaceAll("(?s)<newline_delimited>.*?</newline_delimited>", "")
         .replaceAll("<newline_delimited\\s*/>", "");
     assertFalse(xml.contains("newline_delimited"));
     JsonEOutputMeta loaded = loadXmlMeta(xml);
     try (Harness h = new Harness(loaded, rowMeta("payload"), new Object[] 
{"x"})) {
       h.run();
     }
     assertEquals(payload("x"), read(base + "/out.json"));
   }
   
   @Test
   void enabledNdjsonPropertySurvivesSerializationAndChangesTheWrittenFile() 
throws Exception {
     JsonEOutputMeta original = 
meta(JsonEOutputMeta.OperationType.WRITE_TO_FILE);
     original.setNewlineDelimited(true);
     JsonEOutputMeta loaded = loadXmlMeta(
         
org.apache.hop.metadata.serializer.xml.XmlMetadataUtil.serializeObjectToXml(original));
     try (Harness h = new Harness(loaded, rowMeta("payload"), new Object[] 
{"x"})) {
       h.run();
     }
     assertEquals(payload("x") + "\n", read(base + "/out.json"));
   }
   ```
   
   Exact commands (RED before the corresponding behavior, GREEN afterward):
   
   ```bash
   json_test 'JsonEOutputBehaviorTest#ndjsonRejectsUtf16BeforeOpeningFile'
   json_test 
'JsonEOutputBehaviorTest#deferredEmptyInputDoesNotCreateAnNdjsonFile'
   json_test 'JsonEOutputBehaviorTest#eagerEmptyInputCreatesAnEmptyNdjsonFile'
   json_test 
'JsonEOutputBehaviorTest#ndjsonExactSplitDoesNotCreateAnEmptyRemainder'
   json_test 'JsonEOutputBehaviorTest#jsonSizeMetadataMatchesItsGeneratedValue'
   json_test 
'JsonEOutputBehaviorTest#missingNdjsonPropertyKeepsTheRegularJsonFileFormat'
   json_test 
'JsonEOutputBehaviorTest#enabledNdjsonPropertySurvivesSerializationAndChangesTheWrittenFile'
   ```
   
   Empty-input/legacy characterizations can already pass; no production edit is 
needed in that case. Stage this exact test path and only a necessary 
runtime/meta fix; commit each green case with `Verify NDJSON encoding before 
file creation`, `Verify deferred empty NDJSON output`, `Verify eager empty 
NDJSON output`, `Avoid an empty NDJSON split remainder`, `Verify enhanced JSON 
size row metadata`, `Preserve legacy enhanced JSON format defaults`, or 
`Round-trip the NDJSON file format` respectively.
   
   ## Appendix E — literal staging/commit commands for localized green slices
   
   Run only after the named tests and formatting gate pass. These are future 
implementation instructions, not actions authorized or performed in plan mode.
   
   ```bash
   # #4373
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsoninput/reader/RowOutputConverter.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsoninput/reader/RowOutputConverterNullTest.java
   git commit -m 'Preserve JSON null when empty strings differ from null'
   
   # #2570 metadata boundary
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMeta.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMetaTest.java
 
plugins/transforms/json/src/main/resources/org/apache/hop/pipeline/transforms/jsonoutputenhanced/messages/messages_en_US.properties
   git commit -m 'Validate enhanced JSON group keys during metadata discovery'
   
   # #2570 runtime boundary
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutput.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputBehaviorTest.java
   git commit -m 'Report missing enhanced JSON group keys before runtime lookup'
   
   # #8444 GUI-backed vertical slice
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsoninput/JsonInput.java
 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsoninput/JsonInputMeta.java
 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsoninput/JsonInputDialog.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsoninput/JsonInputTest.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsoninput/JsonInputPathOptionsDialogTest.java
 
plugins/transforms/json/src/main/resources/org/apache/hop/pipeline/transforms/jsoninput/messages/messages_en_US.properties
 docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
   git commit -m 'Allow literal JSONPath expressions without changing legacy 
resolution'
   
   # #5167 / #5313
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMeta.java
 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputDialog.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputBehaviorTest.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputDialogTest.java
 
plugins/transforms/json/src/main/resources/org/apache/hop/pipeline/transforms/jsonoutputenhanced/messages/messages_en_US.properties
 
docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/enhancedjsonoutput.adoc
   git commit -m 'Offer unmapped incoming fields as enhanced JSON group keys'
   
   # #4344 first file-format slice; later runtime slices stage only the 
runtime/test paths
   git add -- 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutput.java
 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMeta.java
 
plugins/transforms/json/src/main/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputDialog.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputBehaviorTest.java
 
plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputDialogTest.java
 
plugins/transforms/json/src/main/resources/org/apache/hop/pipeline/transforms/jsonoutputenhanced/messages/messages_en_US.properties
 
docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/enhancedjsonoutput.adoc
   git commit -m 'Add compact NDJSON output'
   
   # Shared utility, after its focused tests pass
   git add -- core/src/main/java/org/apache/hop/core/json/HopJson.java 
core/src/test/java/org/apache/hop/core/json/HopJsonValueTest.java
   git commit -m 'Provide Jackson JSON-value parsing and serialization for 
migration'
   ```
   
   **Metadata API caller cohort:** changing 
`JsonMetadataParser.getJsonObject`'s return type must be committed with its 
typed callers, not left as a non-compiling downstream tree. The exact cohort is 
`core/src/main/java/org/apache/hop/metadata/serializer/json/JsonMetadataParser.java`,
 
`core/src/main/java/org/apache/hop/metadata/serializer/json/JsonMetadataSerializer.java`,
 
`engine/src/main/java/org/apache/hop/core/metadata/SerializableMetadataProvider.java`,
 
`engine/src/main/java/org/apache/hop/www/api/v1/resources/MetadataResource.java`,
 
`plugins/transforms/metadata/src/main/java/org/apache/hop/pipeline/transforms/metainput/MetadataInput.java`,
 and 
`plugins/tech/ai/src/main/java/org/apache/hop/ai/engine/AiAdvisorMetadataContext.java`.
 Each uses the container/serialization replacements in 6.4. Verify that entire 
cohort before its commit:
   
   ```bash
   ./tools/with-isolated-display.sh ./mvnw -pl 
core,engine,plugins/transforms/metadata,plugins/tech/ai -am -Pskip-uitest 
-DskipTests=false -Dspotless.skip=true -Drat.skip=true install
   ```
   
   Expected: every cohort module compiles and its behavior tests run green. 
Rebuild dependent modules after public API changes; a previously installed 
binary compiled against JSONObject return signatures is not compatible. The 
module inventory describes scope, not permission to commit a broken caller 
halfway through a signature change.
   
   ## Definition of done
   
   - All 15 child obligations are accounted for with evidence or accepted 
decisions.
   - New behavior has an observed RED before its minimal implementation and a 
real GREEN after it; pure-refactor characterizations remain green and 
dependency/source guards prove removal.
   - Old XML keys/IDs/defaults load unchanged; new flags are editable, 
previewed, saved and reloaded through the GUI.
   - Unit, UI, integration, stress, formatting, license and distribution gates 
are recorded from actual runs.
   - No direct json-simple code/dependency or unintended staged runtime copy 
remains if #7995 is approved for implementation; otherwise its deliberate 
deferral/decline is recorded and umbrella closure is not claimed prematurely.
   - Tracker updates are authorized and verified by reading back the exact 
issues; no commits, pushes, merges or remote writes are implied by this plan.
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to