From f9af2ba983d758b7d12528fb56e739079ce7400f Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 19 Jul 2024 16:16:16 -0500 Subject: [PATCH 01/23] Remove all calls to actionInput.getInstance and getSesssion, in favor of the equivallent methods from QContext --- .../ChildInserterPostInsertCustomizer.java | 3 +- .../widgets/AbstractWidgetRenderer.java | 3 +- .../widgets/ChildRecordListRenderer.java | 9 ++-- .../widgets/ProcessWidgetRenderer.java | 3 +- .../core/actions/metadata/MetaDataAction.java | 21 +++++----- .../metadata/ProcessMetaDataAction.java | 3 +- .../actions/metadata/TableMetaDataAction.java | 5 ++- .../processes/CancelProcessAction.java | 3 +- .../processes/RunBackendStepAction.java | 3 +- .../actions/processes/RunProcessAction.java | 2 +- .../reporting/GenerateReportAction.java | 16 +++++++ .../ExcelFastexcelExportStreamer.java | 2 +- .../core/actions/tables/GetAction.java | 2 +- .../core/actions/tables/InsertAction.java | 2 +- .../core/actions/tables/QueryAction.java | 2 +- .../core/actions/tables/UpdateAction.java | 2 +- .../SearchPossibleValueSourceAction.java | 7 ++-- .../model/actions/AbstractActionInput.java | 42 ------------------- .../frontend/QFrontendTableMetaData.java | 4 +- .../bulk/delete/BulkDeleteLoadStep.java | 5 ++- .../bulk/delete/BulkDeleteTransformStep.java | 3 +- .../bulk/edit/BulkEditLoadStep.java | 5 ++- .../bulk/edit/BulkEditTransformStep.java | 5 ++- .../bulk/insert/BulkInsertExtractStep.java | 3 +- .../bulk/insert/BulkInsertTransformStep.java | 5 ++- .../etl/basic/BasicETLTransformFunction.java | 3 +- .../BaseStreamedETLStep.java | 5 ++- .../ExtractViaQueryStep.java | 5 ++- .../LoadViaInsertOrUpdateStep.java | 5 ++- .../StreamedETLPreviewStep.java | 4 +- .../reports/ExecuteReportStep.java | 3 +- .../reports/PrepareReportForRecordStep.java | 3 +- .../reports/PrepareReportStep.java | 3 +- .../StoreScriptRevisionProcessStep.java | 2 +- .../AbstractTableSyncTransformStep.java | 4 +- .../processes/utils/GeneralProcessUtils.java | 3 +- .../StandardScheduledExecutorTest.java | 2 +- .../module/api/actions/AbstractAPIAction.java | 5 ++- .../basic/BasicETLCleanupSourceFilesStep.java | 9 ++-- .../importer/FilesystemImporterStep.java | 10 ++--- .../filesystem/sync/FilesystemSyncStep.java | 13 +++--- .../rdbms/actions/RDBMSAggregateAction.java | 5 ++- .../rdbms/actions/RDBMSCountAction.java | 5 ++- .../rdbms/actions/RDBMSDeleteAction.java | 3 +- .../rdbms/actions/RDBMSQueryAction.java | 9 ++-- .../javalin/QJavalinProcessHandler.java | 3 +- 46 files changed, 135 insertions(+), 129 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java index 84363343..c445fce2 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java @@ -28,6 +28,7 @@ import java.util.Iterator; import java.util.List; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.actions.tables.UpdateAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QRuntimeException; import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; @@ -97,7 +98,7 @@ public abstract class ChildInserterPostInsertCustomizer extends AbstractPostInse List rs = records; List childrenToInsert = new ArrayList<>(); QTableMetaData table = getInsertInput().getTable(); - QTableMetaData childTable = getInsertInput().getInstance().getTable(getChildTableName()); + QTableMetaData childTable = QContext.getQInstance().getTable(getChildTableName()); //////////////////////////////////////////////////////////////////////////////// // iterate over the inserted records, building a list child records to insert // diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java index 2bb15cfc..e9cc04f8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Set; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; import com.kingsrook.qqq.backend.core.actions.values.SearchPossibleValueSourceAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria; @@ -102,7 +103,7 @@ public abstract class AbstractWidgetRenderer String possibleValueSourceName = dropdownData.getPossibleValueSourceName(); if(possibleValueSourceName != null) { - QPossibleValueSource possibleValueSource = input.getInstance().getPossibleValueSource(possibleValueSourceName); + QPossibleValueSource possibleValueSource = QContext.getQInstance().getPossibleValueSource(possibleValueSourceName); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // this looks complicated, but is just look for a label in the dropdown data and if found use it, // 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 c940b690..a44cb44f 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 @@ -34,6 +34,7 @@ import com.kingsrook.qqq.backend.core.actions.tables.CountAction; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -181,10 +182,10 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer { String widgetLabel = input.getQueryParams().get("widgetLabel"); String joinName = input.getQueryParams().get("joinName"); - QJoinMetaData join = input.getInstance().getJoin(joinName); + QJoinMetaData join = QContext.getQInstance().getJoin(joinName); String id = input.getQueryParams().get("id"); - QTableMetaData leftTable = input.getInstance().getTable(join.getLeftTable()); - QTableMetaData rightTable = input.getInstance().getTable(join.getRightTable()); + QTableMetaData leftTable = QContext.getQInstance().getTable(join.getLeftTable()); + QTableMetaData rightTable = QContext.getQInstance().getTable(join.getRightTable()); Integer maxRows = null; if(StringUtils.hasContent(input.getQueryParams().get("maxRows"))) @@ -252,7 +253,7 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer } } - String tablePath = input.getInstance().getTablePath(rightTable.getName()); + String tablePath = QContext.getQInstance().getTablePath(rightTable.getName()); String viewAllLink = tablePath == null ? null : (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), Charset.defaultCharset())); 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/ProcessWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java index bdbf8382..b9665494 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import java.util.HashMap; import com.kingsrook.qqq.backend.core.actions.ActionHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; @@ -57,7 +58,7 @@ public class ProcessWidgetRenderer extends AbstractWidgetRenderer setupDropdowns(input, widgetMetaData, data); String processName = (String) widgetMetaData.getDefaultValues().get(WIDGET_PROCESS_NAME); - QProcessMetaData processMetaData = input.getInstance().getProcess(processName); + QProcessMetaData processMetaData = QContext.getQInstance().getProcess(processName); data.setProcessMetaData(processMetaData); data.setDefaultValues(new HashMap<>(input.getQueryParams())); 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 d8bc012e..b1f6b52b 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 @@ -30,6 +30,7 @@ import java.util.Map; import com.kingsrook.qqq.backend.core.actions.ActionHelper; import com.kingsrook.qqq.backend.core.actions.permissions.PermissionCheckResult; import com.kingsrook.qqq.backend.core.actions.permissions.PermissionsHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataInput; import com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataOutput; @@ -72,7 +73,7 @@ public class MetaDataAction // map tables to frontend metadata // ///////////////////////////////////// Map tables = new LinkedHashMap<>(); - for(Map.Entry entry : metaDataInput.getInstance().getTables().entrySet()) + for(Map.Entry entry : QContext.getQInstance().getTables().entrySet()) { String tableName = entry.getKey(); QTableMetaData table = entry.getValue(); @@ -83,7 +84,7 @@ public class MetaDataAction continue; } - QBackendMetaData backendForTable = metaDataInput.getInstance().getBackendForTable(tableName); + QBackendMetaData backendForTable = QContext.getQInstance().getBackendForTable(tableName); tables.put(tableName, new QFrontendTableMetaData(metaDataInput, backendForTable, table, false, false)); treeNodes.put(tableName, new AppTreeNode(table)); } @@ -96,7 +97,7 @@ public class MetaDataAction // map processes to frontend metadata // //////////////////////////////////////// Map processes = new LinkedHashMap<>(); - for(Map.Entry entry : metaDataInput.getInstance().getProcesses().entrySet()) + for(Map.Entry entry : QContext.getQInstance().getProcesses().entrySet()) { String processName = entry.getKey(); QProcessMetaData process = entry.getValue(); @@ -116,7 +117,7 @@ public class MetaDataAction // map reports to frontend metadata // ////////////////////////////////////// Map reports = new LinkedHashMap<>(); - for(Map.Entry entry : metaDataInput.getInstance().getReports().entrySet()) + for(Map.Entry entry : QContext.getQInstance().getReports().entrySet()) { String reportName = entry.getKey(); QReportMetaData report = entry.getValue(); @@ -136,7 +137,7 @@ public class MetaDataAction // map widgets to frontend metadata // ////////////////////////////////////// Map widgets = new LinkedHashMap<>(); - for(Map.Entry entry : metaDataInput.getInstance().getWidgets().entrySet()) + for(Map.Entry entry : QContext.getQInstance().getWidgets().entrySet()) { String widgetName = entry.getKey(); QWidgetMetaDataInterface widget = entry.getValue(); @@ -154,7 +155,7 @@ public class MetaDataAction /////////////////////////////////////////////////////// // sort apps - by sortOrder (integer), then by label // /////////////////////////////////////////////////////// - List sortedApps = metaDataInput.getInstance().getApps().values().stream() + List sortedApps = QContext.getQInstance().getApps().values().stream() .sorted(Comparator.comparing((QAppMetaData a) -> a.getSortOrder()) .thenComparing((QAppMetaData a) -> a.getLabel())) .toList(); @@ -211,14 +212,14 @@ public class MetaDataAction //////////////////////////////////// // add branding metadata if found // //////////////////////////////////// - if(metaDataInput.getInstance().getBranding() != null) + if(QContext.getQInstance().getBranding() != null) { - metaDataOutput.setBranding(metaDataInput.getInstance().getBranding()); + metaDataOutput.setBranding(QContext.getQInstance().getBranding()); } - metaDataOutput.setEnvironmentValues(metaDataInput.getInstance().getEnvironmentValues()); + metaDataOutput.setEnvironmentValues(QContext.getQInstance().getEnvironmentValues()); - metaDataOutput.setHelpContents(metaDataInput.getInstance().getHelpContent()); + metaDataOutput.setHelpContents(QContext.getQInstance().getHelpContent()); // todo post-customization - can do whatever w/ the result if you want? diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataAction.java index a6419699..1044a500 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataAction.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.actions.metadata; import com.kingsrook.qqq.backend.core.actions.ActionHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException; import com.kingsrook.qqq.backend.core.model.actions.metadata.ProcessMetaDataInput; @@ -47,7 +48,7 @@ public class ProcessMetaDataAction // todo pre-customization - just get to modify the request? ProcessMetaDataOutput processMetaDataOutput = new ProcessMetaDataOutput(); - QProcessMetaData process = processMetaDataInput.getInstance().getProcess(processMetaDataInput.getProcessName()); + QProcessMetaData process = QContext.getQInstance().getProcess(processMetaDataInput.getProcessName()); if(process == null) { throw (new QNotFoundException("Process [" + processMetaDataInput.getProcessName() + "] was not found.")); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataAction.java index 46c4f243..e5b2daf4 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataAction.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.actions.metadata; import com.kingsrook.qqq.backend.core.actions.ActionHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException; import com.kingsrook.qqq.backend.core.model.actions.metadata.TableMetaDataInput; @@ -48,12 +49,12 @@ public class TableMetaDataAction // todo pre-customization - just get to modify the request? TableMetaDataOutput tableMetaDataOutput = new TableMetaDataOutput(); - QTableMetaData table = tableMetaDataInput.getInstance().getTable(tableMetaDataInput.getTableName()); + QTableMetaData table = QContext.getQInstance().getTable(tableMetaDataInput.getTableName()); if(table == null) { throw (new QNotFoundException("Table [" + tableMetaDataInput.getTableName() + "] was not found.")); } - QBackendMetaData backendForTable = tableMetaDataInput.getInstance().getBackendForTable(table.getName()); + QBackendMetaData backendForTable = QContext.getQInstance().getBackendForTable(table.getName()); tableMetaDataOutput.setTable(new QFrontendTableMetaData(tableMetaDataInput, backendForTable, table, true, true)); // todo post-customization - can do whatever w/ the result if you want diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/CancelProcessAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/CancelProcessAction.java index 1e70f88c..568b98d3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/CancelProcessAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/CancelProcessAction.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.actions.processes; import java.util.Optional; import java.util.UUID; import com.kingsrook.qqq.backend.core.actions.ActionHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QBadRequestException; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -54,7 +55,7 @@ public class CancelProcessAction extends RunProcessAction { ActionHelper.validateSession(runProcessInput); - QProcessMetaData process = runProcessInput.getInstance().getProcess(runProcessInput.getProcessName()); + QProcessMetaData process = QContext.getQInstance().getProcess(runProcessInput.getProcessName()); if(process == null) { throw new QBadRequestException("Process [" + runProcessInput.getProcessName() + "] is not defined in this instance."); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunBackendStepAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunBackendStepAction.java index 8b0d7dd3..6f97ec1a 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunBackendStepAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunBackendStepAction.java @@ -30,6 +30,7 @@ import java.util.Objects; import java.util.stream.Collectors; import com.kingsrook.qqq.backend.core.actions.ActionHelper; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -64,7 +65,7 @@ public class RunBackendStepAction { ActionHelper.validateSession(runBackendStepInput); - QProcessMetaData process = runBackendStepInput.getInstance().getProcess(runBackendStepInput.getProcessName()); + QProcessMetaData process = QContext.getQInstance().getProcess(runBackendStepInput.getProcessName()); if(process == null) { throw new QException("Process [" + runBackendStepInput.getProcessName() + "] is not defined in this instance."); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessAction.java index 8624b926..03ee26aa 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/processes/RunProcessAction.java @@ -99,7 +99,7 @@ public class RunProcessAction { ActionHelper.validateSession(runProcessInput); - QProcessMetaData process = runProcessInput.getInstance().getProcess(runProcessInput.getProcessName()); + QProcessMetaData process = QContext.getQInstance().getProcess(runProcessInput.getProcessName()); if(process == null) { throw new QException("Process [" + runProcessInput.getProcessName() + "] is not defined in this instance."); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java index a216e9e5..938ec120 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java @@ -443,7 +443,13 @@ public class GenerateReportAction extends AbstractQActionFunction>>>>>> a9eb8946 (Remove all calls to actionInput.getInstance and getSesssion, in favor of the equivallent methods from QContext) if(dataSource.getQueryInputCustomizer() != null) { @@ -800,6 +806,7 @@ public class GenerateReportAction extends AbstractQActionFunction reportViews = views.stream().filter(v -> v.getType().equals(ReportType.SUMMARY)).toList(); for(QReportView view : reportViews) { +<<<<<<< HEAD QReportDataSource dataSource = getDataSource(view.getDataSourceName()); if(dataSource == null) { @@ -808,6 +815,15 @@ public class GenerateReportAction extends AbstractQActionFunction>>>>>> a9eb8946 (Remove all calls to actionInput.getInstance and getSesssion, in favor of the equivallent methods from QContext) ExportInput exportInput = new ExportInput(); exportInput.setReportDestination(reportInput.getReportDestination()); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/fastexcel/ExcelFastexcelExportStreamer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/fastexcel/ExcelFastexcelExportStreamer.java index fd1dc915..92319cd1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/fastexcel/ExcelFastexcelExportStreamer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/fastexcel/ExcelFastexcelExportStreamer.java @@ -124,7 +124,7 @@ public class ExcelFastexcelExportStreamer implements ExportStreamerInterface if(workbook == null) { String appName = ObjectUtils.tryAndRequireNonNullElse(() -> QContext.getQInstance().getBranding().getAppName(), "QQQ"); - QInstance instance = exportInput.getInstance(); + QInstance instance = QContext.getQInstance(); if(instance != null && instance.getBranding() != null && instance.getBranding().getCompanyName() != null) { appName = instance.getBranding().getCompanyName(); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java index 7fc8bec8..24c6e983 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java @@ -352,7 +352,7 @@ public class GetAction { if(qPossibleValueTranslator == null) { - qPossibleValueTranslator = new QPossibleValueTranslator(getInput.getInstance(), getInput.getSession()); + qPossibleValueTranslator = new QPossibleValueTranslator(QContext.getQInstance(), QContext.getQSession()); } qPossibleValueTranslator.translatePossibleValuesInRecords(getInput.getTable(), List.of(returnRecord)); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java index 9773d3f0..6ece199a 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java @@ -241,7 +241,7 @@ public class InsertAction extends AbstractQActionFunction outputRecordMap = runBackendStepOutput.getRecords().stream().collect(Collectors.toMap(r -> r.getValue(primaryKeyFieldName), r -> r, (a, b) -> a)); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTransformStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTransformStep.java index c0357f66..747877d9 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTransformStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTransformStep.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import com.kingsrook.qqq.backend.core.actions.tables.DeleteAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLine; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLineInterface; @@ -65,7 +66,7 @@ public class BulkDeleteTransformStep extends AbstractTransformStep /////////////////////////////////////////////////////// // capture the table label - for the process summary // /////////////////////////////////////////////////////// - QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName()); + QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getTableName()); if(table != null) { tableLabel = table.getLabel(); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditLoadStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditLoadStep.java index e35181eb..72eaa3fb 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditLoadStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditLoadStep.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.processes.implementations.bulk.edit; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLine; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLineInterface; @@ -99,7 +100,7 @@ public class BulkEditLoadStep extends LoadViaUpdateStep implements ProcessSummar { super.preRun(runBackendStepInput, runBackendStepOutput); - QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName()); + QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getTableName()); if(table != null) { tableLabel = table.getLabel(); @@ -124,7 +125,7 @@ public class BulkEditLoadStep extends LoadViaUpdateStep implements ProcessSummar //////////////////////////////////////////////////////// // roll up results based on output from update action // //////////////////////////////////////////////////////// - QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName()); + QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getTableName()); for(QRecord record : runBackendStepOutput.getRecords()) { Serializable recordPrimaryKey = record.getValue(table.getPrimaryKeyField()); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTransformStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTransformStep.java index 624d6a04..10d10bf1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTransformStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTransformStep.java @@ -31,6 +31,7 @@ import java.util.Optional; import com.kingsrook.qqq.backend.core.actions.tables.UpdateAction; import com.kingsrook.qqq.backend.core.actions.values.QPossibleValueTranslator; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLine; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLineInterface; @@ -81,7 +82,7 @@ public class BulkEditTransformStep extends AbstractTransformStep /////////////////////////////////////////////////////// // capture the table label - for the process summary // /////////////////////////////////////////////////////// - table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName()); + table = QContext.getQInstance().getTable(runBackendStepInput.getTableName()); if(table != null) { tableLabel = table.getLabel(); @@ -230,7 +231,7 @@ public class BulkEditTransformStep extends AbstractTransformStep if(field.getPossibleValueSourceName() != null) { - QPossibleValueTranslator qPossibleValueTranslator = new QPossibleValueTranslator(runBackendStepInput.getInstance(), runBackendStepInput.getSession()); + QPossibleValueTranslator qPossibleValueTranslator = new QPossibleValueTranslator(QContext.getQInstance(), QContext.getQSession()); String translatedValue = qPossibleValueTranslator.translatePossibleValue(field, value); if(StringUtils.hasContent(translatedValue)) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertExtractStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertExtractStep.java index 3a83c955..c29d1648 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertExtractStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertExtractStep.java @@ -27,6 +27,7 @@ import java.util.Locale; import java.util.Map; import java.util.Optional; import com.kingsrook.qqq.backend.core.adapters.CsvToQRecordAdapter; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.model.actions.processes.QUploadedFile; @@ -83,7 +84,7 @@ public class BulkInsertExtractStep extends AbstractExtractStep .withLimit(getLimit()) .withCsv(new String(bytes)) .withDoCorrectValueTypes(true) - .withTable(runBackendStepInput.getInstance().getTable(tableName)) + .withTable(QContext.getQInstance().getTable(tableName)) .withMapping(mapping) .withRecordCustomizer((record) -> { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStep.java index 2546df14..f4eff9a3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStep.java @@ -38,6 +38,7 @@ import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizerInterfa import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizers; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.actions.tables.helpers.UniqueKeyHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLine; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessSummaryLineInterface; @@ -104,7 +105,7 @@ public class BulkInsertTransformStep extends AbstractTransformStep @Override public void preRun(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { - this.table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName()); + this.table = QContext.getQInstance().getTable(runBackendStepInput.getTableName()); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // since we're doing a unique key check in this class, we can tell the loadViaInsert step that it (rather, the InsertAction) doesn't need to re-do one. // @@ -121,7 +122,7 @@ public class BulkInsertTransformStep extends AbstractTransformStep public void runOnePage(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { int rowsInThisPage = runBackendStepInput.getRecords().size(); - QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName()); + QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getTableName()); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // set up an insert-input, which will be used as input to the pre-customizer as well as for additional validations // diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunction.java index 07df9c24..d077488c 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunction.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.adapters.JsonToQFieldMappingAdapter; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -85,7 +86,7 @@ public class BasicETLTransformFunction implements BackendStep throw (new QException("Mapping was not a Key-based mapping type. Was a : " + mapping.getClass().getName())); } - QTableMetaData table = runBackendStepInput.getInstance().getTable(tableName); + QTableMetaData table = QContext.getQInstance().getTable(tableName); List mappedRecords = applyMapping(runBackendStepInput.getRecords(), table, keyBasedFieldMapping); ////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/BaseStreamedETLStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/BaseStreamedETLStep.java index 51dd30fe..728d78f3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/BaseStreamedETLStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/BaseStreamedETLStep.java @@ -27,6 +27,7 @@ import java.util.List; import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader; import com.kingsrook.qqq.backend.core.actions.values.QPossibleValueTranslator; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; @@ -85,14 +86,14 @@ public class BaseStreamedETLStep protected void updateRecordsWithDisplayValuesAndPossibleValues(RunBackendStepInput input, List list) { String destinationTable = input.getValueString(StreamedETLWithFrontendProcess.FIELD_DESTINATION_TABLE); - QTableMetaData table = input.getInstance().getTable(destinationTable); + QTableMetaData table = QContext.getQInstance().getTable(destinationTable); if(table != null && list != null) { QValueFormatter qValueFormatter = new QValueFormatter(); qValueFormatter.setDisplayValuesInRecords(table, list); - QPossibleValueTranslator qPossibleValueTranslator = new QPossibleValueTranslator(input.getInstance(), input.getSession()); + QPossibleValueTranslator qPossibleValueTranslator = new QPossibleValueTranslator(QContext.getQInstance(), QContext.getQSession()); qPossibleValueTranslator.translatePossibleValuesInRecords(table, list); } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/ExtractViaQueryStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/ExtractViaQueryStep.java index 777d3f72..7269b75d 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/ExtractViaQueryStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/ExtractViaQueryStep.java @@ -34,6 +34,7 @@ import com.kingsrook.qqq.backend.core.actions.reporting.DistinctFilteringRecordP import com.kingsrook.qqq.backend.core.actions.reporting.RecordPipe; import com.kingsrook.qqq.backend.core.actions.tables.CountAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -267,7 +268,7 @@ public class ExtractViaQueryStep extends AbstractExtractStep ////////////////////////////////////////////////////////////////////// // else, check for recordIds from a frontend launching of a process // ////////////////////////////////////////////////////////////////////// - QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FIELD_SOURCE_TABLE)); + QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FIELD_SOURCE_TABLE)); if(table == null) { throw (new QException("source table name was not set - could not load records by id")); @@ -319,7 +320,7 @@ public class ExtractViaQueryStep extends AbstractExtractStep if(needDistinctPipe) { String sourceTableName = runBackendStepInput.getValueString(StreamedETLWithFrontendProcess.FIELD_SOURCE_TABLE); - QTableMetaData sourceTable = runBackendStepInput.getInstance().getTable(sourceTableName); + QTableMetaData sourceTable = QContext.getQInstance().getTable(sourceTableName); return (new DistinctFilteringRecordPipe(new UniqueKey(sourceTable.getPrimaryKeyField()), overrideCapacity)); } else diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStep.java index 7244c07a..fbe4d694 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStep.java @@ -28,6 +28,7 @@ import java.util.Optional; import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.actions.tables.UpdateAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; @@ -86,7 +87,7 @@ public class LoadViaInsertOrUpdateStep extends AbstractLoadStep *******************************************************************************/ public void insertAndUpdateRecords(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { - QTableMetaData tableMetaData = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FIELD_DESTINATION_TABLE)); + QTableMetaData tableMetaData = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FIELD_DESTINATION_TABLE)); if(CollectionUtils.nullSafeHasContents(recordsToInsert)) { @@ -139,7 +140,7 @@ public class LoadViaInsertOrUpdateStep extends AbstractLoadStep *******************************************************************************/ protected void evaluateRecords(RunBackendStepInput runBackendStepInput) throws QException { - QTableMetaData tableMetaData = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FIELD_DESTINATION_TABLE)); + QTableMetaData tableMetaData = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FIELD_DESTINATION_TABLE)); recordsToInsert = new ArrayList<>(); recordsToUpdate = new ArrayList<>(); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLPreviewStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLPreviewStep.java index 04308698..1111a705 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLPreviewStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLPreviewStep.java @@ -162,10 +162,10 @@ public class StreamedETLPreviewStep extends BaseStreamedETLStep implements Backe private void countRecords(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput, AbstractExtractStep extractStep) throws QException { String sourceTableName = runBackendStepInput.getValueString(StreamedETLWithFrontendProcess.FIELD_SOURCE_TABLE); - QTableMetaData sourceTable = runBackendStepInput.getInstance().getTable(sourceTableName); + QTableMetaData sourceTable = QContext.getQInstance().getTable(sourceTableName); if(StringUtils.hasContent(sourceTableName)) { - QBackendMetaData sourceTableBackend = runBackendStepInput.getInstance().getBackendForTable(sourceTableName); + QBackendMetaData sourceTableBackend = QContext.getQInstance().getBackendForTable(sourceTableName); if(sourceTable.isCapabilityEnabled(sourceTableBackend, Capability.TABLE_COUNT)) { Integer recordCount = extractStep.doCount(runBackendStepInput); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/ExecuteReportStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/ExecuteReportStep.java index fdfa381c..57a87470 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/ExecuteReportStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/ExecuteReportStep.java @@ -31,6 +31,7 @@ import java.time.format.DateTimeFormatter; import java.util.Map; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.actions.reporting.GenerateReportAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; @@ -58,7 +59,7 @@ public class ExecuteReportStep implements BackendStep try { String reportName = runBackendStepInput.getValueString("reportName"); - QReportMetaData report = runBackendStepInput.getInstance().getReport(reportName); + QReportMetaData report = QContext.getQInstance().getReport(reportName); File tmpFile = File.createTempFile(reportName, ".xlsx", new File("/tmp/")); runBackendStepInput.getAsyncJobCallback().updateStatus("Generating Report"); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java index d97bc159..7b550ada 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java @@ -26,6 +26,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -106,7 +107,7 @@ public class PrepareReportForRecordStep extends PrepareReportStep } String reportName = runBackendStepInput.getValueString("reportName"); - QReportMetaData report = runBackendStepInput.getInstance().getReport(reportName); + QReportMetaData report = QContext.getQInstance().getReport(reportName); // runBackendStepOutput.addValue("downloadFileBaseName", runBackendStepInput.getTable().getLabel() + " " + record.getRecordLabel()); runBackendStepOutput.addValue("downloadFileBaseName", report.getLabel() + " - " + record.getRecordLabel()); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportStep.java index 47c056b4..c78bf3fd 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportStep.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.processes.implementations.reports; import java.util.ArrayList; import java.util.List; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; @@ -56,7 +57,7 @@ public class PrepareReportStep implements BackendStep throw (new QException("Process value [reportName] was not given.")); } - QReportMetaData report = runBackendStepInput.getInstance().getReport(reportName); + QReportMetaData report = QContext.getQInstance().getReport(reportName); if(report == null) { throw (new QException("Process named [" + reportName + "] was not found in this instance.")); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStep.java index 70129eec..96a2e43f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStep.java @@ -145,7 +145,7 @@ public class StoreScriptRevisionProcessStep implements BackendStep try { - scriptRevision.setValue("author", input.getSession().getUser().getFullName()); + scriptRevision.setValue("author", QContext.getQSession().getUser().getFullName()); } catch(Exception e) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/AbstractTableSyncTransformStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/AbstractTableSyncTransformStep.java index 37652098..68619a28 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/AbstractTableSyncTransformStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/AbstractTableSyncTransformStep.java @@ -365,10 +365,10 @@ public abstract class AbstractTableSyncTransformStep extends AbstractTransformSt { if(possibleValueTranslator == null) { - possibleValueTranslator = new QPossibleValueTranslator(runBackendStepInput.getInstance(), runBackendStepInput.getSession()); + possibleValueTranslator = new QPossibleValueTranslator(QContext.getQInstance(), QContext.getQSession()); } - possibleValueTranslator.translatePossibleValuesInRecords(runBackendStepInput.getInstance().getTable(destinationTableName), runBackendStepOutput.getRecords()); + possibleValueTranslator.translatePossibleValuesInRecords(QContext.getQInstance().getTable(destinationTableName), runBackendStepOutput.getRecords()); } } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java index a3e81f44..cba7ac24 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtils.java @@ -32,6 +32,7 @@ import java.util.function.Consumer; import com.kingsrook.qqq.backend.core.actions.tables.CountAction; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -515,7 +516,7 @@ public class GeneralProcessUtils *******************************************************************************/ public static Integer validateSingleSelectedId(RunBackendStepInput runBackendStepInput, String tableName) throws QException { - String tableLabel = runBackendStepInput.getInstance().getTable(tableName).getLabel(); + String tableLabel = QContext.getQInstance().getTable(tableName).getLabel(); //////////////////////////////////////////////////// // Get the selected recordId and verify we only 1 // diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/automation/polling/StandardScheduledExecutorTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/automation/polling/StandardScheduledExecutorTest.java index e08b4ac1..84ed8ae9 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/automation/polling/StandardScheduledExecutorTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/automation/polling/StandardScheduledExecutorTest.java @@ -174,7 +174,7 @@ class StandardScheduledExecutorTest extends BaseTest @Override public void execute(RecordAutomationInput recordAutomationInput) throws QException { - sessionId = recordAutomationInput.getSession().getIdReference(); + sessionId = QContext.getQSession().getIdReference(); } } diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java index 284a71f1..8425fbfb 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.api.actions; import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.session.QSession; @@ -45,9 +46,9 @@ public abstract class AbstractAPIAction *******************************************************************************/ public void preAction(AbstractTableActionInput actionInput) { - QBackendMetaData baseBackendMetaData = actionInput.getInstance().getBackendForTable(actionInput.getTableName()); + QBackendMetaData baseBackendMetaData = QContext.getQInstance().getBackendForTable(actionInput.getTableName()); this.backendMetaData = (APIBackendMetaData) baseBackendMetaData; - this.session = actionInput.getSession(); + this.session = QContext.getQSession(); if(backendMetaData.getActionUtil() != null) { diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java index c047d8bb..0762dd75 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.module.filesystem.processes.implementations.et import java.io.File; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -68,8 +69,8 @@ public class BasicETLCleanupSourceFilesStep implements BackendStep public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { String sourceTableName = runBackendStepInput.getValueString(BasicETLProcess.FIELD_SOURCE_TABLE); - QTableMetaData table = runBackendStepInput.getInstance().getTable(sourceTableName); - QBackendMetaData backend = runBackendStepInput.getInstance().getBackendForTable(sourceTableName); + QTableMetaData table = QContext.getQInstance().getTable(sourceTableName); + QBackendMetaData backend = QContext.getQInstance().getBackendForTable(sourceTableName); QBackendModuleInterface module = new QBackendModuleDispatcher().getQBackendModule(backend); if(!(module instanceof FilesystemBackendModuleInterface filesystemModule)) @@ -93,7 +94,7 @@ public class BasicETLCleanupSourceFilesStep implements BackendStep if(VALUE_DELETE.equals(moveOrDelete)) { LOG.info("Deleting ETL source file: " + sourceFile); - actionBase.deleteFile(runBackendStepInput.getInstance(), table, sourceFile); + actionBase.deleteFile(QContext.getQInstance(), table, sourceFile); } else if(VALUE_MOVE.equals(moveOrDelete)) { @@ -105,7 +106,7 @@ public class BasicETLCleanupSourceFilesStep implements BackendStep } String filePathWithoutBase = actionBase.stripBackendAndTableBasePathsFromFileName(sourceFile, backend, table); String destinationPath = destinationForMoves + File.separator + filePathWithoutBase; - actionBase.moveFile(runBackendStepInput.getInstance(), table, sourceFile, destinationPath); + actionBase.moveFile(QContext.getQInstance(), table, sourceFile, destinationPath); } else { diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterStep.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterStep.java index a57f9c1e..43867e99 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterStep.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/importer/FilesystemImporterStep.java @@ -127,8 +127,8 @@ public class FilesystemImporterStep implements BackendStep Boolean updateFileIfNameExists = runBackendStepInput.getValueBoolean(FIELD_UPDATE_FILE_IF_NAME_EXISTS); Boolean archiveFileEnabled = runBackendStepInput.getValueBoolean(FIELD_ARCHIVE_FILE_ENABLED); - QTableMetaData sourceTable = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FIELD_SOURCE_TABLE)); - QTableMetaData importFileTable = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FIELD_IMPORT_FILE_TABLE)); + QTableMetaData sourceTable = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FIELD_SOURCE_TABLE)); + QTableMetaData importFileTable = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FIELD_IMPORT_FILE_TABLE)); String missingFieldErrorPrefix = "Process " + runBackendStepInput.getProcessName() + " was misconfigured - missing value in field: "; Objects.requireNonNull(fileFormat, missingFieldErrorPrefix + FIELD_FILE_FORMAT); @@ -137,7 +137,7 @@ public class FilesystemImporterStep implements BackendStep // list files in the backend system // // todo - can we do this using query action, with this being a "ONE" type table? // /////////////////////////////////////////////////////////////////////////////////// - QBackendMetaData sourceBackend = runBackendStepInput.getInstance().getBackendForTable(sourceTable.getName()); + QBackendMetaData sourceBackend = QContext.getQInstance().getBackendForTable(sourceTable.getName()); FilesystemBackendModuleInterface sourceModule = (FilesystemBackendModuleInterface) new QBackendModuleDispatcher().getQBackendModule(sourceBackend); AbstractBaseFilesystemAction sourceActionBase = sourceModule.getActionBase(); sourceActionBase.preAction(sourceBackend); @@ -340,7 +340,7 @@ public class FilesystemImporterStep implements BackendStep QTableMetaData archiveTable; try { - archiveTable = runBackendStepInput.getInstance().getTable(archiveTableName); + archiveTable = QContext.getQInstance().getTable(archiveTableName); } catch(Exception e) { @@ -349,7 +349,7 @@ public class FilesystemImporterStep implements BackendStep String archivePath = Objects.requireNonNullElse(runBackendStepInput.getValueString(FIELD_ARCHIVE_PATH), ""); - QBackendMetaData archiveBackend = runBackendStepInput.getInstance().getBackendForTable(archiveTable.getName()); + QBackendMetaData archiveBackend = QContext.getQInstance().getBackendForTable(archiveTable.getName()); FilesystemBackendModuleInterface archiveModule = (FilesystemBackendModuleInterface) new QBackendModuleDispatcher().getQBackendModule(archiveBackend); AbstractBaseFilesystemAction archiveActionBase = archiveModule.getActionBase(); archiveActionBase.preAction(archiveBackend); diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncStep.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncStep.java index 2796a37e..80c93181 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncStep.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncStep.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -74,23 +75,23 @@ public class FilesystemSyncStep implements BackendStep *******************************************************************************/ private void doRun(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { - QTableMetaData sourceTable = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FilesystemSyncProcess.FIELD_SOURCE_TABLE)); - QTableMetaData archiveTable = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FilesystemSyncProcess.FIELD_ARCHIVE_TABLE)); - QTableMetaData processingTable = runBackendStepInput.getInstance().getTable(runBackendStepInput.getValueString(FilesystemSyncProcess.FIELD_PROCESSING_TABLE)); + QTableMetaData sourceTable = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FilesystemSyncProcess.FIELD_SOURCE_TABLE)); + QTableMetaData archiveTable = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FilesystemSyncProcess.FIELD_ARCHIVE_TABLE)); + QTableMetaData processingTable = QContext.getQInstance().getTable(runBackendStepInput.getValueString(FilesystemSyncProcess.FIELD_PROCESSING_TABLE)); - QBackendMetaData sourceBackend = runBackendStepInput.getInstance().getBackendForTable(sourceTable.getName()); + QBackendMetaData sourceBackend = QContext.getQInstance().getBackendForTable(sourceTable.getName()); FilesystemBackendModuleInterface sourceModule = (FilesystemBackendModuleInterface) new QBackendModuleDispatcher().getQBackendModule(sourceBackend); AbstractBaseFilesystemAction sourceActionBase = sourceModule.getActionBase(); sourceActionBase.preAction(sourceBackend); Map sourceFiles = getFileNames(sourceActionBase, sourceTable, sourceBackend); - QBackendMetaData archiveBackend = runBackendStepInput.getInstance().getBackendForTable(archiveTable.getName()); + QBackendMetaData archiveBackend = QContext.getQInstance().getBackendForTable(archiveTable.getName()); FilesystemBackendModuleInterface archiveModule = (FilesystemBackendModuleInterface) new QBackendModuleDispatcher().getQBackendModule(archiveBackend); AbstractBaseFilesystemAction archiveActionBase = archiveModule.getActionBase(); archiveActionBase.preAction(archiveBackend); Set archiveFiles = getFileNames(archiveActionBase, archiveTable, archiveBackend).keySet(); - QBackendMetaData processingBackend = runBackendStepInput.getInstance().getBackendForTable(processingTable.getName()); + QBackendMetaData processingBackend = QContext.getQInstance().getBackendForTable(processingTable.getName()); FilesystemBackendModuleInterface processingModule = (FilesystemBackendModuleInterface) new QBackendModuleDispatcher().getQBackendModule(processingBackend); AbstractBaseFilesystemAction processingActionBase = processingModule.getActionBase(); processingActionBase.preAction(processingBackend); diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java index b174373b..6549a3e2 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; import com.kingsrook.qqq.backend.core.actions.interfaces.AggregateInterface; import com.kingsrook.qqq.backend.core.actions.tables.helpers.ActionTimeoutHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -70,11 +71,11 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega QTableMetaData table = aggregateInput.getTable(); QQueryFilter filter = clonedOrNewFilter(aggregateInput.getFilter()); - JoinsContext joinsContext = new JoinsContext(aggregateInput.getInstance(), table.getName(), aggregateInput.getQueryJoins(), filter); + JoinsContext joinsContext = new JoinsContext(QContext.getQInstance(), table.getName(), aggregateInput.getQueryJoins(), filter); List params = new ArrayList<>(); - String fromClause = makeFromClause(aggregateInput.getInstance(), table.getName(), joinsContext, params); + String fromClause = makeFromClause(QContext.getQInstance(), table.getName(), joinsContext, params); List selectClauses = buildSelectClauses(aggregateInput, joinsContext); String sql = "SELECT " + StringUtils.join(", ", selectClauses) diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java index a24890f1..953fbdaa 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; import com.kingsrook.qqq.backend.core.actions.interfaces.CountInterface; import com.kingsrook.qqq.backend.core.actions.tables.helpers.ActionTimeoutHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.logging.QLogger; @@ -63,7 +64,7 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf QTableMetaData table = countInput.getTable(); QQueryFilter filter = clonedOrNewFilter(countInput.getFilter()); - JoinsContext joinsContext = new JoinsContext(countInput.getInstance(), countInput.getTableName(), countInput.getQueryJoins(), filter); + JoinsContext joinsContext = new JoinsContext(QContext.getQInstance(), countInput.getTableName(), countInput.getQueryJoins(), filter); JoinsContext.FieldAndTableNameOrAlias fieldAndTableNameOrAlias = joinsContext.getFieldAndTableNameOrAlias(table.getPrimaryKeyField()); boolean requiresDistinct = doesSelectClauseRequireDistinct(table); @@ -77,7 +78,7 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf List params = new ArrayList<>(); String sql = clausePrefix + " AS record_count " - + " FROM " + makeFromClause(countInput.getInstance(), table.getName(), joinsContext, params) + + " FROM " + makeFromClause(QContext.getQInstance(), table.getName(), joinsContext, params) + " WHERE " + makeWhereClause(joinsContext, filter, params); // todo sql customization - can edit sql and/or param list diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java index 5d4cddf8..9869435d 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteAction.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.stream.Collectors; import com.kingsrook.qqq.backend.core.actions.interfaces.DeleteInterface; import com.kingsrook.qqq.backend.core.actions.tables.DeleteAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteInput; @@ -273,7 +274,7 @@ public class RDBMSDeleteAction extends AbstractRDBMSAction implements DeleteInte QTableMetaData table = deleteInput.getTable(); String tableName = getTableName(table); - JoinsContext joinsContext = new JoinsContext(deleteInput.getInstance(), table.getName(), new ArrayList<>(), deleteInput.getQueryFilter()); + JoinsContext joinsContext = new JoinsContext(QContext.getQInstance(), table.getName(), new ArrayList<>(), deleteInput.getQueryFilter()); String whereClause = makeWhereClause(joinsContext, filter, params); // todo sql customization - can edit sql and/or param list? diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java index 5b687cd7..ca3d5591 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java @@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import com.kingsrook.qqq.backend.core.actions.interfaces.QueryInterface; import com.kingsrook.qqq.backend.core.actions.tables.helpers.ActionTimeoutHelper; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.instances.QMetaDataVariableInterpreter; @@ -95,10 +96,10 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf StringBuilder sql = new StringBuilder(makeSelectClause(queryInput)); QQueryFilter filter = clonedOrNewFilter(queryInput.getFilter()); - JoinsContext joinsContext = new JoinsContext(queryInput.getInstance(), tableName, queryInput.getQueryJoins(), filter); + JoinsContext joinsContext = new JoinsContext(QContext.getQInstance(), tableName, queryInput.getQueryJoins(), filter); List params = new ArrayList<>(); - sql.append(" FROM ").append(makeFromClause(queryInput.getInstance(), tableName, joinsContext, params)); + sql.append(" FROM ").append(makeFromClause(QContext.getQInstance(), tableName, joinsContext, params)); sql.append(" WHERE ").append(makeWhereClause(joinsContext, filter, params)); if(filter != null && CollectionUtils.nullSafeHasContents(filter.getOrderBys())) @@ -141,7 +142,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf { if(queryJoin.getSelect()) { - QTableMetaData joinTable = queryInput.getInstance().getTable(queryJoin.getJoinTable()); + QTableMetaData joinTable = QContext.getQInstance().getTable(queryJoin.getJoinTable()); String tableNameOrAlias = queryJoin.getJoinTableOrItsAlias(); for(QFieldMetaData joinField : joinTable.getFields().values()) { @@ -289,7 +290,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf *******************************************************************************/ private String makeSelectClause(QueryInput queryInput) throws QException { - QInstance instance = queryInput.getInstance(); + QInstance instance = QContext.getQInstance(); String tableName = queryInput.getTableName(); List queryJoins = queryInput.getQueryJoins(); QTableMetaData table = instance.getTable(tableName); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java index 5faa8c08..48dfef38 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java @@ -52,6 +52,7 @@ import com.kingsrook.qqq.backend.core.actions.reporting.GenerateReportAction; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.actions.tables.StorageAction; import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QBadRequestException; import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException; import com.kingsrook.qqq.backend.core.exceptions.QPermissionDeniedException; @@ -590,7 +591,7 @@ public class QJavalinProcessHandler *******************************************************************************/ private static QQueryFilter buildProcessInitRecordsFilter(Context context, RunProcessInput runProcessInput) throws IOException { - QInstance instance = runProcessInput.getInstance(); + QInstance instance = QContext.getQInstance(); QProcessMetaData process = instance.getProcess(runProcessInput.getProcessName()); QTableMetaData table = instance.getTable(process.getTableName()); From 912e40fe0b25a56d1d0e9e72571da1885ba1c446 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 19 Jul 2024 12:38:02 -0500 Subject: [PATCH 02/23] Eliminated all warnings. --- pom.xml | 3 +-- .../widgets/ChildRecordListRenderer.java | 4 +++- .../excel/poi/StreamedSheetWriter.java | 2 +- .../scripts/RecordScriptTestInterface.java | 3 ++- .../scripts/RunAdHocRecordScriptAction.java | 5 +++-- .../core/actions/values/QValueFormatter.java | 1 + .../SearchPossibleValueSourceAction.java | 1 + .../core/instances/QInstanceValidator.java | 7 +++--- .../core/instances/SecretsManagerUtils.java | 3 ++- .../expressions/AbstractFilterExpression.java | 5 ++++- .../QFilterCriteriaDeserializer.java | 9 ++++---- .../blocks/AbstractBlockWidgetData.java | 13 +++++++++++ .../core/model/data/QRecordEntity.java | 3 +++ .../model/metadata/fields/FieldAdornment.java | 3 ++- .../model/metadata/tables/QTableMetaData.java | 2 +- .../memory/MemoryRecordStore.java | 7 +++++- .../MergeDuplicatesLoadStep.java | 9 ++++++-- .../reports/PrepareReportForRecordStep.java | 5 +++-- .../scripts/TestScriptProcessStep.java | 2 +- .../scheduler/quartz/QuartzJobRunner.java | 4 +++- .../runner/SchedulableProcessRunner.java | 4 +++- .../core/state/TempFileStateProvider.java | 5 +++-- .../backend/core/utils/CollectionUtils.java | 22 +++++++++++-------- .../qqq/backend/core/utils/ObjectUtils.java | 1 + .../qqq/backend/core/utils/ValueUtils.java | 1 + .../qqq/backend/core/utils/YamlUtils.java | 6 ++++- .../collections/AlphaNumericComparator.java | 4 ++-- .../collections/MultiLevelMapHelper.java | 4 +++- .../widgets/ChildRecordListRendererTest.java | 6 ++--- .../widgets/ParentWidgetRendererTest.java | 6 ++--- .../widgets/ProcessWidgetRendererTest.java | 6 ++--- .../dashboard/widgets/USMapRendererTest.java | 6 ++--- .../actions/reporting/ExportActionTest.java | 4 ++-- .../reporting/GenerateReportActionTest.java | 2 +- .../RunAdHocRecordScriptActionTest.java | 4 ++-- .../RunAssociatedScriptActionTest.java | 4 ++-- .../StoreAssociatedScriptActionTest.java | 4 ++-- .../helpers/GetActionCacheHelperTest.java | 2 +- .../helpers/QueryActionCacheHelperTest.java | 2 +- .../values/QPossibleValueTranslatorTest.java | 4 ++-- .../core/adapters/QInstanceAdapterTest.java | 5 +++-- .../TableBasedAuthenticationModuleTest.java | 4 ++-- .../bulk/delete/BulkDeleteTest.java | 2 +- .../bulk/edit/BulkEditTest.java | 2 +- .../insert/BulkInsertTransformStepTest.java | 4 ++-- .../LoadViaInsertOrUpdateStepTest.java | 2 +- .../StreamedETLWithFrontendProcessTest.java | 1 + .../MergeDuplicatesProcessTest.java | 4 ++-- .../savedviews/SavedViewProcessTests.java | 1 + .../LoadScriptTestDetailsProcessStepTest.java | 1 + .../scripts/RunRecordScriptTest.java | 10 +++++---- .../StoreScriptRevisionProcessStepTest.java | 4 ++-- .../sharing/GetSharedRecordsProcessTest.java | 1 + .../tablesync/TableSyncProcessTest.java | 4 ++-- .../utils/GeneralProcessUtilsTest.java | 20 ++++++++--------- .../core/utils/CollectionUtilsTest.java | 1 + .../backend/core/utils/ObjectUtilsTest.java | 4 ++-- .../qqq/backend/core/utils/TestUtils.java | 11 ---------- .../backend/core/utils/ValueUtilsTest.java | 13 ++++++++--- .../module/api/actions/BaseAPIActionUtil.java | 2 +- .../module/api/mocks/MockApiUtilsHelper.java | 3 ++- .../module/api/mocks/MockHttpResponse.java | 2 ++ .../actions/AbstractBaseFilesystemAction.java | 5 +++-- .../basic/BasicETLCleanupSourceFilesStep.java | 4 ++-- .../sync/FilesystemSyncProcess.java | 8 +++---- .../local/actions/FilesystemActionTest.java | 15 +++++++------ .../actions/FilesystemInsertActionTest.java | 3 ++- .../BasicETLCleanupSourceFilesStepTest.java | 3 ++- .../sync/FilesystemSyncProcessTest.java | 3 ++- .../s3/actions/S3InsertActionTest.java | 7 +++--- .../filesystem/s3/utils/S3UtilsTest.java | 3 ++- .../qqq/backend/module/rdbms/TestUtils.java | 3 ++- .../rdbms/actions/RDBMSQueryActionTest.java | 1 + .../module/rdbms/jdbc/QueryManagerTest.java | 7 +++++- .../qqq/api/actions/ApiImplementation.java | 4 ++-- ...SavedReportProcessApiMetaDataEnricher.java | 4 +++- .../ApiProcessSummaryListOutput.java | 5 ++++- .../api/actions/ApiImplementationTest.java | 4 +++- .../qqq/api/utils/ApiScriptUtilsTest.java | 3 +++ .../backend/javalin/QJavalinAccessLogger.java | 2 ++ .../javalin/QJavalinImplementation.java | 6 +++-- .../qqq/backend/javalin/TestUtils.java | 11 +++++----- .../picocli/QPicoCliImplementation.java | 7 +++--- .../picocli/QPicoCliImplementationTest.java | 13 +++++------ .../qqq/frontend/picocli/TestUtils.java | 5 +++-- .../qqq/slack/QSlackImplementation.java | 2 +- .../sampleapp/SampleMetaDataProviderTest.java | 6 ++--- 87 files changed, 257 insertions(+), 166 deletions(-) diff --git a/pom.xml b/pom.xml index 95ac1378..d9569d85 100644 --- a/pom.xml +++ b/pom.xml @@ -50,8 +50,7 @@ UTF-8 UTF-8 - 17 - 17 + 17 true true true 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 a44cb44f..af63d1ac 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 @@ -279,7 +279,9 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer Map widgetValues = input.getWidgetMetaData().getDefaultValues(); if(widgetValues.containsKey("disabledFieldsForNewChildRecords")) { - widgetData.setDisabledFieldsForNewChildRecords((Set) widgetValues.get("disabledFieldsForNewChildRecords")); + @SuppressWarnings("unchecked") + Set disabledFieldsForNewChildRecords = (Set) widgetValues.get("disabledFieldsForNewChildRecords"); + widgetData.setDisabledFieldsForNewChildRecords(disabledFieldsForNewChildRecords); } else { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/StreamedSheetWriter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/StreamedSheetWriter.java index 850a1ecc..903a9d63 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/StreamedSheetWriter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/StreamedSheetWriter.java @@ -161,7 +161,7 @@ public class StreamedSheetWriter } } - Map m = new HashMap(); + Map m = new HashMap<>(); m.computeIfAbsent("s", (s) -> 3); value = rs.toString(); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RecordScriptTestInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RecordScriptTestInterface.java index 8e54da49..70391e66 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RecordScriptTestInterface.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RecordScriptTestInterface.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.actions.scripts; import java.io.Serializable; +import java.util.Arrays; import java.util.Collections; import java.util.List; import com.kingsrook.qqq.backend.core.actions.scripts.logging.BuildScriptLogAndScriptLogLineExecutionLogger; @@ -97,7 +98,7 @@ public class RecordScriptTestInterface implements TestScriptActionInterface } QueryOutput queryOutput = new QueryAction().execute(new QueryInput(tableName) - .withFilter(new QQueryFilter(new QFilterCriteria(table.getPrimaryKeyField(), QCriteriaOperator.IN, recordPrimaryKeyList.split(",")))) + .withFilter(new QQueryFilter(new QFilterCriteria(table.getPrimaryKeyField(), QCriteriaOperator.IN, Arrays.stream(recordPrimaryKeyList.split(",")).toList()))) .withIncludeAssociations(true)); if(CollectionUtils.nullSafeIsEmpty(queryOutput.getRecords())) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptAction.java index fafd48e8..907b45b0 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptAction.java @@ -154,8 +154,9 @@ public class RunAdHocRecordScriptAction Method qRecordListToApiRecordList = apiScriptUtilsClass.getMethod("qRecordListToApiRecordList", List.class, String.class, String.class, String.class); Object apiRecordList = qRecordListToApiRecordList.invoke(null, input.getRecordList(), input.getTableName(), scriptRevision.getApiName(), scriptRevision.getApiVersion()); - // noinspection unchecked - return (ArrayList) apiRecordList; + @SuppressWarnings("unchecked") + ArrayList rs = (ArrayList) apiRecordList; + return rs; } catch(ClassNotFoundException e) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java index fab61595..eef95eb1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java @@ -563,6 +563,7 @@ public class QValueFormatter ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // heavy fields that weren't fetched - they should have a backend-detail specifying their length (or null if null) // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + @SuppressWarnings("unchecked") Map heavyFieldLengths = (Map) record.getBackendDetail(QRecord.BACKEND_DETAILS_TYPE_HEAVY_FIELD_LENGTHS); if(heavyFieldLengths != null) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/SearchPossibleValueSourceAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/SearchPossibleValueSourceAction.java index 56642184..44b8984a 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/SearchPossibleValueSourceAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/SearchPossibleValueSourceAction.java @@ -300,6 +300,7 @@ public class SearchPossibleValueSourceAction /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings({ "rawtypes", "unchecked" }) private SearchPossibleValueSourceOutput searchPossibleValueCustom(SearchPossibleValueSourceInput input, QPossibleValueSource possibleValueSource) { try 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 e8b4812a..311136ec 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 @@ -922,7 +922,7 @@ public class QInstanceValidator /******************************************************************************* ** *******************************************************************************/ - private > void validateTableField(QInstance qInstance, String tableName, String fieldName, QTableMetaData table, QFieldMetaData field) + private void validateTableField(QInstance qInstance, String tableName, String fieldName, QTableMetaData table, QFieldMetaData field) { assertCondition(Objects.equals(fieldName, field.getName()), "Inconsistent naming in table " + tableName + " for field " + fieldName + "/" + field.getName() + "."); @@ -944,12 +944,13 @@ public class QInstanceValidator assertCondition(field.getMaxLength() != null, prefix + "specifies a ValueTooLongBehavior, but not a maxLength."); } - Set>> usedFieldBehaviorTypes = new HashSet<>(); + Set>> usedFieldBehaviorTypes = new HashSet<>(); if(field.getBehaviors() != null) { for(FieldBehavior fieldBehavior : field.getBehaviors()) { - Class> behaviorClass = (Class>) fieldBehavior.getClass(); + @SuppressWarnings("unchecked") + Class> behaviorClass = (Class>) fieldBehavior.getClass(); errors.addAll(fieldBehavior.validateBehaviorConfiguration(table, field)); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/SecretsManagerUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/SecretsManagerUtils.java index 44516fc6..b25efc27 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/SecretsManagerUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/SecretsManagerUtils.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.instances; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.Optional; import com.amazonaws.auth.AWSStaticCredentialsProvider; @@ -113,7 +114,7 @@ public class SecretsManagerUtils dotEnv.renameTo(new File(".env.backup-" + System.currentTimeMillis())); } - FileUtils.writeStringToFile(dotEnv, fullEnv.toString()); + FileUtils.writeStringToFile(dotEnv, fullEnv.toString(), StandardCharsets.UTF_8); } else { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/AbstractFilterExpression.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/AbstractFilterExpression.java index fc4a2034..fe9cc897 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/AbstractFilterExpression.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/AbstractFilterExpression.java @@ -40,11 +40,14 @@ public abstract class AbstractFilterExpression implement /******************************************************************************* + ** Evaluate the expression, given a map of input values. ** + ** By default, this will defer to the evaluate(void) method - but, a subclass + ** (e.g., FilterVariableExpression) may react differently. *******************************************************************************/ public T evaluateInputValues(Map inputValues) throws QException { - return (T) this; + return evaluate(); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/serialization/QFilterCriteriaDeserializer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/serialization/QFilterCriteriaDeserializer.java index ca050b33..72479f12 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/serialization/QFilterCriteriaDeserializer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/serialization/QFilterCriteriaDeserializer.java @@ -79,10 +79,11 @@ public class QFilterCriteriaDeserializer extends StdDeserializer values = objectMapper.treeToValue(node.get("values"), List.class); - String fieldName = objectMapper.treeToValue(node.get("fieldName"), String.class); - QCriteriaOperator operator = objectMapper.treeToValue(node.get("operator"), QCriteriaOperator.class); - String otherFieldName = objectMapper.treeToValue(node.get("otherFieldName"), String.class); + @SuppressWarnings("unchecked") + List values = objectMapper.treeToValue(node.get("values"), List.class); + String fieldName = objectMapper.treeToValue(node.get("fieldName"), String.class); + QCriteriaOperator operator = objectMapper.treeToValue(node.get("operator"), QCriteriaOperator.class); + String otherFieldName = objectMapper.treeToValue(node.get("otherFieldName"), String.class); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // look at all the values - if any of them are actually meant to be an Expression (instance of subclass of AbstractFilterExpression) // diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/AbstractBlockWidgetData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/AbstractBlockWidgetData.java index 74f4888b..a1fdd99f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/AbstractBlockWidgetData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/AbstractBlockWidgetData.java @@ -74,6 +74,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withTooltip(S key, String value) { addTooltip(key, value); @@ -99,6 +100,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withTooltip(S key, BlockTooltip value) { addTooltip(key, value); @@ -144,6 +146,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** Fluent setter for tooltipMap *******************************************************************************/ + @SuppressWarnings("unchecked") public T withTooltipMap(Map tooltipMap) { this.tooltipMap = tooltipMap; @@ -178,6 +181,7 @@ public abstract class AbstractBlockWidgetData< ** Fluent setter for tooltip ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withTooltip(String tooltip) { this.tooltip = new BlockTooltip(tooltip); @@ -190,6 +194,7 @@ public abstract class AbstractBlockWidgetData< ** Fluent setter for tooltip ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withTooltip(BlockTooltip tooltip) { this.tooltip = tooltip; @@ -201,6 +206,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withLink(S key, String value) { addLink(key, value); @@ -226,6 +232,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withLink(S key, BlockLink value) { addLink(key, value); @@ -271,6 +278,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** Fluent setter for linkMap *******************************************************************************/ + @SuppressWarnings("unchecked") public T withLinkMap(Map linkMap) { this.linkMap = linkMap; @@ -305,6 +313,7 @@ public abstract class AbstractBlockWidgetData< ** Fluent setter for link ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withLink(String link) { this.link = new BlockLink(link); @@ -317,6 +326,7 @@ public abstract class AbstractBlockWidgetData< ** Fluent setter for link ** *******************************************************************************/ + @SuppressWarnings("unchecked") public T withLink(BlockLink link) { this.link = link; @@ -348,6 +358,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** Fluent setter for values *******************************************************************************/ + @SuppressWarnings("unchecked") public T withValues(V values) { this.values = values; @@ -379,6 +390,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** Fluent setter for styles *******************************************************************************/ + @SuppressWarnings("unchecked") public T withStyles(SX styles) { this.styles = styles; @@ -409,6 +421,7 @@ public abstract class AbstractBlockWidgetData< /******************************************************************************* ** Fluent setter for blockId *******************************************************************************/ + @SuppressWarnings("unchecked") public T withBlockId(String blockId) { this.blockId = blockId; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecordEntity.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecordEntity.java index 89de8bea..e62757e1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecordEntity.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecordEntity.java @@ -192,6 +192,7 @@ public abstract class QRecordEntity for(QRecordEntityAssociation qRecordEntityAssociation : getAssociationList(this.getClass())) { + @SuppressWarnings("unchecked") List associatedEntities = (List) qRecordEntityAssociation.getGetter().invoke(this); String associationName = qRecordEntityAssociation.getAssociationAnnotation().name(); @@ -245,6 +246,7 @@ public abstract class QRecordEntity for(QRecordEntityAssociation qRecordEntityAssociation : getAssociationList(this.getClass())) { + @SuppressWarnings("unchecked") List associatedEntities = (List) qRecordEntityAssociation.getGetter().invoke(this); String associationName = qRecordEntityAssociation.getAssociationAnnotation().name(); @@ -346,6 +348,7 @@ public abstract class QRecordEntity if(associationAnnotation.isPresent()) { + @SuppressWarnings("unchecked") Class listTypeParam = (Class) getListTypeParam(possibleGetter.getReturnType(), possibleGetter.getAnnotatedReturnType()); associationList.add(new QRecordEntityAssociation(fieldName, possibleGetter, setter.get(), listTypeParam, associationAnnotation.orElse(null))); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java index 2ca70af1..b8aa82c5 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java @@ -188,7 +188,8 @@ public class FieldAdornment ** Fluent setter for values ** *******************************************************************************/ - public FieldAdornment withValues(Pair... values) + @SafeVarargs + public final FieldAdornment withValues(Pair... values) { for(Pair value : values) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java index f2933188..5bbba5b6 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java @@ -804,7 +804,7 @@ public class QTableMetaData implements QAppChildMetaData, Serializable, MetaData { if(this.associatedScripts == null) { - this.associatedScripts = new ArrayList(); + this.associatedScripts = new ArrayList<>(); } this.associatedScripts.add(associatedScript); return (this); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java index dfd25fcf..a547aaba 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/backend/implementations/memory/MemoryRecordStore.java @@ -662,7 +662,11 @@ public class MemoryRecordStore { return (-1); } - return ((Comparable) a).compareTo(b); + + @SuppressWarnings("unchecked") + Comparable comparableSerializableA = (Comparable) a; + + return comparableSerializableA.compareTo(b); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -769,6 +773,7 @@ public class MemoryRecordStore /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings({ "rawtypes", "unchecked" }) private static Serializable computeAggregate(List records, Aggregate aggregate, QTableMetaData table) { String fieldName = aggregate.getFieldName(); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesLoadStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesLoadStep.java index 85470779..fa354e38 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesLoadStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesLoadStep.java @@ -65,9 +65,14 @@ public class MergeDuplicatesLoadStep extends LoadViaInsertOrUpdateStep { super.runOnePage(runBackendStepInput, runBackendStepOutput); - ListingHash otherTableIdsToDelete = (ListingHash) runBackendStepInput.getValue("otherTableIdsToDelete"); + @SuppressWarnings("unchecked") + ListingHash otherTableIdsToDelete = (ListingHash) runBackendStepInput.getValue("otherTableIdsToDelete"); + + @SuppressWarnings("unchecked") ListingHash otherTableFiltersToDelete = (ListingHash) runBackendStepInput.getValue("otherTableFiltersToDelete"); - ListingHash otherTableRecordsToStore = (ListingHash) runBackendStepInput.getValue("otherTableRecordsToStore"); + + @SuppressWarnings("unchecked") + ListingHash otherTableRecordsToStore = (ListingHash) runBackendStepInput.getValue("otherTableRecordsToStore"); if(otherTableIdsToDelete != null) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java index 7b550ada..a1fb1795 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/reports/PrepareReportForRecordStep.java @@ -114,8 +114,9 @@ public class PrepareReportForRecordStep extends PrepareReportStep ///////////////////////////////////////////////////////////////////////////////////// // if there are no more input fields, then remove the INPUT step from the process. // ///////////////////////////////////////////////////////////////////////////////////// - inputFieldList = (ArrayList) runBackendStepOutput.getValue("inputFieldList"); - if(!CollectionUtils.nullSafeHasContents(inputFieldList)) + @SuppressWarnings("unchecked") + ArrayList updatedInputFieldList = (ArrayList) runBackendStepOutput.getValue("inputFieldList"); + if(!CollectionUtils.nullSafeHasContents(updatedInputFieldList)) { removeInputStepFromProcess(runBackendStepOutput); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStep.java index b9a99eab..74dd1039 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStep.java @@ -139,7 +139,7 @@ public class TestScriptProcessStep implements BackendStep ////////////////////////////////// // send script outputs back out // ////////////////////////////////// - output.addValue("scriptLogLines", CollectionUtils.useOrWrap(testScriptOutput.getScriptLogLines(), TypeToken.get(ArrayList.class))); + output.addValue("scriptLogLines", CollectionUtils.useOrWrap(testScriptOutput.getScriptLogLines(), new TypeToken>() {})); output.addValue("outputObject", testScriptOutput.getOutputObject()); if(testScriptOutput.getException() != null) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzJobRunner.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzJobRunner.java index f635bd9b..184060fe 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzJobRunner.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzJobRunner.java @@ -70,7 +70,9 @@ public class QuartzJobRunner implements Job QContext.init(qInstance, quartzScheduler.getSessionSupplier().get()); schedulableType = qInstance.getSchedulableType(context.getJobDetail().getJobDataMap().getString("type")); - params = (Map) context.getJobDetail().getJobDataMap().get("params"); + @SuppressWarnings("unchecked") + Map paramsFromJobDataMap = (Map) context.getJobDetail().getJobDataMap().get("params"); + params = paramsFromJobDataMap; SchedulableRunner schedulableRunner = QCodeLoader.getAdHoc(SchedulableRunner.class, schedulableType.getRunner()); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/schedulable/runner/SchedulableProcessRunner.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/schedulable/runner/SchedulableProcessRunner.java index c94d25ba..52d580f1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/schedulable/runner/SchedulableProcessRunner.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/scheduler/schedulable/runner/SchedulableProcessRunner.java @@ -74,7 +74,9 @@ public class SchedulableProcessRunner implements SchedulableRunner Map backendVariantData = null; if(params.containsKey("backendVariantData")) { - backendVariantData = (Map) params.get("backendVariantData"); + @SuppressWarnings("unchecked") + Map dataFromMap = (Map) params.get("backendVariantData"); + backendVariantData = dataFromMap; } Map processInputValues = buildProcessInputValuesMap(params, process); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/state/TempFileStateProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/state/TempFileStateProvider.java index 7f091f1a..734b011e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/state/TempFileStateProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/state/TempFileStateProvider.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; +import java.nio.charset.StandardCharsets; import java.nio.file.NoSuchFileException; import java.time.Instant; import java.util.Optional; @@ -78,7 +79,7 @@ public class TempFileStateProvider implements StateProviderInterface try { String json = JsonUtils.toJson(data); - FileUtils.writeStringToFile(getFile(key), json); + FileUtils.writeStringToFile(getFile(key), json, StandardCharsets.UTF_8); } catch(IOException e) { @@ -97,7 +98,7 @@ public class TempFileStateProvider implements StateProviderInterface { try { - String json = FileUtils.readFileToString(getFile(key)); + String json = FileUtils.readFileToString(getFile(key), StandardCharsets.UTF_8); return (Optional.of(JsonUtils.toObject(json, type))); } catch(FileNotFoundException | NoSuchFileException fnfe) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java index 1e53c346..f3b3e6ee 100755 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java @@ -50,7 +50,7 @@ public class CollectionUtils ** true if c is null or it's empty ** *******************************************************************************/ - public static boolean nullSafeIsEmpty(Collection c) + public static boolean nullSafeIsEmpty(Collection c) { if(c == null || c.isEmpty()) { @@ -66,7 +66,7 @@ public class CollectionUtils ** true if c is null or it's empty ** *******************************************************************************/ - public static boolean nullSafeIsEmpty(Map c) + public static boolean nullSafeIsEmpty(Map c) { if(c == null || c.isEmpty()) { @@ -82,7 +82,7 @@ public class CollectionUtils ** true if c is NOT null and it's not empty ** *******************************************************************************/ - public static boolean nullSafeHasContents(Collection c) + public static boolean nullSafeHasContents(Collection c) { return (!nullSafeIsEmpty(c)); } @@ -93,7 +93,7 @@ public class CollectionUtils ** true if c is NOT null and it's not empty ** *******************************************************************************/ - public static boolean nullSafeHasContents(Map c) + public static boolean nullSafeHasContents(Map c) { return (!nullSafeIsEmpty(c)); } @@ -104,7 +104,7 @@ public class CollectionUtils ** 0 if c is empty, otherwise, its size. ** *******************************************************************************/ - public static int nullSafeSize(Collection c) + public static int nullSafeSize(Collection c) { if(c == null) { @@ -120,7 +120,7 @@ public class CollectionUtils ** 0 if c is empty, otherwise, its size. ** *******************************************************************************/ - public static int nullSafeSize(Map c) + public static int nullSafeSize(Map c) { if(c == null) { @@ -302,14 +302,14 @@ public class CollectionUtils return (rs); } - List currentPage = new LinkedList(); + List currentPage = new LinkedList<>(); rs.add(currentPage); for(T value : values) { if(currentPage.size() >= pageSize) { - currentPage = new LinkedList(); + currentPage = new LinkedList<>(); rs.add(currentPage); } @@ -423,6 +423,7 @@ public class CollectionUtils ** ** Meant to help avoid null checks on foreach loops. *******************************************************************************/ + @SuppressWarnings("unchecked") public static T[] nonNullArray(T[] array) { if(array == null) @@ -539,7 +540,7 @@ public class CollectionUtils /******************************************************************************* ** *******************************************************************************/ - public static Map objectToMap(Object o) + public static Map objectToMap(Object o) { ObjectMapper mapper = new ObjectMapper() .registerModule(new JavaTimeModule()) @@ -555,6 +556,7 @@ public class CollectionUtils /******************************************************************************* ** *******************************************************************************/ + @SafeVarargs public static List mergeLists(List... lists) { List rs = new ArrayList<>(); @@ -593,6 +595,7 @@ public class CollectionUtils return (null); } + @SuppressWarnings("unchecked") Class targetClass = (Class) typeToken.getRawType(); if(targetClass.isInstance(collection)) { @@ -630,6 +633,7 @@ public class CollectionUtils return (null); } + @SuppressWarnings("unchecked") Class targetClass = (Class) typeToken.getRawType(); if(targetClass.isInstance(collection)) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java index 0fa1566e..6c8161c0 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java @@ -37,6 +37,7 @@ public class ObjectUtils /******************************************************************************* ** A varargs version of Objects.requireNonNullElse *******************************************************************************/ + @SafeVarargs public static T requireNonNullElse(T... objects) { if(objects == null) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ValueUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ValueUtils.java index a2bd7bca..78a26d2a 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ValueUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ValueUtils.java @@ -888,6 +888,7 @@ public class ValueUtils ** Return the first argument that isn't null. ** If all were null, return null. *******************************************************************************/ + @SafeVarargs public static T getFirstNonNull(T... ts) { if(ts == null || ts.length == 0) 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 c52bf027..23004f8d 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 @@ -48,7 +48,11 @@ public class YamlUtils { ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); objectMapper.findAndRegisterModules(); - return (objectMapper.readValue(yaml, Map.class)); + + @SuppressWarnings("unchecked") + Map map = objectMapper.readValue(yaml, Map.class); + + return map; } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/AlphaNumericComparator.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/AlphaNumericComparator.java index 2eb32327..31c2de6f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/AlphaNumericComparator.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/AlphaNumericComparator.java @@ -86,7 +86,7 @@ public class AlphaNumericComparator implements Comparator //////////////////////////////////////////////////////////////// if(INT_PATTERN.matcher(a).matches() && INT_PATTERN.matcher(b).matches()) { - int intsCompared = new Integer(a).compareTo(new Integer(b)); + int intsCompared = Integer.valueOf(a).compareTo(Integer.valueOf(b)); if(intsCompared == TIE) { /////////////////////////////////////////////////////////////////////////////// @@ -119,7 +119,7 @@ public class AlphaNumericComparator implements Comparator ///////////////////////////////////////////////////////////// // if the ints compare as non-zero, return that comparison // ///////////////////////////////////////////////////////////// - int intPartCompared = new Integer(aIntPart).compareTo(new Integer(bIntPart)); + int intPartCompared = Integer.valueOf(aIntPart).compareTo(Integer.valueOf(bIntPart)); if(intPartCompared != TIE) { return (intPartCompared); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MultiLevelMapHelper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MultiLevelMapHelper.java index d7667c2c..65b64c19 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MultiLevelMapHelper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MultiLevelMapHelper.java @@ -87,7 +87,9 @@ public class MultiLevelMapHelper { try { - return (map.getClass().getConstructor().newInstance()); + @SuppressWarnings("unchecked") + Map map1 = map.getClass().getConstructor().newInstance(); + return map1; } catch(Exception e) { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java index c810c1b4..78a2c161 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java @@ -99,7 +99,7 @@ class ChildRecordListRendererTest extends BaseTest .getWidgetMetaData(); qInstance.addWidget(widget); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1) )); @@ -130,12 +130,12 @@ class ChildRecordListRendererTest extends BaseTest .getWidgetMetaData(); qInstance.addWidget(widget); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2) )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( new QRecord().withValue("orderId", 1).withValue("sku", "ABC").withValue("lineNumber", 2), new QRecord().withValue("orderId", 1).withValue("sku", "BCD").withValue("lineNumber", 1), new QRecord().withValue("orderId", 2).withValue("sku", "XYZ") // should not be found. diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRendererTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRendererTest.java index df668663..d203e010 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRendererTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRendererTest.java @@ -128,7 +128,7 @@ class ParentWidgetRendererTest extends BaseTest QContext.getQSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_TYPE_STORE_ALL_ACCESS, true); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1) )); @@ -161,12 +161,12 @@ class ParentWidgetRendererTest extends BaseTest QContext.getQSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_TYPE_STORE_ALL_ACCESS, true); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2) )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( new QRecord().withValue("orderId", 1).withValue("sku", "ABC").withValue("lineNumber", 2), new QRecord().withValue("orderId", 1).withValue("sku", "BCD").withValue("lineNumber", 1), new QRecord().withValue("orderId", 2).withValue("sku", "XYZ") // should not be found. diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRendererTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRendererTest.java index 23e33fb5..887e251f 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRendererTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRendererTest.java @@ -109,7 +109,7 @@ class ProcessWidgetRendererTest extends BaseTest .getWidgetMetaData(); qInstance.addWidget(widget); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1) )); @@ -140,12 +140,12 @@ class ProcessWidgetRendererTest extends BaseTest .getWidgetMetaData(); qInstance.addWidget(widget); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2) )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( new QRecord().withValue("orderId", 1).withValue("sku", "ABC").withValue("lineNumber", 2), new QRecord().withValue("orderId", 1).withValue("sku", "BCD").withValue("lineNumber", 1), new QRecord().withValue("orderId", 2).withValue("sku", "XYZ") // should not be found. diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/USMapRendererTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/USMapRendererTest.java index 0c6f019d..3b23ff02 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/USMapRendererTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/USMapRendererTest.java @@ -116,7 +116,7 @@ class USMapRendererTest extends BaseTest .getWidgetMetaData(); qInstance.addWidget(widget); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1) )); @@ -147,12 +147,12 @@ class USMapRendererTest extends BaseTest .getWidgetMetaData(); qInstance.addWidget(widget); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2) )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( new QRecord().withValue("orderId", 1).withValue("sku", "ABC").withValue("lineNumber", 2), new QRecord().withValue("orderId", 1).withValue("sku", "BCD").withValue("lineNumber", 1), new QRecord().withValue("orderId", 2).withValue("sku", "XYZ") // should not be found. diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/ExportActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/ExportActionTest.java index ff089474..bf9ed623 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/ExportActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/ExportActionTest.java @@ -155,12 +155,12 @@ class ExportActionTest extends BaseTest QInstance qInstance = QContext.getQInstance(); QContext.getQSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_TYPE_STORE_ALL_ACCESS, true); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( new QRecord().withValue("id", 1).withValue("orderNo", "ORD1").withValue("storeId", 1), new QRecord().withValue("id", 2).withValue("orderNo", "ORD2").withValue("storeId", 1) )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( new QRecord().withValue("id", 1).withValue("orderId", 1).withValue("sku", "A").withValue("quantity", 10), new QRecord().withValue("id", 2).withValue("orderId", 1).withValue("sku", "B").withValue("quantity", 15), new QRecord().withValue("id", 3).withValue("orderId", 2).withValue("sku", "A").withValue("quantity", 20) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportActionTest.java index 5f354631..1cf8404a 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportActionTest.java @@ -562,7 +562,7 @@ public class GenerateReportActionTest extends BaseTest *******************************************************************************/ public static void insertPersonRecords(QInstance qInstance) throws QException { - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new PersonQRecord().withFirstName("Darin").withLastName("Jonson").withBirthDate(LocalDate.of(1980, Month.JANUARY, 31)).withNoOfShoes(null).withHomeStateId(1).withPrice(null).withCost(new BigDecimal("0.50")), // wrong last initial new PersonQRecord().withFirstName("Darin").withLastName("Jones").withBirthDate(LocalDate.of(1980, Month.JANUARY, 31)).withNoOfShoes(3).withHomeStateId(1).withPrice(new BigDecimal("1.00")).withCost(new BigDecimal("0.50")), // wrong last initial new PersonQRecord().withFirstName("Darin").withLastName("Kelly").withBirthDate(LocalDate.of(1979, Month.DECEMBER, 30)).withNoOfShoes(4).withHomeStateId(1).withPrice(new BigDecimal("1.20")).withCost(new BigDecimal("0.50")), // bad birthdate diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptActionTest.java index 30f9098f..2cda5932 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAdHocRecordScriptActionTest.java @@ -120,12 +120,12 @@ class RunAdHocRecordScriptActionTest extends BaseTest new ScriptsMetaDataProvider().defineAll(instance, TestUtils.MEMORY_BACKEND_NAME, null); - TestUtils.insertRecords(instance, personMemory, List.of( + TestUtils.insertRecords(personMemory, List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2) )); - TestUtils.insertRecords(instance, instance.getTable("scriptType"), List.of( + TestUtils.insertRecords(instance.getTable("scriptType"), List.of( new QRecord().withValue("id", 1).withValue("name", "Test Script Type") )); } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAssociatedScriptActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAssociatedScriptActionTest.java index bb1275b7..1e604b79 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAssociatedScriptActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/RunAssociatedScriptActionTest.java @@ -184,12 +184,12 @@ class RunAssociatedScriptActionTest extends BaseTest new ScriptsMetaDataProvider().defineAll(instance, TestUtils.MEMORY_BACKEND_NAME, null); - TestUtils.insertRecords(instance, table, List.of( + TestUtils.insertRecords(table, List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2) )); - TestUtils.insertRecords(instance, instance.getTable("scriptType"), List.of( + TestUtils.insertRecords(instance.getTable("scriptType"), List.of( new QRecord().withValue("id", 1).withValue("name", "Test Script Type") )); } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/StoreAssociatedScriptActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/StoreAssociatedScriptActionTest.java index 8018d686..45b5a0e0 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/StoreAssociatedScriptActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/scripts/StoreAssociatedScriptActionTest.java @@ -88,13 +88,13 @@ class StoreAssociatedScriptActionTest extends BaseTest new ScriptsMetaDataProvider().defineAll(instance, TestUtils.MEMORY_BACKEND_NAME, null); - TestUtils.insertRecords(instance, table, List.of( + TestUtils.insertRecords(table, List.of( new QRecord().withValue("id", 1), new QRecord().withValue("id", 2), new QRecord().withValue("id", 3) )); - TestUtils.insertRecords(instance, instance.getTable("scriptType"), List.of( + TestUtils.insertRecords(instance.getTable("scriptType"), List.of( new QRecord().withValue("id", 1).withValue("name", "Test Script"), new QRecord().withValue("id", 2).withValue("name", "Other Script") )); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/GetActionCacheHelperTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/GetActionCacheHelperTest.java index 3292a956..00fc0ba2 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/GetActionCacheHelperTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/GetActionCacheHelperTest.java @@ -69,7 +69,7 @@ class GetActionCacheHelperTest extends BaseTest ///////////////////////////////////// // insert rows in the source table // ///////////////////////////////////// - TestUtils.insertRecords(qInstance, qInstance.getTable(sourceTableName), List.of( + TestUtils.insertRecords(qInstance.getTable(sourceTableName), List.of( new QRecord().withValue("id", 1).withValue("firstName", "George").withValue("lastName", "Washington").withValue("noOfShoes", 5), new QRecord().withValue("id", 2).withValue("firstName", "John").withValue("lastName", "Adams"), new QRecord().withValue("id", 3).withValue("firstName", "Thomas").withValue("lastName", "Jefferson"), diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java index b0f21491..8c6d2118 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryActionCacheHelperTest.java @@ -68,7 +68,7 @@ class QueryActionCacheHelperTest extends BaseTest ///////////////////////////////////// // insert rows in the source table // ///////////////////////////////////// - TestUtils.insertRecords(qInstance, qInstance.getTable(sourceTableName), List.of( + TestUtils.insertRecords(qInstance.getTable(sourceTableName), List.of( new QRecord().withValue("id", 1).withValue("name", "Triangle").withValue("noOfSides", 3), new QRecord().withValue("id", 2).withValue("name", "Square").withValue("noOfSides", 4), new QRecord().withValue("id", 3).withValue("name", "Pentagon").withValue("noOfSides", 5), diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QPossibleValueTranslatorTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QPossibleValueTranslatorTest.java index 5313df6b..423583b7 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QPossibleValueTranslatorTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QPossibleValueTranslatorTest.java @@ -415,8 +415,8 @@ public class QPossibleValueTranslatorTest extends BaseTest List regions = List.of(new QRecord().withValue("id", 11).withValue("name", "Missouri").withValue("countryId", 111)); List countries = List.of(new QRecord().withValue("id", 111).withValue("name", "U.S.A")); - TestUtils.insertRecords(qInstance, qInstance.getTable("region"), regions); - TestUtils.insertRecords(qInstance, qInstance.getTable("country"), countries); + TestUtils.insertRecords(qInstance.getTable("region"), regions); + TestUtils.insertRecords(qInstance.getTable("country"), countries); MemoryRecordStore.resetStatistics(); MemoryRecordStore.setCollectStatistics(true); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/adapters/QInstanceAdapterTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/adapters/QInstanceAdapterTest.java index 986caf18..ebcdffd7 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/adapters/QInstanceAdapterTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/adapters/QInstanceAdapterTest.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.adapters; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; @@ -73,7 +74,7 @@ class QInstanceAdapterTest extends BaseTest @Disabled("Pending custom deserializer on QStepMetaData") void jsonToQInstance() throws IOException { - String json = FileUtils.readFileToString(new File("src/test/resources/personQInstance.json")); + String json = FileUtils.readFileToString(new File("src/test/resources/personQInstance.json"), StandardCharsets.UTF_8); QInstance qInstance = new QInstanceAdapter().jsonToQInstance(json); System.out.println(qInstance); } @@ -87,7 +88,7 @@ class QInstanceAdapterTest extends BaseTest @Disabled("Pending custom deserializer on QStepMetaData") void jsonToQInstanceIncludingBackend() throws IOException { - String json = FileUtils.readFileToString(new File("src/test/resources/personQInstanceIncludingBackend.json")); + String json = FileUtils.readFileToString(new File("src/test/resources/personQInstanceIncludingBackend.json"), StandardCharsets.UTF_8); QInstance qInstance = new QInstanceAdapter().jsonToQInstanceIncludingBackends(json); System.out.println(qInstance); assertNotNull(qInstance.getBackends()); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/TableBasedAuthenticationModuleTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/TableBasedAuthenticationModuleTest.java index 032ca77a..7859259f 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/TableBasedAuthenticationModuleTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/TableBasedAuthenticationModuleTest.java @@ -337,7 +337,7 @@ public class TableBasedAuthenticationModuleTest extends BaseTest { QAuthenticationMetaData tableBasedAuthentication = qInstance.getAuthentication(); qInstance.setAuthentication(new Auth0AuthenticationMetaData().withName("mock").withType(QAuthenticationType.MOCK)); - TestUtils.insertRecords(qInstance, qInstance.getTable("user"), List.of(new QRecord() + TestUtils.insertRecords(qInstance.getTable("user"), List.of(new QRecord() .withValue("username", username) .withValue("fullName", fullName) .withValue("passwordHash", TableBasedAuthenticationModule.PasswordHasher.createHashedPassword(password)))); @@ -361,7 +361,7 @@ public class TableBasedAuthenticationModuleTest extends BaseTest getUserInput.setUniqueKey(Map.of("username", username)); GetOutput getUserOutput = new GetAction().execute(getUserInput); - TestUtils.insertRecords(qInstance, qInstance.getTable("session"), List.of(new QRecord() + TestUtils.insertRecords(qInstance.getTable("session"), List.of(new QRecord() .withValue("id", uuid) .withValue("userId", getUserOutput.getRecord() == null ? -1 : getUserOutput.getRecord().getValueInteger("id")) .withValue("accessTimestamp", accessTimestamp) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTest.java index 91a0041b..48d58311 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteTest.java @@ -74,7 +74,7 @@ class BulkDeleteTest extends BaseTest // insert some test records // ////////////////////////////// QInstance qInstance = QContext.getQInstance(); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin").withValue("lastName", "Kelkhoff").withValue("email", "darin.kelkhoff@kingsrook.com"), new QRecord().withValue("id", 2).withValue("firstName", "Tim").withValue("lastName", "Chamberlain").withValue("email", "tim.chamberlain@kingsrook.com"), new QRecord().withValue("id", 3).withValue("firstName", "James").withValue("lastName", "Maes").withValue("email", "james.maes@kingsrook.com") diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTest.java index f8133223..caad64c6 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/edit/BulkEditTest.java @@ -85,7 +85,7 @@ class BulkEditTest extends BaseTest // insert some test records // ////////////////////////////// QInstance qInstance = QContext.getQInstance(); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin").withValue("lastName", "Kelkhoff").withValue("email", "darin.kelkhoff@kingsrook.com"), new QRecord().withValue("id", 2).withValue("firstName", "Tim").withValue("lastName", "Chamberlain").withValue("email", "tim.chamberlain@kingsrook.com"), new QRecord().withValue("id", 3).withValue("firstName", "James").withValue("lastName", "Maes").withValue("email", "james.maes@kingsrook.com") diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java index e93990a1..87a65f22 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java @@ -86,7 +86,7 @@ class BulkInsertTransformStepTest extends BaseTest //////////////////////////////////////////////////////////// // insert some records that will cause some UK violations // //////////////////////////////////////////////////////////// - TestUtils.insertRecords(instance, table, List.of( + TestUtils.insertRecords(table, List.of( newQRecord("uuid-A", "SKU-1", 1), newQRecord("uuid-B", "SKU-2", 1), newQRecord("uuid-C", "SKU-2", 2) @@ -168,7 +168,7 @@ class BulkInsertTransformStepTest extends BaseTest //////////////////////////////////////////////////////////// // insert some records that will cause some UK violations // //////////////////////////////////////////////////////////// - TestUtils.insertRecords(instance, table, List.of( + TestUtils.insertRecords(table, List.of( newQRecord("uuid-A", "SKU-1", 1), newQRecord("uuid-B", "SKU-2", 1), newQRecord("uuid-C", "SKU-2", 2) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStepTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStepTest.java index 421a3cb6..0f3a6ca3 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStepTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/LoadViaInsertOrUpdateStepTest.java @@ -66,7 +66,7 @@ class LoadViaInsertOrUpdateStepTest extends BaseTest List existingRecordList = List.of( new QRecord().withValue("id", 47).withValue("firstName", "Tom") ); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), existingRecordList); + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), existingRecordList); List inputRecordList = List.of( new QRecord().withValue("id", 47).withValue("firstName", "Tim"), diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcessTest.java index 0eeb5429..e605fbb1 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/streamedwithfrontend/StreamedETLWithFrontendProcessTest.java @@ -307,6 +307,7 @@ public class StreamedETLWithFrontendProcessTest extends BaseTest assertTrue(runProcessOutput.getException().isEmpty()); assertThat(runProcessOutput.getProcessState().getNextStepName()).hasValue("review"); + @SuppressWarnings("unchecked") List validationSummaryLines = (List) runProcessOutput.getValues().get(StreamedETLWithFrontendProcess.FIELD_VALIDATION_SUMMARY); assertThat(validationSummaryLines) .usingRecursiveFieldByFieldElementComparatorOnFields("status", "count") diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java index 3ea9be62..c2a9536f 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java @@ -61,7 +61,7 @@ class MergeDuplicatesProcessTest extends BaseTest QInstance qInstance = QContext.getQInstance(); addProcessToInstance(); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin").withValue("noOfShoes", 1).withValue("favoriteShapeId", 11), new QRecord().withValue("id", 2).withValue("firstName", "Tim").withValue("noOfShoes", 2).withValue("favoriteShapeId", 12), new QRecord().withValue("id", 3).withValue("firstName", "Tyler").withValue("noOfShoes", 1).withValue("favoriteShapeId", 13), @@ -71,7 +71,7 @@ class MergeDuplicatesProcessTest extends BaseTest new QRecord().withValue("id", 7).withValue("firstName", "James").withValue("noOfShoes", 1).withValue("favoriteShapeId", 17) )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_SHAPE), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_SHAPE), List.of( new QRecord().withValue("id", 11).withValue("favoredByNoOfPeople", 1), new QRecord().withValue("id", 12).withValue("favoredByNoOfPeople", 1), new QRecord().withValue("id", 13).withValue("favoredByNoOfPeople", 1), diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java index f4474bef..272650d1 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java @@ -53,6 +53,7 @@ class SavedViewProcessTests extends BaseTest /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("unchecked") @Test void test() throws QException { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/LoadScriptTestDetailsProcessStepTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/LoadScriptTestDetailsProcessStepTest.java index 9e1be9bd..3618f42d 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/LoadScriptTestDetailsProcessStepTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/LoadScriptTestDetailsProcessStepTest.java @@ -73,6 +73,7 @@ class LoadScriptTestDetailsProcessStepTest extends BaseTest Serializable inputFields = output.getValue("testInputFields"); assertThat(inputFields).isInstanceOf(List.class); + @SuppressWarnings("unchecked") List inputFieldsList = (List) inputFields; assertEquals(1, inputFieldsList.size()); assertEquals("recordPrimaryKeyList", inputFieldsList.get(0).getName()); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptTest.java index f2432636..1f66ce22 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptTest.java @@ -56,8 +56,8 @@ class RunRecordScriptTest extends BaseTest QInstance qInstance = QContext.getQInstance(); new ScriptsMetaDataProvider().defineAll(qInstance, TestUtils.MEMORY_BACKEND_NAME, null); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of(new QRecord().withValue("id", 1))); - TestUtils.insertRecords(qInstance, qInstance.getTable(Script.TABLE_NAME), List.of(new QRecord().withValue("id", 1).withTableName(TestUtils.TABLE_NAME_PERSON_MEMORY))); + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of(new QRecord().withValue("id", 1))); + TestUtils.insertRecords(qInstance.getTable(Script.TABLE_NAME), List.of(new QRecord().withValue("id", 1).withTableName(TestUtils.TABLE_NAME_PERSON_MEMORY))); RunProcessInput runProcessInput = new RunProcessInput(); runProcessInput.setProcessName(ScriptsMetaDataProvider.RUN_RECORD_SCRIPT_PROCESS_NAME); @@ -73,8 +73,10 @@ class RunRecordScriptTest extends BaseTest // still good to run the code and at least get this far w/ an expected exception. // /////////////////////////////////////////////////////////////////////////////////////////////////// RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); - System.out.println(runProcessOutput); - assertTrue(((List) runProcessOutput.getValues().get("processResults")).stream().anyMatch(psli -> psli instanceof ProcessSummaryLine psl && psl.getMessage().contains("error that was not logged"))); + + @SuppressWarnings("unchecked") + List processResults = (List) runProcessOutput.getValues().get("processResults"); + assertTrue(processResults.stream().anyMatch(psli -> psli instanceof ProcessSummaryLine psl && psl.getMessage().contains("error that was not logged"))); } } \ No newline at end of file diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStepTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStepTest.java index 524727b7..b6bfdd1b 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStepTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/StoreScriptRevisionProcessStepTest.java @@ -61,7 +61,7 @@ class StoreScriptRevisionProcessStepTest extends BaseTest Integer scriptId = 1701; String scriptContents = "logger.log('Hi');"; - TestUtils.insertRecords(qInstance, qInstance.getTable(Script.TABLE_NAME), List.of(new QRecord().withValue("id", scriptId))); + TestUtils.insertRecords(qInstance.getTable(Script.TABLE_NAME), List.of(new QRecord().withValue("id", scriptId))); List scripts = TestUtils.queryTable(Script.TABLE_NAME); assertNull(scripts.get(0).getValueInteger("currentScriptRevisionId")); @@ -121,7 +121,7 @@ class StoreScriptRevisionProcessStepTest extends BaseTest String scriptContents = "logger.log('Hi');"; String templateContents = "

