SPRINT-15: added initial version of the QLogger class

This commit is contained in:
Tim Chamberlain
2022-11-14 17:37:47 -06:00
parent 430e1bc9c7
commit 20607bbf9b
9 changed files with 222 additions and 37 deletions

View File

@ -37,9 +37,8 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.TableAuto
import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.TriggerEvent;
import com.kingsrook.qqq.backend.core.model.session.QSession;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.QLogger;
import org.apache.commons.lang.NotImplementedException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/*******************************************************************************
@ -47,7 +46,7 @@ import org.apache.logging.log4j.Logger;
*******************************************************************************/
public class RecordAutomationStatusUpdater
{
private static final Logger LOG = LogManager.getLogger(RecordAutomationStatusUpdater.class);
private static final QLogger LOG = QLogger.getLogger(RecordAutomationStatusUpdater.class);
@ -55,7 +54,7 @@ public class RecordAutomationStatusUpdater
** for a list of records from a table, set their automation status - based on
** how the table is configured.
*******************************************************************************/
public static boolean setAutomationStatusInRecords(QTableMetaData table, List<QRecord> records, AutomationStatus automationStatus)
public static boolean setAutomationStatusInRecords(QSession session, QTableMetaData table, List<QRecord> records, AutomationStatus automationStatus)
{
if(table == null || table.getAutomationDetails() == null || CollectionUtils.nullSafeIsEmpty(records))
{
@ -77,7 +76,7 @@ public class RecordAutomationStatusUpdater
String className = stackTraceElement.getClassName();
if(className.contains("com.kingsrook.qqq.backend.core.actions.automation") && !className.equals(RecordAutomationStatusUpdater.class.getName()) && !className.endsWith("Test"))
{
LOG.debug("Avoiding re-setting automation status to PENDING_UPDATE while running an automation");
LOG.debug(session, "Avoiding re-setting automation status to PENDING_UPDATE while running an automation");
return (false);
}
}
@ -135,7 +134,7 @@ public class RecordAutomationStatusUpdater
QTableAutomationDetails automationDetails = table.getAutomationDetails();
if(automationDetails != null && AutomationStatusTrackingType.FIELD_IN_TABLE.equals(automationDetails.getStatusTracking().getType()))
{
boolean didSetStatusField = setAutomationStatusInRecords(table, records, automationStatus);
boolean didSetStatusField = setAutomationStatusInRecords(session, table, records, automationStatus);
if(didSetStatusField)
{
UpdateInput updateInput = new UpdateInput(instance);

View File

@ -67,7 +67,7 @@ public class InsertAction
*******************************************************************************/
private void setAutomationStatusField(InsertInput insertInput)
{
RecordAutomationStatusUpdater.setAutomationStatusInRecords(insertInput.getTable(), insertInput.getRecords(), AutomationStatus.PENDING_INSERT_AUTOMATIONS);
RecordAutomationStatusUpdater.setAutomationStatusInRecords(insertInput.getSession(), insertInput.getTable(), insertInput.getRecords(), AutomationStatus.PENDING_INSERT_AUTOMATIONS);
}

View File

@ -47,7 +47,7 @@ public class UpdateAction
setAutomationStatusField(updateInput);
QBackendModuleDispatcher qBackendModuleDispatcher = new QBackendModuleDispatcher();
QBackendModuleInterface qModule = qBackendModuleDispatcher.getQBackendModule(updateInput.getBackend());
QBackendModuleInterface qModule = qBackendModuleDispatcher.getQBackendModule(updateInput.getBackend());
// todo pre-customization - just get to modify the request?
UpdateOutput updateResult = qModule.getUpdateInterface().execute(updateInput);
// todo post-customization - can do whatever w/ the result if you want
@ -61,7 +61,7 @@ public class UpdateAction
*******************************************************************************/
private void setAutomationStatusField(UpdateInput updateInput)
{
RecordAutomationStatusUpdater.setAutomationStatusInRecords(updateInput.getTable(), updateInput.getRecords(), AutomationStatus.PENDING_UPDATE_AUTOMATIONS);
RecordAutomationStatusUpdater.setAutomationStatusInRecords(updateInput.getSession(), updateInput.getTable(), updateInput.getRecords(), AutomationStatus.PENDING_UPDATE_AUTOMATIONS);
}
}

View File

@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.model.session;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/*******************************************************************************
@ -33,13 +34,25 @@ import java.util.Map;
public class QSession implements Serializable
{
private String idReference;
private QUser user;
private QUser user;
private String uuid;
// implementation-specific custom values
private Map<String, String> values;
/*******************************************************************************
** Default constructor, puts a uuid in the session
**
*******************************************************************************/
public QSession()
{
this.uuid = UUID.randomUUID().toString();
}
/*******************************************************************************
** Getter for idReference
**
@ -145,4 +158,25 @@ public class QSession implements Serializable
this.values = values;
}
/*******************************************************************************
** Getter for uuid
**
*******************************************************************************/
public String getUuid()
{
return uuid;
}
/*******************************************************************************
** Setter for uuid
**
*******************************************************************************/
public void setUuid(String uuid)
{
this.uuid = uuid;
}
}

View File

@ -28,6 +28,7 @@ import com.kingsrook.qqq.backend.core.actions.processes.BackendStep;
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;
import com.kingsrook.qqq.backend.core.model.session.QSession;
/*******************************************************************************
@ -43,7 +44,8 @@ import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutp
*******************************************************************************/
public abstract class AbstractLoadStep implements BackendStep
{
private Optional<QBackendTransaction> transaction = Optional.empty();
private Optional<QBackendTransaction> transaction = Optional.empty();
protected QSession session;
@ -53,9 +55,7 @@ public abstract class AbstractLoadStep implements BackendStep
*******************************************************************************/
public void preRun(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException
{
////////////////////////
// noop in base class //
////////////////////////
this.session = runBackendStepInput.getSession();
}

View File

@ -0,0 +1,138 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2022. 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 <https://www.gnu.org/licenses/>.
*/
package com.kingsrook.qqq.backend.core.utils;
import java.util.HashMap;
import java.util.Map;
import com.kingsrook.qqq.backend.core.model.session.QSession;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/*******************************************************************************
** Utility class for logging
**
*******************************************************************************/
public class QLogger
{
private static Map<String, QLogger> loggerMap = new HashMap<>();
private Logger logger;
/*******************************************************************************
**
*******************************************************************************/
public QLogger(Logger logger)
{
this.logger = logger;
}
/*******************************************************************************
**
*******************************************************************************/
public static QLogger getLogger(Class<?> c)
{
return (loggerMap.computeIfAbsent(c.getName(), x -> new QLogger(LogManager.getLogger(c))));
}
/*******************************************************************************
**
*******************************************************************************/
public void debug(QSession session, String message)
{
logger.debug(wrapMessage(session, message));
}
/*******************************************************************************
**
*******************************************************************************/
public void info(QSession session, String message)
{
logger.info(wrapMessage(session, message));
}
/*******************************************************************************
**
*******************************************************************************/
public void warn(QSession session, String message)
{
logger.warn(wrapMessage(session, message));
}
/*******************************************************************************
**
*******************************************************************************/
public void warn(QSession session, String message, Throwable t)
{
logger.warn(wrapMessage(session, message), t);
}
/*******************************************************************************
**
*******************************************************************************/
public void error(QSession session, String message)
{
logger.error(wrapMessage(session, message));
}
/*******************************************************************************
**
*******************************************************************************/
public void error(QSession session, String message, Throwable t)
{
logger.error(wrapMessage(session, message), t);
}
/*******************************************************************************
**
*******************************************************************************/
private String wrapMessage(QSession session, String message)
{
String propertyName = "qqq.logger.logSessionId.disabled";
String propertyValue = System.getProperty(propertyName, "");
if(propertyValue.equals("true"))
{
return (message);
}
String sessionString = (session != null) ? session.getUuid() : "Not provided";
return ("Session [" + sessionString + "] | " + message);
}
}