From 85eae36c288224e542e8e70493be745925e83900 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Sun, 19 May 2024 20:22:58 -0500 Subject: [PATCH] CE-938 Add concept of MetaDataProducerMultiOutput --- .../core/model/MetaDataProducerInterface.java | 4 +- .../core/model/metadata/MetaDataProducer.java | 2 +- .../metadata/MetaDataProducerHelper.java | 2 +- .../metadata/MetaDataProducerMultiOutput.java | 101 ++++++++++++++++++ .../metadata/MetaDataProducerOutput.java | 35 ++++++ .../metadata/TopLevelMetaDataInterface.java | 2 +- 6 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerMultiOutput.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerOutput.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/MetaDataProducerInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/MetaDataProducerInterface.java index 45bd2ca6..9faf3dc4 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/MetaDataProducerInterface.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/MetaDataProducerInterface.java @@ -23,8 +23,8 @@ package com.kingsrook.qqq.backend.core.model; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.metadata.MetaDataProducerOutput; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.TopLevelMetaDataInterface; /******************************************************************************* @@ -42,7 +42,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.TopLevelMetaDataInterface; ** implement this interface. or, same idea for a QRecordEntity that provides ** its own TableMetaData. *******************************************************************************/ -public interface MetaDataProducerInterface +public interface MetaDataProducerInterface { int DEFAULT_SORT_ORDER = 500; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducer.java index 4207a132..2756715f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducer.java @@ -30,7 +30,7 @@ import com.kingsrook.qqq.backend.core.model.MetaDataProducerInterface; ** MetaDataProducerHelper, to put point at a package full of these, and populate ** your whole QInstance. *******************************************************************************/ -public abstract class MetaDataProducer implements MetaDataProducerInterface +public abstract class MetaDataProducer implements MetaDataProducerInterface { } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java index e8165a41..54c7ae4b 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java @@ -157,7 +157,7 @@ public class MetaDataProducerHelper { try { - TopLevelMetaDataInterface metaData = producer.produce(instance); + MetaDataProducerOutput metaData = producer.produce(instance); if(metaData != null) { metaData.addSelfToInstance(instance); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerMultiOutput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerMultiOutput.java new file mode 100644 index 00000000..d6797a2a --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerMultiOutput.java @@ -0,0 +1,101 @@ +/* + * 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.model.metadata; + + +import java.util.ArrayList; +import java.util.List; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; + + +/******************************************************************************* + ** Output object for a MetaDataProducer, which contains multiple meta-data + ** objects. + *******************************************************************************/ +public class MetaDataProducerMultiOutput implements MetaDataProducerOutput +{ + private List contents; + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public void addSelfToInstance(QInstance instance) + { + for(MetaDataProducerOutput metaDataProducerOutput : CollectionUtils.nonNullList(contents)) + { + metaDataProducerOutput.addSelfToInstance(instance); + } + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void add(MetaDataProducerOutput metaDataProducerOutput) + { + if(contents == null) + { + contents = new ArrayList<>(); + } + contents.add(metaDataProducerOutput); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public MetaDataProducerMultiOutput with(MetaDataProducerOutput metaDataProducerOutput) + { + add(metaDataProducerOutput); + return (this); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public List getEach(Class c) + { + List rs = new ArrayList<>(); + + for(MetaDataProducerOutput content : contents) + { + if(content instanceof MetaDataProducerMultiOutput multiOutput) + { + rs.addAll(multiOutput.getEach(c)); + } + else if(c.isInstance(content)) + { + rs.add(c.cast(content)); + } + } + + return (rs); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerOutput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerOutput.java new file mode 100644 index 00000000..09310523 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerOutput.java @@ -0,0 +1,35 @@ +/* + * 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.model.metadata; + + +/******************************************************************************* + ** Interface to mark objects that can be produced by a MetaDataProducer. + ** + ** These would usually be TopLevelMetaData objects (a table, a process, etc) + ** but can also be a MetaDataProducerMultiOutput, to produce multiple objects + ** from one producer. + *******************************************************************************/ +public interface MetaDataProducerOutput +{ + void addSelfToInstance(QInstance instance); +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/TopLevelMetaDataInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/TopLevelMetaDataInterface.java index e3dc117f..116bae9e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/TopLevelMetaDataInterface.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/TopLevelMetaDataInterface.java @@ -26,7 +26,7 @@ package com.kingsrook.qqq.backend.core.model.metadata; ** Interface for meta-data classes that can be added directly (e.g, at the top ** level) to a QInstance (such as a QTableMetaData - not a QFieldMetaData). *******************************************************************************/ -public interface TopLevelMetaDataInterface +public interface TopLevelMetaDataInterface extends MetaDataProducerOutput { /*******************************************************************************