From 99e282fcdfcf6421f880179dbeccc9a2b796e572 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 28 Feb 2025 19:41:57 -0600 Subject: [PATCH] Add sourceClass attribute to MetaDataProducerInterface --- .../core/model/metadata/MetaDataProducer.java | 35 ++++++++++ .../metadata/MetaDataProducerHelper.java | 65 +++++++++++-------- .../metadata/MetaDataProducerInterface.java | 19 ++++++ ...omRecordEntityGenericMetaDataProducer.java | 34 ++++++++++ ...omRecordEntityGenericMetaDataProducer.java | 34 ++++++++++ ...ueSourceOfEnumGenericMetaDataProducer.java | 37 +++++++++++ ...eSourceOfTableGenericMetaDataProducer.java | 35 ++++++++++ ...dEntityToTableGenericMetaDataProducer.java | 34 ++++++++++ 8 files changed, 266 insertions(+), 27 deletions(-) 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 a4dbe375..401ecb0e 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 @@ -29,5 +29,40 @@ package com.kingsrook.qqq.backend.core.model.metadata; *******************************************************************************/ public abstract class MetaDataProducer implements MetaDataProducerInterface { + private Class sourceClass; + + + /******************************************************************************* + ** Getter for sourceClass + ** + *******************************************************************************/ + @Override + public Class getSourceClass() + { + return sourceClass; + } + + + + /******************************************************************************* + ** Setter for sourceClass + ** + *******************************************************************************/ + @Override + public void setSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + } + + + /******************************************************************************* + ** Fluent setter for sourceClass + ** + *******************************************************************************/ + public MetaDataProducer withSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + return (this); + } } 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 487c6dda..ec41e0b6 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 @@ -239,17 +239,19 @@ public class MetaDataProducerHelper ** ***************************************************************************/ @SuppressWarnings("unchecked") - private static > MetaDataProducerInterface processMetaDataProducingPossibleValueEnum(Class aClass) + private static > MetaDataProducerInterface processMetaDataProducingPossibleValueEnum(Class sourceClass) { String warningPrefix = "Found a class annotated as @" + QMetaDataProducingPossibleValueEnum.class.getSimpleName(); - if(!PossibleValueEnum.class.isAssignableFrom(aClass)) + if(!PossibleValueEnum.class.isAssignableFrom(sourceClass)) { - LOG.warn(warningPrefix + ", but which is not a " + PossibleValueEnum.class.getSimpleName() + ", so it will not be used.", logPair("class", aClass.getSimpleName())); + LOG.warn(warningPrefix + ", but which is not a " + PossibleValueEnum.class.getSimpleName() + ", so it will not be used.", logPair("class", sourceClass.getSimpleName())); return null; } - PossibleValueEnum[] values = (PossibleValueEnum[]) aClass.getEnumConstants(); - return (new PossibleValueSourceOfEnumGenericMetaDataProducer(aClass.getSimpleName(), (PossibleValueEnum[]) values)); + PossibleValueEnum[] values = (PossibleValueEnum[]) sourceClass.getEnumConstants(); + PossibleValueSourceOfEnumGenericMetaDataProducer producer = new PossibleValueSourceOfEnumGenericMetaDataProducer<>(sourceClass.getSimpleName(), (PossibleValueEnum[]) values); + producer.setSourceClass(sourceClass); + return producer; } @@ -257,32 +259,32 @@ public class MetaDataProducerHelper /*************************************************************************** ** ***************************************************************************/ - private static List> processMetaDataProducingEntity(Class aClass) throws Exception + private static List> processMetaDataProducingEntity(Class sourceClass) throws Exception { List> rs = new ArrayList<>(); - QMetaDataProducingEntity qMetaDataProducingEntity = aClass.getAnnotation(QMetaDataProducingEntity.class); + QMetaDataProducingEntity qMetaDataProducingEntity = sourceClass.getAnnotation(QMetaDataProducingEntity.class); String warningPrefix = "Found a class annotated as @" + QMetaDataProducingEntity.class.getSimpleName(); /////////////////////////////////////////////////////////// // make sures class is QRecordEntity and cast it as such // /////////////////////////////////////////////////////////// - if(!QRecordEntity.class.isAssignableFrom(aClass)) + if(!QRecordEntity.class.isAssignableFrom(sourceClass)) { - LOG.warn(warningPrefix + ", but which is not a " + QRecordEntity.class.getSimpleName() + ", so it will not be used.", logPair("class", aClass.getSimpleName())); + LOG.warn(warningPrefix + ", but which is not a " + QRecordEntity.class.getSimpleName() + ", so it will not be used.", logPair("class", sourceClass.getSimpleName())); return (rs); } @SuppressWarnings("unchecked") // safe per the check above. - Class recordEntityClass = (Class) aClass; + Class recordEntityClass = (Class) sourceClass; //////////////////////////////////////////////// // get TABLE_NAME static field from the class // //////////////////////////////////////////////// - Field tableNameField = aClass.getDeclaredField("TABLE_NAME"); + Field tableNameField = recordEntityClass.getDeclaredField("TABLE_NAME"); if(!tableNameField.getType().equals(String.class)) { - LOG.warn(warningPrefix + ", but whose TABLE_NAME field is not a String, so it will not be used.", logPair("class", aClass.getSimpleName())); + LOG.warn(warningPrefix + ", but whose TABLE_NAME field is not a String, so it will not be used.", logPair("class", recordEntityClass.getSimpleName())); return (rs); } @@ -303,6 +305,7 @@ public class MetaDataProducerHelper } RecordEntityToTableGenericMetaDataProducer producer = new RecordEntityToTableGenericMetaDataProducer(tableNameValue, recordEntityClass, tableMetaDataProductionCustomizer); + producer.setSourceClass(recordEntityClass); if(tableMetaDataCustomizer != null) { @@ -322,7 +325,9 @@ public class MetaDataProducerHelper //////////////////////////////////////// if(qMetaDataProducingEntity.producePossibleValueSource()) { - rs.add(new PossibleValueSourceOfTableGenericMetaDataProducer(tableNameValue)); + PossibleValueSourceOfTableGenericMetaDataProducer producer = new PossibleValueSourceOfTableGenericMetaDataProducer(tableNameValue); + producer.setSourceClass(recordEntityClass); + rs.add(producer); } ////////////////////////// @@ -333,11 +338,11 @@ public class MetaDataProducerHelper Class childEntityClass = childTable.childTableEntityClass(); if(childTable.childJoin().enabled()) { - CollectionUtils.addIfNotNull(rs, processChildJoin(aClass, childTable)); + CollectionUtils.addIfNotNull(rs, processChildJoin(recordEntityClass, childTable)); if(childTable.childRecordListWidget().enabled()) { - CollectionUtils.addIfNotNull(rs, processChildRecordListWidget(aClass, childTable)); + CollectionUtils.addIfNotNull(rs, processChildRecordListWidget(recordEntityClass, childTable)); } } else @@ -347,7 +352,7 @@ public class MetaDataProducerHelper ////////////////////////////////////////////////////////////////////////// // if not doing the join, can't do the child-widget, so warn about that // ////////////////////////////////////////////////////////////////////////// - LOG.warn(warningPrefix + " requested to produce a ChildRecordListWidget, but not produce a Join - which is not allowed (must do join to do widget). ", logPair("class", aClass.getSimpleName()), logPair("childEntityClass", childEntityClass.getSimpleName())); + LOG.warn(warningPrefix + " requested to produce a ChildRecordListWidget, but not produce a Join - which is not allowed (must do join to do widget). ", logPair("class", recordEntityClass.getSimpleName()), logPair("childEntityClass", childEntityClass.getSimpleName())); } } } @@ -360,14 +365,16 @@ public class MetaDataProducerHelper /*************************************************************************** ** ***************************************************************************/ - private static MetaDataProducerInterface processChildRecordListWidget(Class aClass, ChildTable childTable) throws Exception + private static MetaDataProducerInterface processChildRecordListWidget(Class sourceClass, ChildTable childTable) throws Exception { Class childEntityClass = childTable.childTableEntityClass(); - String parentTableName = getTableNameStaticFieldValue(aClass); + String parentTableName = getTableNameStaticFieldValue(sourceClass); String childTableName = getTableNameStaticFieldValue(childEntityClass); ChildRecordListWidget childRecordListWidget = childTable.childRecordListWidget(); - return (new ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer(childTableName, parentTableName, childRecordListWidget)); + ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer producer = new ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer(childTableName, parentTableName, childRecordListWidget); + producer.setSourceClass(sourceClass); + return producer; } @@ -397,20 +404,22 @@ public class MetaDataProducerHelper /*************************************************************************** ** ***************************************************************************/ - private static MetaDataProducerInterface processChildJoin(Class aClass, ChildTable childTable) throws Exception + private static MetaDataProducerInterface processChildJoin(Class entityClass, ChildTable childTable) throws Exception { Class childEntityClass = childTable.childTableEntityClass(); - String parentTableName = getTableNameStaticFieldValue(aClass); + String parentTableName = getTableNameStaticFieldValue(entityClass); String childTableName = getTableNameStaticFieldValue(childEntityClass); String possibleValueFieldName = findPossibleValueField(childEntityClass, parentTableName); if(!StringUtils.hasContent(possibleValueFieldName)) { - LOG.warn("Could not find field in [" + childEntityClass.getSimpleName() + "] with possibleValueSource referencing table [" + aClass.getSimpleName() + "]"); + LOG.warn("Could not find field in [" + childEntityClass.getSimpleName() + "] with possibleValueSource referencing table [" + entityClass.getSimpleName() + "]"); return (null); } - return (new ChildJoinFromRecordEntityGenericMetaDataProducer(childTableName, parentTableName, possibleValueFieldName)); + ChildJoinFromRecordEntityGenericMetaDataProducer producer = new ChildJoinFromRecordEntityGenericMetaDataProducer(childTableName, parentTableName, possibleValueFieldName); + producer.setSourceClass(entityClass); + return producer; } @@ -418,18 +427,20 @@ public class MetaDataProducerHelper /*************************************************************************** ** ***************************************************************************/ - private static MetaDataProducerInterface processMetaDataProducer(Class aClass) throws Exception + private static MetaDataProducerInterface processMetaDataProducer(Class sourceCClass) throws Exception { - for(Constructor constructor : aClass.getConstructors()) + for(Constructor constructor : sourceCClass.getConstructors()) { if(constructor.getParameterCount() == 0) { Object o = constructor.newInstance(); - return (MetaDataProducerInterface) o; + MetaDataProducerInterface producer = (MetaDataProducerInterface) o; + producer.setSourceClass(sourceCClass); + return producer; } } - LOG.warn("Found a class which implements MetaDataProducerInterface, but it does not have a no-arg constructor, so it cannot be used.", logPair("class", aClass.getSimpleName())); + LOG.warn("Found a class which implements MetaDataProducerInterface, but it does not have a no-arg constructor, so it cannot be used.", logPair("class", sourceCClass.getSimpleName())); return null; } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerInterface.java index fa725451..6aef051e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerInterface.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerInterface.java @@ -73,4 +73,23 @@ public interface MetaDataProducerInterface return (true); } + + /*************************************************************************** + * + ***************************************************************************/ + default void setSourceClass(Class sourceClass) + { + ////////// + // noop // + ////////// + } + + + /*************************************************************************** + ** + ***************************************************************************/ + default Class getSourceClass() + { + return null; + } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java index 76c892cd..c1bc51cf 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java @@ -62,6 +62,7 @@ public class ChildJoinFromRecordEntityGenericMetaDataProducer implements MetaDat private String parentTableName; // e.g., order private String foreignKeyFieldName; // e.g., orderId + private Class sourceClass; /*************************************************************************** @@ -102,4 +103,37 @@ public class ChildJoinFromRecordEntityGenericMetaDataProducer implements MetaDat return (join); } + + + /******************************************************************************* + ** Getter for sourceClass + ** + *******************************************************************************/ + public Class getSourceClass() + { + return sourceClass; + } + + + + /******************************************************************************* + ** Setter for sourceClass + ** + *******************************************************************************/ + public void setSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + } + + + /******************************************************************************* + ** Fluent setter for sourceClass + ** + *******************************************************************************/ + public ChildJoinFromRecordEntityGenericMetaDataProducer withSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer.java index d9d7858c..6dac1a10 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer.java @@ -57,6 +57,8 @@ public class ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer implem private ChildRecordListWidget childRecordListWidget; + private Class sourceClass; + /*************************************************************************** @@ -111,4 +113,36 @@ public class ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer implem return (widget); } + + + /******************************************************************************* + ** Getter for sourceClass + ** + *******************************************************************************/ + public Class getSourceClass() + { + return sourceClass; + } + + + + /******************************************************************************* + ** Setter for sourceClass + ** + *******************************************************************************/ + public void setSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + } + + + /******************************************************************************* + ** Fluent setter for sourceClass + ** + *******************************************************************************/ + public ChildRecordListWidgetFromRecordEntityGenericMetaDataProducer withSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + return (this); + } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfEnumGenericMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfEnumGenericMetaDataProducer.java index 8cb96ec2..f43818b5 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfEnumGenericMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfEnumGenericMetaDataProducer.java @@ -40,6 +40,10 @@ public class PossibleValueSourceOfEnumGenericMetaDataProducer[] values; + private Class sourceClass; + + + /******************************************************************************* @@ -62,4 +66,37 @@ public class PossibleValueSourceOfEnumGenericMetaDataProducer getSourceClass() + { + return sourceClass; + } + + + + /******************************************************************************* + ** Setter for sourceClass + ** + *******************************************************************************/ + public void setSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + } + + + /******************************************************************************* + ** Fluent setter for sourceClass + ** + *******************************************************************************/ + public PossibleValueSourceOfEnumGenericMetaDataProducer withSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfTableGenericMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfTableGenericMetaDataProducer.java index c1656f35..7d194f64 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfTableGenericMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/PossibleValueSourceOfTableGenericMetaDataProducer.java @@ -37,6 +37,7 @@ public class PossibleValueSourceOfTableGenericMetaDataProducer implements MetaDa { private final String tableName; + private Class sourceClass; /******************************************************************************* @@ -58,4 +59,38 @@ public class PossibleValueSourceOfTableGenericMetaDataProducer implements MetaDa { return (QPossibleValueSource.newForTable(tableName)); } + + + + /******************************************************************************* + ** Getter for sourceClass + ** + *******************************************************************************/ + public Class getSourceClass() + { + return sourceClass; + } + + + + /******************************************************************************* + ** Setter for sourceClass + ** + *******************************************************************************/ + public void setSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + } + + + /******************************************************************************* + ** Fluent setter for sourceClass + ** + *******************************************************************************/ + public PossibleValueSourceOfTableGenericMetaDataProducer withSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/RecordEntityToTableGenericMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/RecordEntityToTableGenericMetaDataProducer.java index 21565148..20cf5be1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/RecordEntityToTableGenericMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/RecordEntityToTableGenericMetaDataProducer.java @@ -48,6 +48,7 @@ public class RecordEntityToTableGenericMetaDataProducer implements MetaDataProdu private static MetaDataCustomizerInterface defaultMetaDataCustomizer = null; + private Class sourceClass; /******************************************************************************* @@ -154,4 +155,37 @@ public class RecordEntityToTableGenericMetaDataProducer implements MetaDataProdu RecordEntityToTableGenericMetaDataProducer.defaultMetaDataCustomizer = defaultMetaDataCustomizer; } + + + /******************************************************************************* + ** Getter for sourceClass + ** + *******************************************************************************/ + public Class getSourceClass() + { + return sourceClass; + } + + + + /******************************************************************************* + ** Setter for sourceClass + ** + *******************************************************************************/ + public void setSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + } + + + /******************************************************************************* + ** Fluent setter for sourceClass + ** + *******************************************************************************/ + public RecordEntityToTableGenericMetaDataProducer withSourceClass(Class sourceClass) + { + this.sourceClass = sourceClass; + return (this); + } + }