From d6a9c8f0e004b456818756e0f6a4482d05e352e0 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 20 Mar 2023 14:28:26 -0500 Subject: [PATCH] Add instance, table, and field-level middleware meta-data --- .../core/instances/QInstanceEnricher.java | 6 ++ .../core/instances/QInstanceValidator.java | 15 ++++ .../core/model/metadata/QInstance.java | 61 +++++++++++++ .../metadata/QMiddlewareInstanceMetaData.java | 89 +++++++++++++++++++ .../model/metadata/fields/QFieldMetaData.java | 63 +++++++++++++ .../fields/QMiddlewareFieldMetaData.java | 63 +++++++++++++ .../tables/QMiddlewareTableMetaData.java | 74 +++++++++++++++ .../model/metadata/tables/QTableMetaData.java | 62 +++++++++++++ 8 files changed, 433 insertions(+) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QMiddlewareInstanceMetaData.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QMiddlewareFieldMetaData.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QMiddlewareTableMetaData.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java index f82740f0..23224694 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java @@ -60,6 +60,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportDataSource import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportMetaData; import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportView; import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QMiddlewareTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier; import com.kingsrook.qqq.backend.core.processes.implementations.bulk.delete.BulkDeleteTransformStep; @@ -180,6 +181,11 @@ public class QInstanceEnricher if(table.getFields() != null) { table.getFields().values().forEach(this::enrichField); + + for(QMiddlewareTableMetaData middlewareTableMetaData : CollectionUtils.nonNullMap(table.getMiddlewareMetaData()).values()) + { + middlewareTableMetaData.enrich(table); + } } if(CollectionUtils.nullSafeIsEmpty(table.getSections())) 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 4adf2f44..07d2a954 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 @@ -46,6 +46,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.QMiddlewareInstanceMetaData; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage; @@ -141,6 +142,7 @@ public class QInstanceValidator validateQueuesAndProviders(qInstance); validateJoins(qInstance); validateSecurityKeyTypes(qInstance); + validateMiddlewareMetaData(qInstance); validateUniqueTopLevelNames(qInstance); } @@ -159,6 +161,19 @@ public class QInstanceValidator + /******************************************************************************* + ** + *******************************************************************************/ + private void validateMiddlewareMetaData(QInstance qInstance) + { + for(QMiddlewareInstanceMetaData middlewareInstanceMetaData : CollectionUtils.nonNullMap(qInstance.getMiddlewareMetaData()).values()) + { + middlewareInstanceMetaData.validate(qInstance); + } + } + + + /******************************************************************************* ** *******************************************************************************/ diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java index 7c45cf88..be3b7074 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java @@ -90,6 +90,8 @@ public class QInstance private Map queueProviders = new LinkedHashMap<>(); private Map queues = new LinkedHashMap<>(); + private Map middlewareMetaData = new LinkedHashMap<>(); + private Map environmentValues = new LinkedHashMap<>(); private String defaultTimeZoneId = "UTC"; @@ -1075,4 +1077,63 @@ public class QInstance return (this); } + + + /******************************************************************************* + ** Getter for middlewareMetaData + *******************************************************************************/ + public Map getMiddlewareMetaData() + { + return (this.middlewareMetaData); + } + + + + /******************************************************************************* + ** Getter for middlewareMetaData + *******************************************************************************/ + public QMiddlewareInstanceMetaData getMiddlewareMetaData(String type) + { + if(this.middlewareMetaData == null) + { + return (null); + } + return this.middlewareMetaData.get(type); + } + + + + /******************************************************************************* + ** Setter for middlewareMetaData + *******************************************************************************/ + public void setMiddlewareMetaData(Map middlewareMetaData) + { + this.middlewareMetaData = middlewareMetaData; + } + + + + /******************************************************************************* + ** Fluent setter for middlewareMetaData + *******************************************************************************/ + public QInstance withMiddlewareMetaData(Map middlewareMetaData) + { + this.middlewareMetaData = middlewareMetaData; + return (this); + } + + + + /******************************************************************************* + ** Fluent setter for middlewareMetaData + *******************************************************************************/ + public QInstance withMiddlewareMetaData(QMiddlewareInstanceMetaData middlewareMetaData) + { + if(this.middlewareMetaData == null) + { + this.middlewareMetaData = new HashMap<>(); + } + this.middlewareMetaData.put(middlewareMetaData.getType(), middlewareMetaData); + return (this); + } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QMiddlewareInstanceMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QMiddlewareInstanceMetaData.java new file mode 100644 index 00000000..9e34a689 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QMiddlewareInstanceMetaData.java @@ -0,0 +1,89 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. 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.model.metadata; + + +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; + + +/******************************************************************************* + ** Base-class for instance-level meta-data defined for a specific middleware. + *******************************************************************************/ +public abstract class QMiddlewareInstanceMetaData +{ + protected String type; + + + + /******************************************************************************* + ** Getter for type + *******************************************************************************/ + public String getType() + { + return (this.type); + } + + + + /******************************************************************************* + ** Setter for type + *******************************************************************************/ + public void setType(String type) + { + this.type = type; + } + + + + /******************************************************************************* + ** Fluent setter for type + *******************************************************************************/ + public QMiddlewareInstanceMetaData withType(String type) + { + this.type = type; + return (this); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void enrich(QTableMetaData table) + { + //////////////////////// + // noop in base class // + //////////////////////// + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void validate(QInstance qInstance) + { + //////////////////////// + // noop in base class // + //////////////////////// + } +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java index cd9cfeeb..56ba9f8e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java @@ -25,8 +25,10 @@ package com.kingsrook.qqq.backend.core.model.metadata.fields; import java.io.Serializable; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import com.github.hervian.reflection.Fun; @@ -81,6 +83,8 @@ public class QFieldMetaData implements Cloneable private List adornments; + private Map middlewareMetaData; + /******************************************************************************* @@ -788,4 +792,63 @@ public class QFieldMetaData implements Cloneable return (this); } + + + /******************************************************************************* + ** Getter for middlewareMetaData + *******************************************************************************/ + public Map getMiddlewareMetaData() + { + return (this.middlewareMetaData); + } + + + + /******************************************************************************* + ** Getter for middlewareMetaData + *******************************************************************************/ + public QMiddlewareFieldMetaData getMiddlewareMetaData(String type) + { + if(this.middlewareMetaData == null) + { + return (null); + } + return this.middlewareMetaData.get(type); + } + + + + /******************************************************************************* + ** Setter for middlewareMetaData + *******************************************************************************/ + public void setMiddlewareMetaData(Map middlewareMetaData) + { + this.middlewareMetaData = middlewareMetaData; + } + + + + /******************************************************************************* + ** Fluent setter for middlewareMetaData + *******************************************************************************/ + public QFieldMetaData withMiddlewareMetaData(Map middlewareMetaData) + { + this.middlewareMetaData = middlewareMetaData; + return (this); + } + + + + /******************************************************************************* + ** Fluent setter for middlewareMetaData + *******************************************************************************/ + public QFieldMetaData withMiddlewareMetaData(QMiddlewareFieldMetaData middlewareMetaData) + { + if(this.middlewareMetaData == null) + { + this.middlewareMetaData = new HashMap<>(); + } + this.middlewareMetaData.put(middlewareMetaData.getType(), middlewareMetaData); + return (this); + } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QMiddlewareFieldMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QMiddlewareFieldMetaData.java new file mode 100644 index 00000000..454187d4 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QMiddlewareFieldMetaData.java @@ -0,0 +1,63 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. 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.model.metadata.fields; + + +/******************************************************************************* + ** Base-class for field-level meta-data defined for a specific middleware. + *******************************************************************************/ +public abstract class QMiddlewareFieldMetaData +{ + protected String type; + + + + /******************************************************************************* + ** Getter for type + *******************************************************************************/ + public String getType() + { + return (this.type); + } + + + + /******************************************************************************* + ** Setter for type + *******************************************************************************/ + public void setType(String type) + { + this.type = type; + } + + + + /******************************************************************************* + ** Fluent setter for type + *******************************************************************************/ + public QMiddlewareFieldMetaData withType(String type) + { + this.type = type; + return (this); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QMiddlewareTableMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QMiddlewareTableMetaData.java new file mode 100644 index 00000000..f6707861 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QMiddlewareTableMetaData.java @@ -0,0 +1,74 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. 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.model.metadata.tables; + + +/******************************************************************************* + ** Base-class for table-level meta-data defined for a specific middleware. + *******************************************************************************/ +public abstract class QMiddlewareTableMetaData +{ + protected String type; + + + + /******************************************************************************* + ** Getter for type + *******************************************************************************/ + public String getType() + { + return (this.type); + } + + + + /******************************************************************************* + ** Setter for type + *******************************************************************************/ + public void setType(String type) + { + this.type = type; + } + + + + /******************************************************************************* + ** Fluent setter for type + *******************************************************************************/ + public QMiddlewareTableMetaData withType(String type) + { + this.type = type; + return (this); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void enrich(QTableMetaData table) + { + //////////////////////// + // noop in base class // + //////////////////////// + } +} 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 c3187ccb..73fd684f 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 @@ -96,6 +96,8 @@ public class QTableMetaData implements QAppChildMetaData, Serializable, MetaData private CacheOf cacheOf; + private Map middlewareMetaData; + /******************************************************************************* @@ -1175,4 +1177,64 @@ public class QTableMetaData implements QAppChildMetaData, Serializable, MetaData return (this); } + + + /******************************************************************************* + ** Getter for middlewareMetaData + *******************************************************************************/ + public Map getMiddlewareMetaData() + { + return (this.middlewareMetaData); + } + + + + /******************************************************************************* + ** Getter for middlewareMetaData + *******************************************************************************/ + public QMiddlewareTableMetaData getMiddlewareMetaData(String type) + { + if(this.middlewareMetaData == null) + { + return (null); + } + return this.middlewareMetaData.get(type); + } + + + + /******************************************************************************* + ** Setter for middlewareMetaData + *******************************************************************************/ + public void setMiddlewareMetaData(Map middlewareMetaData) + { + this.middlewareMetaData = middlewareMetaData; + } + + + + /******************************************************************************* + ** Fluent setter for middlewareMetaData + *******************************************************************************/ + public QTableMetaData withMiddlewareMetaData(Map middlewareMetaData) + { + this.middlewareMetaData = middlewareMetaData; + return (this); + } + + + + /******************************************************************************* + ** Fluent setter for middlewareMetaData + *******************************************************************************/ + public QTableMetaData withMiddlewareMetaData(QMiddlewareTableMetaData middlewareMetaData) + { + if(this.middlewareMetaData == null) + { + this.middlewareMetaData = new HashMap<>(); + } + this.middlewareMetaData.put(middlewareMetaData.getType(), middlewareMetaData); + return (this); + } + }