Update to make example instance statically (since for an api-aware middleware, this code might end up running multiple times)

This commit is contained in:
2025-05-23 16:42:29 -05:00
parent 3b1178a7c6
commit e89c837690

View File

@ -30,6 +30,11 @@ import java.util.TreeSet;
import com.kingsrook.qqq.backend.core.actions.metadata.MetaDataAction; import com.kingsrook.qqq.backend.core.actions.metadata.MetaDataAction;
import com.kingsrook.qqq.backend.core.context.CapturedContext; import com.kingsrook.qqq.backend.core.context.CapturedContext;
import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException;
import com.kingsrook.qqq.backend.core.instances.QInstanceEnricher;
import com.kingsrook.qqq.backend.core.instances.QInstanceValidator;
import com.kingsrook.qqq.backend.core.instances.enrichment.plugins.QInstanceEnricherPluginInterface;
import com.kingsrook.qqq.backend.core.instances.validation.plugins.QInstanceValidatorPluginInterface;
import com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataOutput; import com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataOutput;
import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType;
import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData;
@ -47,7 +52,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.Capability;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.session.QSystemUserSession; import com.kingsrook.qqq.backend.core.model.session.QSystemUserSession;
import com.kingsrook.qqq.backend.core.modules.backend.implementations.memory.MemoryBackendModule; import com.kingsrook.qqq.backend.core.modules.backend.implementations.memory.MemoryBackendModule;
import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.ListingHash;
import com.kingsrook.qqq.middleware.javalin.executors.MetaDataExecutor; import com.kingsrook.qqq.middleware.javalin.executors.MetaDataExecutor;
import com.kingsrook.qqq.middleware.javalin.executors.io.MetaDataInput; import com.kingsrook.qqq.middleware.javalin.executors.io.MetaDataInput;
import com.kingsrook.qqq.middleware.javalin.specs.AbstractEndpointSpec; import com.kingsrook.qqq.middleware.javalin.specs.AbstractEndpointSpec;
@ -69,6 +74,13 @@ import io.javalin.http.Context;
*******************************************************************************/ *******************************************************************************/
public class MetaDataSpecV1 extends AbstractEndpointSpec<MetaDataInput, MetaDataResponseV1, MetaDataExecutor> public class MetaDataSpecV1 extends AbstractEndpointSpec<MetaDataInput, MetaDataResponseV1, MetaDataExecutor>
{ {
private static QInstance exampleInstance;
static
{
exampleInstance = defineExampleInstance();
validateExampleInstance(exampleInstance);
}
/*************************************************************************** /***************************************************************************
** **
@ -187,8 +199,46 @@ public class MetaDataSpecV1 extends AbstractEndpointSpec<MetaDataInput, MetaData
{ {
Map<String, Example> examples = new HashMap<>(); Map<String, Example> examples = new HashMap<>();
QInstance exampleInstance = new QInstance(); //////////////////////////////////////////////////////////////////////////////////////////////////////
// double-wrap the context here, so the instance will exist when the system-user-session is created //
// to avoid warnings out of system-user-session about there not being an instance in context. //
//////////////////////////////////////////////////////////////////////////////////////////////////////
QContext.withTemporaryContext(new CapturedContext(exampleInstance, null), () ->
{
QContext.withTemporaryContext(new CapturedContext(exampleInstance, new QSystemUserSession()), () ->
{
try
{
MetaDataAction metaDataAction = new MetaDataAction();
MetaDataOutput output = metaDataAction.execute(new com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataInput());
examples.put("Example", new Example()
.withValue(new MetaDataResponseV1()
.withMetaDataOutput(output)
)
);
}
catch(Exception e)
{
examples.put("Example", new Example().withValue("Error building example: " + e.getMessage()));
}
});
});
return new BasicResponse("""
Overall metadata for the application.""",
MetaDataResponseV1.class.getSimpleName(),
examples
);
}
/***************************************************************************
**
***************************************************************************/
private static QInstance defineExampleInstance()
{
QInstance exampleInstance = new QInstance();
exampleInstance.setAuthentication(new QAuthenticationMetaData().withName("anonymous").withType(QAuthenticationType.FULLY_ANONYMOUS)); exampleInstance.setAuthentication(new QAuthenticationMetaData().withName("anonymous").withType(QAuthenticationType.FULLY_ANONYMOUS));
QBackendMetaData exampleBackend = new QBackendMetaData() QBackendMetaData exampleBackend = new QBackendMetaData()
@ -241,37 +291,7 @@ public class MetaDataSpecV1 extends AbstractEndpointSpec<MetaDataInput, MetaData
.withChild(childApp) .withChild(childApp)
.withChild(exampleTable); .withChild(exampleTable);
exampleInstance.addApp(exampleApp); exampleInstance.addApp(exampleApp);
return exampleInstance;
//////////////////////////////////////////////////////////////////////////////////////////////////////
// double-wrap the context here, so the instance will exist when the system-user-session is created //
// to avoid warnings out of system-user-session about there not being an instance in context. //
//////////////////////////////////////////////////////////////////////////////////////////////////////
QContext.withTemporaryContext(new CapturedContext(exampleInstance, null), () ->
{
QContext.withTemporaryContext(new CapturedContext(exampleInstance, new QSystemUserSession()), () ->
{
try
{
MetaDataAction metaDataAction = new MetaDataAction();
MetaDataOutput output = metaDataAction.execute(new com.kingsrook.qqq.backend.core.model.actions.metadata.MetaDataInput());
examples.put("Example", new Example()
.withValue(new MetaDataResponseV1()
.withMetaDataOutput(output)
)
);
}
catch(Exception e)
{
examples.put("Example", new Example().withValue("Error building example: " + e.getMessage()));
}
});
});
return new BasicResponse("""
Overall metadata for the application.""",
MetaDataResponseV1.class.getSimpleName(),
examples
);
} }
@ -279,10 +299,24 @@ public class MetaDataSpecV1 extends AbstractEndpointSpec<MetaDataInput, MetaData
/*************************************************************************** /***************************************************************************
** **
***************************************************************************/ ***************************************************************************/
@Override private static void validateExampleInstance(QInstance exampleInstance)
public void handleOutput(Context context, MetaDataResponseV1 output) throws Exception
{ {
context.result(JsonUtils.toJson(output)); ListingHash<Class<?>, QInstanceEnricherPluginInterface<?>> enricherPlugins = QInstanceEnricher.getEnricherPlugins();
} QInstanceEnricher.removeAllEnricherPlugins();
ListingHash<Class<?>, QInstanceValidatorPluginInterface<?>> validatorPlugins = QInstanceValidator.getValidatorPlugins();
QInstanceValidator.removeAllValidatorPlugins();
try
{
new QInstanceValidator().validate(exampleInstance);
}
catch(QInstanceValidationException e)
{
System.err.println("Error validating example instance: " + e.getMessage());
}
enricherPlugins.values().forEach(l -> l.forEach(QInstanceEnricher::addEnricherPlugin));
validatorPlugins.values().forEach(l -> l.forEach(QInstanceValidator::addValidatorPlugin));
}
} }