From 80e1d8143c89d3bdd3b7f780ab646be34c22c055 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 14 Jul 2025 20:03:29 -0500 Subject: [PATCH 01/10] Replace QProcessMetaData.addStep and addOptionalStep with .withStep and .withOptionalStep --- .../core/instances/QInstanceEnricher.java | 18 ++++++++--------- .../metadata/processes/QProcessMetaData.java | 4 ++-- .../scripts/ScriptsMetaDataProvider.java | 2 +- .../etl/basic/BasicETLProcess.java | 6 +++--- .../etl/streamed/StreamedETLProcess.java | 2 +- .../StreamedETLWithFrontendProcess.java | 10 +++++----- ...rbageCollectorProcessMetaDataProducer.java | 2 +- .../reports/BasicRunReportProcess.java | 8 ++++---- .../reports/RunReportForRecordProcess.java | 8 ++++---- .../RenderSavedReportMetaDataProducer.java | 8 ++++---- .../RunScheduledReportMetaDataProducer.java | 4 ++-- .../actions/processes/RunProcessTest.java | 2 +- .../RunProcessUpdateStepListTest.java | 12 +++++------ .../core/instances/QInstanceEnricherTest.java | 2 +- .../qqq/backend/core/utils/TestUtils.java | 20 +++++++++---------- ...esystemImporterProcessMetaDataBuilder.java | 2 +- .../sync/FilesystemSyncProcess.java | 2 +- .../BasicETLCleanupSourceFilesStepTest.java | 2 +- ...asicETLCollectSourceFileNamesStepTest.java | 2 +- .../java/com/kingsrook/qqq/api/TestUtils.java | 6 +++--- .../qqq/frontend/picocli/TestUtils.java | 2 +- 21 files changed, 62 insertions(+), 62 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java index 6895a258..445b3ea3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java @@ -984,16 +984,16 @@ public class QInstanceEnricher .withCode(new QCodeReference(BulkInsertReceiveValueMappingStep.class)); int i = 0; - process.addStep(i++, prepareFileUploadStep); - process.addStep(i++, uploadScreen); + process.withStep(i++, prepareFileUploadStep); + process.withStep(i++, uploadScreen); - process.addStep(i++, prepareFileMappingStep); - process.addStep(i++, fileMappingScreen); - process.addStep(i++, receiveFileMappingStep); + process.withStep(i++, prepareFileMappingStep); + process.withStep(i++, fileMappingScreen); + process.withStep(i++, receiveFileMappingStep); - process.addStep(i++, prepareValueMappingStep); - process.addStep(i++, valueMappingScreen); - process.addStep(i++, receiveValueMappingStep); + process.withStep(i++, prepareValueMappingStep); + process.withStep(i++, valueMappingScreen); + process.withStep(i++, receiveValueMappingStep); process.getFrontendStep(StreamedETLWithFrontendProcess.STEP_NAME_REVIEW).setRecordListFields(editableFields); @@ -1053,7 +1053,7 @@ public class QInstanceEnricher Fields whose switches are off will not be updated.""")) .withComponent(new QFrontendComponentMetaData().withType(QComponentType.BULK_EDIT_FORM)); - process.addStep(0, editScreen); + process.withStep(0, editScreen); process.getFrontendStep("review").setRecordListFields(editableFields); qInstance.addProcess(process); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QProcessMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QProcessMetaData.java index baaa16ae..66677db3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QProcessMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QProcessMetaData.java @@ -213,7 +213,7 @@ public class QProcessMetaData implements QAppChildMetaData, MetaDataWithPermissi { if(stepList != null) { - stepList.forEach(this::addStep); + stepList.forEach(this::withStep); } return (this); @@ -231,7 +231,7 @@ public class QProcessMetaData implements QAppChildMetaData, MetaDataWithPermissi { index = this.stepList.size(); } - addStep(index, step); + withStep(index, step); return (this); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java index b7282874..6e9730b3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java @@ -174,7 +174,7 @@ public class ScriptsMetaDataProvider .withLoadStepClass(RunRecordScriptLoadStep.class) .getProcessMetaData(); - processMetaData.addStep(0, new QFrontendStepMetaData() + processMetaData.withStep(0, new QFrontendStepMetaData() .withName("input") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM)) .withFormField(new QFieldMetaData("scriptId", QFieldType.INTEGER).withPossibleValueSourceName(Script.TABLE_NAME) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLProcess.java index 7388c07f..7ca54f96 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLProcess.java @@ -83,8 +83,8 @@ public class BasicETLProcess return new QProcessMetaData() .withName(PROCESS_NAME) - .addStep(extractFunction) - .addStep(transformFunction) - .addStep(loadFunction); + .withStep(extractFunction) + .withStep(transformFunction) + .withStep(loadFunction); } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamed/StreamedETLProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamed/StreamedETLProcess.java index c4dbf1c6..12d07921 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamed/StreamedETLProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamed/StreamedETLProcess.java @@ -68,6 +68,6 @@ public class StreamedETLProcess return new QProcessMetaData() .withName(PROCESS_NAME) - .addStep(etlFunction); + .withStep(etlFunction); } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcess.java index 09e621ce..c6722da2 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcess.java @@ -191,11 +191,11 @@ public class StreamedETLWithFrontendProcess .withComponent(new QFrontendComponentMetaData().withType(QComponentType.PROCESS_SUMMARY_RESULTS)); return new QProcessMetaData() - .addStep(previewStep) - .addStep(reviewStep) - .addStep(validateStep) - .addStep(executeStep) - .addStep(resultStep); + .withStep(previewStep) + .withStep(reviewStep) + .withStep(validateStep) + .withStep(executeStep) + .withStep(resultStep); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/garbagecollector/GarbageCollectorProcessMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/garbagecollector/GarbageCollectorProcessMetaDataProducer.java index a9d28fac..c2c6d6be 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/garbagecollector/GarbageCollectorProcessMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/garbagecollector/GarbageCollectorProcessMetaDataProducer.java @@ -91,7 +91,7 @@ public class GarbageCollectorProcessMetaDataProducer .withInputData(new QFunctionInputMetaData() .withField(new QFieldMetaData("joinedTablesToAlsoDelete", QFieldType.STRING).withDefaultValue(joinedTablesToAlsoDelete))); - processMetaData.addStep(0, new QFrontendStepMetaData() + processMetaData.withStep(0, new QFrontendStepMetaData() .withName("input") .withLabel("Input") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.HELP_TEXT).withValue("text", """ diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/BasicRunReportProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/BasicRunReportProcess.java index aa2413df..34772cba 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/BasicRunReportProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/BasicRunReportProcess.java @@ -81,10 +81,10 @@ public class BasicRunReportProcess return new QProcessMetaData() .withName(PROCESS_NAME) .withIsHidden(true) - .addStep(prepareStep) - .addStep(inputStep) - .addStep(executeStep) - .addStep(accessStep); + .withStep(prepareStep) + .withStep(inputStep) + .withStep(executeStep) + .withStep(accessStep); } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/RunReportForRecordProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/RunReportForRecordProcess.java index 09ad980c..b5577167 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/RunReportForRecordProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/RunReportForRecordProcess.java @@ -109,10 +109,10 @@ public class RunReportForRecordProcess return new QProcessMetaData() .withName(PROCESS_NAME) - .addStep(prepareStep) - .addStep(inputStep) - .addStep(executeStep) - .addStep(accessStep); + .withStep(prepareStep) + .withStep(inputStep) + .withStep(executeStep) + .withStep(accessStep); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RenderSavedReportMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RenderSavedReportMetaDataProducer.java index 4b25c61c..65eb3d71 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RenderSavedReportMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RenderSavedReportMetaDataProducer.java @@ -75,7 +75,7 @@ public class RenderSavedReportMetaDataProducer implements MetaDataProducerInterf .withTableName(SavedReport.TABLE_NAME) .withIcon(new QIcon().withName("print")) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("pre") .withInputData(new QFunctionInputMetaData() .withField(new QFieldMetaData(SES_PROVIDER_NAME, QFieldType.STRING)) @@ -86,7 +86,7 @@ public class RenderSavedReportMetaDataProducer implements MetaDataProducerInterf .withRecordListMetaData(new QRecordListMetaData().withTableName(SavedReport.TABLE_NAME))) .withCode(new QCodeReference(RenderSavedReportPreStep.class))) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("input") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM)) .withFormField(new QFieldMetaData(FIELD_NAME_REPORT_FORMAT, QFieldType.STRING) @@ -97,13 +97,13 @@ public class RenderSavedReportMetaDataProducer implements MetaDataProducerInterf .withComponent(new QFrontendComponentMetaData().withType(QComponentType.WIDGET) .withValue("widgetName", SavedReportsMetaDataProvider.RENDER_REPORT_PROCESS_VALUES_WIDGET))) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("execute") .withInputData(new QFunctionInputMetaData().withRecordListMetaData(new QRecordListMetaData() .withTableName(SavedReport.TABLE_NAME))) .withCode(new QCodeReference(RenderSavedReportExecuteStep.class))) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("output") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.DOWNLOAD_FORM)) .withComponent(new NoCodeWidgetFrontendComponentMetaData() diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RunScheduledReportMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RunScheduledReportMetaDataProducer.java index b23e2575..8b75e267 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RunScheduledReportMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedreports/RunScheduledReportMetaDataProducer.java @@ -59,13 +59,13 @@ public class RunScheduledReportMetaDataProducer implements MetaDataProducerInter .withTableName(ScheduledReport.TABLE_NAME) .withIcon(new QIcon().withName("print")) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("execute") .withInputData(new QFunctionInputMetaData().withRecordListMetaData(new QRecordListMetaData() .withTableName(ScheduledReport.TABLE_NAME))) .withCode(new QCodeReference(RunScheduledReportExecuteStep.class))) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("results") .withComponent(new NoCodeWidgetFrontendComponentMetaData() .withOutput(new WidgetHtmlLine().withVelocityTemplate("Success")))); // todo!!! diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessTest.java index 130ac0cf..81da7d66 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessTest.java @@ -366,7 +366,7 @@ public class RunProcessTest extends BaseTest // only put back1 in the step list. // ////////////////////////////////////// )) - .addOptionalStep(front1) + .withOptionalStep(front1) ); //////////////////////////////////////////////////////////// diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessUpdateStepListTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessUpdateStepListTest.java index bbafad3f..fc5168ea 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessUpdateStepListTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessUpdateStepListTest.java @@ -164,13 +164,13 @@ public class RunProcessUpdateStepListTest extends BaseTest .withName(STEP_END) )); - process.addOptionalStep(new QFrontendStepMetaData().withName(STEP_A)); - process.addOptionalStep(new QBackendStepMetaData().withName(STEP_B).withCode(new QCodeReference(NoopBackendStep.class))); - process.addOptionalStep(new QFrontendStepMetaData().withName(STEP_C)); + process.withOptionalStep(new QFrontendStepMetaData().withName(STEP_A)); + process.withOptionalStep(new QBackendStepMetaData().withName(STEP_B).withCode(new QCodeReference(NoopBackendStep.class))); + process.withOptionalStep(new QFrontendStepMetaData().withName(STEP_C)); - process.addOptionalStep(new QBackendStepMetaData().withName(STEP_1).withCode(new QCodeReference(NoopBackendStep.class))); - process.addOptionalStep(new QFrontendStepMetaData().withName(STEP_2)); - process.addOptionalStep(new QBackendStepMetaData().withName(STEP_3).withCode(new QCodeReference(NoopBackendStep.class))); + process.withOptionalStep(new QBackendStepMetaData().withName(STEP_1).withCode(new QCodeReference(NoopBackendStep.class))); + process.withOptionalStep(new QFrontendStepMetaData().withName(STEP_2)); + process.withOptionalStep(new QBackendStepMetaData().withName(STEP_3).withCode(new QCodeReference(NoopBackendStep.class))); return (process); } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java index 58e7ccca..d796bf07 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java @@ -576,7 +576,7 @@ class QInstanceEnricherTest extends BaseTest QProcessMetaData process = new QProcessMetaData(); process.setName("test"); process.withStepList(List.of(new QBackendStepMetaData().withName("execute").withCode(new QCodeReference(TestUtils.IncreaseBirthdateStep.class)))); - process.addOptionalStep(new QFrontendStepMetaData() + process.withOptionalStep(new QFrontendStepMetaData() .withName("screen") .withViewField(new QFieldMetaData("myField", QFieldType.STRING))); qInstance.addProcess(process); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/TestUtils.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/TestUtils.java index 731b7235..2a76e974 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/TestUtils.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/TestUtils.java @@ -327,11 +327,11 @@ public class TestUtils .withName(PROCESS_NAME_INCREASE_BIRTHDATE) .withTableName(TABLE_NAME_PERSON_MEMORY) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("preview") ) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("doWork") .withCode(new QCodeReference(IncreaseBirthdateStep.class)) .withInputData(new QFunctionInputMetaData() @@ -340,7 +340,7 @@ public class TestUtils .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING).withDefaultValue("Success!")))) ) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("results") .withFormField(new QFieldMetaData("outputMessage", QFieldType.STRING)) ); @@ -1144,7 +1144,7 @@ public class TestUtils return new QProcessMetaData() .withName(PROCESS_NAME_GREET_PEOPLE) .withTableName(TABLE_NAME_PERSON_MEMORY) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("prepare") .withCode(new QCodeReference() .withName(MockBackendStep.class.getName()) @@ -1175,13 +1175,13 @@ public class TestUtils .withName(PROCESS_NAME_GREET_PEOPLE_INTERACTIVE) .withTableName(TABLE_NAME_PERSON) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("setup") .withFormField(new QFieldMetaData("greetingPrefix", QFieldType.STRING)) .withFormField(new QFieldMetaData("greetingSuffix", QFieldType.STRING)) ) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("doWork") .withCode(new QCodeReference() .withName(MockBackendStep.class.getName()) @@ -1200,7 +1200,7 @@ public class TestUtils .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) ) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("results") .withFormField(new QFieldMetaData("outputMessage", QFieldType.STRING)) ); @@ -1221,7 +1221,7 @@ public class TestUtils return new QProcessMetaData() .withName(PROCESS_NAME_ADD_TO_PEOPLES_AGE) .withTableName(TABLE_NAME_PERSON) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("getAgeStatistics") .withCode(new QCodeReference() .withName(GetAgeStatistics.class.getName()) @@ -1235,7 +1235,7 @@ public class TestUtils .withFieldList(List.of( new QFieldMetaData("minAge", QFieldType.INTEGER), new QFieldMetaData("maxAge", QFieldType.INTEGER))))) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("addAge") .withCode(new QCodeReference() .withName(AddAge.class.getName()) @@ -1265,7 +1265,7 @@ public class TestUtils .withTableName(defineTableBasepull().getName())) .withName(PROCESS_NAME_BASEPULL) .withTableName(TABLE_NAME_PERSON) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("prepare") .withCode(new QCodeReference() .withName(MockBackendStep.class.getName()) diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterProcessMetaDataBuilder.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterProcessMetaDataBuilder.java index 7612bb0f..2ca310e1 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterProcessMetaDataBuilder.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterProcessMetaDataBuilder.java @@ -49,7 +49,7 @@ public class FilesystemImporterProcessMetaDataBuilder extends AbstractProcessMet public FilesystemImporterProcessMetaDataBuilder() { super(new QProcessMetaData() - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("sync") .withCode(new QCodeReference(FilesystemImporterStep.class)) .withInputData(new QFunctionInputMetaData() diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcess.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcess.java index 8339a973..ee3ea816 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcess.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcess.java @@ -76,6 +76,6 @@ public class FilesystemSyncProcess return new QProcessMetaData() .withName(PROCESS_NAME) - .addStep(syncStep); + .withStep(syncStep); } } diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStepTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStepTest.java index 3bd46582..23062ed0 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStepTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStepTest.java @@ -183,7 +183,7 @@ public class BasicETLCleanupSourceFilesStepTest extends BaseTest private RunBackendStepOutput runFunction(QInstance qInstance, List filePaths, Map values) throws Exception { QBackendStepMetaData backendStepMetaData = new BasicETLCleanupSourceFilesStep().defineStepMetaData(); - QProcessMetaData qProcessMetaData = new QProcessMetaData().withName("testScaffold").addStep(backendStepMetaData); + QProcessMetaData qProcessMetaData = new QProcessMetaData().withName("testScaffold").withStep(backendStepMetaData); qInstance.addProcess(qProcessMetaData); HashSet filePathsSet = new HashSet<>(filePaths); diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCollectSourceFileNamesStepTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCollectSourceFileNamesStepTest.java index ca7814f0..9376c0a0 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCollectSourceFileNamesStepTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCollectSourceFileNamesStepTest.java @@ -96,7 +96,7 @@ class BasicETLCollectSourceFileNamesStepTest extends BaseTest { QInstance qInstance = TestUtils.defineInstance(); QBackendStepMetaData backendStepMetaData = new BasicETLCollectSourceFileNamesStep().defineStepMetaData(); - QProcessMetaData qProcessMetaData = new QProcessMetaData().withName("testScaffold").addStep(backendStepMetaData); + QProcessMetaData qProcessMetaData = new QProcessMetaData().withName("testScaffold").withStep(backendStepMetaData); qInstance.addProcess(qProcessMetaData); reInitInstanceInContext(qInstance); diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java index 9c198ec0..107b37be 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java @@ -204,7 +204,7 @@ public class TestUtils .withName(PROCESS_NAME_GET_PERSON_INFO) .withLabel("Get Person Info") .withTableName(TABLE_NAME_PERSON) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("enterInputs") .withLabel("Person Info Input") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM)) @@ -230,11 +230,11 @@ public class TestUtils """)) )) - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("execute") .withCode(new QCodeReference(GetPersonInfoStep.class))) - .addStep(new QFrontendStepMetaData() + .withStep(new QFrontendStepMetaData() .withName("dummyStep") ); diff --git a/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/TestUtils.java b/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/TestUtils.java index 8a9e0a6d..126e87f5 100644 --- a/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/TestUtils.java +++ b/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/TestUtils.java @@ -169,7 +169,7 @@ public class TestUtils return new QProcessMetaData() .withName("greet") .withTableName("person") - .addStep(new QBackendStepMetaData() + .withStep(new QBackendStepMetaData() .withName("prepare") .withCode(new QCodeReference() .withName(MockBackendStep.class.getName()) From 06ed66f6404281f05b1c8e1d185a862e028c8c2b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 14 Jul 2025 20:19:54 -0500 Subject: [PATCH 02/10] Update al lURLEncoder.encode calls to use StandardCharsets.UTF_8 (some were Charset.defaultCharset, some were deprecated single-arg) --- .../core/actions/dashboard/AbstractHTMLWidgetRenderer.java | 4 ++-- .../actions/dashboard/widgets/ChildRecordListRenderer.java | 3 ++- .../actions/dashboard/widgets/RecordListWidgetRenderer.java | 3 ++- .../qqq/backend/module/filesystem/s3/utils/S3Utils.java | 3 ++- .../qqq/backend/javalin/QJavalinProcessHandlerTest.java | 3 ++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java index 942e3ceb..e56a5ebf 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java @@ -161,7 +161,7 @@ public abstract class AbstractHTMLWidgetRenderer extends AbstractWidgetRenderer public static String linkTableCreateWithDefaultValues(RenderWidgetInput input, String tableName, Map defaultValues) throws QException { String tablePath = QContext.getQInstance().getTablePath(tableName); - return (tablePath + "/create#defaultValues=" + URLEncoder.encode(JsonUtils.toJson(defaultValues), Charset.defaultCharset())); + return (tablePath + "/create#defaultValues=" + URLEncoder.encode(JsonUtils.toJson(defaultValues), StandardCharsets.UTF_8)); } @@ -229,7 +229,7 @@ public abstract class AbstractHTMLWidgetRenderer extends AbstractWidgetRenderer } filter = QQueryFilterDeduper.dedupeFilter(filter); - return (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), Charset.defaultCharset())); + return (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), StandardCharsets.UTF_8)); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java index a73fcb09..769cca7d 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import java.io.Serializable; import java.net.URLEncoder; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -262,7 +263,7 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer } String tablePath = QContext.getQInstance().getTablePath(rightTable.getName()); - String viewAllLink = tablePath == null ? null : (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), Charset.defaultCharset())); + String viewAllLink = tablePath == null ? null : (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), StandardCharsets.UTF_8)); ChildRecordListData widgetData = new ChildRecordListData(widgetLabel, queryOutput, rightTable, tablePath, viewAllLink, totalRows); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/RecordListWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/RecordListWidgetRenderer.java index ffd6710e..c7a1da28 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/RecordListWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/RecordListWidgetRenderer.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import java.net.URLEncoder; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import com.kingsrook.qqq.backend.core.actions.tables.CountAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; @@ -194,7 +195,7 @@ public class RecordListWidgetRenderer extends AbstractWidgetRenderer } String tablePath = QContext.getQInstance().getTablePath(tableName); - String viewAllLink = tablePath == null ? null : (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), Charset.defaultCharset())); + String viewAllLink = tablePath == null ? null : (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), StandardCharsets.UTF_8)); ChildRecordListData widgetData = new ChildRecordListData(input.getQueryParams().get("widgetLabel"), queryOutput, table, tablePath, viewAllLink, totalRows); diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3Utils.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3Utils.java index 025e742a..9fcff089 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3Utils.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3Utils.java @@ -26,6 +26,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URI; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.PathMatcher; @@ -176,7 +177,7 @@ public class S3Utils /////////////////////////////////////////// // skip files that do not match the glob // /////////////////////////////////////////// - if(!pathMatcher.matches(Path.of(URI.create("file:///" + URLEncoder.encode(key))))) + if(!pathMatcher.matches(Path.of(URI.create("file:///" + URLEncoder.encode(key, StandardCharsets.UTF_8))))) { // LOG.debug("Skipping file [{}] that does not match glob [{}]", key, glob); continue; diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java index 6c5298ed..d46c3203 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.javalin; import java.net.URLEncoder; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.UUID; import com.kingsrook.qqq.backend.core.actions.async.AsyncJobState; @@ -123,7 +124,7 @@ class QJavalinProcessHandlerTest extends QJavalinTestBase .withValues(List.of(3, 4, 5))); String filterJSON = JsonUtils.toJson(queryFilter); - HttpResponse response = Unirest.get(BASE_URL + "/processes/greet/init?recordsParam=filterJSON&filterJSON=" + URLEncoder.encode(filterJSON, Charset.defaultCharset())).asString(); + HttpResponse response = Unirest.get(BASE_URL + "/processes/greet/init?recordsParam=filterJSON&filterJSON=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8)).asString(); assertEquals(200, response.getStatus()); JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); assertNotNull(jsonObject); From cdfc58adc66b77b9b2837c7b3acae7b228de5ec7 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 14 Jul 2025 20:40:18 -0500 Subject: [PATCH 03/10] Replaced deprecated withIn and withType methods that took strings in favor of ones that take enum constants --- .../actions/GenerateOpenApiSpecAction.java | 124 +++++++++--------- ...derSavedReportProcessApiProcessOutput.java | 7 +- .../processes/ApiProcessObjectOutput.java | 3 +- .../ApiProcessSummaryListOutput.java | 13 +- 4 files changed, 76 insertions(+), 71 deletions(-) diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java index c6eda4c5..8bd87a45 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java @@ -83,6 +83,7 @@ import com.kingsrook.qqq.openapi.model.Content; import com.kingsrook.qqq.openapi.model.Example; import com.kingsrook.qqq.openapi.model.ExampleWithListValue; import com.kingsrook.qqq.openapi.model.ExampleWithSingleValue; +import com.kingsrook.qqq.openapi.model.In; import com.kingsrook.qqq.openapi.model.Info; import com.kingsrook.qqq.openapi.model.Method; import com.kingsrook.qqq.openapi.model.OpenAPI; @@ -93,6 +94,7 @@ import com.kingsrook.qqq.openapi.model.Response; import com.kingsrook.qqq.openapi.model.Schema; import com.kingsrook.qqq.openapi.model.SecurityScheme; import com.kingsrook.qqq.openapi.model.Tag; +import com.kingsrook.qqq.openapi.model.Type; import io.javalin.http.ContentType; import io.javalin.http.HttpStatus; import org.apache.commons.lang.BooleanUtils; @@ -289,16 +291,16 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction tableFields = new LinkedHashMap<>(); Schema tableSchema = new Schema() - .withType("object") + .withType(Type.OBJECT) .withProperties(tableFields); for(QFieldMetaData field : tableApiFields) @@ -1461,7 +1463,7 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction properties = new LinkedHashMap<>(); - properties.put("statusCode", new Schema().withType("integer")); - properties.put("statusText", new Schema().withType("string")); - properties.put("error", new Schema().withType("string")); + properties.put("statusCode", new Schema().withType(Type.INTEGER)); + properties.put("statusText", new Schema().withType(Type.STRING)); + properties.put("error", new Schema().withType(Type.STRING)); properties.put(primaryKeyApiName, new Schema().withType(getFieldType(primaryKeyField))); return new Response() .withDescription("Multiple statuses. See body for details.") .withContent(MapBuilder.of("application/json", new Content() .withSchema(new Schema() - .withType("array") + .withType(Type.ARRAY) .withItems(new Schema() - .withType("object") + .withType(Type.OBJECT) .withProperties(properties)) .withExample(example)))); } @@ -1704,7 +1706,7 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction "string"; - case INTEGER, LONG -> "integer"; // todo - we could give 'format' w/ int32 & int64 to further specify - case DECIMAL -> "number"; - case BOOLEAN -> "boolean"; + case STRING, DATE, TIME, DATE_TIME, TEXT, HTML, PASSWORD, BLOB -> Type.STRING; + case INTEGER, LONG -> Type.INTEGER; // todo - we could give 'format' w/ int32 & int64 to further specify + case DECIMAL -> Type.NUMBER; + case BOOLEAN -> Type.BOOLEAN; }; } @@ -1796,9 +1798,9 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction getSpecResponses(String apiName) { Map propertiesFor207Object = new LinkedHashMap<>(); - propertiesFor207Object.put("id", new Schema().withType("integer").withDescription("Id of the record whose status is being described in the object")); - propertiesFor207Object.put("statusCode", new Schema().withType("integer").withDescription("HTTP Status code indicating the success or failure of the process on this record")); - propertiesFor207Object.put("statusText", new Schema().withType("string").withDescription("HTTP Status text indicating the success or failure of the process on this record")); - propertiesFor207Object.put("message", new Schema().withType("string").withDescription("Additional descriptive information about the result of the process on this record.")); + propertiesFor207Object.put("id", new Schema().withType(Type.INTEGER).withDescription("Id of the record whose status is being described in the object")); + propertiesFor207Object.put("statusCode", new Schema().withType(Type.INTEGER).withDescription("HTTP Status code indicating the success or failure of the process on this record")); + propertiesFor207Object.put("statusText", new Schema().withType(Type.STRING).withDescription("HTTP Status text indicating the success or failure of the process on this record")); + propertiesFor207Object.put("message", new Schema().withType(Type.STRING).withDescription("Additional descriptive information about the result of the process on this record.")); List exampleFor207Object = ListBuilder.of(MapBuilder.of(LinkedHashMap::new) .with("id", 42) @@ -112,9 +113,9 @@ public class ApiProcessSummaryListOutput implements ApiProcessOutputInterface .withDescription("For each input record, an object describing its status may be returned.") .withContent(MapBuilder.of(ContentType.JSON, new Content() .withSchema(new Schema() - .withType("array") + .withType(Type.ARRAY) .withItems(new Schema() - .withType("object") + .withType(Type.OBJECT) .withProperties(propertiesFor207Object)) .withExample(exampleFor207Object) ) From f7ca485e6e3a01552b00764223160381174c5a57 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 15 Jul 2025 08:06:33 -0500 Subject: [PATCH 04/10] Replace deprecated IOUtils.readLines call --- .../com/kingsrook/qqq/backend/module/sqlite/TestUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qqq-backend-module-sqlite/src/test/java/com/kingsrook/qqq/backend/module/sqlite/TestUtils.java b/qqq-backend-module-sqlite/src/test/java/com/kingsrook/qqq/backend/module/sqlite/TestUtils.java index 7fb9feb4..6cb4d98f 100644 --- a/qqq-backend-module-sqlite/src/test/java/com/kingsrook/qqq/backend/module/sqlite/TestUtils.java +++ b/qqq-backend-module-sqlite/src/test/java/com/kingsrook/qqq/backend/module/sqlite/TestUtils.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.module.sqlite; import java.io.File; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.util.List; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; @@ -86,7 +87,6 @@ public class TestUtils /******************************************************************************* ** *******************************************************************************/ - @SuppressWarnings("unchecked") public static void primeTestDatabase(String sqlFileName) throws Exception { SQLiteBackendMetaData backend = TestUtils.defineBackend(); @@ -98,7 +98,7 @@ public class TestUtils { InputStream primeTestDatabaseSqlStream = SQLiteBackendModule.class.getResourceAsStream("/" + sqlFileName); assertNotNull(primeTestDatabaseSqlStream); - List lines = (List) IOUtils.readLines(primeTestDatabaseSqlStream); + List lines = IOUtils.readLines(primeTestDatabaseSqlStream, StandardCharsets.UTF_8); lines = lines.stream().filter(line -> !line.startsWith("-- ")).toList(); String joinedSQL = String.join("\n", lines); for(String sql : joinedSQL.split(";")) From dd67ed317c27b2f2c97a74afbb4e6ef8f9e523ae Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 15 Jul 2025 08:29:10 -0500 Subject: [PATCH 05/10] Replace deprecated backend.setVariantOptions properties with VariantsConfig --- .../api/actions/BaseAPIActionUtilTest.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtilTest.java b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtilTest.java index ad985295..62dbb471 100644 --- a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtilTest.java +++ b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtilTest.java @@ -59,6 +59,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateOutput; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.tables.UniqueKey; +import com.kingsrook.qqq.backend.core.model.metadata.variants.BackendVariantsConfig; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.SleepUtils; import com.kingsrook.qqq.backend.core.utils.lambdas.UnsafeConsumer; @@ -71,6 +72,7 @@ import com.kingsrook.qqq.backend.module.api.model.AuthorizationType; import com.kingsrook.qqq.backend.module.api.model.OutboundAPILog; import com.kingsrook.qqq.backend.module.api.model.OutboundAPILogMetaDataProvider; import com.kingsrook.qqq.backend.module.api.model.metadata.APIBackendMetaData; +import com.kingsrook.qqq.backend.module.api.model.metadata.APIBackendVariantSetting; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; @@ -684,10 +686,11 @@ class BaseAPIActionUtilTest extends BaseTest APIBackendMetaData backend = (APIBackendMetaData) QContext.getQInstance().getBackend(TestUtils.MOCK_BACKEND_NAME); backend.setAuthorizationType(AuthorizationType.API_KEY_HEADER); backend.setUsesVariants(true); - backend.setVariantOptionsTableName("variant"); - backend.setVariantOptionsTableIdField("id"); - backend.setVariantOptionsTableApiKeyField("apiKey"); - backend.setVariantOptionsTableTypeValue("API_KEY_TYPE"); + backend.setBackendVariantsConfig(new BackendVariantsConfig() + .withOptionsTableName("variant") + .withVariantTypeKey("API_KEY_TYPE") + .withBackendSettingSourceFieldName(APIBackendVariantSetting.API_KEY, "apiKey") + ); InsertInput insertInput = new InsertInput(); insertInput.setTableName("variant"); @@ -716,11 +719,12 @@ class BaseAPIActionUtilTest extends BaseTest APIBackendMetaData backend = (APIBackendMetaData) QContext.getQInstance().getBackend(TestUtils.MOCK_BACKEND_NAME); backend.setAuthorizationType(AuthorizationType.BASIC_AUTH_USERNAME_PASSWORD); backend.setUsesVariants(true); - backend.setVariantOptionsTableName("variant"); - backend.setVariantOptionsTableIdField("id"); - backend.setVariantOptionsTableUsernameField("username"); - backend.setVariantOptionsTablePasswordField("password"); - backend.setVariantOptionsTableTypeValue("USER_PASS"); + backend.setBackendVariantsConfig(new BackendVariantsConfig() + .withOptionsTableName("variant") + .withVariantTypeKey("USER_PASS") + .withBackendSettingSourceFieldName(APIBackendVariantSetting.USERNAME, "username") + .withBackendSettingSourceFieldName(APIBackendVariantSetting.PASSWORD, "password") + ); InsertInput insertInput = new InsertInput(); insertInput.setTableName("variant"); @@ -736,7 +740,7 @@ class BaseAPIActionUtilTest extends BaseTest util.setBackendMetaData(backend); util.setupAuthorizationInRequest(httpGet); Header authHeader = httpGet.getFirstHeader("Authorization"); - assertTrue(authHeader.getValue().equals(util.getBasicAuthenticationHeader("user", "pass"))); + assertEquals(authHeader.getValue(), util.getBasicAuthenticationHeader("user", "pass")); } From 2548725be291941f6c5ab809d7d15384393640a2 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 15 Jul 2025 08:29:28 -0500 Subject: [PATCH 06/10] Fix whitespace --- .../qqq/api/actions/GenerateOpenApiSpecAction.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java index 8bd87a45..65bd7ee5 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java @@ -628,11 +628,11 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction Date: Tue, 15 Jul 2025 08:30:07 -0500 Subject: [PATCH 07/10] Add @SuppressWarnings("deprecation") for usage of metaDataFilter (as framework still supports it, despite it being deprecated, so we don't want warnings about it in here) --- .../qqq/backend/core/actions/metadata/MetaDataAction.java | 8 +++++--- .../qqq/backend/core/instances/QInstanceValidator.java | 4 +++- .../backend/core/actions/metadata/MetaDataActionTest.java | 1 + .../backend/core/instances/QInstanceValidatorTest.java | 4 +++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataAction.java index 8ecf4dcf..6d604b77 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataAction.java @@ -329,23 +329,25 @@ public class MetaDataAction if(metaDataActionCustomizerReference != null) { actionCustomizer = QCodeLoader.getAdHoc(MetaDataActionCustomizerInterface.class, metaDataActionCustomizerReference); - LOG.debug("Using new meta-data actionCustomizer of type: " + actionCustomizer.getClass().getSimpleName()); } if(actionCustomizer == null) { + ///////////////////////////////////////////////////////////////////////////////////// + // check if QInstance is still using the now-deprecated getMetaDataFilter approach // + ///////////////////////////////////////////////////////////////////////////////////// + @SuppressWarnings("deprecation") QCodeReference metaDataFilterReference = QContext.getQInstance().getMetaDataFilter(); if(metaDataFilterReference != null) { + LOG.warn("QInstance.metaDataFilter is deprecated in favor of metaDataActionCustomizer."); actionCustomizer = QCodeLoader.getAdHoc(MetaDataActionCustomizerInterface.class, metaDataFilterReference); - LOG.debug("Using new meta-data actionCustomizer (via metaDataFilter reference) of type: " + actionCustomizer.getClass().getSimpleName()); } } if(actionCustomizer == null) { actionCustomizer = new DefaultNoopMetaDataActionCustomizer(); - LOG.debug("Using new default (allow-all) meta-data actionCustomizer"); } return (actionCustomizer); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java index 8f7793ef..efeb404d 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java @@ -239,8 +239,10 @@ public class QInstanceValidator /*************************************************************************** - ** + * this method still supports the deprecated MetaDataFilter (plus its + * replacement, MetaDataActionCustomizer ***************************************************************************/ + @SuppressWarnings("deprecation") private void validateInstanceAttributes(QInstance qInstance) { if(qInstance.getMetaDataFilter() != null) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java index 4d75312d..4ddeaa46 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java @@ -470,6 +470,7 @@ class MetaDataActionTest extends BaseTest /*************************************************************************** ** ***************************************************************************/ + @SuppressWarnings("deprecation") // the point of this test is to use the deprecated thing. public static class DenyAllFilter implements MetaDataFilterInterface { /*************************************************************************** diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidatorTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidatorTest.java index d790ca59..b0c880ee 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidatorTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidatorTest.java @@ -148,8 +148,10 @@ public class QInstanceValidatorTest extends BaseTest /******************************************************************************* - ** + * the point of this method is to test the deprecated member, so, don't need to + * get a compiler warning about usage of deprecated member. *******************************************************************************/ + @SuppressWarnings("deprecation") @Test void testMetaDataFilter() { From b78519aa55c2a685ac3b3b8915dbd07172b0e625 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 15 Jul 2025 08:48:57 -0500 Subject: [PATCH 08/10] add toYamlCustomized / toJsonCustomized methods, that expose jackson's now-preferred Builder objects to be configured on instead of doing config directly on mapper objects. --- .../qqq/backend/core/utils/JsonUtils.java | 48 ++++++++++++++++++- .../qqq/backend/core/utils/YamlUtils.java | 37 +++++++++++++- .../qqq/backend/core/utils/YamlUtilsTest.java | 43 +++++++++++++++++ .../middleware/javalin/tools/PublishAPI.java | 4 +- .../javalin/tools/ValidateAPIVersions.java | 4 +- 5 files changed, 130 insertions(+), 6 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/JsonUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/JsonUtils.java index 325e842f..9255be94 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/JsonUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/JsonUtils.java @@ -37,6 +37,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -84,6 +85,7 @@ public class JsonUtils ** Internally using jackson - so jackson annotations apply! ** *******************************************************************************/ + @Deprecated(since = "since toJsonCustomized was added, which uses jackson's newer builder object for customization") public static String toJson(Object object, Consumer objectMapperCustomizer) { try @@ -105,6 +107,34 @@ public class JsonUtils + /******************************************************************************* + ** Serialize any object into a JSON String - with customizations on the Jackson + ** ObjectMapper. + ** + ** Internally using jackson - so jackson annotations apply! + ** + *******************************************************************************/ + public static String toJsonCustomized(Object object, Consumer jsonMapperCustomizer) + { + try + { + JsonMapper.Builder jsonMapperBuilder = newJsonMapperBuilder(); + if(jsonMapperCustomizer != null) + { + jsonMapperCustomizer.accept(jsonMapperBuilder); + } + String jsonResult = jsonMapperBuilder.build().writeValueAsString(object); + return (jsonResult); + } + catch(JsonProcessingException e) + { + LOG.error("Error serializing object of type [" + object.getClass().getSimpleName() + "] to json", e); + throw new IllegalArgumentException("Error in JSON Serialization", e); + } + } + + + /******************************************************************************* ** Serialize any object into a "pretty" / formatted JSON String. ** @@ -168,7 +198,6 @@ public class JsonUtils /******************************************************************************* ** De-serialize a json string into an object of the specified class - with ** customizations on the Jackson ObjectMapper. - **. ** ** Internally using jackson - so jackson annotations apply! ** @@ -242,6 +271,23 @@ public class JsonUtils + /******************************************************************************* + ** Standard private method to build jackson JsonMapperBuilder with standard features. + ** + *******************************************************************************/ + private static JsonMapper.Builder newJsonMapperBuilder() + { + JsonMapper.Builder jsonMapperBuilder = JsonMapper.builder(); + jsonMapperBuilder.addModule(new JavaTimeModule()); + jsonMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); + jsonMapperBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY); + jsonMapperBuilder.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + jsonMapperBuilder.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + + return (jsonMapperBuilder); + } + + /******************************************************************************* ** Standard private method to build jackson ObjectMapper with standard features. ** diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/YamlUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/YamlUtils.java index 23004f8d..0c0ddbd1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/YamlUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/YamlUtils.java @@ -26,9 +26,11 @@ import java.util.Map; import java.util.function.Consumer; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -62,7 +64,7 @@ public class YamlUtils *******************************************************************************/ public static String toYaml(Object object) { - return toYaml(object, null); + return toYamlCustomized(object, null); } @@ -70,6 +72,7 @@ public class YamlUtils /******************************************************************************* ** *******************************************************************************/ + @Deprecated(since = "since toYamlCustomized was added, which uses jackson's newer builder object for customization") public static String toYaml(Object object, Consumer objectMapperCustomizer) { try @@ -96,4 +99,36 @@ public class YamlUtils } } + + + /******************************************************************************* + ** + *******************************************************************************/ + public static String toYamlCustomized(Object object, Consumer yamlMapperCustomizer) + { + try + { + YAMLFactory yamlFactory = new YAMLFactory() + .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); + + YAMLMapper.Builder yamlMapperBuilder = YAMLMapper.builder(yamlFactory); + yamlMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); + yamlMapperBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY); + + if(yamlMapperCustomizer != null) + { + yamlMapperCustomizer.accept(yamlMapperBuilder); + } + + YAMLMapper yamlMapper = yamlMapperBuilder.build(); + yamlMapper.findAndRegisterModules(); + return (yamlMapper.writeValueAsString(object)); + } + catch(Exception e) + { + LOG.error("Error serializing object of type [" + object.getClass().getSimpleName() + "] to yaml", e); + throw new IllegalArgumentException("Error in YAML Serialization", e); + } + } + } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/YamlUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/YamlUtilsTest.java index 3c1c7c95..3e715cf8 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/YamlUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/YamlUtilsTest.java @@ -24,9 +24,11 @@ package com.kingsrook.qqq.backend.core.utils; import java.util.Map; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.MapperFeature; import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /******************************************************************************* @@ -60,6 +62,47 @@ class YamlUtilsTest extends BaseTest + /*************************************************************************** + * simple bean to use in customObjectMapper test + * we'd use a map, but SORT_PROPERTIES_ALPHABETICALLY doesn't apply to maps... + ***************************************************************************/ + private record SomeBean(String foo, Integer bar) {} + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testCustomObjectMapper() throws JsonProcessingException + { + SomeBean someBean = new SomeBean("Hi", 47); + + /////////////////////////////////////////////////////////////////// + // by default, the fields come out in the order they're declared // + /////////////////////////////////////////////////////////////////// + assertEquals(""" + foo: "Hi" + bar: 47 + """, YamlUtils.toYaml(someBean)); + + ///////////////////////////////////////////////////////////// + // customize the builder to sort properties alphabetically // + // (to assert that doing a customization works) // + ///////////////////////////////////////////////////////////// + String outputYaml = YamlUtils.toYamlCustomized(someBean, yamlMapperBuilder -> + { + yamlMapperBuilder.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + }); + + assertEquals(""" + bar: 47 + foo: "Hi" + """, outputYaml); + } + + + /******************************************************************************* ** *******************************************************************************/ diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/PublishAPI.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/PublishAPI.java index a411c403..b2216ba4 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/PublishAPI.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/PublishAPI.java @@ -104,7 +104,7 @@ public class PublishAPI implements Callable // subsets of it (e.g., grouped by table mostly) - then we'll write out each such file // ///////////////////////////////////////////////////////////////////////////////////////////////// OpenAPI openAPI = middlewareVersion.generateOpenAPIModel("qqq"); - String yaml = YamlUtils.toYaml(openAPI, mapper -> + String yaml = YamlUtils.toYamlCustomized(openAPI, mapperBuilder -> { if(sortFileContentsForHuman) { @@ -114,7 +114,7 @@ public class PublishAPI implements Callable } else { - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + mapperBuilder.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } }); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/ValidateAPIVersions.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/ValidateAPIVersions.java index fdc918ae..d2d83bdd 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/ValidateAPIVersions.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/tools/ValidateAPIVersions.java @@ -112,9 +112,9 @@ public class ValidateAPIVersions implements Callable // generate a new spec based on current code in codebase // /////////////////////////////////////////////////////////// OpenAPI openAPI = middlewareVersion.generateOpenAPIModel("qqq"); - String yaml = YamlUtils.toYaml(openAPI, mapper -> + String yaml = YamlUtils.toYamlCustomized(openAPI, mapperBuilder -> { - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + mapperBuilder.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); }); ///////////////////////////////////////////////////////////////////// From 928f4a25438b8c31d1ad5f7fdae88d130bd4cea7 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 15 Jul 2025 10:33:51 -0500 Subject: [PATCH 09/10] Removed assertions about logs that have been removed --- .../core/actions/metadata/MetaDataActionTest.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java index 4ddeaa46..0eb26407 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/MetaDataActionTest.java @@ -31,8 +31,6 @@ import java.util.stream.Collectors; import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.logging.QCollectingLogger; -import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataInput; import com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataOutput; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; @@ -367,8 +365,6 @@ class MetaDataActionTest extends BaseTest @Deprecated(since = "migrated to metaDataCustomizer") void testFilter() throws QException { - QCollectingLogger collectingLogger = QLogger.activateCollectingLoggerForClass(MetaDataAction.class); - ////////////////////////////////////////////////////// // run default version, and assert tables are found // ////////////////////////////////////////////////////// @@ -379,7 +375,6 @@ class MetaDataActionTest extends BaseTest // run again (with the same instance as before) to assert about memoization of the filter based on the QInstance // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// new MetaDataAction().execute(new MetaDataInput()); - assertThat(collectingLogger.getCollectedMessages()).filteredOn(clm -> clm.getMessage().contains("Using new default")).hasSize(1); ///////////////////////////////////////////////////////////// // set up new instance to use a custom filter, to deny all // @@ -398,9 +393,6 @@ class MetaDataActionTest extends BaseTest // run again (with the same instance as before) to assert about memoization of the filter based on the QInstance // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// new MetaDataAction().execute(new MetaDataInput()); - assertThat(collectingLogger.getCollectedMessages()).filteredOn(clm -> clm.getMessage().contains("actionCustomizer (via metaDataFilter reference) of type: DenyAllFilter")).hasSize(1); - - QLogger.deactivateCollectingLoggerForClass(MetaDataAction.class); //////////////////////////////////////////////////////////// // run now with the AllowAllFilter, confirm we get tables // @@ -420,8 +412,6 @@ class MetaDataActionTest extends BaseTest @Test void testCustomizer() throws QException { - QCollectingLogger collectingLogger = QLogger.activateCollectingLoggerForClass(MetaDataAction.class); - ////////////////////////////////////////////////////// // run default version, and assert tables are found // ////////////////////////////////////////////////////// @@ -432,7 +422,6 @@ class MetaDataActionTest extends BaseTest // run again (with the same instance as before) to assert about memoization of the filter based on the QInstance // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// new MetaDataAction().execute(new MetaDataInput()); - assertThat(collectingLogger.getCollectedMessages()).filteredOn(clm -> clm.getMessage().contains("Using new default")).hasSize(1); ///////////////////////////////////////////////////////////// // set up new instance to use a custom filter, to deny all // @@ -449,11 +438,9 @@ class MetaDataActionTest extends BaseTest /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // run again (with the same instance as before) to assert about memoization of the filter based on the QInstance // + // mmm, we stopped loggin about it, so, we'll... assume the memoization is good // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// new MetaDataAction().execute(new MetaDataInput()); - assertThat(collectingLogger.getCollectedMessages()).filteredOn(clm -> clm.getMessage().contains("meta-data actionCustomizer of type: DenyAllFilteringCustomizer")).hasSize(1); - - QLogger.deactivateCollectingLoggerForClass(MetaDataAction.class); ///////////////////////////////////////////////////////////////////////////////// // run now with the DefaultNoopMetaDataActionCustomizer, confirm we get tables // From ac94ca625ddc64867146600fd1f9ec0ffc14f77d Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 17 Jul 2025 11:56:05 -0500 Subject: [PATCH 10/10] Add secondary sort (QFieldMetaData::getName) to execute method, for increased stability --- .../com/kingsrook/qqq/api/actions/GetTableApiFieldsAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsAction.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsAction.java index 02c585bb..9b4305de 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsAction.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsAction.java @@ -173,7 +173,7 @@ public class GetTableApiFieldsAction extends AbstractQActionFunction