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/pom.xml b/pom.xml
index 95ac1378..41a1556f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,8 +50,7 @@
UTF-8
UTF-8
- 17
- 17
+ 17
true
true
true
@@ -168,6 +167,7 @@
warning
**/target/generated-sources/*.*
+ true
check
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
{
/*******************************************************************************
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..ed183ca4 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;
@@ -49,6 +50,9 @@ import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
*******************************************************************************/
public abstract class ChildInserterPostInsertCustomizer extends AbstractPostInsertCustomizer
{
+ /***************************************************************************
+ **
+ ***************************************************************************/
public enum RelationshipType
{
PARENT_POINTS_AT_CHILD,
@@ -97,7 +101,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..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
@@ -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);
@@ -278,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/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/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/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 extends Serializable>) apiRecordList;
+ @SuppressWarnings("unchecked")
+ ArrayList extends Serializable> rs = (ArrayList extends Serializable>) apiRecordList;
+ return rs;
}
catch(ClassNotFoundException e)
{
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..75b17a22 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 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 9657b2fb..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
@@ -30,6 +30,7 @@ import java.util.List;
import java.util.Objects;
import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader;
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.tables.query.QCriteriaOperator;
@@ -69,14 +70,14 @@ public class SearchPossibleValueSourceAction
*******************************************************************************/
public SearchPossibleValueSourceOutput execute(SearchPossibleValueSourceInput input) throws QException
{
- QInstance qInstance = input.getInstance();
+ QInstance qInstance = QContext.getQInstance();
QPossibleValueSource possibleValueSource = qInstance.getPossibleValueSource(input.getPossibleValueSourceName());
if(possibleValueSource == null)
{
throw new QException("Missing possible value source named [" + input.getPossibleValueSourceName() + "]");
}
- possibleValueTranslator = new QPossibleValueTranslator(input.getInstance(), input.getSession());
+ possibleValueTranslator = new QPossibleValueTranslator(QContext.getQInstance(), QContext.getQSession());
SearchPossibleValueSourceOutput output = null;
if(possibleValueSource.getType().equals(QPossibleValueSourceType.ENUM))
{
@@ -199,7 +200,7 @@ public class SearchPossibleValueSourceAction
QueryInput queryInput = new QueryInput();
queryInput.setTableName(possibleValueSource.getTableName());
- QTableMetaData table = input.getInstance().getTable(possibleValueSource.getTableName());
+ QTableMetaData table = QContext.getQInstance().getTable(possibleValueSource.getTableName());
QQueryFilter queryFilter = new QQueryFilter();
queryFilter.setBooleanOperator(QQueryFilter.BooleanOperator.OR);
@@ -299,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/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!
**
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 19469abc..41f7ff2b 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
@@ -923,7 +923,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() + ".");
@@ -945,12 +945,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/AbstractActionInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/AbstractActionInput.java
index cee3d521..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
@@ -32,7 +32,6 @@ 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.metadata.authentication.QAuthenticationMetaData;
import com.kingsrook.qqq.backend.core.model.session.QSession;
@@ -93,17 +92,6 @@ public class AbstractActionInput
- /*******************************************************************************
- **
- *******************************************************************************/
- @JsonIgnore
- public QAuthenticationMetaData getAuthenticationMetaData()
- {
- return (getInstance().getAuthentication());
- }
-
-
-
/*******************************************************************************
** Getter for instance
**
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/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
**
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/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/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/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/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/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/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 extends QRecordEntity> associatedEntities = (List extends QRecordEntity>) 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 extends QRecordEntity> associatedEntities = (List extends QRecordEntity>) qRecordEntityAssociation.getGetter().invoke(this);
String associationName = qRecordEntityAssociation.getAssociationAnnotation().name();
@@ -346,6 +348,7 @@ public abstract class QRecordEntity
if(associationAnnotation.isPresent())
{
+ @SuppressWarnings("unchecked")
Class extends QRecordEntity> listTypeParam = (Class extends QRecordEntity>) 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/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-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/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/frontend/QFrontendTableMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java
index 2f93c109..d98ad463 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java
@@ -168,11 +168,11 @@ public class QFrontendTableMetaData
editPermission = PermissionsHelper.hasTablePermission(actionInput, tableMetaData.getName(), TablePermissionSubType.EDIT);
deletePermission = PermissionsHelper.hasTablePermission(actionInput, tableMetaData.getName(), TablePermissionSubType.DELETE);
- QBackendMetaData backend = actionInput.getInstance().getBackend(tableMetaData.getBackendName());
+ QBackendMetaData backend = QContext.getQInstance().getBackend(tableMetaData.getBackendName());
if(backend != null && backend.getUsesVariants())
{
usesVariants = true;
- variantTableLabel = actionInput.getInstance().getTable(backend.getVariantOptionsTableName()).getLabel();
+ variantTableLabel = QContext.getQInstance().getTable(backend.getVariantOptionsTableName()).getLabel();
}
this.helpContents = tableMetaData.getHelpContent();
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/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/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/bulk/delete/BulkDeleteLoadStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteLoadStep.java
index 3fdd208f..3b7b5631 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteLoadStep.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/bulk/delete/BulkDeleteLoadStep.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+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;
@@ -76,7 +77,7 @@ public class BulkDeleteLoadStep extends LoadViaDeleteStep implements ProcessSumm
{
super.preRun(runBackendStepInput, runBackendStepOutput);
- QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName());
+ QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getTableName());
if(table != null)
{
tableLabel = table.getLabel();
@@ -119,7 +120,7 @@ public class BulkDeleteLoadStep extends LoadViaDeleteStep implements ProcessSumm
////////////////////////////
super.runOnePage(runBackendStepInput, runBackendStepOutput);
- QTableMetaData table = runBackendStepInput.getInstance().getTable(runBackendStepInput.getTableName());
+ QTableMetaData table = QContext.getQInstance().getTable(runBackendStepInput.getTableName());
String primaryKeyFieldName = table.getPrimaryKeyField();
Map 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/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 d97bc159..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
@@ -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,15 +107,16 @@ 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());
/////////////////////////////////////////////////////////////////////////////////////
// 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/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/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/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/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/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/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)
{
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/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/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/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/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-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/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-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/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/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/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/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/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)));
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/instances/QInstanceValidatorTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidatorTest.java
index e09cfe1f..e6651f3a 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
@@ -173,10 +173,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");
}
@@ -191,10 +191,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");
}
@@ -552,7 +552,8 @@ public class QInstanceValidatorTest extends BaseTest
////////////////////////////////////////
// make sure our always failer fails. //
////////////////////////////////////////
- assertValidationFailureReasonsAllowingExtraReasons((qInstance) -> {
+ assertValidationFailureReasonsAllowingExtraReasons((qInstance) ->
+ {
}, "always fail");
}
finally
@@ -562,7 +563,8 @@ public class QInstanceValidatorTest extends BaseTest
////////////////////////////////////////////////////
// make sure if remove all plugins, we don't fail //
////////////////////////////////////////////////////
- assertValidationSuccess((qInstance) -> {
+ assertValidationSuccess((qInstance) ->
+ {
});
}
}
@@ -631,6 +633,9 @@ public class QInstanceValidatorTest extends BaseTest
*******************************************************************************/
public static class CustomizerWithNoVoidConstructor
{
+ /***************************************************************************
+ **
+ ***************************************************************************/
public CustomizerWithNoVoidConstructor(boolean b)
{
@@ -644,6 +649,9 @@ public class QInstanceValidatorTest extends BaseTest
*******************************************************************************/
private static class CustomizerWithPrivateVisibility extends AbstractPostQueryCustomizer
{
+ /***************************************************************************
+ **
+ ***************************************************************************/
public CustomizerWithPrivateVisibility()
{
System.out.println("eh?");
@@ -668,6 +676,9 @@ public class QInstanceValidatorTest extends BaseTest
*******************************************************************************/
public static class CustomizerWithOnlyPrivateConstructor
{
+ /***************************************************************************
+ **
+ ***************************************************************************/
private CustomizerWithOnlyPrivateConstructor()
{
@@ -1112,15 +1123,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",
@@ -1139,15 +1151,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",
@@ -1169,15 +1182,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",
@@ -1276,10 +1290,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");
}
@@ -1319,19 +1333,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");
}
@@ -1344,19 +1358,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");
}
@@ -1369,21 +1383,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");
}
@@ -1488,13 +1502,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");
}
@@ -1611,43 +1625,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");
}
@@ -1804,11 +1818,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");
}
@@ -2021,35 +2035,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 ->
@@ -2306,11 +2320,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
{
}
@@ -2318,17 +2335,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)
{
@@ -2338,11 +2361,14 @@ public class QInstanceValidatorTest extends BaseTest
- ///////////////////////////////////////////////
- // //
- ///////////////////////////////////////////////
+ /***************************************************************************
+ **
+ ***************************************************************************/
public class TestNoArgsConstructorClass extends AbstractTransformStep
{
+ /***************************************************************************
+ **
+ ***************************************************************************/
public TestNoArgsConstructorClass(int i)
{
@@ -2350,12 +2376,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/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..b87b6799 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)
@@ -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))
@@ -168,7 +170,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)
@@ -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/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..a209694b 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";
@@ -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..53ac9fc5 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
{
@@ -82,7 +83,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 +104,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 +121,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 +152,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 +184,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
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..17231334 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";
@@ -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/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/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/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
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-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/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-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..54487bd8 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,9 @@ 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.setURI(new URI(url));
request.setEntity(recordsToEntity(table, recordList));
QHttpResponse response = makeRequest(table, request);
@@ -685,112 +719,157 @@ 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 ->
- {
- 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 CUSTOM ->
- {
- handleCustomAuthorization(request);
- }
+ case API_KEY_QUERY_PARAM -> addApiKeyQueryParamToRequest(request);
+ case CUSTOM -> handleCustomAuthorization(request);
default -> throw new IllegalArgumentException("Unexpected authorization type: " + backendMetaData.getAuthorizationType());
}
}
+ /***************************************************************************
+ **
+ ***************************************************************************/
+ protected void addApiKeyQueryParamToRequest(HttpRequestBase request) throws QException
+ {
+ try
+ {
+ String uri = request.getURI().toString();
+ String pair = backendMetaData.getApiKeyQueryParamName() + "=" + 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));
+ }
+ }
+
+
+
+ /***************************************************************************
+ **
+ ***************************************************************************/
+ 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 +887,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 +906,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 +966,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);
@@ -1207,39 +1345,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 +1360,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/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-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=*****");
+ }
+
+
+
/*******************************************************************************
**
*******************************************************************************/
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);
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 c047d8bb..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
@@ -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
{
@@ -128,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/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/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/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-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/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/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/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/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-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-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/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() + ")");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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..5a900351 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,11 +25,13 @@ 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;
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 +72,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)
@@ -116,6 +118,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..121c2c9b 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,11 +25,13 @@ 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;
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 +65,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 +79,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
@@ -96,6 +98,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/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 9f72646f..84428b1c 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;
@@ -98,10 +99,10 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
StringBuilder sql = new StringBuilder(selection.selectClause());
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()))
@@ -151,6 +152,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 //
//////////////////////////////////////////////
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..19c909c2 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(";"))
@@ -200,8 +201,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/RDBMSQueryActionTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionTest.java
index b3bf3975..2b084bf0 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
@@ -984,6 +984,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/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-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/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-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,
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