Hey

"; - TestUtils.insertRecords(qInstance, qInstance.getTable(Script.TABLE_NAME), List.of(new QRecord().withValue("id", scriptId))); + TestUtils.insertRecords(qInstance.getTable(Script.TABLE_NAME), List.of(new QRecord().withValue("id", scriptId))); List scripts = TestUtils.queryTable(Script.TABLE_NAME); assertNull(scripts.get(0).getValueInteger("currentScriptRevisionId")); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/sharing/GetSharedRecordsProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/sharing/GetSharedRecordsProcessTest.java index d00e1898..4e1ddfbc 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/sharing/GetSharedRecordsProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/sharing/GetSharedRecordsProcessTest.java @@ -84,6 +84,7 @@ class GetSharedRecordsProcessTest extends BaseTest input.addValue("recordId", 1); processStep.run(input, output); + @SuppressWarnings("unchecked") List resultList = (List) output.getValue("resultList"); assertEquals(1, resultList.size()); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java index 220b5cc5..45eaebf9 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java @@ -116,7 +116,7 @@ class TableSyncProcessTest extends BaseTest .withFields(personTable.getFields()) .withField(new QFieldMetaData("sourcePersonId", QFieldType.INTEGER))); - TestUtils.insertRecords(qInstance, qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin"), new QRecord().withValue("id", 2).withValue("firstName", "Tim"), new QRecord().withValue("id", 3).withValue("firstName", "Tyler"), @@ -124,7 +124,7 @@ class TableSyncProcessTest extends BaseTest new QRecord().withValue("id", 5).withValue("firstName", "Homer") )); - TestUtils.insertRecords(qInstance, qInstance.getTable(TABLE_NAME_PEOPLE_SYNC), List.of( + TestUtils.insertRecords(qInstance.getTable(TABLE_NAME_PEOPLE_SYNC), List.of( new QRecord().withValue("sourcePersonId", 3).withValue("firstName", "Garret"), new QRecord().withValue("sourcePersonId", 5).withValue("firstName", "Homer") )); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java index aad2d4ca..bfa0868e 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/utils/GeneralProcessUtilsTest.java @@ -80,7 +80,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("favoriteShapeId", 3), new QRecord().withValue("favoriteShapeId", 1) )); @@ -107,7 +107,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("favoriteShapeId", 3), new QRecord().withValue("favoriteShapeId", 1) )); @@ -134,7 +134,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("favoriteShapeId", 3), new QRecord().withValue("id", 2).withValue("favoriteShapeId", 3), new QRecord().withValue("id", 3).withValue("favoriteShapeId", 1) @@ -166,7 +166,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("favoriteShapeId", 3), new QRecord().withValue("favoriteShapeId", 1) )); @@ -194,7 +194,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("favoriteShapeId", 3), new QRecord().withValue("id", 2).withValue("favoriteShapeId", 3), new QRecord().withValue("id", 3).withValue("favoriteShapeId", 1) @@ -239,7 +239,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("favoriteShapeId", 3), new QRecord().withValue("id", 2).withValue("favoriteShapeId", 3), new QRecord().withValue("id", 3).withValue("favoriteShapeId", 1) @@ -263,7 +263,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin"), new QRecord().withValue("id", 2).withValue("firstName", "James"), new QRecord().withValue("id", 3).withValue("firstName", "Tim") @@ -288,7 +288,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin"), new QRecord().withValue("id", 2).withValue("firstName", "James"), new QRecord().withValue("id", 3).withValue("firstName", "Tim") @@ -309,7 +309,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin"), new QRecord().withValue("id", 2).withValue("firstName", "James"), new QRecord().withValue("id", 3).withValue("firstName", "Tim") @@ -342,7 +342,7 @@ class GeneralProcessUtilsTest extends BaseTest { QInstance instance = QContext.getQInstance(); - TestUtils.insertRecords(instance, instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( + TestUtils.insertRecords(instance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY), List.of( new QRecord().withValue("id", 1).withValue("firstName", "Darin").withValue("lastName", "Kelkhoff"), new QRecord().withValue("id", 2).withValue("firstName", "James").withValue("lastName", "Maes"), new QRecord().withValue("id", 3).withValue("firstName", "James").withValue("lastName", "Brown") diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java index 62c0573e..e6de12b3 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java @@ -557,6 +557,7 @@ class CollectionUtilsTest extends BaseTest /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("unchecked") @Test void testUseOrWrap() { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java index 08a308e6..5d21ae0d 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java @@ -39,11 +39,11 @@ class ObjectUtilsTest /******************************************************************************* ** *******************************************************************************/ - @SuppressWarnings({ "DataFlowIssue", "ConfusingArgumentToVarargsMethod" }) @Test void testRequireNonNullElse() { - assertThatThrownBy(() -> ObjectUtils.requireNonNullElse(null)).isInstanceOf(NullPointerException.class); + Object nullObject = null; + assertThatThrownBy(() -> ObjectUtils.requireNonNullElse(nullObject)).isInstanceOf(NullPointerException.class); assertThatThrownBy(() -> ObjectUtils.requireNonNullElse(null, null)).isInstanceOf(NullPointerException.class); assertThatThrownBy(() -> ObjectUtils.requireNonNullElse(null, null, null)).isInstanceOf(NullPointerException.class); assertEquals("a", ObjectUtils.requireNonNullElse("a", "b")); 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 da654f3d..ff274dc9 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 @@ -357,17 +357,6 @@ public class TestUtils - /******************************************************************************* - ** - *******************************************************************************/ - @Deprecated(since = "better to call the one without qInstance param") - public static void insertRecords(QInstance qInstance, QTableMetaData table, List records) throws QException - { - insertRecords(table, records); - } - - - /******************************************************************************* ** *******************************************************************************/ diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ValueUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ValueUtilsTest.java index a28c0482..a726eca3 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ValueUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ValueUtilsTest.java @@ -303,9 +303,16 @@ class ValueUtilsTest extends BaseTest assertEquals(3, ValueUtils.getFirstNonNull(null, null, 3)); assertNull(ValueUtils.getFirstNonNull()); - assertNull(ValueUtils.getFirstNonNull(new Object[] { })); - assertNull(ValueUtils.getFirstNonNull(null)); - assertNull(ValueUtils.getFirstNonNull(null, null)); + + Object[] emptyArray = { }; + assertNull(ValueUtils.getFirstNonNull(emptyArray)); + + Object nullObject = null; + assertNull(ValueUtils.getFirstNonNull(nullObject)); + assertNull(ValueUtils.getFirstNonNull(null, nullObject)); + assertNull(ValueUtils.getFirstNonNull(nullObject, null)); + assertNull(ValueUtils.getFirstNonNull(nullObject, nullObject)); + assertNull(ValueUtils.getFirstNonNull(nullObject, nullObject, nullObject)); } diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index 57cef42d..00b31626 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -1212,7 +1212,7 @@ public class BaseAPIActionUtil { try { - requestBody = StringUtils.join("\n", IOUtils.readLines(entityRequest.getEntity().getContent())); + requestBody = StringUtils.join("\n", IOUtils.readLines(entityRequest.getEntity().getContent(), StandardCharsets.UTF_8)); } catch(Exception e) { diff --git a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiUtilsHelper.java b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiUtilsHelper.java index 314eed51..050b9c55 100644 --- a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiUtilsHelper.java +++ b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiUtilsHelper.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.api.mocks; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.Deque; import com.kingsrook.qqq.backend.core.exceptions.QException; @@ -221,6 +222,6 @@ public class MockApiUtilsHelper @SuppressWarnings("unchecked") public static String readRequestBody(HttpRequestBase request) throws IOException { - return (StringUtils.join("\n", IOUtils.readLines(((HttpEntityEnclosingRequestBase) request).getEntity().getContent()))); + return (StringUtils.join("\n", IOUtils.readLines(((HttpEntityEnclosingRequestBase) request).getEntity().getContent(), StandardCharsets.UTF_8))); } } diff --git a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockHttpResponse.java b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockHttpResponse.java index dbc61f69..9c32efd2 100644 --- a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockHttpResponse.java +++ b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockHttpResponse.java @@ -287,6 +287,7 @@ public class MockHttpResponse implements CloseableHttpResponse @Override + @SuppressWarnings("deprecation") public HttpParams getParams() { return null; @@ -295,6 +296,7 @@ public class MockHttpResponse implements CloseableHttpResponse @Override + @SuppressWarnings("deprecation") public void setParams(HttpParams httpParams) { diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractBaseFilesystemAction.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractBaseFilesystemAction.java index c010dad9..fdf343c6 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractBaseFilesystemAction.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractBaseFilesystemAction.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.module.filesystem.base.actions; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -222,7 +223,7 @@ public abstract class AbstractBaseFilesystemAction { case CSV: { - String fileContents = IOUtils.toString(inputStream); + String fileContents = IOUtils.toString(inputStream, StandardCharsets.UTF_8); fileContents = customizeFileContentsAfterReading(table, fileContents); if(queryInput.getRecordPipe() != null) @@ -245,7 +246,7 @@ public abstract class AbstractBaseFilesystemAction } case JSON: { - String fileContents = IOUtils.toString(inputStream); + String fileContents = IOUtils.toString(inputStream, StandardCharsets.UTF_8); fileContents = customizeFileContentsAfterReading(table, fileContents); // todo - pipe support!! diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java index 0762dd75..68a319ca 100644 --- a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/etl/basic/BasicETLCleanupSourceFilesStep.java @@ -129,7 +129,7 @@ public class BasicETLCleanupSourceFilesStep implements BackendStep .withName(this.getClass().getName()) .withCodeType(QCodeType.JAVA)) .withInputData(new QFunctionInputMetaData() - .addField(new QFieldMetaData("moveOrDelete", QFieldType.STRING)) - .addField(new QFieldMetaData("destinationForMoves", QFieldType.STRING)))); + .withField(new QFieldMetaData("moveOrDelete", QFieldType.STRING)) + .withField(new QFieldMetaData("destinationForMoves", QFieldType.STRING)))); } } 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 ba01a434..8339a973 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 @@ -69,10 +69,10 @@ public class FilesystemSyncProcess .withName(FilesystemSyncStep.class.getName()) .withCodeType(QCodeType.JAVA)) .withInputData(new QFunctionInputMetaData() - .addField(new QFieldMetaData(FIELD_SOURCE_TABLE, QFieldType.STRING)) - .addField(new QFieldMetaData(FIELD_ARCHIVE_TABLE, QFieldType.STRING)) - .addField(new QFieldMetaData(FIELD_MAX_FILES_TO_ARCHIVE, QFieldType.INTEGER).withDefaultValue(Integer.MAX_VALUE)) - .addField(new QFieldMetaData(FIELD_PROCESSING_TABLE, QFieldType.STRING))); + .withField(new QFieldMetaData(FIELD_SOURCE_TABLE, QFieldType.STRING)) + .withField(new QFieldMetaData(FIELD_ARCHIVE_TABLE, QFieldType.STRING)) + .withField(new QFieldMetaData(FIELD_MAX_FILES_TO_ARCHIVE, QFieldType.INTEGER).withDefaultValue(Integer.MAX_VALUE)) + .withField(new QFieldMetaData(FIELD_PROCESSING_TABLE, QFieldType.STRING))); return new QProcessMetaData() .withName(PROCESS_NAME) diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemActionTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemActionTest.java index 243f56c6..b81f94ef 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemActionTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemActionTest.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.module.filesystem.local.actions; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -115,14 +116,14 @@ public class FilesystemActionTest extends BaseTest {"id":2,"createDate":"2022-06-17 14:52:59","modifyDate":"2022-06-17 14:52:59","firstName":"Jane","lastName":"Smith","birthDate":"1982-02-02","email":"jane@kingsrook.com"} ] """; - FileUtils.writeStringToFile(new File(fullPath + "DATA-1.json"), jsonData1); + FileUtils.writeStringToFile(new File(fullPath + "DATA-1.json"), jsonData1, StandardCharsets.UTF_8); String jsonData2 = """ [ {"id":3,"createDate":"2021-11-27 15:40:38","modifyDate":"2021-11-27 15:40:38","firstName":"Homer","lastName":"S","birthDate":"1983-03-03","email":"homer.s@kingsrook.com"} ] """; - FileUtils.writeStringToFile(new File(fullPath + "DATA-2.json"), jsonData2); + FileUtils.writeStringToFile(new File(fullPath + "DATA-2.json"), jsonData2, StandardCharsets.UTF_8); } @@ -147,14 +148,14 @@ public class FilesystemActionTest extends BaseTest "1","2021-10-26 14:39:37","2021-10-26 14:39:37","John","Doe","1981-01-01","john@kingsrook.com" "2","2022-06-17 14:52:59","2022-06-17 14:52:59","Jane","Smith","1982-02-02","jane@kingsrook.com" """; - FileUtils.writeStringToFile(new File(fullPath + "FILE-1.csv"), csvData1); + FileUtils.writeStringToFile(new File(fullPath + "FILE-1.csv"), csvData1, StandardCharsets.UTF_8); String csvData2 = """ "id","createDate","modifyDate","firstName","lastName","birthDate","email" "3","2021-11-27 15:40:38","2021-11-27 15:40:38","Homer","S","1983-03-03","homer.s@kingsrook.com" "4","2022-07-18 15:53:00","2022-07-18 15:53:00","Marge","S","1984-04-04","marge.s@kingsrook.com" "5","2022-11-11 12:00:00","2022-11-12 13:00:00","Bart","S","1985-05-05","bart.s@kingsrook.com\""""; // intentionally no \n at EOL here - FileUtils.writeStringToFile(new File(fullPath + "FILE-2.csv"), csvData2); + FileUtils.writeStringToFile(new File(fullPath + "FILE-2.csv"), csvData2, StandardCharsets.UTF_8); } @@ -177,15 +178,15 @@ public class FilesystemActionTest extends BaseTest String data1 = """ Hello, Blob """; - FileUtils.writeStringToFile(new File(fullPath + "BLOB-1.txt"), data1); + FileUtils.writeStringToFile(new File(fullPath + "BLOB-1.txt"), data1, StandardCharsets.UTF_8); String data2 = """ Hi Bob"""; - FileUtils.writeStringToFile(new File(fullPath + "BLOB-2.txt"), data2); + FileUtils.writeStringToFile(new File(fullPath + "BLOB-2.txt"), data2, StandardCharsets.UTF_8); String data3 = """ # Hi MD..."""; - FileUtils.writeStringToFile(new File(fullPath + "BLOB-3.md"), data3); + FileUtils.writeStringToFile(new File(fullPath + "BLOB-3.md"), data3, StandardCharsets.UTF_8); } diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertActionTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertActionTest.java index 864f8757..f1f9b9cc 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertActionTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/actions/FilesystemInsertActionTest.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.module.filesystem.local.actions; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.exceptions.QException; @@ -64,7 +65,7 @@ public class FilesystemInsertActionTest extends FilesystemActionTest .allMatch(record -> record.getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH).contains(TestUtils.BASE_PATH)) .allMatch(record -> record.getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH).contains("blobs")); - assertEquals("Hello, World", FileUtils.readFileToString(new File(insertOutput.getRecords().get(0).getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH)))); + assertEquals("Hello, World", FileUtils.readFileToString(new File(insertOutput.getRecords().get(0).getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH)), StandardCharsets.UTF_8)); } 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 98b87e49..3bd46582 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 @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.filesystem.processes.implementations.et import java.io.File; +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -189,7 +190,7 @@ public class BasicETLCleanupSourceFilesStepTest extends BaseTest for(String filePath : filePathsSet) { File file = new File(filePath); - FileUtils.writeStringToFile(file, "content"); + FileUtils.writeStringToFile(file, "content", StandardCharsets.UTF_8); } // List records = filePaths.stream() diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcessTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcessTest.java index 0f38e654..ef71e424 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcessTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/processes/implementations/filesystem/sync/FilesystemSyncProcessTest.java @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.module.filesystem.processes.implementations.fi import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import com.kingsrook.qqq.backend.core.actions.processes.RunBackendStepAction; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; @@ -105,7 +106,7 @@ class FilesystemSyncProcessTest extends BaseTest { String path = ((FilesystemTableBackendDetails) table.getBackendDetails()).getBasePath(); File file = new File(basePath + "/" + path + "/" + name); - FileUtils.writeStringToFile(file, content); + FileUtils.writeStringToFile(file, content, StandardCharsets.UTF_8); } diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertActionTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertActionTest.java index ff45ff9a..63a6723a 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertActionTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/actions/S3InsertActionTest.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.filesystem.s3.actions; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import com.amazonaws.services.s3.model.S3Object; import com.kingsrook.qqq.backend.core.exceptions.QException; @@ -68,9 +69,9 @@ public class S3InsertActionTest extends BaseS3Test assertThat(insertOutput.getRecords()) .allMatch(record -> record.getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH).contains("blobs")); - String fullPath = insertOutput.getRecords().get(0).getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH); - S3Object object = getAmazonS3().getObject(BUCKET_NAME, fullPath); - List lines = IOUtils.readLines(object.getObjectContent()); + String fullPath = insertOutput.getRecords().get(0).getBackendDetailString(FilesystemRecordBackendDetailFields.FULL_PATH); + S3Object object = getAmazonS3().getObject(BUCKET_NAME, fullPath); + List lines = IOUtils.readLines(object.getObjectContent(), StandardCharsets.UTF_8); assertEquals("Hi, Bob.", lines.get(0)); } diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3UtilsTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3UtilsTest.java index cc1c007f..35984ee4 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3UtilsTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/S3UtilsTest.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.filesystem.s3.utils; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.List; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.kingsrook.qqq.backend.core.exceptions.QException; @@ -76,7 +77,7 @@ public class S3UtilsTest extends BaseS3Test List s3ObjectSummaries = s3Utils.listObjectsInBucketMatchingGlob(BUCKET_NAME, "test-files", ""); S3ObjectSummary s3ObjectSummary = s3ObjectSummaries.stream().filter(o -> o.getKey().contains("1.csv")).findAny().get(); InputStream inputStream = s3Utils.getObjectAsInputStream(s3ObjectSummary); - String csvFromS3 = IOUtils.toString(inputStream); + String csvFromS3 = IOUtils.toString(inputStream, StandardCharsets.UTF_8); assertEquals(getCSVData1(), csvFromS3, "File from S3 should match expected content"); } diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java index 7a84cc63..ee006df7 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.rdbms; 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; @@ -91,7 +92,7 @@ public class TestUtils { InputStream primeTestDatabaseSqlStream = RDBMSActionTest.class.getResourceAsStream("/" + sqlFileName); assertNotNull(primeTestDatabaseSqlStream); - List lines = (List) IOUtils.readLines(primeTestDatabaseSqlStream); + List lines = (List) 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(";")) diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionTest.java index fa27d4ea..fda4e03e 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionTest.java @@ -982,6 +982,7 @@ public class RDBMSQueryActionTest extends RDBMSActionTest ** *******************************************************************************/ @Test + @SuppressWarnings("unchecked") void testHeavyFields() throws QException { ////////////////////////////////////////////////////////// diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManagerTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManagerTest.java index 232be3b7..396a8c77 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManagerTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/QueryManagerTest.java @@ -293,6 +293,7 @@ class QueryManagerTest extends BaseTest ** confirms (more?) correct behavior *******************************************************************************/ @Test + @SuppressWarnings("deprecation") void testLocalDate() throws SQLException { try(Connection connection = getConnection()) @@ -304,17 +305,20 @@ class QueryManagerTest extends BaseTest ResultSet rs = preparedStatement.getResultSet(); rs.next(); - Date date = QueryManager.getDate(rs, 1); + Date date = QueryManager.getDate(rs, 1); + assertNotNull(date); assertEquals(1, date.getDate(), "Date value"); assertEquals(Month.OCTOBER.getValue(), date.getMonth() + 1, "Month value"); assertEquals(2013, date.getYear() + 1900, "Year value"); LocalDate localDate = QueryManager.getLocalDate(rs, 1); + assertNotNull(localDate); assertEquals(1, localDate.getDayOfMonth(), "Date value"); assertEquals(Month.OCTOBER, localDate.getMonth(), "Month value"); assertEquals(2013, localDate.getYear(), "Year value"); LocalDateTime localDateTime = QueryManager.getLocalDateTime(rs, 1); + assertNotNull(localDateTime); assertEquals(1, localDateTime.getDayOfMonth(), "Date value"); assertEquals(Month.OCTOBER, localDateTime.getMonth(), "Month value"); assertEquals(2013, localDateTime.getYear(), "Year value"); @@ -322,6 +326,7 @@ class QueryManagerTest extends BaseTest assertEquals(0, localDateTime.getMinute(), "Minute value"); OffsetDateTime offsetDateTime = QueryManager.getOffsetDateTime(rs, 1); + assertNotNull(offsetDateTime); assertEquals(1, offsetDateTime.getDayOfMonth(), "Date value"); assertEquals(Month.OCTOBER, offsetDateTime.getMonth(), "Month value"); assertEquals(2013, offsetDateTime.getYear(), "Year value"); diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiImplementation.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiImplementation.java index f5d53dbc..2525263f 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiImplementation.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiImplementation.java @@ -1388,7 +1388,7 @@ public class ApiImplementation List criteriaValues; if(selectedOperator.noOfValues == null) { - criteriaValues = Arrays.asList(value.split(",")); + criteriaValues = Arrays.stream(value.split(",")).map(Serializable.class::cast).toList(); } else if(selectedOperator.noOfValues == 1) { @@ -1404,7 +1404,7 @@ public class ApiImplementation } else if(selectedOperator.noOfValues == 2) { - criteriaValues = Arrays.asList(value.split(",")); + criteriaValues = Arrays.stream(value.split(",")).map(Serializable.class::cast).toList(); if(criteriaValues.size() != 2) { throw (new QBadRequestException("Operator " + selectedOperator.prefix + " for field " + name + " requires 2 values (received " + criteriaValues.size() + ")")); diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/implementations/savedreports/RenderSavedReportProcessApiMetaDataEnricher.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/implementations/savedreports/RenderSavedReportProcessApiMetaDataEnricher.java index 528adfe8..ae7b2757 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/implementations/savedreports/RenderSavedReportProcessApiMetaDataEnricher.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/implementations/savedreports/RenderSavedReportProcessApiMetaDataEnricher.java @@ -92,7 +92,9 @@ public class RenderSavedReportProcessApiMetaDataEnricher ApiFieldMetaDataContainer apiFieldMetaDataContainer = new ApiFieldMetaDataContainer().withDefaultApiFieldMetaData(defaultApiFieldMetaData); if(example instanceof List) { - defaultApiFieldMetaData.withExample(new ExampleWithListValue().withValue((List) example)); + @SuppressWarnings("unchecked") + List stringList = (List) example; + defaultApiFieldMetaData.withExample(new ExampleWithListValue().withValue(stringList)); } else { diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessSummaryListOutput.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessSummaryListOutput.java index 9abf7c0f..0fcb94a2 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessSummaryListOutput.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessSummaryListOutput.java @@ -62,6 +62,7 @@ public class ApiProcessSummaryListOutput implements ApiProcessOutputInterface @Override public HttpStatus.Code getSuccessStatusCode(RunProcessInput runProcessInput, RunProcessOutput runProcessOutput) { + @SuppressWarnings("unchecked") List processSummaryLineInterfaces = (List) runProcessOutput.getValues().get("processResults"); if(processSummaryLineInterfaces.isEmpty()) { @@ -134,7 +135,9 @@ public class ApiProcessSummaryListOutput implements ApiProcessOutputInterface { try { - ArrayList apiOutput = new ArrayList<>(); + ArrayList apiOutput = new ArrayList<>(); + + @SuppressWarnings("unchecked") List processSummaryLineInterfaces = (List) runProcessOutput.getValues().get("processResults"); for(ProcessSummaryLineInterface processSummaryLineInterface : processSummaryLineInterfaces) { diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/ApiImplementationTest.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/ApiImplementationTest.java index 376562c2..3b515ca8 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/ApiImplementationTest.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/ApiImplementationTest.java @@ -230,7 +230,9 @@ class ApiImplementationTest extends BaseTest // query for persons - make sure custom method ran // ///////////////////////////////////////////////////// Map queryResult = ApiImplementation.query(apiInstanceMetaData, TestUtils.CURRENT_API_VERSION, "person", Collections.emptyMap()); - assertEquals("value from prepareToProduceApiValues", ((List>) queryResult.get("records")).get(0).get("lastName")); + @SuppressWarnings("unchecked") + List> records = (List>) queryResult.get("records"); + assertEquals("value from prepareToProduceApiValues", records.get(0).get("lastName")); assertEquals(queryResult.get("count"), PersonLastNameBulkApiValueCustomizer.prepareWasCalledWithThisNoOfRecords); } diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/utils/ApiScriptUtilsTest.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/utils/ApiScriptUtilsTest.java index 483b6f37..26426b98 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/utils/ApiScriptUtilsTest.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/utils/ApiScriptUtilsTest.java @@ -311,6 +311,7 @@ class ApiScriptUtilsTest extends BaseTest Serializable result = apiScriptUtils.runProcess(TestUtils.PROCESS_NAME_TRANSFORM_PEOPLE, JsonUtils.toJson(Map.of("id", "1,2,3"))); assertThat(result).isInstanceOf(List.class); + @SuppressWarnings("unchecked") List> resultList = (List>) result; assertEquals(3, resultList.size()); @@ -332,6 +333,7 @@ class ApiScriptUtilsTest extends BaseTest Serializable asyncResult = apiScriptUtils.runProcess(TestUtils.PROCESS_NAME_TRANSFORM_PEOPLE, JsonUtils.toJson(Map.of("id", "1,2,3", "async", true))); assertThat(asyncResult).isInstanceOf(Map.class); + @SuppressWarnings("unchecked") String jobId = ValueUtils.getValueAsString(((Map) asyncResult).get("jobId")); assertNotNull(jobId); @@ -350,6 +352,7 @@ class ApiScriptUtilsTest extends BaseTest } assertThat(result).isInstanceOf(List.class); + @SuppressWarnings("unchecked") List> resultList = (List>) result; assertEquals(3, resultList.size()); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLogger.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLogger.java index 755fcb52..c947bef4 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLogger.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLogger.java @@ -383,11 +383,13 @@ public class QJavalinAccessLogger { if(runProcessOutput.getValues().containsKey(StreamedETLWithFrontendProcess.FIELD_PROCESS_SUMMARY)) { + @SuppressWarnings("unchecked") List processSummaryLines = (List) runProcessOutput.getValues().get(StreamedETLWithFrontendProcess.FIELD_PROCESS_SUMMARY); processSummaryListToLogPairs(logPairs, processSummaryLines); } else if(runProcessOutput.getValues().containsKey(StreamedETLWithFrontendProcess.FIELD_VALIDATION_SUMMARY)) { + @SuppressWarnings("unchecked") List processSummaryLines = (List) runProcessOutput.getValues().get(StreamedETLWithFrontendProcess.FIELD_VALIDATION_SUMMARY); processSummaryListToLogPairs(logPairs, processSummaryLines); } diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index 61fdc389..18c29fd5 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -28,6 +28,7 @@ import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.Serializable; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; @@ -41,6 +42,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; +import com.fasterxml.jackson.core.type.TypeReference; import com.kingsrook.qqq.backend.core.actions.async.AsyncJobManager; import com.kingsrook.qqq.backend.core.actions.dashboard.RenderWidgetAction; import com.kingsrook.qqq.backend.core.actions.metadata.MetaDataAction; @@ -223,7 +225,7 @@ public class QJavalinImplementation public QJavalinImplementation(String qInstanceFilePath) throws IOException { LOG.info("Loading qInstance from file (assuming json): " + qInstanceFilePath); - String qInstanceJson = FileUtils.readFileToString(new File(qInstanceFilePath)); + String qInstanceJson = FileUtils.readFileToString(new File(qInstanceFilePath), StandardCharsets.UTF_8); QJavalinImplementation.qInstance = new QInstanceAdapter().jsonToQInstanceIncludingBackends(qInstanceJson); QJavalinImplementation.javalinMetaData = new QJavalinMetaData(); } @@ -1800,7 +1802,7 @@ public class QJavalinImplementation if(CollectionUtils.nullSafeHasContents(valuesParamList)) { String valuesParam = valuesParamList.get(0); - values = JsonUtils.toObject(valuesParam, Map.class); + values = JsonUtils.toObject(valuesParam, new TypeReference<>(){}); } } diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java index 00a87d47..fd9eb11a 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.javalin; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.util.List; import java.util.Objects; @@ -119,7 +120,7 @@ public class TestUtils { InputStream primeTestDatabaseSqlStream = TestUtils.class.getResourceAsStream("/prime-test-database.sql"); 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(";")) @@ -365,7 +366,7 @@ public class TestUtils .withOutputMetaData(new QFunctionOutputMetaData() .withRecordListMetaData(new QRecordListMetaData() .withTableName(TABLE_NAME_PERSON) - .addField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) + .withField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) ) .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) ); @@ -402,7 +403,7 @@ public class TestUtils .withOutputMetaData(new QFunctionOutputMetaData() .withRecordListMetaData(new QRecordListMetaData() .withTableName(TABLE_NAME_PERSON) - .addField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) + .withField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) ) .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) ) @@ -514,7 +515,7 @@ public class TestUtils .withName(SleeperStep.class.getName()) .withCodeType(QCodeType.JAVA)) .withInputData(new QFunctionInputMetaData() - .addField(new QFieldMetaData(SleeperStep.FIELD_SLEEP_MILLIS, QFieldType.INTEGER)))); + .withField(new QFieldMetaData(SleeperStep.FIELD_SLEEP_MILLIS, QFieldType.INTEGER)))); } } @@ -571,7 +572,7 @@ public class TestUtils .withName(ThrowerStep.class.getName()) .withCodeType(QCodeType.JAVA)) .withInputData(new QFunctionInputMetaData() - .addField(new QFieldMetaData(ThrowerStep.FIELD_SLEEP_MILLIS, QFieldType.INTEGER)))); + .withField(new QFieldMetaData(ThrowerStep.FIELD_SLEEP_MILLIS, QFieldType.INTEGER)))); } } diff --git a/qqq-middleware-picocli/src/main/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementation.java b/qqq-middleware-picocli/src/main/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementation.java index b0583cdb..d92372a2 100644 --- a/qqq-middleware-picocli/src/main/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementation.java +++ b/qqq-middleware-picocli/src/main/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementation.java @@ -29,6 +29,7 @@ import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.Serializable; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -129,7 +130,7 @@ public class QPicoCliImplementation if(args.length > 0 && args[0].startsWith("--qInstanceJsonFile=")) { String filePath = args[0].replaceFirst("--.*=", ""); - String qInstanceJson = FileUtils.readFileToString(new File(filePath)); + String qInstanceJson = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8); qInstance = new QInstanceAdapter().jsonToQInstanceIncludingBackends(qInstanceJson); String[] subArgs = Arrays.copyOfRange(args, 1, args.length); @@ -716,7 +717,7 @@ public class QPicoCliImplementation try { String path = subParseResult.matchedOptionValue("--jsonFile", ""); - String json = FileUtils.readFileToString(new File(path)); + String json = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8); recordList = new JsonToQRecordAdapter().buildRecordsFromJson(json, table, mapping); } catch(IOException e) @@ -729,7 +730,7 @@ public class QPicoCliImplementation try { String path = subParseResult.matchedOptionValue("--csvFile", ""); - String csv = FileUtils.readFileToString(new File(path)); + String csv = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8); recordList = new CsvToQRecordAdapter().buildRecordsFromCsv(csv, table, mapping); } catch(IOException e) diff --git a/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java b/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java index ba858384..49191f90 100644 --- a/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java +++ b/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java @@ -395,7 +395,7 @@ class QPicoCliImplementationTest File file = new File("/tmp/" + UUID.randomUUID() + ".json"); file.deleteOnExit(); - FileUtils.writeStringToFile(file, jsonContents); + FileUtils.writeStringToFile(file, jsonContents, StandardCharsets.UTF_8); TestOutput testOutput = testCli("person", "insert", mapping, "--jsonFile=" + file.getAbsolutePath()); JSONObject insertResult = JsonUtils.toJSONObject(testOutput.getOutput()); @@ -433,7 +433,7 @@ class QPicoCliImplementationTest File file = new File("/tmp/" + UUID.randomUUID() + ".csv"); file.deleteOnExit(); - FileUtils.writeStringToFile(file, csvContents); + FileUtils.writeStringToFile(file, csvContents, StandardCharsets.UTF_8); TestOutput testOutput = testCli("person", "insert", mapping, "--csvFile=" + file.getAbsolutePath()); JSONObject insertResult = JsonUtils.toJSONObject(testOutput.getOutput()); @@ -683,8 +683,7 @@ class QPicoCliImplementationTest assertTestOutputContains(testOutput, "Wrote 3 records to file " + filename); File file = new File(filename); - @SuppressWarnings("unchecked") - List list = FileUtils.readLines(file); + List list = FileUtils.readLines(file, StandardCharsets.UTF_8); assertEquals(4, list.size()); assertThat(list.get(0)).contains(""" "Id","Create Date","Modify Date\""""); @@ -710,8 +709,7 @@ class QPicoCliImplementationTest assertTestOutputContains(testOutput, "Wrote 4 records to file " + filename); File file = new File(filename); - @SuppressWarnings("unchecked") - List list = FileUtils.readLines(file); + List list = FileUtils.readLines(file, StandardCharsets.UTF_8); assertEquals(5, list.size()); assertThat(list.get(0)).contains(""" "Id","Create Date","Modify Date\""""); @@ -842,8 +840,7 @@ class QPicoCliImplementationTest TestOutput testOutput = testCli("person", "export", "--filename=" + filename, "--fieldNames=id,lastName,birthDate"); File file = new File(filename); - @SuppressWarnings("unchecked") - List list = FileUtils.readLines(file); + List list = FileUtils.readLines(file, StandardCharsets.UTF_8); assertEquals(6, list.size()); assertThat(list.get(0)).isEqualTo(""" "Id","Last Name","Birth Date\""""); 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 cb226925..8a9e0a6d 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 @@ -23,6 +23,7 @@ package com.kingsrook.qqq.frontend.picocli; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.util.List; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType; @@ -65,7 +66,7 @@ public class TestUtils { InputStream primeTestDatabaseSqlStream = TestUtils.class.getResourceAsStream("/prime-test-database.sql"); assertNotNull(primeTestDatabaseSqlStream); - List lines = (List) IOUtils.readLines(primeTestDatabaseSqlStream); + List lines = (List) 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(";")) @@ -182,7 +183,7 @@ public class TestUtils .withOutputMetaData(new QFunctionOutputMetaData() .withRecordListMetaData(new QRecordListMetaData() .withTableName("person") - .addField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) + .withField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) ) .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) ); diff --git a/qqq-middleware-slack/src/main/java/com/kingsrook/qqq/slack/QSlackImplementation.java b/qqq-middleware-slack/src/main/java/com/kingsrook/qqq/slack/QSlackImplementation.java index 850491cc..4c1c17d2 100644 --- a/qqq-middleware-slack/src/main/java/com/kingsrook/qqq/slack/QSlackImplementation.java +++ b/qqq-middleware-slack/src/main/java/com/kingsrook/qqq/slack/QSlackImplementation.java @@ -115,7 +115,7 @@ public class QSlackImplementation public QSlackImplementation(String qInstanceFilePath) throws IOException { LOG.info("Loading qInstance from file (assuming json): " + qInstanceFilePath); - String qInstanceJson = FileUtils.readFileToString(new File(qInstanceFilePath)); + String qInstanceJson = FileUtils.readFileToString(new File(qInstanceFilePath), StandardCharsets.UTF_8); QSlackImplementation.qInstance = new QInstanceAdapter().jsonToQInstanceIncludingBackends(qInstanceJson); } diff --git a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index ec3355fe..411c78df 100644 --- a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -25,6 +25,7 @@ package com.kingsrook.sampleapp; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.util.List; import java.util.UUID; @@ -117,7 +118,6 @@ public class SampleMetaDataProviderTest /******************************************************************************* ** *******************************************************************************/ - @SuppressWarnings("unchecked") public static void primeTestDatabase(String sqlFileName) throws Exception { ConnectionManager connectionManager = new ConnectionManager(); @@ -125,7 +125,7 @@ public class SampleMetaDataProviderTest { InputStream primeTestDatabaseSqlStream = SampleMetaDataProviderTest.class.getResourceAsStream("/" + sqlFileName); assertNotNull(primeTestDatabaseSqlStream); - List lines = (List) IOUtils.readLines(primeTestDatabaseSqlStream); + List lines = (List) 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(";")) @@ -177,7 +177,7 @@ public class SampleMetaDataProviderTest id,name,state 1,Chester,IL 2,Red Bud,IL - 3,Sparta,IL"""); + 3,Sparta,IL""", StandardCharsets.UTF_8); return destinationFile; } From be0e1f9c0bc35133314a05b70dcd5b5ca1de7d2b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 19 Jul 2024 14:52:15 -0500 Subject: [PATCH 03/23] add some test coverage (updates to eliminate warnings put us just under threshold) --- .../javalin/QJavalinImplementationTest.java | 93 ++++++++++++++++++- .../qqq/backend/javalin/TestUtils.java | 78 ++++++++++++++++ .../test/resources/prime-test-database.sql | 15 +++ 3 files changed, 185 insertions(+), 1 deletion(-) diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java index 84382e57..8adbf274 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java @@ -31,6 +31,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Function; +import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportFormat; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType; @@ -556,7 +557,59 @@ class QJavalinImplementationTest extends QJavalinTestBase ** *******************************************************************************/ @Test - public void test_dataInsertMultipartForm() throws IOException + public void test_dataInsertMultipartForm() throws IOException, QException + { + HttpResponse response = Unirest.post(BASE_URL + "/data/person") + .header("Content-Type", "application/json") + .multiPartContent() + .field("firstName", "Bobby") + .field("lastName", "Hull") + .field("email", "bobby@hull.com") + .field("associations", """ + { + "pets": + [ + {"name": "Fido", "species": "dog"} + ] + } + """) + .asString(); + + assertEquals(200, response.getStatus()); + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertTrue(jsonObject.has("records")); + JSONArray records = jsonObject.getJSONArray("records"); + assertEquals(1, records.length()); + JSONObject record0 = records.getJSONObject(0); + Integer newPersonId = record0.getJSONObject("values").getInt("id"); + + ////////////////////////////////////////////////////////////////////////// + // get all the pets - assert a new one was inserted for this new person // + ////////////////////////////////////////////////////////////////////////// + HttpResponse petGetResponse = Unirest.get(BASE_URL + "/data/pet").asString(); + assertEquals(200, petGetResponse.getStatus()); + JSONObject petsJsonObject = JsonUtils.toJSONObject(petGetResponse.getBody()); + JSONArray petRecords = petsJsonObject.getJSONArray("records"); + boolean foundPetForNewPerson = false; + for(int i = 0; i < petRecords.length(); i++) + { + if(newPersonId.equals(petRecords.getJSONObject(i).getJSONObject("values").getInt("ownerPersonId"))) + { + assertEquals("Fido", petRecords.getJSONObject(i).getJSONObject("values").getString("name")); + foundPetForNewPerson = true; + } + } + assertTrue(foundPetForNewPerson); + } + + + + /******************************************************************************* + ** test an insert - posting a multipart form - including associations! + ** + *******************************************************************************/ + @Test + public void test_dataInsertMultipartFormWithAssocitions() throws IOException { try(InputStream photoInputStream = getClass().getResourceAsStream("/photo.png")) { @@ -972,6 +1025,44 @@ class QJavalinImplementationTest extends QJavalinTestBase + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testTimeZoneHeaders() + { + { + HttpResponse response = Unirest.get(BASE_URL + "/widget/timezoneWidget") + .header("X-QQQ-UserTimezoneOffsetMinutes", "300") + .header("X-QQQ-UserTimezone", "US/Central") + .asString(); + + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertEquals("300|US/Central", jsonObject.getString("html")); + } + + { + HttpResponse response = Unirest.get(BASE_URL + "/widget/timezoneWidget") + .header("X-QQQ-UserTimezoneOffsetMinutes", "-600") + .header("X-QQQ-UserTimezone", "SomeZone") + .asString(); + + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertEquals("-600|SomeZone", jsonObject.getString("html")); + } + + { + HttpResponse response = Unirest.get(BASE_URL + "/widget/timezoneWidget") + .header("X-QQQ-UserTimezoneOffsetMinutes", "foo") + .asString(); + + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertEquals("null|null", jsonObject.getString("html")); + } + } + + + /******************************************************************************* ** *******************************************************************************/ diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java index fd9eb11a..1920e0e5 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java @@ -30,8 +30,10 @@ import java.util.Objects; import java.util.Optional; import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizerInterface; import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizers; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; @@ -41,6 +43,10 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperat import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; +import com.kingsrook.qqq.backend.core.model.dashboard.widgets.RawHTML; +import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; @@ -71,9 +77,11 @@ import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportMetaData; import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportView; import com.kingsrook.qqq.backend.core.model.metadata.reporting.ReportType; import com.kingsrook.qqq.backend.core.model.metadata.tables.AssociatedScript; +import com.kingsrook.qqq.backend.core.model.metadata.tables.Association; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.savedviews.SavedViewsMetaDataProvider; import com.kingsrook.qqq.backend.core.model.scripts.ScriptsMetaDataProvider; +import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.core.model.statusmessages.QWarningMessage; import com.kingsrook.qqq.backend.core.modules.backend.implementations.memory.MemoryBackendModule; import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; @@ -93,6 +101,7 @@ public class TestUtils public static final String BACKEND_NAME_MEMORY = "memory"; public static final String TABLE_NAME_PERSON = "person"; + public static final String TABLE_NAME_PET = "pet"; public static final String PROCESS_NAME_GREET_PEOPLE_INTERACTIVE = "greetInteractive"; public static final String PROCESS_NAME_SIMPLE_SLEEP = "simpleSleep"; @@ -157,7 +166,9 @@ public class TestUtils qInstance.setAuthentication(defineAuthentication()); qInstance.addBackend(defineDefaultH2Backend()); qInstance.addTable(defineTablePerson()); + qInstance.addTable(defineTablePet()); qInstance.addJoin(definePersonJoinPartnerPerson()); + qInstance.addJoin(definePersonJoinPet()); qInstance.addProcess(defineProcessGreetPeople()); qInstance.addProcess(defineProcessGreetPeopleInteractive()); qInstance.addProcess(defineProcessSimpleSleep()); @@ -191,6 +202,12 @@ public class TestUtils qInstance.addWidget(new QWidgetMetaData() .withName(PersonsByCreateDateBarChart.class.getSimpleName()) .withCodeReference(new QCodeReference(PersonsByCreateDateBarChart.class))); + + qInstance.addWidget(new QWidgetMetaData() + .withName("timezoneWidget") + .withType(WidgetType.HTML.getType()) + .withCodeReference(new QCodeReference(TimezoneWidgetRenderer.class))); + } @@ -263,6 +280,7 @@ public class TestUtils .withField(new QFieldMetaData("testScriptId", QFieldType.INTEGER).withBackendName("test_script_id")) .withField(new QFieldMetaData("photo", QFieldType.BLOB).withBackendName("photo")) .withField(new QFieldMetaData("photoFileName", QFieldType.STRING).withBackendName("photo_file_name")) + .withAssociation(new Association().withName("pets").withJoinName("personJoinPet").withAssociatedTableName(TABLE_NAME_PET)) .withAssociatedScript(new AssociatedScript() .withFieldName("testScriptId") .withScriptTypeId(1) @@ -282,6 +300,31 @@ public class TestUtils + /******************************************************************************* + ** Define the pet table + ** + *******************************************************************************/ + public static QTableMetaData defineTablePet() + { + QTableMetaData qTableMetaData = new QTableMetaData() + .withName(TABLE_NAME_PET) + .withLabel("Pet") + .withRecordLabelFormat("%s") + .withRecordLabelFields("name") + .withBackendName(defineDefaultH2Backend().getName()) + .withPrimaryKeyField("id") + .withField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date")) + .withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date")) + .withField(new QFieldMetaData("ownerPersonId", QFieldType.INTEGER).withBackendName("owner_person_id")) + .withField(new QFieldMetaData("name", QFieldType.STRING).withBackendName("name")) + .withField(new QFieldMetaData("species", QFieldType.STRING).withBackendName("species")); + + return (qTableMetaData); + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -343,6 +386,21 @@ public class TestUtils + /******************************************************************************* + ** + *******************************************************************************/ + public static QJoinMetaData definePersonJoinPet() + { + return (new QJoinMetaData() + .withLeftTable(TABLE_NAME_PERSON) + .withRightTable(TABLE_NAME_PET) + .withType(JoinType.ONE_TO_MANY) + .withName("personJoinPet") + .withJoinOn(new JoinOn("id", "ownerPersonId"))); + } + + + /******************************************************************************* ** Define the 'greet people' process *******************************************************************************/ @@ -613,4 +671,24 @@ public class TestUtils new InsertAction().execute(insertInput); } + + + /*************************************************************************** + ** + ***************************************************************************/ + public static class TimezoneWidgetRenderer extends AbstractWidgetRenderer + { + + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public RenderWidgetOutput render(RenderWidgetInput input) throws QException + { + return (new RenderWidgetOutput(new RawHTML("title", + QContext.getQSession().getValue(QSession.VALUE_KEY_USER_TIMEZONE_OFFSET_MINUTES) + + "|" + QContext.getQSession().getValue(QSession.VALUE_KEY_USER_TIMEZONE) + ))); + } + } } diff --git a/qqq-middleware-javalin/src/test/resources/prime-test-database.sql b/qqq-middleware-javalin/src/test/resources/prime-test-database.sql index bd233046..06e306e0 100644 --- a/qqq-middleware-javalin/src/test/resources/prime-test-database.sql +++ b/qqq-middleware-javalin/src/test/resources/prime-test-database.sql @@ -42,3 +42,18 @@ INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (3, 'Ti INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (4, 'Tyler', 'Samples', '1990-01-01', 'tsamples@mmltholdings.com'); INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (5, 'Garret', 'Richardson', '1981-01-01', 'grichardson@mmltholdings.com'); INSERT INTO person (id, first_name, last_name, birth_date, email) VALUES (6, 'Linda', 'Kelkhoff', '1976-01-01', 'not-linda.kelkhoff@gmail.com'); + +DROP TABLE IF EXISTS pet; +CREATE TABLE pet +( + id INT AUTO_INCREMENT, + create_date TIMESTAMP DEFAULT now(), + modify_date TIMESTAMP DEFAULT now(), + + name VARCHAR(80) NOT NULL, + species VARCHAR(80) NOT NULL, + owner_person_id INT +); + +INSERT INTO pet (id, name, species, owner_person_id) VALUES (1, 'Chester', 'dog', 1); +INSERT INTO pet (id, name, species, owner_person_id) VALUES (2, 'Lucy', 'dog', 1); From 028751e23abd8987eb1052f40c8c19d408b8b6cf Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 19 Jul 2024 15:50:45 -0500 Subject: [PATCH 04/23] more test coverage for javalin (for new anonymous inner TypeReference) --- .../javalin/QJavalinImplementationTest.java | 22 +++++++++++++++++++ .../qqq/backend/javalin/TestUtils.java | 5 ++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java index 8adbf274..1a61710c 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java @@ -950,6 +950,28 @@ class QJavalinImplementationTest extends QJavalinTestBase + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testPossibleValueWithFilter() + { + HttpResponse response = Unirest.post(BASE_URL + "/data/pet/possibleValues/ownerPersonId?searchTerm=") + .field("values", """ + {"email":"tsamples@mmltholdings.com"} + """) + .asString(); + + assertEquals(200, response.getStatus()); + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertNotNull(jsonObject); + assertNotNull(jsonObject.getJSONArray("options")); + assertEquals(1, jsonObject.getJSONArray("options").length()); + assertEquals("Tyler Samples (4)", jsonObject.getJSONArray("options").getJSONObject(0).getString("label")); + } + + + /******************************************************************************* ** *******************************************************************************/ diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java index 1920e0e5..c08773fa 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java @@ -316,7 +316,10 @@ public class TestUtils .withField(new QFieldMetaData("id", QFieldType.INTEGER)) .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date")) .withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date")) - .withField(new QFieldMetaData("ownerPersonId", QFieldType.INTEGER).withBackendName("owner_person_id")) + .withField(new QFieldMetaData("ownerPersonId", QFieldType.INTEGER).withBackendName("owner_person_id") + .withPossibleValueSourceName(TABLE_NAME_PERSON) + .withPossibleValueSourceFilter(new QQueryFilter(new QFilterCriteria("email", QCriteriaOperator.EQUALS, "${input.email}"))) + ) .withField(new QFieldMetaData("name", QFieldType.STRING).withBackendName("name")) .withField(new QFieldMetaData("species", QFieldType.STRING).withBackendName("species")); From b7cfea157df9aad5ca2ec2b59385ba27896b2f82 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 17 Jul 2024 20:11:41 -0500 Subject: [PATCH 05/23] Checkstyle updates - remove MagicNumber - add MissingJavadocType - remove rules about contents of javadocs --- checkstyle/config.xml | 27 +++---------------- .../RecordAutomationStatusUpdater.java | 3 +++ .../AbstractPreInsertCustomizer.java | 8 +++--- .../ChildInserterPostInsertCustomizer.java | 3 +++ .../audits/AuditDetailAccumulator.java | 3 +++ .../query/expressions/NowWithOffset.java | 3 +++ .../query/expressions/ThisOrLastPeriod.java | 3 +++ .../model/dashboard/widgets/AlertData.java | 3 +++ .../widgets/blocks/BlockTooltip.java | 3 +++ .../dashboard/ParentWidgetMetaData.java | 3 +++ .../metadata/tables/cache/CacheUseCase.java | 3 +++ .../core/utils/collections/ListBuilder.java | 1 - .../core/utils/collections/MapBuilder.java | 1 - .../module/api/actions/BaseAPIActionUtil.java | 3 +++ .../processes/ApiProcessMetaData.java | 3 +++ 15 files changed, 40 insertions(+), 30 deletions(-) diff --git a/checkstyle/config.xml b/checkstyle/config.xml index 501849be..78c2f499 100644 --- a/checkstyle/config.xml +++ b/checkstyle/config.xml @@ -213,18 +213,6 @@ - - - - - - - - @@ -233,23 +221,14 @@ + + + - - - - - - - - - - - - diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java index beef50e5..4ef0409f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java @@ -344,6 +344,9 @@ public class RecordAutomationStatusUpdater + /*************************************************************************** + ** + ***************************************************************************/ private record Key(QTableMetaData table, TriggerEvent triggerEvent) {} } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java index c0706a5c..222f0328 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java @@ -55,10 +55,10 @@ public abstract class AbstractPreInsertCustomizer implements TableCustomizerInte - ///////////////////////////////////////////////////////////////////////////////// - // allow the customizer to specify when it should be executed as part of the // - // insert action. default (per method in this class) is AFTER_ALL_VALIDATIONS // - ///////////////////////////////////////////////////////////////////////////////// + /*************************************************************************** + ** allow the customizer to specify when it should be executed as part of the + ** insert action. default (per method in this class) is AFTER_ALL_VALIDATIONS + ***************************************************************************/ public enum WhenToRun { BEFORE_ALL_VALIDATIONS, diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java index 84363343..293b5759 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java @@ -49,6 +49,9 @@ import com.kingsrook.qqq.backend.core.utils.CollectionUtils; *******************************************************************************/ public abstract class ChildInserterPostInsertCustomizer extends AbstractPostInsertCustomizer { + /*************************************************************************** + ** + ***************************************************************************/ public enum RelationshipType { PARENT_POINTS_AT_CHILD, diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/audits/AuditDetailAccumulator.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/audits/AuditDetailAccumulator.java index bf653d41..e8e34a2e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/audits/AuditDetailAccumulator.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/audits/AuditDetailAccumulator.java @@ -152,5 +152,8 @@ public class AuditDetailAccumulator implements Serializable } + /*************************************************************************** + ** + ***************************************************************************/ private record TableNameAndPrimaryKey(String tableName, Serializable primaryKey) {} } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/NowWithOffset.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/NowWithOffset.java index 51f64c99..c941ea9e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/NowWithOffset.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/NowWithOffset.java @@ -42,6 +42,9 @@ public class NowWithOffset extends AbstractFilterExpression + /*************************************************************************** + ** + ***************************************************************************/ public enum Operator {PLUS, MINUS} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/ThisOrLastPeriod.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/ThisOrLastPeriod.java index 15fd1bfa..0f0e10ce 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/ThisOrLastPeriod.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/expressions/ThisOrLastPeriod.java @@ -43,6 +43,9 @@ public class ThisOrLastPeriod extends AbstractFilterExpression + /*************************************************************************** + ** + ***************************************************************************/ public enum Operator {THIS, LAST} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/AlertData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/AlertData.java index 28b60929..5c6567fb 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/AlertData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/AlertData.java @@ -28,6 +28,9 @@ package com.kingsrook.qqq.backend.core.model.dashboard.widgets; *******************************************************************************/ public class AlertData extends QWidgetData { + /*************************************************************************** + ** + ***************************************************************************/ public enum AlertType { ERROR, diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/BlockTooltip.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/BlockTooltip.java index 0f33376c..2e17134c 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/BlockTooltip.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/blocks/BlockTooltip.java @@ -33,6 +33,9 @@ public class BlockTooltip + /*************************************************************************** + ** + ***************************************************************************/ public enum Placement {BOTTOM, LEFT, RIGHT, TOP} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java index 77657937..797fe882 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java @@ -39,6 +39,9 @@ public class ParentWidgetMetaData extends QWidgetMetaData + /*************************************************************************** + ** + ***************************************************************************/ public enum LayoutType { GRID, diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java index 7f5852fb..8d12cee6 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/cache/CacheUseCase.java @@ -32,6 +32,9 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.UniqueKey; *******************************************************************************/ public class CacheUseCase { + /*************************************************************************** + ** + ***************************************************************************/ public enum Type { PRIMARY_KEY_TO_PRIMARY_KEY, // e.g., the primary key in the cache table equals the primary key in the source table. diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/ListBuilder.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/ListBuilder.java index 5bec5e53..9e46aa42 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/ListBuilder.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/ListBuilder.java @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.List; -@SuppressWarnings({ "checkstyle:javadoc", "DanglingJavadoc" }) /******************************************************************************* ** List.of is "great", but annoying because it makes unmodifiable lists... ** So, replace it with this, which returns ArrayLists, which "don't suck" diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java index e03d4283..a0eb7f20 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java @@ -27,7 +27,6 @@ import java.util.Map; import java.util.function.Supplier; -@SuppressWarnings({ "checkstyle:javadoc", "DanglingJavadoc" }) /******************************************************************************* ** Map.of is "great", but annoying because it makes unmodifiable maps, and it ** NPE's on nulls... So, replace it with this, which returns HashMaps (or maps diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index 57cef42d..1f4f3281 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -117,6 +117,9 @@ public class BaseAPIActionUtil + /*************************************************************************** + ** + ***************************************************************************/ public enum UpdateHttpMethod {PUT, POST} diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessMetaData.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessMetaData.java index e1694dd7..5da8c160 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessMetaData.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/metadata/processes/ApiProcessMetaData.java @@ -69,6 +69,9 @@ public class ApiProcessMetaData + /*************************************************************************** + ** + ***************************************************************************/ public enum AsyncMode { NEVER, From 22d5bc547ca3c2b47d69ee24eb035ed775f393b4 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 17 Jul 2024 20:23:10 -0500 Subject: [PATCH 06/23] Add includeTestSourceDirectory=true to checkstyle config --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 95ac1378..5a440646 100644 --- a/pom.xml +++ b/pom.xml @@ -168,6 +168,7 @@ warning **/target/generated-sources/*.* + true check From 840e1aada395b98a394772e360c013c648b58054 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 17 Jul 2024 20:31:41 -0500 Subject: [PATCH 07/23] Applying checkstyle updates to test sources --- .../dashboard/widgets/TableDataAssert.java | 19 +- .../dashboard/widgets/TableDataRowAssert.java | 19 +- .../metadata/ProcessMetaDataActionTest.java | 3 +- .../metadata/TableMetaDataActionTest.java | 3 +- .../RunProcessUpdateStepListTest.java | 20 +- .../actions/values/QValueFormatterTest.java | 2 +- .../instances/QInstanceValidatorTest.java | 344 ++++++++++-------- .../backend/core/logging/LogUtilsTest.java | 2 + .../fields/CaseChangeBehaviorTest.java | 2 +- .../insert/BulkInsertTransformStepTest.java | 11 +- .../basic/BasicETLTransformFunctionTest.java | 3 + .../MergeDuplicatesProcessTest.java | 2 +- .../tablesync/TableSyncProcessTest.java | 4 +- .../scheduler/quartz/QuartzTestUtils.java | 2 +- .../backend/core/testutils/PersonQRecord.java | 21 ++ .../qqq/backend/core/utils/JsonUtilsTest.java | 3 + .../qqq/backend/module/api/TestUtils.java | 15 +- .../local/FilesystemBackendModuleTest.java | 2 +- .../filesystem/s3/S3BackendModuleTest.java | 2 +- .../s3/utils/PathMatcherGlobTest.java | 3 + .../qqq/backend/module/mongodb/TestUtils.java | 3 +- .../qqq/backend/module/rdbms/TestUtils.java | 3 +- .../rdbms/actions/RDBMSDeleteActionTest.java | 12 +- .../rdbms/actions/RDBMSInsertActionTest.java | 6 +- .../rdbms/actions/RDBMSUpdateActionTest.java | 27 +- .../rdbms/jdbc/ConnectionManagerTest.java | 6 + .../actions/GetTableApiFieldsActionTest.java | 2 +- .../metadata/ApiInstanceMetaDataTest.java | 4 +- .../javalin/QJavalinAccessLoggerTest.java | 13 +- .../javalin/QJavalinScriptsHandlerTest.java | 3 + .../qqq/backend/javalin/QJavalinTestBase.java | 2 +- .../lambda/QBaseCustomLambdaHandlerTest.java | 3 + .../picocli/QPicoCliImplementationTest.java | 6 +- .../sampleapp/SampleMetaDataProviderTest.java | 7 +- 34 files changed, 353 insertions(+), 226 deletions(-) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataAssert.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataAssert.java index 5724f815..eaa402eb 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataAssert.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataAssert.java @@ -1,5 +1,22 @@ /* - * Copyright © 2022-2023. ColdTrack . All Rights Reserved. + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataRowAssert.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataRowAssert.java index 83ecf3ad..ebb10b2f 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataRowAssert.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/TableDataRowAssert.java @@ -1,5 +1,22 @@ /* - * Copyright © 2022-2023. ColdTrack . All Rights Reserved. + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataActionTest.java index 9bc9ce67..69cf9fb7 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/ProcessMetaDataActionTest.java @@ -67,7 +67,8 @@ class ProcessMetaDataActionTest extends BaseTest @Test public void test_notFound() { - assertThrows(QNotFoundException.class, () -> { + assertThrows(QNotFoundException.class, () -> + { ProcessMetaDataInput request = new ProcessMetaDataInput(); request.setProcessName("willNotBeFound"); new ProcessMetaDataAction().execute(request); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataActionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataActionTest.java index 780c1880..c623e53a 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataActionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/metadata/TableMetaDataActionTest.java @@ -65,7 +65,8 @@ class TableMetaDataActionTest extends BaseTest @Test public void test_notFound() { - assertThrows(QUserFacingException.class, () -> { + assertThrows(QUserFacingException.class, () -> + { TableMetaDataInput request = new TableMetaDataInput(); request.setTableName("willNotBeFound"); new TableMetaDataAction().execute(request); 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 7ae1ab99..bbafad3f 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 @@ -51,16 +51,16 @@ public class RunProcessUpdateStepListTest extends BaseTest { private static final String PROCESS_NAME = RunProcessUpdateStepListTest.class.getSimpleName(); - private final static String STEP_START = "start"; - private final static String STEP_A = "a"; - private final static String STEP_B = "b"; - private final static String STEP_C = "c"; - private final static String STEP_1 = "1"; - private final static String STEP_2 = "2"; - private final static String STEP_3 = "3"; - private final static String STEP_END = "end"; + private static final String STEP_START = "start"; + private static final String STEP_A = "a"; + private static final String STEP_B = "b"; + private static final String STEP_C = "c"; + private static final String STEP_1 = "1"; + private static final String STEP_2 = "2"; + private static final String STEP_3 = "3"; + private static final String STEP_END = "end"; - private final static List LETTERS_STEP_LIST = List.of( + private static final List LETTERS_STEP_LIST = List.of( STEP_START, STEP_A, STEP_B, @@ -68,7 +68,7 @@ public class RunProcessUpdateStepListTest extends BaseTest STEP_END ); - private final static List NUMBERS_STEP_LIST = List.of( + private static final List NUMBERS_STEP_LIST = List.of( STEP_START, STEP_1, STEP_2, diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java index 8760b0fb..a937b4ad 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java @@ -36,10 +36,10 @@ import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.context.QContext; 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.fields.DateTimeDisplayValueBehavior; import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; -import com.kingsrook.qqq.backend.core.model.metadata.fields.DateTimeDisplayValueBehavior; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.utils.TestUtils; import org.junit.jupiter.api.Test; 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 6f958c64..68d1c8c2 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 @@ -169,10 +169,10 @@ public class QInstanceValidatorTest extends BaseTest public void test_validateNullTablesAndProcesses() { assertValidationFailureReasons((qInstance) -> - { - qInstance.setTables(null); - qInstance.setProcesses(null); - }, + { + qInstance.setTables(null); + qInstance.setProcesses(null); + }, true, "At least 1 table must be defined"); } @@ -187,10 +187,10 @@ public class QInstanceValidatorTest extends BaseTest public void test_validateEmptyTablesAndProcesses() { assertValidationFailureReasons((qInstance) -> - { - qInstance.setTables(new HashMap<>()); - qInstance.setProcesses(new HashMap<>()); - }, + { + qInstance.setTables(new HashMap<>()); + qInstance.setProcesses(new HashMap<>()); + }, true, "At least 1 table must be defined"); } @@ -548,7 +548,8 @@ public class QInstanceValidatorTest extends BaseTest //////////////////////////////////////// // make sure our always failer fails. // //////////////////////////////////////// - assertValidationFailureReasonsAllowingExtraReasons((qInstance) -> { + assertValidationFailureReasonsAllowingExtraReasons((qInstance) -> + { }, "always fail"); } finally @@ -558,7 +559,8 @@ public class QInstanceValidatorTest extends BaseTest //////////////////////////////////////////////////// // make sure if remove all plugins, we don't fail // //////////////////////////////////////////////////// - assertValidationSuccess((qInstance) -> { + assertValidationSuccess((qInstance) -> + { }); } } @@ -627,6 +629,9 @@ public class QInstanceValidatorTest extends BaseTest *******************************************************************************/ public static class CustomizerWithNoVoidConstructor { + /*************************************************************************** + ** + ***************************************************************************/ public CustomizerWithNoVoidConstructor(boolean b) { @@ -640,6 +645,9 @@ public class QInstanceValidatorTest extends BaseTest *******************************************************************************/ private static class CustomizerWithPrivateVisibility extends AbstractPostQueryCustomizer { + /*************************************************************************** + ** + ***************************************************************************/ public CustomizerWithPrivateVisibility() { System.out.println("eh?"); @@ -664,6 +672,9 @@ public class QInstanceValidatorTest extends BaseTest *******************************************************************************/ public static class CustomizerWithOnlyPrivateConstructor { + /*************************************************************************** + ** + ***************************************************************************/ private CustomizerWithOnlyPrivateConstructor() { @@ -1108,15 +1119,16 @@ public class QInstanceValidatorTest extends BaseTest @Test void testPossibleValueSourceMisConfiguredEnum() { - assertValidationFailureReasons((qInstance) -> { - QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE); - possibleValueSource.setTableName("person"); - possibleValueSource.setSearchFields(List.of("id")); - possibleValueSource.setOrderByFields(List.of(new QFilterOrderBy("id"))); - possibleValueSource.setCustomCodeReference(new QCodeReference()); - possibleValueSource.setEnumValues(null); - possibleValueSource.setType(QPossibleValueSourceType.ENUM); - }, + assertValidationFailureReasons((qInstance) -> + { + QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_STATE); + possibleValueSource.setTableName("person"); + possibleValueSource.setSearchFields(List.of("id")); + possibleValueSource.setOrderByFields(List.of(new QFilterOrderBy("id"))); + possibleValueSource.setCustomCodeReference(new QCodeReference()); + possibleValueSource.setEnumValues(null); + possibleValueSource.setType(QPossibleValueSourceType.ENUM); + }, "should not have a tableName", "should not have searchFields", "should not have orderByFields", @@ -1135,15 +1147,16 @@ public class QInstanceValidatorTest extends BaseTest @Test void testPossibleValueSourceMisConfiguredTable() { - assertValidationFailureReasons((qInstance) -> { - QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_SHAPE); - possibleValueSource.setTableName(null); - possibleValueSource.setSearchFields(null); - possibleValueSource.setOrderByFields(new ArrayList<>()); - possibleValueSource.setCustomCodeReference(new QCodeReference()); - possibleValueSource.setEnumValues(List.of(new QPossibleValue<>("test"))); - possibleValueSource.setType(QPossibleValueSourceType.TABLE); - }, + assertValidationFailureReasons((qInstance) -> + { + QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_SHAPE); + possibleValueSource.setTableName(null); + possibleValueSource.setSearchFields(null); + possibleValueSource.setOrderByFields(new ArrayList<>()); + possibleValueSource.setCustomCodeReference(new QCodeReference()); + possibleValueSource.setEnumValues(List.of(new QPossibleValue<>("test"))); + possibleValueSource.setType(QPossibleValueSourceType.TABLE); + }, "should not have enum values", "should not have a customCodeReference", "is missing a tableName", @@ -1165,15 +1178,16 @@ public class QInstanceValidatorTest extends BaseTest @Test void testPossibleValueSourceMisConfiguredCustom() { - assertValidationFailureReasons((qInstance) -> { - QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_CUSTOM); - possibleValueSource.setTableName("person"); - possibleValueSource.setSearchFields(List.of("id")); - possibleValueSource.setOrderByFields(List.of(new QFilterOrderBy("id"))); - possibleValueSource.setCustomCodeReference(null); - possibleValueSource.setEnumValues(List.of(new QPossibleValue<>("test"))); - possibleValueSource.setType(QPossibleValueSourceType.CUSTOM); - }, + assertValidationFailureReasons((qInstance) -> + { + QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(TestUtils.POSSIBLE_VALUE_SOURCE_CUSTOM); + possibleValueSource.setTableName("person"); + possibleValueSource.setSearchFields(List.of("id")); + possibleValueSource.setOrderByFields(List.of(new QFilterOrderBy("id"))); + possibleValueSource.setCustomCodeReference(null); + possibleValueSource.setEnumValues(List.of(new QPossibleValue<>("test"))); + possibleValueSource.setType(QPossibleValueSourceType.CUSTOM); + }, "should not have enum values", "should not have a tableName", "should not have searchFields", @@ -1272,10 +1286,10 @@ public class QInstanceValidatorTest extends BaseTest "action missing a name"); assertValidationFailureReasons((qInstance) -> - { - List actions = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY).getAutomationDetails().getActions(); - actions.add(actions.get(0)); - }, + { + List actions = qInstance.getTable(TestUtils.TABLE_NAME_PERSON_MEMORY).getAutomationDetails().getActions(); + actions.add(actions.get(0)); + }, "more than one action named"); } @@ -1315,19 +1329,19 @@ public class QInstanceValidatorTest extends BaseTest void testTableAutomationActionProcessName() { assertValidationFailureReasons((qInstance) -> - { - TableAutomationAction action = getAction0(qInstance); - action.setCodeReference(null); - action.setProcessName("notAProcess"); - }, + { + TableAutomationAction action = getAction0(qInstance); + action.setCodeReference(null); + action.setProcessName("notAProcess"); + }, "unrecognized processName"); assertValidationFailureReasons((qInstance) -> - { - TableAutomationAction action = getAction0(qInstance); - action.setCodeReference(null); - action.setProcessName(TestUtils.PROCESS_NAME_BASEPULL); - }, + { + TableAutomationAction action = getAction0(qInstance); + action.setCodeReference(null); + action.setProcessName(TestUtils.PROCESS_NAME_BASEPULL); + }, "different table"); } @@ -1340,19 +1354,19 @@ public class QInstanceValidatorTest extends BaseTest void testTableAutomationActionCodeReferenceAndProcessName() { assertValidationFailureReasons((qInstance) -> - { - TableAutomationAction action = getAction0(qInstance); - action.setCodeReference(null); - action.setProcessName(null); - }, + { + TableAutomationAction action = getAction0(qInstance); + action.setCodeReference(null); + action.setProcessName(null); + }, "missing both"); assertValidationFailureReasons((qInstance) -> - { - TableAutomationAction action = getAction0(qInstance); - action.setCodeReference(new QCodeReference(TestUtils.CheckAge.class)); - action.setProcessName(TestUtils.PROCESS_NAME_INCREASE_BIRTHDATE); - }, + { + TableAutomationAction action = getAction0(qInstance); + action.setCodeReference(new QCodeReference(TestUtils.CheckAge.class)); + action.setProcessName(TestUtils.PROCESS_NAME_INCREASE_BIRTHDATE); + }, "has both"); } @@ -1365,21 +1379,21 @@ public class QInstanceValidatorTest extends BaseTest void testTableAutomationActionFilter() { assertValidationFailureReasons((qInstance) -> - { - TableAutomationAction action = getAction0(qInstance); - action.setFilter(new QQueryFilter() - .withCriteria(new QFilterCriteria()) - ); - }, + { + TableAutomationAction action = getAction0(qInstance); + action.setFilter(new QQueryFilter() + .withCriteria(new QFilterCriteria()) + ); + }, "without a field name", "without an operator"); assertValidationFailureReasons((qInstance) -> - { - TableAutomationAction action = getAction0(qInstance); - action.setFilter(new QQueryFilter() - .withCriteria(new QFilterCriteria("notAField", QCriteriaOperator.EQUALS, Collections.emptyList())) - ); - }, + { + TableAutomationAction action = getAction0(qInstance); + action.setFilter(new QQueryFilter() + .withCriteria(new QFilterCriteria("notAField", QCriteriaOperator.EQUALS, Collections.emptyList())) + ); + }, "unrecognized field"); } @@ -1484,13 +1498,13 @@ public class QInstanceValidatorTest extends BaseTest void testQueueProviderSQSAttributes() { assertValidationFailureReasons((qInstance) -> - { - SQSQueueProviderMetaData queueProvider = (SQSQueueProviderMetaData) qInstance.getQueueProvider(TestUtils.DEFAULT_QUEUE_PROVIDER); - queueProvider.setAccessKey(null); - queueProvider.setSecretKey(""); - queueProvider.setRegion(null); - queueProvider.setBaseURL(""); - }, + { + SQSQueueProviderMetaData queueProvider = (SQSQueueProviderMetaData) qInstance.getQueueProvider(TestUtils.DEFAULT_QUEUE_PROVIDER); + queueProvider.setAccessKey(null); + queueProvider.setSecretKey(""); + queueProvider.setRegion(null); + queueProvider.setBaseURL(""); + }, "Missing accessKey", "Missing secretKey", "Missing region", "Missing baseURL"); } @@ -1607,43 +1621,43 @@ public class QInstanceValidatorTest extends BaseTest void testReportDataSourceNames() { assertValidationFailureReasons((qInstance) -> - { - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // enricher will give us a default name if only 1 data source, so, set 1st one to null name, then add a second // - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// - QReportMetaData report = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON); - report.setDataSources(new ArrayList<>(report.getDataSources())); - report.getDataSources().get(0).setName(null); - report.getDataSources().add(new QReportDataSource() - .withName("2nd") - .withSourceTable(TestUtils.TABLE_NAME_PERSON) - ); - }, + { + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // enricher will give us a default name if only 1 data source, so, set 1st one to null name, then add a second // + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + QReportMetaData report = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON); + report.setDataSources(new ArrayList<>(report.getDataSources())); + report.getDataSources().get(0).setName(null); + report.getDataSources().add(new QReportDataSource() + .withName("2nd") + .withSourceTable(TestUtils.TABLE_NAME_PERSON) + ); + }, "Missing name for a dataSource", "unrecognized dataSourceName"); assertValidationFailureReasons((qInstance) -> - { - /////////////////////////////////// - // same as above, but "" vs null // - /////////////////////////////////// - QReportMetaData report = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON); - report.setDataSources(new ArrayList<>(report.getDataSources())); - report.getDataSources().get(0).setName(""); - report.getDataSources().add(new QReportDataSource() - .withName("2nd") - .withSourceTable(TestUtils.TABLE_NAME_PERSON) - ); - }, + { + /////////////////////////////////// + // same as above, but "" vs null // + /////////////////////////////////// + QReportMetaData report = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON); + report.setDataSources(new ArrayList<>(report.getDataSources())); + report.getDataSources().get(0).setName(""); + report.getDataSources().add(new QReportDataSource() + .withName("2nd") + .withSourceTable(TestUtils.TABLE_NAME_PERSON) + ); + }, "Missing name for a dataSource", "unrecognized dataSourceName"); assertValidationFailureReasons((qInstance) -> - { - List dataSources = new ArrayList<>(qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getDataSources()); - dataSources.add(dataSources.get(0)); - qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).setDataSources(dataSources); - }, + { + List dataSources = new ArrayList<>(qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getDataSources()); + dataSources.add(dataSources.get(0)); + qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).setDataSources(dataSources); + }, "More than one dataSource with name"); } @@ -1702,19 +1716,19 @@ public class QInstanceValidatorTest extends BaseTest "has both a sourceTable and a staticDataSupplier"); assertValidationFailureReasons((qInstance) -> - { - QReportDataSource dataSource = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getDataSources().get(0); - dataSource.setSourceTable(null); - dataSource.setStaticDataSupplier(new QCodeReference(null, QCodeType.JAVA)); - }, + { + QReportDataSource dataSource = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getDataSources().get(0); + dataSource.setSourceTable(null); + dataSource.setStaticDataSupplier(new QCodeReference(null, QCodeType.JAVA)); + }, "missing a code reference name"); assertValidationFailureReasons((qInstance) -> - { - QReportDataSource dataSource = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getDataSources().get(0); - dataSource.setSourceTable(null); - dataSource.setStaticDataSupplier(new QCodeReference(ArrayList.class)); - }, + { + QReportDataSource dataSource = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getDataSources().get(0); + dataSource.setSourceTable(null); + dataSource.setStaticDataSupplier(new QCodeReference(ArrayList.class)); + }, "is not of the expected type"); } @@ -1773,11 +1787,11 @@ public class QInstanceValidatorTest extends BaseTest "has a column with no name"); assertValidationFailureReasons((qInstance) -> - { - List columns = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getViews().get(0).getColumns(); - columns.get(0).setName("id"); - columns.get(1).setName("id"); - }, + { + List columns = qInstance.getReport(TestUtils.REPORT_NAME_SHAPES_PERSON).getViews().get(0).getColumns(); + columns.get(0).setName("id"); + columns.get(1).setName("id"); + }, "has multiple columns named: id"); } @@ -1990,35 +2004,35 @@ public class QInstanceValidatorTest extends BaseTest "Table A exposedJoin B is missing a label"); assertValidationFailureReasons(qInstance -> - { - qInstance.addTable(newTable("A", "id").withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("B").withJoinPath(List.of("notAJoin")))); - qInstance.addTable(newTable("B", "id", "aId")); - qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("B").withName("AB").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); - }, + { + qInstance.addTable(newTable("A", "id").withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("B").withJoinPath(List.of("notAJoin")))); + qInstance.addTable(newTable("B", "id", "aId")); + qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("B").withName("AB").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); + }, "does not match a valid join connection in the instance"); assertValidationFailureReasons(qInstance -> - { - qInstance.addTable(newTable("A", "id") - .withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("foo").withJoinPath(List.of("AB"))) - .withExposedJoin(new ExposedJoin().withJoinTable("C").withLabel("foo").withJoinPath(List.of("AC"))) - ); - qInstance.addTable(newTable("B", "id", "aId")); - qInstance.addTable(newTable("C", "id", "aId")); - qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("B").withName("AB").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); - qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("C").withName("AC").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); - }, + { + qInstance.addTable(newTable("A", "id") + .withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("foo").withJoinPath(List.of("AB"))) + .withExposedJoin(new ExposedJoin().withJoinTable("C").withLabel("foo").withJoinPath(List.of("AC"))) + ); + qInstance.addTable(newTable("B", "id", "aId")); + qInstance.addTable(newTable("C", "id", "aId")); + qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("B").withName("AB").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); + qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("C").withName("AC").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); + }, "more than one join labeled: foo"); assertValidationFailureReasons(qInstance -> - { - qInstance.addTable(newTable("A", "id") - .withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("B1").withJoinPath(List.of("AB"))) - .withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("B2").withJoinPath(List.of("AB"))) - ); - qInstance.addTable(newTable("B", "id", "aId")); - qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("B").withName("AB").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); - }, + { + qInstance.addTable(newTable("A", "id") + .withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("B1").withJoinPath(List.of("AB"))) + .withExposedJoin(new ExposedJoin().withJoinTable("B").withLabel("B2").withJoinPath(List.of("AB"))) + ); + qInstance.addTable(newTable("B", "id", "aId")); + qInstance.addJoin(new QJoinMetaData().withLeftTable("A").withRightTable("B").withName("AB").withType(JoinType.ONE_TO_ONE).withJoinOn(new JoinOn("id", "aId"))); + }, "than one join with the joinPath: [AB]"); assertValidationSuccess(qInstance -> @@ -2275,11 +2289,14 @@ public class QInstanceValidatorTest extends BaseTest - /////////////////////////////////////////////// - // test classes for validating process steps // - /////////////////////////////////////////////// + /*************************************************************************** + ** test classes for validating process steps + ***************************************************************************/ public abstract class TestAbstractClass extends AbstractTransformStep { + /*************************************************************************** + ** + ***************************************************************************/ public void runOnePage(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { } @@ -2287,17 +2304,23 @@ public class QInstanceValidatorTest extends BaseTest - /////////////////////////////////////////////// - // // - /////////////////////////////////////////////// + /*************************************************************************** + ** + ***************************************************************************/ private class TestPrivateClass extends AbstractTransformStep { + /*************************************************************************** + ** + ***************************************************************************/ public void runOnePage(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { } + /*************************************************************************** + ** + ***************************************************************************/ @Override public ArrayList getProcessSummary(RunBackendStepOutput runBackendStepOutput, boolean isForResultScreen) { @@ -2307,11 +2330,14 @@ public class QInstanceValidatorTest extends BaseTest - /////////////////////////////////////////////// - // // - /////////////////////////////////////////////// + /*************************************************************************** + ** + ***************************************************************************/ public class TestNoArgsConstructorClass extends AbstractTransformStep { + /*************************************************************************** + ** + ***************************************************************************/ public TestNoArgsConstructorClass(int i) { @@ -2319,12 +2345,18 @@ public class QInstanceValidatorTest extends BaseTest + /*************************************************************************** + ** + ***************************************************************************/ public void runOnePage(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { } + /*************************************************************************** + ** + ***************************************************************************/ @Override public ArrayList getProcessSummary(RunBackendStepOutput runBackendStepOutput, boolean isForResultScreen) { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/logging/LogUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/logging/LogUtilsTest.java index 1b2ee4ea..ec496fcb 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/logging/LogUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/logging/LogUtilsTest.java @@ -33,6 +33,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; /******************************************************************************* ** Unit test for com.kingsrook.qqq.backend.core.logging.LogUtils *******************************************************************************/ +@SuppressWarnings("checkstyle:FileTabCharacter") class LogUtilsTest extends BaseTest { private static final QLogger LOG = QLogger.getLogger(LogUtilsTest.class); @@ -123,6 +124,7 @@ class LogUtilsTest extends BaseTest /******************************************************************************* ** *******************************************************************************/ + @SuppressWarnings("checkstyle:FileTabCharacter") @Test void testFilterStackTraceMySqlConnection() { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/CaseChangeBehaviorTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/CaseChangeBehaviorTest.java index b5851024..61f91bb0 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/CaseChangeBehaviorTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/model/metadata/fields/CaseChangeBehaviorTest.java @@ -52,7 +52,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; *******************************************************************************/ class CaseChangeBehaviorTest extends BaseTest { - public static final String FIELD = "firstName" ; + public static final String FIELD = "firstName"; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java index e93990a1..f0d9d0cf 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/insert/BulkInsertTransformStepTest.java @@ -138,10 +138,12 @@ class BulkInsertTransformStepTest extends BaseTest - private QTableMetaData defineTable(QTableMetaData TABLE_NAME, QInstance instance) + /*************************************************************************** + ** + ***************************************************************************/ + private QTableMetaData defineTable(QTableMetaData table, QInstance instance) { - QTableMetaData table = TABLE_NAME - .withPrimaryKeyField("id") + table.withPrimaryKeyField("id") .withField(new QFieldMetaData("id", QFieldType.INTEGER)) .withField(new QFieldMetaData("uuid", QFieldType.STRING)) .withField(new QFieldMetaData("sku", QFieldType.STRING)) @@ -203,6 +205,9 @@ class BulkInsertTransformStepTest extends BaseTest + /*************************************************************************** + ** + ***************************************************************************/ private boolean recordEquals(QRecord record, String uuid, String sku, Integer storeId) { return (record.getValue("uuid").equals(uuid) diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunctionTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunctionTest.java index 1416ff16..66ccea12 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunctionTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/etl/basic/BasicETLTransformFunctionTest.java @@ -64,6 +64,9 @@ class BasicETLTransformFunctionTest extends BaseTest + /*************************************************************************** + ** + ***************************************************************************/ private String doRemoveNonNumericValuesFromMappedRecords(QFieldType fieldType, String inputValue) { String field = "field"; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java index 3ea9be62..5737c71f 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/mergeduplicates/MergeDuplicatesProcessTest.java @@ -48,7 +48,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; *******************************************************************************/ class MergeDuplicatesProcessTest extends BaseTest { - String PROCESS_NAME = "testMergeProcess"; + private static final String PROCESS_NAME = "testMergeProcess"; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java index 220b5cc5..8ad4f733 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/tablesync/TableSyncProcessTest.java @@ -54,8 +54,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; *******************************************************************************/ class TableSyncProcessTest extends BaseTest { - String PROCESS_NAME = "testSyncProcess"; - String TABLE_NAME_PEOPLE_SYNC = "peopleSync"; + private static final String PROCESS_NAME = "testSyncProcess"; + private static final String TABLE_NAME_PEOPLE_SYNC = "peopleSync"; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzTestUtils.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzTestUtils.java index 7e36e6b6..305eed7c 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzTestUtils.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/scheduler/quartz/QuartzTestUtils.java @@ -35,7 +35,7 @@ import org.quartz.SchedulerException; *******************************************************************************/ public class QuartzTestUtils { - public final static String QUARTZ_SCHEDULER_NAME = "TestQuartzScheduler"; + public static final String QUARTZ_SCHEDULER_NAME = "TestQuartzScheduler"; diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/testutils/PersonQRecord.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/testutils/PersonQRecord.java index d5620731..83a1df51 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/testutils/PersonQRecord.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/testutils/PersonQRecord.java @@ -32,6 +32,9 @@ import com.kingsrook.qqq.backend.core.model.data.QRecord; *******************************************************************************/ public class PersonQRecord extends QRecord { + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withLastName(String lastName) { setValue("lastName", lastName); @@ -40,6 +43,9 @@ public class PersonQRecord extends QRecord + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withFirstName(String firstName) { setValue("firstName", firstName); @@ -48,6 +54,9 @@ public class PersonQRecord extends QRecord + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withBirthDate(LocalDate birthDate) { setValue("birthDate", birthDate); @@ -56,6 +65,9 @@ public class PersonQRecord extends QRecord + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withNoOfShoes(Integer noOfShoes) { setValue("noOfShoes", noOfShoes); @@ -64,6 +76,9 @@ public class PersonQRecord extends QRecord + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withPrice(BigDecimal price) { setValue("price", price); @@ -72,6 +87,9 @@ public class PersonQRecord extends QRecord + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withCost(BigDecimal cost) { setValue("cost", cost); @@ -80,6 +98,9 @@ public class PersonQRecord extends QRecord + /*************************************************************************** + ** + ***************************************************************************/ public PersonQRecord withHomeStateId(int homeStateId) { setValue("homeStateId", homeStateId); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java index f049ad44..8e88739a 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/JsonUtilsTest.java @@ -93,6 +93,9 @@ class JsonUtilsTest extends BaseTest *******************************************************************************/ private static class LooksLikeAnEntityButJustThrowsInItsGetterMethod { + /*************************************************************************** + ** + ***************************************************************************/ public String getValue() { throw new IllegalStateException("Test"); diff --git a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/TestUtils.java b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/TestUtils.java index 3de63044..b9111b27 100644 --- a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/TestUtils.java +++ b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/TestUtils.java @@ -95,8 +95,7 @@ public class TestUtils .withAuthorizationType(AuthorizationType.API_KEY_HEADER) .withBaseUrl("http://localhost:9999/mock") .withContentType("application/json") - .withActionUtil(new QCodeReference(MockApiActionUtils.class)) - ); + .withActionUtil(new QCodeReference(MockApiActionUtils.class))); } @@ -115,8 +114,7 @@ public class TestUtils .withBackendDetails(new APITableBackendDetails() .withTablePath("mock") .withTableWrapperObjectName("mocks") - ) - ); + )); } @@ -147,8 +145,7 @@ public class TestUtils .withAuthorizationType(AuthorizationType.BASIC_AUTH_API_KEY) .withBaseUrl("https://api.easypost.com/v2/") .withContentType("application/json") - .withActionUtil(new QCodeReference(EasyPostUtils.class)) - ); + .withActionUtil(new QCodeReference(EasyPostUtils.class))); } @@ -170,8 +167,7 @@ public class TestUtils .withBackendDetails(new APITableBackendDetails() .withTablePath("variant") .withTableWrapperObjectName("variant") - ) - ); + )); } @@ -191,7 +187,6 @@ public class TestUtils .withBackendDetails(new APITableBackendDetails() .withTablePath("trackers") .withTableWrapperObjectName("tracker") - ) - ); + )); } } diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java index 6faf15bc..26cb44ea 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/local/FilesystemBackendModuleTest.java @@ -50,7 +50,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; *******************************************************************************/ public class FilesystemBackendModuleTest { - private final String PATH_THAT_WONT_EXIST = "some/path/that/wont/exist"; + private static final String PATH_THAT_WONT_EXIST = "some/path/that/wont/exist"; diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/S3BackendModuleTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/S3BackendModuleTest.java index 73a8f6ae..c18ce4bc 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/S3BackendModuleTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/S3BackendModuleTest.java @@ -47,7 +47,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; *******************************************************************************/ public class S3BackendModuleTest extends BaseS3Test { - private final String PATH_THAT_WONT_EXIST = "some/path/that/wont/exist"; + private static final String PATH_THAT_WONT_EXIST = "some/path/that/wont/exist"; diff --git a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/PathMatcherGlobTest.java b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/PathMatcherGlobTest.java index 2aa65293..bf9d95ae 100644 --- a/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/PathMatcherGlobTest.java +++ b/qqq-backend-module-filesystem/src/test/java/com/kingsrook/qqq/backend/module/filesystem/s3/utils/PathMatcherGlobTest.java @@ -37,6 +37,9 @@ import org.junit.jupiter.api.Test; public class PathMatcherGlobTest { + /*************************************************************************** + ** + ***************************************************************************/ @Test public void testPathMatcher() throws Exception { diff --git a/qqq-backend-module-mongodb/src/test/java/com/kingsrook/qqq/backend/module/mongodb/TestUtils.java b/qqq-backend-module-mongodb/src/test/java/com/kingsrook/qqq/backend/module/mongodb/TestUtils.java index 9687dff1..17ab849e 100644 --- a/qqq-backend-module-mongodb/src/test/java/com/kingsrook/qqq/backend/module/mongodb/TestUtils.java +++ b/qqq-backend-module-mongodb/src/test/java/com/kingsrook/qqq/backend/module/mongodb/TestUtils.java @@ -158,8 +158,7 @@ public class TestUtils .withName(TABLE_NAME_PERSON) .withType(QPossibleValueSourceType.TABLE) .withTableName(TABLE_NAME_PERSON) - .withValueFormatAndFields(PVSValueFormatAndFields.LABEL_ONLY) - ); + .withValueFormatAndFields(PVSValueFormatAndFields.LABEL_ONLY)); } diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java index 7a84cc63..7dcb1cd0 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/TestUtils.java @@ -200,8 +200,7 @@ public class TestUtils .withName(TABLE_NAME_PERSON) .withType(QPossibleValueSourceType.TABLE) .withTableName(TABLE_NAME_PERSON) - .withValueFormatAndFields(PVSValueFormatAndFields.LABEL_ONLY) - ); + .withValueFormatAndFields(PVSValueFormatAndFields.LABEL_ONLY)); } diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java index a441e914..61e72681 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSDeleteActionTest.java @@ -103,7 +103,8 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest DeleteOutput deleteResult = new RDBMSDeleteAction().execute(deleteInput); assertEquals(3, deleteResult.getDeletedRecordCount(), "Should delete one row"); assertEquals(0, deleteResult.getRecordsWithErrors().size(), "should have no errors"); - runTestSql("SELECT id FROM person", (rs -> { + runTestSql("SELECT id FROM person", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -177,7 +178,8 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest assertTrue(deleteResult.getRecordsWithErrors().stream().noneMatch(r -> r.getErrors().isEmpty()), "All we got back should have errors"); assertEquals(3, deleteResult.getDeletedRecordCount(), "Should get back that 3 were deleted"); - runTestSql("SELECT id FROM child_table", (rs -> { + runTestSql("SELECT id FROM child_table", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -223,7 +225,8 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest assertEquals(1, queryStats.get(QueryManager.STAT_QUERIES_RAN), "Number of queries ran"); assertEquals(3, deleteResult.getDeletedRecordCount(), "Should get back that 3 were deleted"); - runTestSql("SELECT id FROM child_table", (rs -> { + runTestSql("SELECT id FROM child_table", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -275,7 +278,8 @@ public class RDBMSDeleteActionTest extends RDBMSActionTest assertTrue(deleteResult.getRecordsWithErrors().stream().noneMatch(r -> r.getErrors().isEmpty()), "All we got back should have errors"); assertEquals(3, deleteResult.getDeletedRecordCount(), "Should get back that 3 were deleted"); - runTestSql("SELECT id FROM child_table", (rs -> { + runTestSql("SELECT id FROM child_table", (rs -> + { int rowsFound = 0; while(rs.next()) { diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java index 74d8804e..c7689286 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSInsertActionTest.java @@ -188,9 +188,13 @@ public class RDBMSInsertActionTest extends RDBMSActionTest + /*************************************************************************** + ** + ***************************************************************************/ private void assertAnInsertedPersonRecord(String firstName, String lastName, Integer id) throws Exception { - runTestSql("SELECT * FROM person WHERE last_name = '" + lastName + "'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = '" + lastName + "'", (rs -> + { int rowsFound = 0; while(rs.next()) { diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java index a024b1dc..64f4c950 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSUpdateActionTest.java @@ -118,7 +118,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest assertEquals(1, updateResult.getRecords().size(), "Should return 1 row"); assertEquals(2, updateResult.getRecords().get(0).getValue("id"), "Should have id=2 in the row"); // todo - add errors to QRecord? assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); - runTestSql("SELECT * FROM person WHERE last_name = 'Kirk'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'Kirk'", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -129,7 +130,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest } assertEquals(1, rowsFound); })); - runTestSql("SELECT * FROM person WHERE last_name = 'Maes'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'Maes'", (rs -> + { if(rs.next()) { fail("Should not have found Maes any more."); @@ -176,7 +178,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest assertEquals(3, updateResult.getRecords().get(1).getValue("id"), "Should have expected ids in the row"); assertEquals(5, updateResult.getRecords().get(2).getValue("id"), "Should have expected ids in the row"); // todo - add errors to QRecord? assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); - runTestSql("SELECT * FROM person WHERE last_name = 'From Bewitched'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'From Bewitched'", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -188,7 +191,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest } assertEquals(1, rowsFound); })); - runTestSql("SELECT * FROM person WHERE last_name = 'Chamberlain'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'Chamberlain'", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -199,7 +203,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest } assertEquals(1, rowsFound); })); - runTestSql("SELECT * FROM person WHERE last_name = 'Richardson'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'Richardson'", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -243,7 +248,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest assertEquals(1, updateResult.getRecords().get(0).getValue("id"), "Should have expected ids in the row"); assertEquals(3, updateResult.getRecords().get(1).getValue("id"), "Should have expected ids in the row"); // todo - add errors to QRecord? assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); - runTestSql("SELECT * FROM person WHERE last_name = 'From Bewitched'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'From Bewitched'", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -255,7 +261,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest } assertEquals(1, rowsFound); })); - runTestSql("SELECT * FROM person WHERE last_name = 'Tim''s Uncle'", (rs -> { + runTestSql("SELECT * FROM person WHERE last_name = 'Tim''s Uncle'", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -294,7 +301,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest assertEquals(5, updateResult.getRecords().size(), "Should return 5 rows"); // todo - add errors to QRecord? assertTrue(updateResult.getRecords().stream().noneMatch(qrs -> CollectionUtils.nullSafeHasContents(qrs.getErrors())), "There should be no errors"); - runTestSql("SELECT * FROM person WHERE id <= 5", (rs -> { + runTestSql("SELECT * FROM person WHERE id <= 5", (rs -> + { int rowsFound = 0; while(rs.next()) { @@ -414,7 +422,8 @@ public class RDBMSUpdateActionTest extends RDBMSActionTest private String selectModifyDate(Integer id) throws Exception { StringBuilder modifyDate = new StringBuilder(); - runTestSql("SELECT modify_date FROM person WHERE id = " + id, (rs -> { + runTestSql("SELECT modify_date FROM person WHERE id = " + id, (rs -> + { if(rs.next()) { modifyDate.append(rs.getString("modify_date")); diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java index 13850df1..0bb417ca 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java @@ -39,6 +39,9 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; @Disabled("This was okay for POC, but shouldn't run in CI") class ConnectionManagerTest extends BaseTest { + /*************************************************************************** + ** + ***************************************************************************/ @Test public void test() throws SQLException { @@ -101,6 +104,9 @@ class ConnectionManagerTest extends BaseTest + /*************************************************************************** + ** + ***************************************************************************/ private RDBMSBackendMetaData getAuroraBacked() { QMetaDataVariableInterpreter interpreter = new QMetaDataVariableInterpreter(); diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsActionTest.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsActionTest.java index ee9bfc8f..6e7edda6 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsActionTest.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GetTableApiFieldsActionTest.java @@ -49,7 +49,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; *******************************************************************************/ class GetTableApiFieldsActionTest extends BaseTest { - private final String TABLE_NAME = "testTable"; + private static final String TABLE_NAME = "testTable"; Function, Set> fieldListToNameSet = l -> l.stream().map(f -> f.getName()).collect(Collectors.toSet()); diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/model/metadata/ApiInstanceMetaDataTest.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/model/metadata/ApiInstanceMetaDataTest.java index bc2ac00e..307bd078 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/model/metadata/ApiInstanceMetaDataTest.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/model/metadata/ApiInstanceMetaDataTest.java @@ -80,8 +80,8 @@ class ApiInstanceMetaDataTest { assertValidationErrors(makeBaselineValidApiInstanceMetaData() .withCurrentVersion(new APIVersion("2023.Q1")) - .withSupportedVersions(List.of(new APIVersion("2022.Q3"), new APIVersion("2022.Q4"))) - , List.of("supportedVersions [[2022.Q3, 2022.Q4]] does not contain currentVersion [2023.Q1]")); + .withSupportedVersions(List.of(new APIVersion("2022.Q3"), new APIVersion("2022.Q4"))), + List.of("supportedVersions [[2022.Q3, 2022.Q4]] does not contain currentVersion [2023.Q1]")); assertValidationErrors(makeBaselineValidApiInstanceMetaData() .withCurrentVersion(new APIVersion("2023.Q1")) diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLoggerTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLoggerTest.java index 380df252..61bf8f22 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLoggerTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinAccessLoggerTest.java @@ -136,13 +136,12 @@ class QJavalinAccessLoggerTest QInstance qInstance = TestUtils.defineInstance(); new QJavalinImplementation(qInstance, new QJavalinMetaData() .withLoggerDisabled(false) - .withLogFilter(logEntry -> - switch(logEntry.logType()) - { - case START, PROCESS_SUMMARY -> false; - case END_SUCCESS, END_SUCCESS_SLOW -> true; - case END_FAIL -> logEntry.actionName().startsWith("yes"); - })); + .withLogFilter(logEntry -> switch(logEntry.logType()) + { + case START, PROCESS_SUMMARY -> false; + case END_SUCCESS, END_SUCCESS_SLOW -> true; + case END_FAIL -> logEntry.actionName().startsWith("yes"); + })); System.out.println("shouldn't log"); QJavalinAccessLogger.logStart("test"); // shouldn't log diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinScriptsHandlerTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinScriptsHandlerTest.java index 3f44f706..7d940960 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinScriptsHandlerTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinScriptsHandlerTest.java @@ -53,6 +53,9 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; *******************************************************************************/ class QJavalinScriptsHandlerTest extends QJavalinTestBase { + /*************************************************************************** + ** + ***************************************************************************/ @BeforeEach public void beforeEach() throws Exception { diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java index 2eb91ff1..f8ee594f 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java @@ -96,7 +96,7 @@ public class QJavalinTestBase /******************************************************************************* ** *******************************************************************************/ - static protected void restartServerWithInstance(QInstance qInstance) throws QInstanceValidationException + protected static void restartServerWithInstance(QInstance qInstance) throws QInstanceValidationException { if(qJavalinImplementation != null) { diff --git a/qqq-middleware-lambda/src/test/java/com/kingsrook/qqq/lambda/QBaseCustomLambdaHandlerTest.java b/qqq-middleware-lambda/src/test/java/com/kingsrook/qqq/lambda/QBaseCustomLambdaHandlerTest.java index 935f616d..5269b61c 100644 --- a/qqq-middleware-lambda/src/test/java/com/kingsrook/qqq/lambda/QBaseCustomLambdaHandlerTest.java +++ b/qqq-middleware-lambda/src/test/java/com/kingsrook/qqq/lambda/QBaseCustomLambdaHandlerTest.java @@ -368,6 +368,9 @@ class QBaseCustomLambdaHandlerTest + /*************************************************************************** + ** + ***************************************************************************/ private String getNoBodyInputString() { return (""" diff --git a/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java b/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java index ba858384..0e547b24 100644 --- a/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java +++ b/qqq-middleware-picocli/src/test/java/com/kingsrook/qqq/frontend/picocli/QPicoCliImplementationTest.java @@ -552,7 +552,8 @@ class QPicoCliImplementationTest *******************************************************************************/ private void assertRowValueById(String tableName, String columnName, String value, Integer id) throws Exception { - TestUtils.runTestSql("SELECT " + columnName + " FROM " + tableName + " WHERE id=" + id, (rs -> { + TestUtils.runTestSql("SELECT " + columnName + " FROM " + tableName + " WHERE id=" + id, (rs -> + { if(rs.next()) { assertEquals(value, rs.getString(1)); @@ -590,7 +591,8 @@ class QPicoCliImplementationTest JSONObject deleteResult = JsonUtils.toJSONObject(testOutput.getOutput()); assertNotNull(deleteResult); assertEquals(2, deleteResult.getInt("deletedRecordCount")); - TestUtils.runTestSql("SELECT id FROM person", (rs -> { + TestUtils.runTestSql("SELECT id FROM person", (rs -> + { int rowsFound = 0; while(rs.next()) { diff --git a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index ec3355fe..74c9621b 100644 --- a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -117,7 +117,6 @@ public class SampleMetaDataProviderTest /******************************************************************************* ** *******************************************************************************/ - @SuppressWarnings("unchecked") public static void primeTestDatabase(String sqlFileName) throws Exception { ConnectionManager connectionManager = new ConnectionManager(); @@ -125,7 +124,7 @@ public class SampleMetaDataProviderTest { InputStream primeTestDatabaseSqlStream = SampleMetaDataProviderTest.class.getResourceAsStream("/" + sqlFileName); assertNotNull(primeTestDatabaseSqlStream); - List lines = (List) IOUtils.readLines(primeTestDatabaseSqlStream); + List lines = IOUtils.readLines(primeTestDatabaseSqlStream); lines = lines.stream().filter(line -> !line.startsWith("-- ")).toList(); String joinedSQL = String.join("\n", lines); for(String sql : joinedSQL.split(";")) @@ -168,8 +167,8 @@ public class SampleMetaDataProviderTest *******************************************************************************/ private File copyTestFileToRandomNameUnderTable(QTableMetaData fedExTable) throws IOException { - File destinationDir = new File(SampleMetaDataProvider.defineFilesystemBackend().getBasePath() + File.separator + - ((FilesystemTableBackendDetails) fedExTable.getBackendDetails()).getBasePath()); + File destinationDir = new File(SampleMetaDataProvider.defineFilesystemBackend().getBasePath() + File.separator + + ((FilesystemTableBackendDetails) fedExTable.getBackendDetails()).getBasePath()); destinationDir.mkdirs(); File destinationFile = new File(destinationDir.getAbsolutePath() + File.separator + UUID.randomUUID()); From fa2b1c0b8e48c9f020f198745103dae33271f5c3 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 19 Jul 2024 16:25:15 -0500 Subject: [PATCH 08/23] Fix merge conflicts --- .../actions/reporting/GenerateReportAction.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java index 938ec120..a216e9e5 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java @@ -443,13 +443,7 @@ public class GenerateReportAction extends AbstractQActionFunction>>>>>> a9eb8946 (Remove all calls to actionInput.getInstance and getSesssion, in favor of the equivallent methods from QContext) if(dataSource.getQueryInputCustomizer() != null) { @@ -806,7 +800,6 @@ public class GenerateReportAction extends AbstractQActionFunction reportViews = views.stream().filter(v -> v.getType().equals(ReportType.SUMMARY)).toList(); for(QReportView view : reportViews) { -<<<<<<< HEAD QReportDataSource dataSource = getDataSource(view.getDataSourceName()); if(dataSource == null) { @@ -815,15 +808,6 @@ public class GenerateReportAction extends AbstractQActionFunction>>>>>> a9eb8946 (Remove all calls to actionInput.getInstance and getSesssion, in favor of the equivallent methods from QContext) ExportInput exportInput = new ExportInput(); exportInput.setReportDestination(reportInput.getReportDestination()); From 9a2276edf22a6c29c5d9709a352498af594fe5d9 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 16 Jul 2024 14:34:35 -0500 Subject: [PATCH 09/23] CE-1472 - Refactored to do variants a little more generically per different auth-types; made createOAuth2TokenRequest its own overrideable method --- .../core/model/metadata/QBackendMetaData.java | 64 +++++ .../module/api/actions/BaseAPIActionUtil.java | 266 +++++++++++++----- .../module/api/mocks/MockApiActionUtils.java | 3 +- 3 files changed, 258 insertions(+), 75 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QBackendMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QBackendMetaData.java index 628fa870..52f6c95f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QBackendMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QBackendMetaData.java @@ -53,6 +53,8 @@ public class QBackendMetaData implements TopLevelMetaDataInterface private String variantOptionsTableUsernameField; private String variantOptionsTablePasswordField; private String variantOptionsTableApiKeyField; + private String variantOptionsTableClientIdField; + private String variantOptionsTableClientSecretField; private String variantOptionsTableName; // todo - at some point, we may want to apply this to secret properties on subclasses? @@ -648,4 +650,66 @@ public class QBackendMetaData implements TopLevelMetaDataInterface { qInstance.addBackend(this); } + + /******************************************************************************* + ** Getter for variantOptionsTableClientIdField + *******************************************************************************/ + public String getVariantOptionsTableClientIdField() + { + return (this.variantOptionsTableClientIdField); + } + + + + /******************************************************************************* + ** Setter for variantOptionsTableClientIdField + *******************************************************************************/ + public void setVariantOptionsTableClientIdField(String variantOptionsTableClientIdField) + { + this.variantOptionsTableClientIdField = variantOptionsTableClientIdField; + } + + + + /******************************************************************************* + ** Fluent setter for variantOptionsTableClientIdField + *******************************************************************************/ + public QBackendMetaData withVariantOptionsTableClientIdField(String variantOptionsTableClientIdField) + { + this.variantOptionsTableClientIdField = variantOptionsTableClientIdField; + return (this); + } + + + + /******************************************************************************* + ** Getter for variantOptionsTableClientSecretField + *******************************************************************************/ + public String getVariantOptionsTableClientSecretField() + { + return (this.variantOptionsTableClientSecretField); + } + + + + /******************************************************************************* + ** Setter for variantOptionsTableClientSecretField + *******************************************************************************/ + public void setVariantOptionsTableClientSecretField(String variantOptionsTableClientSecretField) + { + this.variantOptionsTableClientSecretField = variantOptionsTableClientSecretField; + } + + + + /******************************************************************************* + ** Fluent setter for variantOptionsTableClientSecretField + *******************************************************************************/ + public QBackendMetaData withVariantOptionsTableClientSecretField(String variantOptionsTableClientSecretField) + { + this.variantOptionsTableClientSecretField = variantOptionsTableClientSecretField; + return (this); + } + + } diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index 57cef42d..bbb2b43d 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -35,6 +35,7 @@ import java.util.Base64; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.context.QContext; @@ -64,6 +65,7 @@ import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.core.model.statusmessages.SystemErrorStatusMessage; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils; +import com.kingsrook.qqq.backend.core.utils.Pair; import com.kingsrook.qqq.backend.core.utils.SleepUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; import com.kingsrook.qqq.backend.core.utils.ValueUtils; @@ -87,6 +89,7 @@ import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPatch; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; @@ -117,8 +120,37 @@ public class BaseAPIActionUtil + /*************************************************************************** + ** enum of which HTTP Method the backend uses for Updates. + ***************************************************************************/ public enum UpdateHttpMethod - {PUT, POST} + { + PUT(HttpPut::new), + POST(HttpPost::new), + PATCH(HttpPatch::new); + + private Supplier httpEntitySupplier; + + + + /*************************************************************************** + ** + ***************************************************************************/ + UpdateHttpMethod(Supplier httpEnttySupplier) + { + this.httpEntitySupplier = httpEnttySupplier; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + public HttpEntityEnclosingRequestBase newRequest() + { + return (this.httpEntitySupplier.get()); + } + } @@ -347,7 +379,7 @@ public class BaseAPIActionUtil { String paramString = buildQueryStringForUpdate(table, recordList); String url = buildTableUrl(table) + paramString; - HttpEntityEnclosingRequestBase request = getUpdateMethod().equals(UpdateHttpMethod.PUT) ? new HttpPut(url) : new HttpPost(url); + HttpEntityEnclosingRequestBase request = getUpdateMethod().newRequest(); request.setEntity(recordsToEntity(table, recordList)); QHttpResponse response = makeRequest(table, request); @@ -685,54 +717,19 @@ public class BaseAPIActionUtil *******************************************************************************/ public void setupAuthorizationInRequest(HttpRequestBase request) throws QException { - /////////////////////////////////////////////////////////////////////////////////// - // if backend specifies that it uses variants, look for that data in the session // - /////////////////////////////////////////////////////////////////////////////////// - if(backendMetaData.getUsesVariants()) - { - QSession session = QContext.getQSession(); - if(session.getBackendVariants() == null || !session.getBackendVariants().containsKey(backendMetaData.getVariantOptionsTableTypeValue())) - { - throw (new QException("Could not find Backend Variant information for Backend '" + backendMetaData.getName() + "'")); - } - - Serializable variantId = session.getBackendVariants().get(backendMetaData.getVariantOptionsTableTypeValue()); - GetInput getInput = new GetInput(); - getInput.setShouldMaskPasswords(false); - getInput.setTableName(backendMetaData.getVariantOptionsTableName()); - getInput.setPrimaryKey(variantId); - GetOutput getOutput = new GetAction().execute(getInput); - - QRecord record = getOutput.getRecord(); - if(record == null) - { - throw (new QException("Could not find Backend Variant in table " + backendMetaData.getVariantOptionsTableName() + " with id '" + variantId + "'")); - } - - if(backendMetaData.getAuthorizationType().equals(AuthorizationType.BASIC_AUTH_USERNAME_PASSWORD)) - { - request.setHeader("Authorization", getBasicAuthenticationHeader(record.getValueString(backendMetaData.getVariantOptionsTableUsernameField()), record.getValueString(backendMetaData.getVariantOptionsTablePasswordField()))); - } - else if(backendMetaData.getAuthorizationType().equals(AuthorizationType.API_KEY_HEADER)) - { - request.setHeader("API-Key", record.getValueString(backendMetaData.getVariantOptionsTableApiKeyField())); - } - else - { - throw (new IllegalArgumentException("Unexpected variant authorization type specified: " + backendMetaData.getAuthorizationType())); - } - return; - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // if not using variants, the authorization data will be in the backend meta data object // - /////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + // update the request based on the authorization type being used // + /////////////////////////////////////////////////////////////////// switch(backendMetaData.getAuthorizationType()) { - case BASIC_AUTH_API_KEY -> request.setHeader("Authorization", getBasicAuthenticationHeader(backendMetaData.getApiKey())); - case BASIC_AUTH_USERNAME_PASSWORD -> request.setHeader("Authorization", getBasicAuthenticationHeader(backendMetaData.getUsername(), backendMetaData.getPassword())); - case API_KEY_HEADER -> request.setHeader("API-Key", backendMetaData.getApiKey()); - case API_TOKEN -> request.setHeader("Authorization", "Token " + backendMetaData.getApiKey()); + case BASIC_AUTH_API_KEY -> request.setHeader("Authorization", getBasicAuthenticationHeader(getApiKey())); + case BASIC_AUTH_USERNAME_PASSWORD -> + { + Pair usernameAndPassword = getUsernameAndPassword(); + request.setHeader("Authorization", getBasicAuthenticationHeader(usernameAndPassword.getA(), usernameAndPassword.getB())); + } + case API_KEY_HEADER -> request.setHeader("API-Key", getApiKey()); + case API_TOKEN -> request.setHeader("Authorization", "Token " + getApiKey()); case OAUTH2 -> request.setHeader("Authorization", "Bearer " + getOAuth2Token()); case API_KEY_QUERY_PARAM -> { @@ -740,7 +737,7 @@ public class BaseAPIActionUtil { String uri = request.getURI().toString(); uri += (uri.contains("?") ? "&" : "?"); - uri += backendMetaData.getApiKeyQueryParamName() + "=" + backendMetaData.getApiKey(); + uri += backendMetaData.getApiKeyQueryParamName() + "=" + getApiKey(); request.setURI(new URI(uri)); } catch(URISyntaxException e) @@ -748,49 +745,113 @@ public class BaseAPIActionUtil throw (new QException("Error setting authorization query parameter", e)); } } - case CUSTOM -> - { - handleCustomAuthorization(request); - } + case CUSTOM -> handleCustomAuthorization(request); default -> throw new IllegalArgumentException("Unexpected authorization type: " + backendMetaData.getAuthorizationType()); } } + /*************************************************************************** + ** + ***************************************************************************/ + protected String getApiKey() throws QException + { + if(backendMetaData.getUsesVariants()) + { + QRecord record = getVariantRecord(); + return (record.getValueString(backendMetaData.getVariantOptionsTableApiKeyField())); + } + + return (backendMetaData.getApiKey()); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + protected Pair getUsernameAndPassword() throws QException + { + if(backendMetaData.getUsesVariants()) + { + QRecord record = getVariantRecord(); + return (Pair.of(record.getValueString(backendMetaData.getVariantOptionsTableUsernameField()), record.getValueString(backendMetaData.getVariantOptionsTablePasswordField()))); + } + + return (Pair.of(backendMetaData.getUsername(), backendMetaData.getPassword())); + } + + + + /******************************************************************************* + ** For backends that use variants, look up the variant record (in theory, based + ** on an id in the session's backend variants map, then fetched from the backend's + ** variant options table. + *******************************************************************************/ + protected QRecord getVariantRecord() throws QException + { + Serializable variantId = getVariantId(); + GetInput getInput = new GetInput(); + getInput.setShouldMaskPasswords(false); + getInput.setTableName(backendMetaData.getVariantOptionsTableName()); + getInput.setPrimaryKey(variantId); + GetOutput getOutput = new GetAction().execute(getInput); + + QRecord record = getOutput.getRecord(); + if(record == null) + { + throw (new QException("Could not find Backend Variant in table " + backendMetaData.getVariantOptionsTableName() + " with id '" + variantId + "'")); + } + return record; + } + + + + /******************************************************************************* + ** Get the variant id from the session for the backend. + *******************************************************************************/ + protected Serializable getVariantId() throws QException + { + QSession session = QContext.getQSession(); + if(session.getBackendVariants() == null || !session.getBackendVariants().containsKey(backendMetaData.getVariantOptionsTableTypeValue())) + { + throw (new QException("Could not find Backend Variant information for Backend '" + backendMetaData.getName() + "'")); + } + Serializable variantId = session.getBackendVariants().get(backendMetaData.getVariantOptionsTableTypeValue()); + return variantId; + } + + + /******************************************************************************* ** *******************************************************************************/ - public String getOAuth2Token() throws OAuthCredentialsException + public String getOAuth2Token() throws OAuthCredentialsException, QException { + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // define the key that will be used in the backend's customValues map, to stash the access token. // + // for non-variant backends, this is just a constant string. But for variant-backends, append the variantId to it. // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + String accessTokenKey = "accessToken"; + if(backendMetaData.getUsesVariants()) + { + Serializable variantId = getVariantId(); + accessTokenKey = accessTokenKey + ":" + variantId; + } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // check for the access token in the backend meta data. if it's not there, then issue a request for a token. // // this is not generally meant to be put in the meta data by the app programmer - rather, we're just using // // it as a "cheap & easy" way to "cache" the token within our process's memory... // //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - String accessToken = ValueUtils.getValueAsString(backendMetaData.getCustomValue("accessToken")); - Boolean setCredentialsInHeader = BooleanUtils.isTrue(ValueUtils.getValueAsBoolean(backendMetaData.getCustomValue("setCredentialsInHeader"))); + String accessToken = ValueUtils.getValueAsString(backendMetaData.getCustomValue(accessTokenKey)); if(!StringUtils.hasContent(accessToken)) { - String fullURL = backendMetaData.getBaseUrl() + "oauth/token"; - String postBody = "grant_type=client_credentials"; - - if(!setCredentialsInHeader) - { - postBody += "&client_id=" + backendMetaData.getClientId() + "&client_secret=" + backendMetaData.getClientSecret(); - } - try(CloseableHttpClient client = HttpClients.custom().setConnectionManager(new PoolingHttpClientConnectionManager()).build()) { - HttpPost request = new HttpPost(fullURL); - request.setEntity(new StringEntity(postBody, getCharsetForEntity())); - - if(setCredentialsInHeader) - { - request.setHeader("Authorization", getBasicAuthenticationHeader(backendMetaData.getClientId(), backendMetaData.getClientSecret())); - } - request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); + HttpRequestBase request = createOAuth2TokenRequest(); HttpResponse response = executeOAuthTokenRequest(client, request); int statusCode = response.getStatusLine().getStatusCode(); @@ -808,7 +869,7 @@ public class BaseAPIActionUtil /////////////////////////////////////////////////////////////////////////////////////////////////// // stash the access token in the backendMetaData, from which it will be used for future requests // /////////////////////////////////////////////////////////////////////////////////////////////////// - backendMetaData.withCustomValue("accessToken", accessToken); + backendMetaData.withCustomValue(accessTokenKey, accessToken); } catch(OAuthCredentialsException oce) { @@ -827,6 +888,53 @@ public class BaseAPIActionUtil + /*************************************************************************** + ** For doing OAuth2 authentication, create a request for a token. + ***************************************************************************/ + protected HttpRequestBase createOAuth2TokenRequest() throws QException + { + String fullURL = backendMetaData.getBaseUrl() + "oauth/token"; + String postBody = "grant_type=client_credentials"; + + Pair clientIdAndSecret = getClientIdAndSecret(); + String clientId = clientIdAndSecret.getA(); + String clientSecret = clientIdAndSecret.getB(); + + Boolean setCredentialsInHeader = BooleanUtils.isTrue(ValueUtils.getValueAsBoolean(backendMetaData.getCustomValue("setCredentialsInHeader"))); + if(!setCredentialsInHeader) + { + postBody += "&client_id=" + clientId + "&client_secret=" + clientSecret; + } + + HttpPost request = new HttpPost(fullURL); + request.setEntity(new StringEntity(postBody, getCharsetForEntity())); + + if(setCredentialsInHeader) + { + request.setHeader("Authorization", getBasicAuthenticationHeader(clientId, clientSecret)); + } + request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); + return request; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + protected Pair getClientIdAndSecret() throws QException + { + if(backendMetaData.getUsesVariants()) + { + QRecord record = getVariantRecord(); + return (Pair.of(record.getValueString(backendMetaData.getVariantOptionsTableClientIdField()), record.getValueString(backendMetaData.getVariantOptionsTableClientSecretField()))); + } + + return (Pair.of(backendMetaData.getClientId(), backendMetaData.getClientSecret())); + } + + + /******************************************************************************* ** Let a subclass change what charset to use for entities (bodies) being posted/put/etc. *******************************************************************************/ @@ -840,6 +948,18 @@ public class BaseAPIActionUtil /******************************************************************************* ** one-line method, factored out so mock/tests can override *******************************************************************************/ + protected CloseableHttpResponse executeOAuthTokenRequest(CloseableHttpClient client, HttpRequestBase request) throws IOException + { + return client.execute(request); + } + + + + /******************************************************************************* + ** one-line method, factored out so mock/tests can override + ** Deprecated, in favor of more generic overload that takes HttpRequestBase + *******************************************************************************/ + @Deprecated protected CloseableHttpResponse executeOAuthTokenRequest(CloseableHttpClient client, HttpPost request) throws IOException { return client.execute(request); diff --git a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiActionUtils.java b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiActionUtils.java index b54f37d7..52367b7a 100644 --- a/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiActionUtils.java +++ b/qqq-backend-module-api/src/test/java/com/kingsrook/qqq/backend/module/api/mocks/MockApiActionUtils.java @@ -28,7 +28,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.module.api.actions.BaseAPIActionUtil; import com.kingsrook.qqq.backend.module.api.actions.QHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.CloseableHttpClient; @@ -89,7 +88,7 @@ public class MockApiActionUtils extends BaseAPIActionUtil ** *******************************************************************************/ @Override - protected CloseableHttpResponse executeOAuthTokenRequest(CloseableHttpClient client, HttpPost request) throws IOException + protected CloseableHttpResponse executeOAuthTokenRequest(CloseableHttpClient client, HttpRequestBase request) throws IOException { runMockAsserter(request); return new MockHttpResponse(mockApiUtilsHelper); From 06a69279a8d80f214ae212b3e9bf483e802db854 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 17 Jul 2024 15:07:30 -0500 Subject: [PATCH 10/23] CE-1472 - Fix doUpdate to set URL --- .../qqq/backend/module/api/actions/BaseAPIActionUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index bbb2b43d..6ef91f16 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -380,6 +380,8 @@ public class BaseAPIActionUtil String paramString = buildQueryStringForUpdate(table, recordList); String url = buildTableUrl(table) + paramString; HttpEntityEnclosingRequestBase request = getUpdateMethod().newRequest(); + + request.setURI(new URI(url)); request.setEntity(recordsToEntity(table, recordList)); QHttpResponse response = makeRequest(table, request); From 583d702355bbf2f8c0b531601081510144af6bfe Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 19 Jul 2024 17:02:37 -0500 Subject: [PATCH 11/23] Re-add getInstance and getSession (until qqq consumer apps stop using them) --- .../model/actions/AbstractActionInput.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/AbstractActionInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/AbstractActionInput.java index baf31301..2b62ccf5 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/AbstractActionInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/AbstractActionInput.java @@ -27,10 +27,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.kingsrook.qqq.backend.core.actions.async.AsyncJobCallback; import com.kingsrook.qqq.backend.core.actions.async.AsyncJobStatus; import com.kingsrook.qqq.backend.core.actions.async.NonPersistedAsyncJobCallback; +import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException; import com.kingsrook.qqq.backend.core.instances.QInstanceValidator; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.session.QSession; /******************************************************************************* @@ -90,6 +92,34 @@ public class AbstractActionInput + /******************************************************************************* + ** Getter for instance + ** + ** Deprecated. Please use QContext.getInstance() instead + *******************************************************************************/ + @JsonIgnore + @Deprecated + public QInstance getInstance() + { + return (QContext.getQInstance()); + } + + + + /******************************************************************************* + ** Getter for session + ** + ** Deprecated. Please use QContext.getSession() instead + *******************************************************************************/ + @JsonIgnore + @Deprecated + public QSession getSession() + { + return (QContext.getQSession()); + } + + + /******************************************************************************* ** Getter for asyncJobCallback ** From 58b0936c50ac10b6b06690b2335a83e4e3147475 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 14:41:40 -0500 Subject: [PATCH 12/23] Add details to Incorrect number of values given exception --- .../qqq/backend/module/rdbms/actions/AbstractRDBMSAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/AbstractRDBMSAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/AbstractRDBMSAction.java index f9e12361..501a45ba 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/AbstractRDBMSAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/AbstractRDBMSAction.java @@ -661,7 +661,7 @@ public abstract class AbstractRDBMSAction } else if(!expectedNoOfParams.equals(values.size())) { - throw new IllegalArgumentException("Incorrect number of values given for criteria [" + field.getName() + "]"); + throw new IllegalArgumentException("Incorrect number of values given for criteria [" + field.getName() + "] (expected " + expectedNoOfParams + ", received " + values.size() + ")"); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// From 2de3306f9522f72c160b92735638abec028d9eb6 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 14:41:55 -0500 Subject: [PATCH 13/23] Add c'tor that takes table name, and override withTableName --- .../tables/aggregate/AggregateInput.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java index 9d69e5ac..e0fe22fc 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java @@ -59,6 +59,30 @@ public class AggregateInput extends AbstractTableActionInput + /******************************************************************************* + ** Constructor + ** + *******************************************************************************/ + public AggregateInput(String tableName) + { + this(); + setTableName(tableName); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public AggregateInput withTableName(String tableName) + { + super.withTableName(tableName); + return (this); + } + + + /******************************************************************************* ** Getter for filter ** From d92be4e69b4fddcff487c1c5a7a289e8bc75a366 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:00:36 -0500 Subject: [PATCH 14/23] don't duplicate apikey=value in re-tries; mask api key in outboundApiLog urls --- .../module/api/actions/BaseAPIActionUtil.java | 114 +++++++++++------- .../api/actions/BaseAPIActionUtilTest.java | 68 +++++++++++ 2 files changed, 138 insertions(+), 44 deletions(-) diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index 57cef42d..ae9fe8d0 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -734,20 +734,7 @@ public class BaseAPIActionUtil case API_KEY_HEADER -> request.setHeader("API-Key", backendMetaData.getApiKey()); case API_TOKEN -> request.setHeader("Authorization", "Token " + backendMetaData.getApiKey()); case OAUTH2 -> request.setHeader("Authorization", "Bearer " + getOAuth2Token()); - case API_KEY_QUERY_PARAM -> - { - try - { - String uri = request.getURI().toString(); - uri += (uri.contains("?") ? "&" : "?"); - uri += backendMetaData.getApiKeyQueryParamName() + "=" + backendMetaData.getApiKey(); - request.setURI(new URI(uri)); - } - catch(URISyntaxException e) - { - throw (new QException("Error setting authorization query parameter", e)); - } - } + case API_KEY_QUERY_PARAM -> addApiKeyQueryParamToRequest(request); case CUSTOM -> { handleCustomAuthorization(request); @@ -758,6 +745,35 @@ public class BaseAPIActionUtil + /*************************************************************************** + ** + ***************************************************************************/ + protected void addApiKeyQueryParamToRequest(HttpRequestBase request) throws QException + { + try + { + String uri = request.getURI().toString(); + String pair = backendMetaData.getApiKeyQueryParamName() + "=" + backendMetaData.getApiKey(); + + /////////////////////////////////////////////////////////////////////////////////// + // avoid re-adding the name=value pair if it's already there (e.g., for a retry) // + /////////////////////////////////////////////////////////////////////////////////// + if(!uri.contains(pair)) + { + uri += (uri.contains("?") ? "&" : "?"); + uri += pair; + } + + request.setURI(new URI(uri)); + } + catch(URISyntaxException e) + { + throw (new QException("Error setting authorization query parameter", e)); + } + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -1207,39 +1223,11 @@ public class BaseAPIActionUtil return; } - String requestBody = null; - if(request instanceof HttpEntityEnclosingRequest entityRequest) - { - try - { - requestBody = StringUtils.join("\n", IOUtils.readLines(entityRequest.getEntity().getContent())); - } - catch(Exception e) - { - // leave it null... - } - } - - //////////////////////////////////// - // mask api keys in query strings // - //////////////////////////////////// - String url = request.getURI().toString(); - if(backendMetaData.getAuthorizationType().equals(AuthorizationType.API_KEY_QUERY_PARAM)) - { - url = url.replaceFirst(backendMetaData.getApiKey(), "******"); - } + OutboundAPILog outboundAPILog = generateOutboundApiLogRecord(request, response); InsertInput insertInput = new InsertInput(); insertInput.setTableName(table.getName()); - insertInput.setRecords(List.of(new OutboundAPILog() - .withMethod(request.getMethod()) - .withUrl(url) - .withTimestamp(Instant.now()) - .withRequestBody(requestBody) - .withStatusCode(response.getStatusCode()) - .withResponseBody(response.getContent()) - .toQRecord() - )); + insertInput.setRecords(List.of(outboundAPILog.toQRecord())); new InsertAction().executeAsync(insertInput); } catch(Exception e) @@ -1250,6 +1238,44 @@ public class BaseAPIActionUtil + /*************************************************************************** + ** + ***************************************************************************/ + public OutboundAPILog generateOutboundApiLogRecord(HttpRequestBase request, QHttpResponse response) + { + String requestBody = null; + if(request instanceof HttpEntityEnclosingRequest entityRequest) + { + try + { + requestBody = StringUtils.join("\n", IOUtils.readLines(entityRequest.getEntity().getContent(), StandardCharsets.UTF_8)); + } + catch(Exception e) + { + // leave it null... + } + } + + //////////////////////////////////// + // mask api keys in query strings // + //////////////////////////////////// + String url = request.getURI().toString(); + if(backendMetaData.getAuthorizationType().equals(AuthorizationType.API_KEY_QUERY_PARAM)) + { + url = url.replaceAll(backendMetaData.getApiKey(), "******"); + } + + return new OutboundAPILog() + .withMethod(request.getMethod()) + .withUrl(url) + .withTimestamp(Instant.now()) + .withRequestBody(requestBody) + .withStatusCode(response.getStatusCode()) + .withResponseBody(response.getContent()); + } + + + /******************************************************************************* ** *******************************************************************************/ 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 60923ea5..ad985295 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 @@ -61,6 +61,7 @@ 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.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.SleepUtils; +import com.kingsrook.qqq.backend.core.utils.lambdas.UnsafeConsumer; import com.kingsrook.qqq.backend.module.api.BaseTest; import com.kingsrook.qqq.backend.module.api.TestUtils; import com.kingsrook.qqq.backend.module.api.exceptions.RateLimitException; @@ -74,6 +75,7 @@ import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpRequestBase; import org.json.JSONArray; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; @@ -868,6 +870,72 @@ class BaseAPIActionUtilTest extends BaseTest + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testAuthorizationApiKeyQueryParam() throws QException + { + APIBackendMetaData backend = (APIBackendMetaData) QContext.getQInstance().getBackend(TestUtils.MOCK_BACKEND_NAME); + backend.setAuthorizationType(AuthorizationType.API_KEY_QUERY_PARAM); + backend.setApiKeyQueryParamName("apikey"); + backend.setApiKey("9876-WXYZ"); + + //////////////////////////////////////////////////////////////////////////////////////////// + // this will make it not use the mock makeRequest method, // + // but instead the mock executeHttpRequest, so we can test code from the base makeRequest // + //////////////////////////////////////////////////////////////////////////////////////////// + mockApiUtilsHelper.setUseMock(false); + + ////////////////////////////////////////////////////////////////////////////// + // we'll want to assert that the URL has the api query string - and just // + // one copy of it (as we once had a bug where it got duplicated upon retry) // + ////////////////////////////////////////////////////////////////////////////// + UnsafeConsumer asserter = request -> assertThat(request.getURI().toString()) + .contains("?apikey=9876-WXYZ") + .doesNotContain("?apikey=9876-WXYZ&apikey=9876-WXYZ"); + + //////////////////////////////////////// + // queue up a 429, so we'll try-again // + //////////////////////////////////////// + mockApiUtilsHelper.setMockRequestAsserter(asserter); + mockApiUtilsHelper.enqueueMockResponse(new QHttpResponse().withStatusCode(429).withContent("")); + + ////////////////////// + // queue a response // + ////////////////////// + mockApiUtilsHelper.setMockRequestAsserter(asserter); + mockApiUtilsHelper.enqueueMockResponse(""" + {"id": 3, "name": "Bart"}, + """); + + GetOutput getOutput = runSimpleGetAction(); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testGenerateOutboundApiLogRecord() throws QException + { + APIBackendMetaData backend = (APIBackendMetaData) QContext.getQInstance().getBackend(TestUtils.MOCK_BACKEND_NAME); + backend.setAuthorizationType(AuthorizationType.API_KEY_QUERY_PARAM); + backend.setApiKeyQueryParamName("apikey"); + backend.setApiKey("9876-WXYZ"); + + MockApiActionUtils mockApiActionUtils = new MockApiActionUtils(); + mockApiActionUtils.setBackendMetaData(backend); + OutboundAPILog outboundAPILog = mockApiActionUtils.generateOutboundApiLogRecord(new HttpGet("...?apikey=9876-WXYZ"), new QHttpResponse()); + + assertThat(outboundAPILog.getUrl()) + .doesNotContain("9876-WXYZ") + .contains("?apikey=*****"); + } + + + /******************************************************************************* ** *******************************************************************************/ From 26fc4fb4e043045223638cabef65561360a27d3c Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:01:22 -0500 Subject: [PATCH 15/23] Initial checkin --- .../qqq/backend/core/utils/CountingHash.java | 126 ++++++++++++++++++ .../backend/core/utils/CountingHashTest.java | 76 +++++++++++ 2 files changed, 202 insertions(+) create mode 100755 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CountingHash.java create mode 100644 qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CountingHashTest.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CountingHash.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CountingHash.java new file mode 100755 index 00000000..8db0e364 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CountingHash.java @@ -0,0 +1,126 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.utils; + + +import java.io.Serializable; +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import com.kingsrook.qqq.backend.core.utils.collections.MutableMap; + + +/******************************************************************************* + ** Hash that provides "counting" capability -- keys map to Integers that + ** are automatically/easily summed to + ** + *******************************************************************************/ +public class CountingHash extends AbstractMap implements Serializable +{ + private Map map = null; + + + + /******************************************************************************* + ** Default constructor + ** + *******************************************************************************/ + public CountingHash() + { + this.map = new HashMap<>(); + } + + + + /******************************************************************************* + ** Constructor where you can supply a source map (e.g., if you want a specific + ** Map type (like LinkedHashMap), or with pre-values. + ** + ** Note - the input map will be wrapped in a MutableMap - so - it'll be mutable. + ** + *******************************************************************************/ + public CountingHash(Map sourceMap) + { + this.map = new MutableMap<>(sourceMap); + } + + + + /******************************************************************************* + ** Increment the value for the specified key by 1. + ** + *******************************************************************************/ + public Integer add(K key) + { + Integer value = getOrCreateListForKey(key); + Integer sum = value + 1; + map.put(key, sum); + return (sum); + } + + + + /******************************************************************************* + ** Increment the value for the specified key by the supplied addend + ** + *******************************************************************************/ + public Integer add(K key, Integer addend) + { + Integer value = getOrCreateListForKey(key); + Integer sum = value + addend; + map.put(key, sum); + return (sum); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private Integer getOrCreateListForKey(K key) + { + Integer value; + + if(!this.map.containsKey(key)) + { + this.map.put(key, 0); + value = 0; + } + else + { + value = this.map.get(key); + } + return value; + } + + + + /*************************************************************************** + * + ***************************************************************************/ + public Set> entrySet() + { + return this.map.entrySet(); + } + +} diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CountingHashTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CountingHashTest.java new file mode 100644 index 00000000..7033b170 --- /dev/null +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CountingHashTest.java @@ -0,0 +1,76 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.utils; + + +import java.util.Map; +import com.kingsrook.qqq.backend.core.BaseTest; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + + +/******************************************************************************* + ** Unit test for CountingHash + *******************************************************************************/ +class CountingHashTest extends BaseTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void test() + { + CountingHash countingHash = new CountingHash<>(); + + assertNull(countingHash.get("a")); + + countingHash.add("a"); + assertEquals(1, countingHash.get("a")); + + countingHash.add("a"); + assertEquals(2, countingHash.get("a")); + + countingHash.add("a", 2); + assertEquals(4, countingHash.get("a")); + + countingHash.add("b", 5); + assertEquals(5, countingHash.get("b")); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testAlwaysMutable() + { + CountingHash alwaysMutable = new CountingHash<>(Map.of("A", 5)); + alwaysMutable.add("A"); + alwaysMutable.add("B"); + assertEquals(6, alwaysMutable.get("A")); + assertEquals(1, alwaysMutable.get("B")); + } + +} \ No newline at end of file From 09c4d9961244a21fee06ad511212f42113437ad9 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:02:06 -0500 Subject: [PATCH 16/23] Avoid NPE and return w/ noop in performValidations if null (or empty) input records --- .../qqq/backend/core/actions/tables/InsertAction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java index 9773d3f0..9336f9db 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java @@ -227,6 +227,11 @@ public class InsertAction extends AbstractQActionFunction Date: Thu, 1 Aug 2024 15:02:20 -0500 Subject: [PATCH 17/23] Add a log info re: releasing lock --- .../qqq/backend/core/processes/locks/ProcessLockUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtils.java index fdc5b20e..ac3a05e8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtils.java @@ -433,6 +433,8 @@ public class ProcessLockUtils { throw (new QException("Error deleting processLock record: " + deleteOutput.getRecordsWithErrors().get(0).getErrorsAsString())); } + + LOG.info("Released process lock", logPair("id", processLock.getId()), logPair("key", processLock.getKey()), logPair("typeId", processLock.getProcessLockTypeId()), logPair("details", processLock.getDetails())); } catch(QException e) { From 5aed59b9b1fc5c65f2f1f9ca82827308a98b1abd Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:02:38 -0500 Subject: [PATCH 18/23] Add implements AutoCloseable, so we could use in a try-with-resources --- .../kingsrook/qqq/backend/core/actions/QBackendTransaction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/QBackendTransaction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/QBackendTransaction.java index 465dae45..feab34a6 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/QBackendTransaction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/QBackendTransaction.java @@ -37,7 +37,7 @@ import com.kingsrook.qqq.backend.core.modules.backend.QBackendModuleInterface; ** ** Note: One would imagine that this class shouldn't ever implement Serializable... *******************************************************************************/ -public class QBackendTransaction +public class QBackendTransaction implements AutoCloseable { /******************************************************************************* From d44790545d7d11db2e41fd986b5f0b3537c91ad2 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:04:03 -0500 Subject: [PATCH 19/23] Add total # failures to message; remove unused c'tor --- .../QInstanceValidationException.java | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/exceptions/QInstanceValidationException.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/exceptions/QInstanceValidationException.java index fa090ca1..8b44cf4c 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/exceptions/QInstanceValidationException.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/exceptions/QInstanceValidationException.java @@ -22,8 +22,8 @@ package com.kingsrook.qqq.backend.core.exceptions; -import java.util.Arrays; import java.util.List; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -55,12 +55,11 @@ public class QInstanceValidationException extends QException *******************************************************************************/ public QInstanceValidationException(List reasons) { - super( - (reasons != null && reasons.size() > 0) - ? "Instance validation failed for the following reasons:\n - " + StringUtils.join("\n - ", reasons) - : "Validation failed, but no reasons were provided"); + super((CollectionUtils.nullSafeHasContents(reasons)) + ? "Instance validation failed for the following reasons:\n - " + StringUtils.join("\n - ", reasons) + "\n(" + reasons.size() + " Total reason" + StringUtils.plural(reasons) + ")" + : "Validation failed, but no reasons were provided"); - if(reasons != null && reasons.size() > 0) + if(CollectionUtils.nullSafeHasContents(reasons)) { this.reasons = reasons; } @@ -68,25 +67,6 @@ public class QInstanceValidationException extends QException - /******************************************************************************* - ** Constructor of an array/varargs of reasons. They feed into the core exception message. - ** - *******************************************************************************/ - public QInstanceValidationException(String... reasons) - { - super( - (reasons != null && reasons.length > 0) - ? "Instance validation failed for the following reasons: " + StringUtils.joinWithCommasAndAnd(Arrays.stream(reasons).toList()) - : "Validation failed, but no reasons were provided"); - - if(reasons != null && reasons.length > 0) - { - this.reasons = Arrays.stream(reasons).toList(); - } - } - - - /******************************************************************************* ** Constructor of message & cause - does not populate reasons! ** From ba3cf53c3094e85beb2b4a5b128cfb0056765792 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:08:53 -0500 Subject: [PATCH 20/23] Update to throw QNotFoundException if view isn't found by id (rather than NPE) --- .../savedviews/QuerySavedViewProcess.java | 14 +++- .../savedviews/SavedViewProcessTests.java | 65 +++++++++++++++++-- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/QuerySavedViewProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/QuerySavedViewProcess.java index f4f57516..4ac4038a 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/QuerySavedViewProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/QuerySavedViewProcess.java @@ -29,6 +29,7 @@ import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.exceptions.QNotFoundException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; @@ -44,6 +45,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.savedviews.SavedView; +import static com.kingsrook.qqq.backend.core.logging.LogUtils.logPair; /******************************************************************************* @@ -78,10 +80,10 @@ public class QuerySavedViewProcess implements BackendStep public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { ActionHelper.validateSession(runBackendStepInput); + Integer savedViewId = runBackendStepInput.getValueInteger("id"); try { - Integer savedViewId = runBackendStepInput.getValueInteger("id"); if(savedViewId != null) { GetInput input = new GetInput(); @@ -89,6 +91,11 @@ public class QuerySavedViewProcess implements BackendStep input.setPrimaryKey(savedViewId); GetOutput output = new GetAction().execute(input); + if(output.getRecord() == null) + { + throw (new QNotFoundException("The requested view was not found.")); + } + runBackendStepOutput.addRecord(output.getRecord()); runBackendStepOutput.addValue("savedView", output.getRecord()); runBackendStepOutput.addValue("savedViewList", (Serializable) List.of(output.getRecord())); @@ -108,6 +115,11 @@ public class QuerySavedViewProcess implements BackendStep runBackendStepOutput.addValue("savedViewList", (Serializable) output.getRecords()); } } + catch(QNotFoundException qnfe) + { + LOG.info("View not found", logPair("savedViewId", savedViewId)); + throw (qnfe); + } catch(Exception e) { LOG.warn("Error querying for saved views", e); diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java index f4474bef..304dc425 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/savedviews/SavedViewProcessTests.java @@ -82,7 +82,7 @@ class SavedViewProcessTests extends BaseTest runProcessInput.addValue("tableName", tableName); runProcessInput.addValue("viewJson", JsonUtils.toJson(new QQueryFilter(new QFilterCriteria("id", QCriteriaOperator.EQUALS, 47)))); RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); - List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); + List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); assertEquals(1, savedViewList.size()); savedViewId = savedViewList.get(0).getValueInteger("id"); assertNotNull(savedViewId); @@ -103,7 +103,7 @@ class SavedViewProcessTests extends BaseTest runProcessInput.setProcessName(QuerySavedViewProcess.getProcessMetaData().getName()); runProcessInput.addValue("tableName", tableName); RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); - List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); + List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); assertEquals(1, savedViewList.size()); assertEquals(1, savedViewList.get(0).getValueInteger("id")); assertEquals("My View", savedViewList.get(0).getValueString("label")); @@ -120,7 +120,7 @@ class SavedViewProcessTests extends BaseTest runProcessInput.addValue("tableName", tableName); runProcessInput.addValue("viewJson", JsonUtils.toJson(new QQueryFilter(new QFilterCriteria("id", QCriteriaOperator.EQUALS, 47)))); RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); - List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); + List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); assertEquals(1, savedViewList.size()); assertEquals(1, savedViewList.get(0).getValueInteger("id")); assertEquals("My Updated View", savedViewList.get(0).getValueString("label")); @@ -151,7 +151,7 @@ class SavedViewProcessTests extends BaseTest runProcessInput.addValue("label", "My Updated View"); runProcessInput.addValue("tableName", tableName); runProcessInput.addValue("viewJson", JsonUtils.toJson(new QQueryFilter(new QFilterCriteria("id", QCriteriaOperator.EQUALS, 47)))); - + ////////////////////////////////////////// // should throw a "duplicate" exception // ////////////////////////////////////////// @@ -183,7 +183,64 @@ class SavedViewProcessTests extends BaseTest RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); assertEquals(0, ((List) runProcessOutput.getValues().get("savedViewList")).size()); } + } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testNotFoundThrowsProperly() throws QException + { + QInstance qInstance = QContext.getQInstance(); + new SavedViewsMetaDataProvider().defineAll(qInstance, TestUtils.MEMORY_BACKEND_NAME, null); + String tableName = TestUtils.TABLE_NAME_PERSON_MEMORY; + + { + //////////////////////////////////////////////////////// + // get one by id when it doesn't exist - should throw // + //////////////////////////////////////////////////////// + RunProcessInput runProcessInput = new RunProcessInput(); + runProcessInput.setProcessName(QuerySavedViewProcess.getProcessMetaData().getName()); + runProcessInput.addValue("tableName", tableName); + runProcessInput.addValue("id", -1); + assertThatThrownBy(() -> new RunProcessAction().execute(runProcessInput)) + .hasMessageContaining("view was not found") + .isInstanceOf(QUserFacingException.class); + } + + Integer savedViewId; + { + ////////////////////// + // store a new view // + ////////////////////// + RunProcessInput runProcessInput = new RunProcessInput(); + runProcessInput.setProcessName(StoreSavedViewProcess.getProcessMetaData().getName()); + runProcessInput.addValue("label", "My View"); + runProcessInput.addValue("tableName", tableName); + runProcessInput.addValue("viewJson", JsonUtils.toJson(new QQueryFilter(new QFilterCriteria("id", QCriteriaOperator.EQUALS, 47)))); + RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); + List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); + assertEquals(1, savedViewList.size()); + savedViewId = savedViewList.get(0).getValueInteger("id"); + assertNotNull(savedViewId); + } + + { + //////////////////////////////////////// + // get now with valid id, should work // + //////////////////////////////////////// + RunProcessInput runProcessInput = new RunProcessInput(); + runProcessInput.setProcessName(QuerySavedViewProcess.getProcessMetaData().getName()); + runProcessInput.addValue("tableName", tableName); + runProcessInput.addValue("id", savedViewId); + RunProcessOutput runProcessOutput = new RunProcessAction().execute(runProcessInput); + List savedViewList = (List) runProcessOutput.getValues().get("savedViewList"); + assertEquals(1, savedViewList.size()); + assertEquals(1, savedViewList.get(0).getValueInteger("id")); + assertEquals("My View", savedViewList.get(0).getValueString("label")); + } } } \ No newline at end of file From a11d584c8a10ce9ea817eb5048688145bb730a8d Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:11:20 -0500 Subject: [PATCH 21/23] Fix formatting of booleans when value is string (e.g., format based on QFieldMetaData type, not value object class) --- .../backend/core/actions/values/QValueFormatter.java | 12 +++++++++--- .../core/actions/values/QValueFormatterTest.java | 6 +++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java index fab61595..d5704252 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatter.java @@ -68,7 +68,7 @@ public class QValueFormatter *******************************************************************************/ public static String formatValue(QFieldMetaData field, Serializable value) { - return (formatValue(field.getDisplayFormat(), field.getName(), value)); + return (formatValue(field.getDisplayFormat(), field.getType(), field.getName(), value)); } @@ -78,7 +78,7 @@ public class QValueFormatter *******************************************************************************/ public static String formatValue(String displayFormat, Serializable value) { - return (formatValue(displayFormat, "", value)); + return (formatValue(displayFormat, null, "", value)); } @@ -87,7 +87,7 @@ public class QValueFormatter ** For a display format string, an optional fieldName (only used for logging), ** and a value, apply the format. *******************************************************************************/ - private static String formatValue(String displayFormat, String fieldName, Serializable value) + private static String formatValue(String displayFormat, QFieldType fieldType, String fieldName, Serializable value) { ////////////////////////////////// // null values get null results // @@ -107,6 +107,11 @@ public class QValueFormatter return formatBoolean(b); } + if(QFieldType.BOOLEAN.equals(fieldType)) + { + return formatBoolean(ValueUtils.getValueAsBoolean(value)); + } + if(value instanceof LocalTime lt) { return formatLocalTime(lt); @@ -404,6 +409,7 @@ public class QValueFormatter } + /******************************************************************************* ** For a single record, set its display values - where caller (meant to stay private) ** can specify if they've already done fieldBehaviors (to avoid re-doing). diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java index 8760b0fb..cd678974 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/values/QValueFormatterTest.java @@ -36,10 +36,10 @@ import com.kingsrook.qqq.backend.core.BaseTest; import com.kingsrook.qqq.backend.core.context.QContext; 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.fields.DateTimeDisplayValueBehavior; import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; -import com.kingsrook.qqq.backend.core.model.metadata.fields.DateTimeDisplayValueBehavior; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.utils.TestUtils; import org.junit.jupiter.api.Test; @@ -89,6 +89,10 @@ class QValueFormatterTest extends BaseTest assertNull(QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.BOOLEAN), null)); assertEquals("Yes", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.BOOLEAN), true)); assertEquals("No", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.BOOLEAN), false)); + assertEquals("Yes", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.BOOLEAN), "true")); + assertEquals("No", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.BOOLEAN), "false")); + assertEquals("true", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.STRING), "true")); + assertEquals("false", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.STRING), "false")); assertNull(QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.TIME), null)); assertEquals("5:00:00 AM", QValueFormatter.formatValue(new QFieldMetaData().withType(QFieldType.TIME), LocalTime.of(5, 0))); From 3eae3a5758c2d2d0cb5bd1fd0ad96cb6aa2f9284 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 1 Aug 2024 15:12:59 -0500 Subject: [PATCH 22/23] re-set queryStat startTimestamp to just before executeQuery, to avoid including time spent aquiring db connection --- .../module/rdbms/actions/RDBMSAggregateAction.java | 9 +++++++++ .../backend/module/rdbms/actions/RDBMSCountAction.java | 9 +++++++++ .../backend/module/rdbms/actions/RDBMSQueryAction.java | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java index b174373b..7e231765 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.module.rdbms.actions; import java.io.Serializable; import java.sql.Connection; import java.sql.ResultSet; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -116,6 +117,14 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega actionTimeoutHelper = new ActionTimeoutHelper(aggregateInput.getTimeoutSeconds(), TimeUnit.SECONDS, new StatementTimeoutCanceller(statement, sql)); actionTimeoutHelper.start(); + /////////////////////////////////////////////////////////////////////////////////////////////////// + // to avoid counting time spent acquiring a connection, re-set the queryStat startTimestamp here // + /////////////////////////////////////////////////////////////////////////////////////////////////// + if(queryStat != null) + { + queryStat.setStartTimestamp(Instant.now()); + } + QueryManager.executeStatement(statement, sql, ((ResultSet resultSet) -> { ///////////////////////////////////////////////////////////////////////// diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java index a24890f1..c9f87e8a 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.module.rdbms.actions; import java.io.Serializable; import java.sql.Connection; import java.sql.ResultSet; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -96,6 +97,14 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf actionTimeoutHelper = new ActionTimeoutHelper(countInput.getTimeoutSeconds(), TimeUnit.SECONDS, new StatementTimeoutCanceller(statement, sql)); actionTimeoutHelper.start(); + /////////////////////////////////////////////////////////////////////////////////////////////////// + // to avoid counting time spent acquiring a connection, re-set the queryStat startTimestamp here // + /////////////////////////////////////////////////////////////////////////////////////////////////// + if(queryStat != null) + { + queryStat.setStartTimestamp(Instant.now()); + } + QueryManager.executeStatement(statement, sql, ((ResultSet resultSet) -> { ///////////////////////////////////////////////////////////////////////// diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java index 5b687cd7..47305b81 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java @@ -28,6 +28,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -165,6 +166,14 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf actionTimeoutHelper = new ActionTimeoutHelper(queryInput.getTimeoutSeconds(), TimeUnit.SECONDS, new StatementTimeoutCanceller(statement, sql)); actionTimeoutHelper.start(); + /////////////////////////////////////////////////////////////////////////////////////////////////// + // to avoid counting time spent acquiring a connection, re-set the queryStat startTimestamp here // + /////////////////////////////////////////////////////////////////////////////////////////////////// + if(queryStat != null) + { + queryStat.setStartTimestamp(Instant.now()); + } + ////////////////////////////////////////////// // execute the query - iterate over results // ////////////////////////////////////////////// From 9baa7c32bfe3cc6271e437a0e807449bebc1899e Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 2 Aug 2024 12:32:36 -0500 Subject: [PATCH 23/23] Add safety around most calls to formParam and/or queryParam, as they can throw if the request isn't formatted as expected, in ways that we may not want it to. --- .../qqq/api/javalin/QJavalinApiHandler.java | 15 +- .../javalin/QJavalinImplementation.java | 41 +-- .../qqq/backend/javalin/QJavalinUtils.java | 76 +++++ .../backend/javalin/QJavalinUtilsTest.java | 287 ++++++++++++++++++ 4 files changed, 387 insertions(+), 32 deletions(-) create mode 100644 qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinUtilsTest.java diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java index 96625d79..8c541218 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java @@ -458,11 +458,18 @@ public class QJavalinApiHandler ObjectUtils.ifNotNull(fieldsContainer.getRecordIdsField(), fields::add); for(QFieldMetaData field : fields) { - String queryParamValue = paramAccessor.apply(context, field.getName()); - if(queryParamValue != null) + try { - String backendName = ObjectUtils.requireConditionElse(field.getBackendName(), StringUtils::hasContent, field.getName()); - parameters.put(backendName, queryParamValue); + String value = paramAccessor.apply(context, field.getName()); + if(value != null) + { + String backendName = ObjectUtils.requireConditionElse(field.getBackendName(), StringUtils::hasContent, field.getName()); + parameters.put(backendName, value); + } + } + catch(Exception e) + { + LOG.info("Exception trying to process process input field", e); } } } diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index 61fdc389..3f4386ed 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -547,14 +547,17 @@ public class QJavalinImplementation } else { - String authorizationFormValue = context.formParam("Authorization"); - if(StringUtils.hasContent(authorizationFormValue)) + try { - processAuthorizationValue(authenticationContext, authorizationFormValue); + String authorizationFormValue = context.formParam("Authorization"); + if(StringUtils.hasContent(authorizationFormValue)) + { + processAuthorizationValue(authenticationContext, authorizationFormValue); + } } - else + catch(Exception e) { - LOG.debug("Neither [" + SESSION_ID_COOKIE_NAME + "] cookie nor [Authorization] header was present in request."); + LOG.info("Exception looking for Authorization formParam", e); } } @@ -565,7 +568,7 @@ public class QJavalinImplementation QSession session = authenticationModule.createSession(qInstance, authenticationContext); QContext.init(qInstance, session, null, input); - String tableVariant = StringUtils.hasContent(context.formParam("tableVariant")) ? context.formParam("tableVariant") : context.queryParam("tableVariant"); + String tableVariant = QJavalinUtils.getFormParamOrQueryParam(context, "tableVariant"); if(StringUtils.hasContent(tableVariant)) { JSONObject variant = new JSONObject(tableVariant); @@ -1183,11 +1186,7 @@ public class QJavalinImplementation PermissionsHelper.checkTablePermissionThrowing(countInput, TablePermissionSubType.READ); - filter = QJavalinUtils.stringQueryParam(context, "filter"); - if(!StringUtils.hasContent(filter)) - { - filter = context.formParam("filter"); - } + filter = QJavalinUtils.getQueryParamOrFormParam(context, "filter"); if(filter != null) { countInput.setFilter(JsonUtils.toObject(filter, QQueryFilter.class)); @@ -1256,11 +1255,7 @@ public class QJavalinImplementation PermissionsHelper.checkTablePermissionThrowing(queryInput, TablePermissionSubType.READ); - filter = QJavalinUtils.stringQueryParam(context, "filter"); - if(!StringUtils.hasContent(filter)) - { - filter = context.formParam("filter"); - } + filter = QJavalinUtils.getQueryParamOrFormParam(context, "filter"); if(filter != null) { QQueryFilter qQueryFilter = JsonUtils.toObject(filter, QQueryFilter.class); @@ -1540,23 +1535,13 @@ public class QJavalinImplementation PermissionsHelper.checkTablePermissionThrowing(exportInput, TablePermissionSubType.READ); - String fields = QJavalinUtils.stringQueryParam(context, "fields"); - if(!StringUtils.hasContent(fields)) - { - fields = context.formParam("fields"); - } - + String fields = QJavalinUtils.getQueryParamOrFormParam(context, "fields"); if(StringUtils.hasContent(fields)) { exportInput.setFieldNames(List.of(fields.split(","))); } - String filter = context.queryParam("filter"); - if(!StringUtils.hasContent(filter)) - { - filter = context.formParam("filter"); - } - + String filter = QJavalinUtils.getQueryParamOrFormParam(context, "filter"); if(StringUtils.hasContent(filter)) { exportInput.setQueryFilter(JsonUtils.toObject(filter, QQueryFilter.class)); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinUtils.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinUtils.java index fb1a4681..daa3fe8b 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinUtils.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinUtils.java @@ -102,4 +102,80 @@ public class QJavalinUtils return (null); } + + + + /*************************************************************************** + ** get a param value from either the form-body, or query string returning + ** the first one found, looking in that order, null if neither is found. + ** uses try-catch on reading each of those, as they apparently can throw! + ***************************************************************************/ + static String getFormParamOrQueryParam(Context context, String parameterName) + { + String value = null; + try + { + value = context.formParam(parameterName); + } + catch(Exception e) + { + //////////////// + // leave null // + //////////////// + } + + if(!StringUtils.hasContent(value)) + { + try + { + value = context.queryParam(parameterName); + } + catch(Exception e) + { + //////////////// + // leave null // + //////////////// + } + } + + return value; + } + + + + /*************************************************************************** + ** get a param value from either the query string, or form-body, returning + ** the first one found, looking in that order, null if neither is found. + ** uses try-catch on reading each of those, as they apparently can throw! + ***************************************************************************/ + static String getQueryParamOrFormParam(Context context, String parameterName) + { + String value = null; + try + { + value = context.queryParam(parameterName); + } + catch(Exception e) + { + //////////////// + // leave null // + //////////////// + } + + if(!StringUtils.hasContent(value)) + { + try + { + value = context.formParam(parameterName); + } + catch(Exception e) + { + //////////////// + // leave null // + //////////////// + } + } + + return value; + } } diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinUtilsTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinUtilsTest.java new file mode 100644 index 00000000..c8ffe0dd --- /dev/null +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinUtilsTest.java @@ -0,0 +1,287 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.javalin; + + +import java.io.InputStream; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import io.javalin.http.Context; +import io.javalin.http.HandlerType; +import io.javalin.http.HttpStatus; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + + +/******************************************************************************* + ** Unit test for QJavalinUtils + *******************************************************************************/ +class QJavalinUtilsTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void test() + { + //////////////////////////////////////////////////////////////////////////////////////////////// + // demonstrate that calling formParam or queryParam can throw (e.g., on our lame MockContext) // + //////////////////////////////////////////////////////////////////////////////////////////////// + assertThatThrownBy(() -> new MockContext(false, false).queryParam("foo")); + assertThatThrownBy(() -> new MockContext(false, false).formParam("foo")); + assertEquals("query:foo", new MockContext(true, false).queryParam("foo")); + assertEquals("form:foo", new MockContext(false, true).formParam("foo")); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // now demonstrate that calling these wrapping util methods avoid such exceptions (which was their intent.) // + // and, that when the context can return values, that the right ones are used // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + assertNull(QJavalinUtils.getQueryParamOrFormParam(new MockContext(false, false), "foo")); + assertEquals("query:foo", QJavalinUtils.getQueryParamOrFormParam(new MockContext(true, false), "foo")); + assertEquals("form:foo", QJavalinUtils.getQueryParamOrFormParam(new MockContext(false, true), "foo")); + assertEquals("query:foo", QJavalinUtils.getQueryParamOrFormParam(new MockContext(true, true), "foo")); + + assertNull(QJavalinUtils.getFormParamOrQueryParam(new MockContext(false, false), "foo")); + assertEquals("form:foo", QJavalinUtils.getFormParamOrQueryParam(new MockContext(false, true), "foo")); + assertEquals("query:foo", QJavalinUtils.getFormParamOrQueryParam(new MockContext(true, false), "foo")); + assertEquals("form:foo", QJavalinUtils.getFormParamOrQueryParam(new MockContext(true, true), "foo")); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + private static class MockContext implements Context + { + boolean returnsQueryParams; + boolean returnsFormParams; + + + + /******************************************************************************* + ** Constructor + ** + *******************************************************************************/ + public MockContext(boolean returnsQueryParams, boolean returnsFormParams) + { + this.returnsQueryParams = returnsQueryParams; + this.returnsFormParams = returnsFormParams; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @Nullable + @Override + public String queryParam(@NotNull String key) + { + if(this.returnsQueryParams) + { + return ("query:" + key); + } + + return Context.super.queryParam(key); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @Nullable + @Override + public String formParam(@NotNull String key) + { + if(this.returnsFormParams) + { + return ("form:" + key); + } + + return Context.super.formParam(key); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public HttpServletRequest req() + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public HttpServletResponse res() + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public T appAttribute(@NotNull String s) + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public HandlerType handlerType() + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public String matchedPath() + { + return ""; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public String endpointHandlerPath() + { + return ""; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public String pathParam(@NotNull String s) + { + return ""; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public Map pathParamMap() + { + return Map.of(); + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public ServletOutputStream outputStream() + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @NotNull + @Override + public Context result(@NotNull InputStream inputStream) + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @Nullable + @Override + public InputStream resultInputStream() + { + return null; + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public void future(@NotNull Supplier> supplier) + { + + } + + + + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public void redirect(@NotNull String s, @NotNull HttpStatus httpStatus) + { + + } + } +} \ No newline at end of file