From 64287985200fda750675473e0a56aae7761da6d4 Mon Sep 17 00:00:00 2001 From: Stuart Douglas Date: Tue, 6 May 2025 17:29:14 +1000 Subject: [PATCH 1/2] chore: store project root in the builder --- .../block/ftl/deployment/EnumProcessor.java | 2 +- .../block/ftl/deployment/HTTPProcessor.java | 46 +++++++--- .../block/ftl/deployment/ModuleBuilder.java | 86 ++++++++++--------- .../block/ftl/deployment/ModuleProcessor.java | 6 +- .../ftl/deployment/SubscriptionProcessor.java | 8 +- .../block/ftl/deployment/TopicsProcessor.java | 2 +- .../ftl/deployment/TypeAliasProcessor.java | 3 +- .../block/ftl/deployment/TypeProcessor.java | 4 +- .../block/ftl/deployment/VerbProcessor.java | 17 ++-- 9 files changed, 97 insertions(+), 77 deletions(-) diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/EnumProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/EnumProcessor.java index 18551cf239..5667a4b133 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/EnumProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/EnumProcessor.java @@ -189,7 +189,7 @@ private TypeEnum extractTypeEnum(CombinedIndexBuildItem index, ProjectRootBuildI Thread.currentThread().getContextClassLoader()); variantClasses.add(variantClazz); } - xyz.block.ftl.schema.v1.Type declType = moduleBuilder.buildType(projectRoot, variantType, visibility, + xyz.block.ftl.schema.v1.Type declType = moduleBuilder.buildType(variantType, visibility, Nullability.NOT_NULL); TypeValue typeValue = TypeValue.newBuilder().setValue(declType).build(); diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java index a603335056..5b26bd912b 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java @@ -27,7 +27,6 @@ import xyz.block.ftl.runtime.VerbRegistry; import xyz.block.ftl.runtime.builtin.HttpRequest; import xyz.block.ftl.runtime.builtin.HttpResponse; -import xyz.block.ftl.schema.v1.Array; import xyz.block.ftl.schema.v1.IngressPathComponent; import xyz.block.ftl.schema.v1.IngressPathLiteral; import xyz.block.ftl.schema.v1.IngressPathParameter; @@ -117,20 +116,23 @@ public void accept(ModuleBuilder moduleBuilder) { @Override public void accept(ModuleBuilder moduleBuilder) { Type stringType = Type.newBuilder().setString(xyz.block.ftl.schema.v1.String.newBuilder().build()).build(); - Type pathParamType = Type.newBuilder() - .setMap(xyz.block.ftl.schema.v1.Map.newBuilder().setKey(stringType) - .setValue(stringType)) - .build(); + for (var endpoint : restEndpoints.getEntries()) { var verbName = ModuleBuilder.methodToName(endpoint.getMethodInfo()); org.jboss.jandex.Type bodyParamType = VoidType.VOID; MethodParameter[] parameters = endpoint.getResourceMethod().getParameters(); + List pathParams = new ArrayList<>(); + List queryParams = new ArrayList<>(); for (int i = 0, parametersLength = parameters.length; i < parametersLength; i++) { var httpParam = parameters[i]; if (httpParam.parameterType.equals(ParameterType.BODY)) { bodyParamType = endpoint.getMethodInfo().parameterType(i); + } else if (httpParam.parameterType.equals(ParameterType.PATH)) { + pathParams.add(httpParam); + } else if (httpParam.parameterType.equals(ParameterType.QUERY)) { + queryParams.add(httpParam); } } @@ -147,6 +149,7 @@ public void accept(ModuleBuilder moduleBuilder) { String path = extractPath(endpoint); URITemplate template = new URITemplate(path, false); List pathComponents = new ArrayList<>(); + boolean hasParams = false; for (var i : template.components) { if (i.type == URITemplate.Type.CUSTOM_REGEX) { throw new RuntimeException( @@ -163,11 +166,35 @@ public void accept(ModuleBuilder moduleBuilder) { .build()); } } else { + hasParams = true; pathComponents.add(IngressPathComponent.newBuilder() .setIngressPathParameter(IngressPathParameter.newBuilder().setName(i.name)) .build()); } } + + Type pathParamType; + if (pathParams.isEmpty() && !hasParams) { + pathParamType = Type.newBuilder() + .setUnit(Unit.newBuilder()) + .build(); + } else { + pathParamType = Type.newBuilder() + .setMap(xyz.block.ftl.schema.v1.Map.newBuilder().setKey(stringType) + .setValue(stringType)) + .build(); + } + + Type.Builder queryParamsType; + if (queryParams.isEmpty()) { + queryParamsType = Type.newBuilder() + .setUnit(Unit.newBuilder()); + } else { + queryParamsType = Type.newBuilder() + .setMap(xyz.block.ftl.schema.v1.Map.newBuilder().setKey(stringType) + .setValue(stringType)); + } + ModuleBuilder.VerbCustomization verbCustomization = new ModuleBuilder.VerbCustomization(); verbCustomization.setCustomHandling(true) .setMetadataCallback((builder) -> { @@ -193,12 +220,7 @@ public void accept(ModuleBuilder moduleBuilder) { .setName(HttpRequest.class.getSimpleName()) .addTypeParameters(requestTypeParam) .addTypeParameters(pathParamType) - .addTypeParameters(Type.newBuilder() - .setMap(xyz.block.ftl.schema.v1.Map.newBuilder().setKey(stringType) - .setValue(Type.newBuilder() - .setArray( - Array.newBuilder().setElement(stringType))) - .build()))) + .addTypeParameters(queryParamsType)) .build(); }) .setResponseType((responseTypeParam) -> { @@ -210,7 +232,7 @@ public void accept(ModuleBuilder moduleBuilder) { .build(); }); - moduleBuilder.registerVerbMethod(projectRoot, endpoint.getMethodInfo(), + moduleBuilder.registerVerbMethod(endpoint.getMethodInfo(), endpoint.getActualClassInfo().name().toString(), Visibility.VISIBILITY_SCOPE_NONE, false, ModuleBuilder.BodyType.ALLOWED, verbCustomization); } diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleBuilder.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleBuilder.java index f930b7542d..2abdd490c6 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleBuilder.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleBuilder.java @@ -112,12 +112,13 @@ public class ModuleBuilder { private final CommentsBuildItem comments; private final List validationFailures = new ArrayList<>(); private final boolean defaultToOptional; + private final String projectRoot; public ModuleBuilder(IndexView index, String moduleName, Map knownTopics, Map verbClients, Map sqlQueryClients, FTLRecorder recorder, - CommentsBuildItem comments, boolean defaultToOptional) { + CommentsBuildItem comments, boolean defaultToOptional, String projectRoot) { this.index = index; this.moduleName = moduleName; this.protoModuleBuilder = Module.newBuilder() @@ -129,6 +130,7 @@ public ModuleBuilder(IndexView index, String moduleName, Map loadClass(org.jboss.jandex.Type param) throws ClassNotFou } - public void registerVerbMethod(String projectRoot, MethodInfo method, String className, + public void registerVerbMethod(MethodInfo method, String className, Visibility visibility, boolean transaction, BodyType bodyType) { - registerVerbMethod(projectRoot, method, className, visibility, transaction, bodyType, new VerbCustomization()); + registerVerbMethod(method, className, visibility, transaction, bodyType, new VerbCustomization()); } - public void registerVerbMethod(String projectRoot, MethodInfo method, String className, + public void registerVerbMethod(MethodInfo method, String className, Visibility visibility, boolean transaction, BodyType bodyType, VerbCustomization customization) { Position methodPos = forMethod(projectRoot, method); try { @@ -220,7 +222,7 @@ public void registerVerbMethod(String projectRoot, MethodInfo method, String cla Nullability bodyParamNullability = Nullability.MISSING; xyz.block.ftl.schema.v1.Verb.Builder verbBuilder = xyz.block.ftl.schema.v1.Verb.newBuilder(); - String verbName = validateName(projectRoot, method, ModuleBuilder.methodToName(method)); + String verbName = validateName(method, ModuleBuilder.methodToName(method)); MetadataCalls.Builder callsMetadata = MetadataCalls.newBuilder(); MetadataConfig.Builder configMetadata = MetadataConfig.newBuilder(); MetadataEgress.Builder configEgress = MetadataEgress.newBuilder(); @@ -240,7 +242,7 @@ public void registerVerbMethod(String projectRoot, MethodInfo method, String cla if (!knownSecrets.contains(name)) { xyz.block.ftl.schema.v1.Secret.Builder secretBuilder = xyz.block.ftl.schema.v1.Secret .newBuilder().setPos(methodPos) - .setType(buildType(projectRoot, param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) + .setType(buildType(param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) .setName(name) .addAllComments(comments.getComments(name)); addDecls(Decl.newBuilder().setSecret(secretBuilder).build()); @@ -255,7 +257,7 @@ public void registerVerbMethod(String projectRoot, MethodInfo method, String cla if (!knownConfig.contains(name)) { xyz.block.ftl.schema.v1.Config.Builder configBuilder = xyz.block.ftl.schema.v1.Config .newBuilder().setPos(methodPos) - .setType(buildType(projectRoot, param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) + .setType(buildType(param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) .setName(name) .addAllComments(comments.getComments(name)); addDecls(Decl.newBuilder().setConfig(configBuilder).build()); @@ -272,7 +274,7 @@ public void registerVerbMethod(String projectRoot, MethodInfo method, String cla if (!knownConfig.contains(config)) { xyz.block.ftl.schema.v1.Config.Builder configBuilder = xyz.block.ftl.schema.v1.Config .newBuilder() - .setType(buildType(projectRoot, param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) + .setType(buildType(param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) .setName(config); addDecls(Decl.newBuilder().setConfig(configBuilder).build()); knownConfig.add(config); @@ -356,9 +358,9 @@ public void registerVerbMethod(String projectRoot, MethodInfo method, String cla .setPos(methodPos) .setRequest( customization.requestType - .apply(buildType(projectRoot, bodyParamType, visibility, bodyParamNullability))) + .apply(buildType(bodyParamType, visibility, bodyParamNullability))) .setResponse( - customization.responseType.apply(buildType(projectRoot, method.returnType(), visibility, method))) + customization.responseType.apply(buildType(method.returnType(), visibility, method))) .addAllComments(comments.getComments(verbName)); if (customization.metadataCallback != null) { customization.metadataCallback.accept(verbBuilder); @@ -374,12 +376,12 @@ public void registerVerbMethod(String projectRoot, MethodInfo method, String cla } } - public void registerVerbType(String projectRoot, ClassInfo clazz, + public void registerVerbType(ClassInfo clazz, Visibility visibility, boolean transaction, BodyType bodyType) { - registerVerbType(projectRoot, clazz, visibility, transaction, bodyType, new VerbCustomization()); + registerVerbType(clazz, visibility, transaction, bodyType, new VerbCustomization()); } - public void registerVerbType(String projectRoot, ClassInfo clazz, + public void registerVerbType(ClassInfo clazz, Visibility visibility, boolean transaction, BodyType bodyType, VerbCustomization customization) { List> bodyParameterTypes = new ArrayList<>(); @@ -425,7 +427,7 @@ public void registerVerbType(String projectRoot, ClassInfo clazz, Position methodPos = forMethod(projectRoot, result.method()); xyz.block.ftl.schema.v1.Verb.Builder verbBuilder = xyz.block.ftl.schema.v1.Verb.newBuilder(); - String verbName = validateName(projectRoot, result.method(), ModuleBuilder.classToName(clazz)); + String verbName = validateName(result.method(), ModuleBuilder.classToName(clazz)); MetadataCalls.Builder callsMetadata = MetadataCalls.newBuilder(); MetadataConfig.Builder configMetadata = MetadataConfig.newBuilder(); MetadataSecrets.Builder secretMetadata = MetadataSecrets.newBuilder(); @@ -445,7 +447,7 @@ public void registerVerbType(String projectRoot, ClassInfo clazz, if (!knownSecrets.contains(name)) { xyz.block.ftl.schema.v1.Secret.Builder secretBuilder = xyz.block.ftl.schema.v1.Secret .newBuilder().setPos(methodPos) - .setType(buildType(projectRoot, param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) + .setType(buildType(param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) .setName(name) .addAllComments(comments.getComments(name)); addDecls(Decl.newBuilder().setSecret(secretBuilder).build()); @@ -458,7 +460,7 @@ public void registerVerbType(String projectRoot, ClassInfo clazz, if (!knownConfig.contains(name)) { xyz.block.ftl.schema.v1.Config.Builder configBuilder = xyz.block.ftl.schema.v1.Config .newBuilder().setPos(methodPos) - .setType(buildType(projectRoot, param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) + .setType(buildType(param.type(), Visibility.VISIBILITY_SCOPE_NONE, param)) .setName(name) .addAllComments(comments.getComments(name)); addDecls(Decl.newBuilder().setConfig(configBuilder).build()); @@ -518,10 +520,10 @@ public void registerVerbType(String projectRoot, ClassInfo clazz, .setPos(methodPos) .setRequest( customization.requestType - .apply(buildType(projectRoot, result.bodyParamType(), visibility, + .apply(buildType(result.bodyParamType(), visibility, result.bodyParamNullability()))) .setResponse(customization.responseType - .apply(buildType(projectRoot, result.method().returnType(), visibility, result.method()))) + .apply(buildType(result.method().returnType(), visibility, result.method()))) .addAllComments(comments.getComments(verbName)); if (customization.metadataCallback != null) { customization.metadataCallback.accept(verbBuilder); @@ -605,7 +607,7 @@ private List resolveDatabaseUses(Verb verb) { return refs; } - public void registerSQLQueryMethod(String projectRoot, MethodInfo method, String className, String returnType, + public void registerSQLQueryMethod(MethodInfo method, String className, String returnType, String dbName, String command, String rawSQL, String[] fields, String[] colToFieldName) { try { @@ -653,11 +655,11 @@ private Type handleNullabilityAnnotations(Type res, Nullability nullability) { return res; } - public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility visibility, AnnotationTarget target) { - return buildType(projectRoot, type, visibility, nullability(target)); + public Type buildType(org.jboss.jandex.Type type, Visibility visibility, AnnotationTarget target) { + return buildType(type, visibility, nullability(target)); } - public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility visibility, Nullability nullability) { + public Type buildType(org.jboss.jandex.Type type, Visibility visibility, Nullability nullability) { switch (type.kind()) { case PRIMITIVE -> { var prim = type.asPrimitiveType(); @@ -689,7 +691,7 @@ public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility } return handleNullabilityAnnotations(Type.newBuilder() .setArray(Array.newBuilder() - .setElement(buildType(projectRoot, arrayType.componentType(), visibility, Nullability.NOT_NULL)) + .setElement(buildType(arrayType.componentType(), visibility, Nullability.NOT_NULL)) .build()) .build(), nullability); } @@ -711,7 +713,7 @@ public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility PrimitiveType unboxed = PrimitiveType.unbox(clazz); if (unboxed != null) { - Type primitive = buildType(projectRoot, unboxed, visibility, Nullability.NOT_NULL); + Type primitive = buildType(unboxed, visibility, Nullability.NOT_NULL); if (nullability == Nullability.NOT_NULL) { return primitive; } @@ -792,7 +794,7 @@ public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility .setName(name) .setVisibility(actual) .addAllComments(comments.getComments(name)); - buildDataElement(projectRoot, data, clazz.name(), actual); + buildDataElement(data, clazz.name(), actual); addDecls(Decl.newBuilder().setData(data).build()); return handleNullabilityAnnotations(ref, nullability); } @@ -802,47 +804,47 @@ public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility if (paramType.name().equals(DotName.createSimple(List.class))) { return handleNullabilityAnnotations(Type.newBuilder() .setArray(Array.newBuilder() - .setElement(buildType(projectRoot, paramType.arguments().get(0), visibility, + .setElement(buildType(paramType.arguments().get(0), visibility, Nullability.NOT_NULL))) .build(), nullability); } else if (paramType.name().equals(DotName.createSimple(Map.class))) { return handleNullabilityAnnotations(Type.newBuilder() .setMap(xyz.block.ftl.schema.v1.Map.newBuilder() - .setKey(buildType(projectRoot, paramType.arguments().get(0), visibility, + .setKey(buildType(paramType.arguments().get(0), visibility, Nullability.NOT_NULL)) - .setValue(buildType(projectRoot, paramType.arguments().get(1), visibility, + .setValue(buildType(paramType.arguments().get(1), visibility, Nullability.NOT_NULL))) .build(), nullability); } else if (paramType.name().equals(DotNames.OPTIONAL)) { // TODO: optional kinda sucks return Type.newBuilder().setOptional(xyz.block.ftl.schema.v1.Optional.newBuilder() - .setType(buildType(projectRoot, paramType.arguments().get(0), visibility, Nullability.NOT_NULL))) + .setType(buildType(paramType.arguments().get(0), visibility, Nullability.NOT_NULL))) .build(); } else if (paramType.name().equals(DotName.createSimple(HttpRequest.class))) { return Type.newBuilder() .setRef(Ref.newBuilder().setModule(BUILTIN).setName(HttpRequest.class.getSimpleName()) .addTypeParameters( - buildType(projectRoot, paramType.arguments().get(0), visibility, + buildType(paramType.arguments().get(0), visibility, Nullability.NOT_NULL))) .build(); } else if (paramType.name().equals(DotName.createSimple(HttpResponse.class))) { return Type.newBuilder() .setRef(Ref.newBuilder().setModule(BUILTIN).setName(HttpResponse.class.getSimpleName()) .addTypeParameters( - buildType(projectRoot, paramType.arguments().get(0), visibility, + buildType(paramType.arguments().get(0), visibility, Nullability.NOT_NULL)) .addTypeParameters(Type.newBuilder().setUnit(Unit.newBuilder().build()))) .build(); } else { ClassInfo classByName = index.getClassByName(paramType.name()); - validateName(projectRoot, classByName.name().toString(), classByName.name().local()); + validateName(classByName.name().toString(), classByName.name().local()); var cb = ClassType.builder(classByName.name()); - var main = buildType(projectRoot, cb.build(), visibility, Nullability.NOT_NULL); + var main = buildType(cb.build(), visibility, Nullability.NOT_NULL); var builder = main.toBuilder(); var refBuilder = builder.getRef().toBuilder(); for (var arg : paramType.arguments()) { - refBuilder.addTypeParameters(buildType(projectRoot, arg, visibility, Nullability.NOT_NULL)); + refBuilder.addTypeParameters(buildType(arg, visibility, Nullability.NOT_NULL)); } builder.setRef(refBuilder); @@ -854,7 +856,7 @@ public Type buildType(String projectRoot, org.jboss.jandex.Type type, Visibility throw new RuntimeException("NOT YET IMPLEMENTED"); } - private void buildDataElement(String projectRoot, Data.Builder data, DotName className, Visibility visibility) { + private void buildDataElement(Data.Builder data, DotName className, Visibility visibility) { if (className == null || className.equals(DotName.OBJECT_NAME)) { return; } @@ -866,7 +868,7 @@ private void buildDataElement(String projectRoot, Data.Builder data, DotName cla for (var field : clazz.fieldsInDeclarationOrder()) { if (!Modifier.isStatic(field.flags())) { Field.Builder builder = Field.newBuilder().setName(field.name()) - .setType(buildType(projectRoot, field.type(), visibility, field)); + .setType(buildType(field.type(), visibility, field)); if (field.hasAnnotation(JsonAlias.class)) { var aliases = field.annotation(JsonAlias.class); if (aliases.value() != null) { @@ -881,7 +883,7 @@ private void buildDataElement(String projectRoot, Data.Builder data, DotName cla data.addFields(builder.build()); } } - buildDataElement(projectRoot, data, clazz.superName(), visibility); + buildDataElement(data, clazz.superName(), visibility); } public ModuleBuilder addDecls(Decl decl) { @@ -940,12 +942,12 @@ public void writeTo(OutputStream out, OutputStream errorOut, BiConsumer languageMappings) { - validateName(projectRoot, finalT.name().toString(), name); + validateName(finalT.name().toString(), name); TypeAlias.Builder typeAlias = TypeAlias.newBuilder() - .setType(buildType(projectRoot, finalS, visibility, Nullability.NOT_NULL)) + .setType(buildType(finalS, visibility, Nullability.NOT_NULL)) .setName(name) .addAllComments(comments.getComments(name)) .addMetadata(Metadata.newBuilder() @@ -1115,11 +1117,11 @@ String validateName(Position position, String name) { return name; } - String validateName(String projectRoot, String className, String name) { + String validateName(String className, String name) { return validateName(toError(PositionUtils.forClass(projectRoot, className)), name); } - String validateName(String projectRoot, MethodInfo methodInfo, String name) { + String validateName(MethodInfo methodInfo, String name) { return validateName(toError(PositionUtils.forMethod(projectRoot, methodInfo)), name); } diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleProcessor.java index 3d6d6da6d3..1d1a8a5316 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/ModuleProcessor.java @@ -138,13 +138,15 @@ public void generateSchema(CombinedIndexBuildItem index, DefaultOptionalBuildItem defaultOptionalBuildItem, List schemaContributorBuildItems, LaunchModeBuildItem launchModeBuildItem, - CommentsBuildItem comments) throws Exception { + CommentsBuildItem comments, + ProjectRootBuildItem projectRootBuildItem) throws Exception { String moduleName = moduleNameBuildItem.getModuleName(); ModuleBuilder moduleBuilder = new ModuleBuilder(index.getIndex(), moduleName, topicsBuildItem.getTopics(), verbClientBuildItem.getVerbClients(), sqlQueryClientBuildItem.getSQLQueryClients(), - recorder, comments, defaultOptionalBuildItem.isDefaultToOptional()); + recorder, comments, defaultOptionalBuildItem.isDefaultToOptional(), + projectRootBuildItem.getProjectRoot()); for (var i : schemaContributorBuildItems) { i.getSchemaContributor().accept(moduleBuilder); diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/SubscriptionProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/SubscriptionProcessor.java index f269c64cda..abfdf216ee 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/SubscriptionProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/SubscriptionProcessor.java @@ -25,13 +25,11 @@ public class SubscriptionProcessor { @BuildStep public void registerSubscriptions(CombinedIndexBuildItem index, - ProjectRootBuildItem projectRootBuildItem, ModuleNameBuildItem moduleNameBuildItem, BuildProducer additionalBeanBuildItemBuildProducer, BuildProducer schemaContributorBuildItems) throws Exception { AdditionalBeanBuildItem.Builder beans = AdditionalBeanBuildItem.builder().setUnremovable(); var moduleName = moduleNameBuildItem.getModuleName(); - var projectRoot = projectRootBuildItem.getProjectRoot(); for (var subscription : index.getIndex().getAnnotations(FTLDotNames.SUBSCRIPTION)) { var info = fromJandex(index.getComputingIndex(), subscription, moduleName); if (subscription.target().kind() != AnnotationTarget.Kind.METHOD) { @@ -40,15 +38,15 @@ public void registerSubscriptions(CombinedIndexBuildItem index, var method = subscription.target().asMethod(); String className = method.declaringClass().name().toString(); beans.addBeanClass(className); - schemaContributorBuildItems.produce(generateSubscription(projectRoot, method, className, info)); + schemaContributorBuildItems.produce(generateSubscription(method, className, info)); } additionalBeanBuildItemBuildProducer.produce(beans.build()); } - private SchemaContributorBuildItem generateSubscription(String projectRoot, MethodInfo method, String className, + private SchemaContributorBuildItem generateSubscription(MethodInfo method, String className, SubscriptionAnnotation info) { return new SchemaContributorBuildItem(moduleBuilder -> { - moduleBuilder.registerVerbMethod(projectRoot, method, className, Visibility.VISIBILITY_SCOPE_NONE, false, + moduleBuilder.registerVerbMethod(method, className, Visibility.VISIBILITY_SCOPE_NONE, false, ModuleBuilder.BodyType.REQUIRED, new ModuleBuilder.VerbCustomization().setMetadataCallback(builder -> { diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TopicsProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TopicsProcessor.java index 8e98e69e66..30812a0083 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TopicsProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TopicsProcessor.java @@ -132,7 +132,7 @@ public void accept(ModuleBuilder moduleBuilder) { .setVisibility(visibility) .setPos(PositionUtils.forClass(projectRoot, topic.interfaceName())) .setName(topic.topicName()) - .setEvent(moduleBuilder.buildType(projectRoot, topic.eventType(), visibility, Nullability.NOT_NULL)) + .setEvent(moduleBuilder.buildType(topic.eventType(), visibility, Nullability.NOT_NULL)) .addMetadata(Metadata.newBuilder() .setPartitions(MetadataPartitions.newBuilder() .setPartitions(topic.partitions()).build()) diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeAliasProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeAliasProcessor.java index 8e941d8c4a..2b4b8c897c 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeAliasProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeAliasProcessor.java @@ -22,7 +22,6 @@ public class TypeAliasProcessor { @BuildStep public void processTypeAlias(CombinedIndexBuildItem index, - ProjectRootBuildItem projectRootBuildItem, BuildProducer schemaContributorBuildItemBuildProducer, BuildProducer additionalBeanBuildItem, BuildProducer typeAliasBuildItemBuildProducer) { @@ -91,7 +90,7 @@ public void processTypeAlias(CombinedIndexBuildItem index, } } schemaContributorBuildItemBuildProducer.produce(new SchemaContributorBuildItem(moduleBuilder -> moduleBuilder - .registerTypeAlias(projectRootBuildItem.getProjectRoot(), name, finalT, finalS, visibility, + .registerTypeAlias(name, finalT, finalS, visibility, languageMappings))); } else { // If the 'module' field of the annotation is non-empty, we have a mapper for a type alias defined in diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeProcessor.java index f4a3d8251b..3ac7c90d4b 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/TypeProcessor.java @@ -14,18 +14,16 @@ public class TypeProcessor { @BuildStep public void handleExportedTypes(CombinedIndexBuildItem index, - ProjectRootBuildItem projectRootBuildItem, BuildProducer schemaContributorBuildItemBuildProducer, List typeAliasBuildItems // included to force typealias processing before this ) { - var projectRoot = projectRootBuildItem.getProjectRoot(); Collection exports = index.getIndex().getAnnotations(FTLDotNames.DATA); for (var an : exports) { if (an.target().kind() != org.jboss.jandex.AnnotationTarget.Kind.CLASS) { continue; } schemaContributorBuildItemBuildProducer.produce(new SchemaContributorBuildItem(moduleBuilder -> moduleBuilder - .buildType(projectRoot, ClassType.create(an.target().asClass().name()), + .buildType(ClassType.create(an.target().asClass().name()), VisibilityUtil.getVisibility(an.target()), an.target()))); } } diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/VerbProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/VerbProcessor.java index 1e440fb6a9..fc84e8ca23 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/VerbProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/VerbProcessor.java @@ -545,12 +545,11 @@ SQLQueryClientBuildItem handleSQLQueryClients(CombinedIndexBuildItem index, public void verbsAndCron(CombinedIndexBuildItem index, BuildProducer additionalBeanBuildItem, BuildProducer schemaContributorBuildItemBuildProducer, - List typeAliasBuildItems, // included to force typealias processing before this - ProjectRootBuildItem projectRootBuildItem) { + List typeAliasBuildItems // included to force typealias processing before this + ) { Collection verbAnnotations = index.getIndex().getAnnotations(FTLDotNames.VERB); log.debugf("Processing %d verb annotations into decls", verbAnnotations.size()); var beans = AdditionalBeanBuildItem.builder().setUnremovable(); - String projectRoot = projectRootBuildItem.getProjectRoot(); for (var verb : verbAnnotations) { if (verb.target().kind() == AnnotationTarget.Kind.METHOD) { @@ -563,12 +562,12 @@ public void verbsAndCron(CombinedIndexBuildItem index, String className = method.declaringClass().name().toString(); beans.addBeanClass(className); schemaContributorBuildItemBuildProducer.produce(new SchemaContributorBuildItem(moduleBuilder -> moduleBuilder - .registerVerbMethod(projectRoot, method, className, VisibilityUtil.getVisibility(method), false, + .registerVerbMethod(method, className, VisibilityUtil.getVisibility(method), false, ModuleBuilder.BodyType.ALLOWED))); } else { var type = verb.target().asClass(); schemaContributorBuildItemBuildProducer.produce(new SchemaContributorBuildItem(moduleBuilder -> moduleBuilder - .registerVerbType(projectRoot, type, VisibilityUtil.getVisibility(verb.target()), false, + .registerVerbType(type, VisibilityUtil.getVisibility(verb.target()), false, ModuleBuilder.BodyType.ALLOWED))); } } @@ -585,7 +584,7 @@ public void verbsAndCron(CombinedIndexBuildItem index, String className = method.declaringClass().name().toString(); beans.addBeanClass(className); schemaContributorBuildItemBuildProducer.produce(new SchemaContributorBuildItem(moduleBuilder -> moduleBuilder - .registerVerbMethod(projectRoot, method, className, VisibilityUtil.getVisibility(method), true, + .registerVerbMethod(method, className, VisibilityUtil.getVisibility(method), true, ModuleBuilder.BodyType.ALLOWED))); } @@ -601,7 +600,7 @@ public void verbsAndCron(CombinedIndexBuildItem index, schemaContributorBuildItemBuildProducer.produce( new SchemaContributorBuildItem( - moduleBuilder -> moduleBuilder.registerVerbMethod(projectRoot, method, className, + moduleBuilder -> moduleBuilder.registerVerbMethod(method, className, Visibility.VISIBILITY_SCOPE_NONE, false, ModuleBuilder.BodyType.DISALLOWED, new ModuleBuilder.VerbCustomization() @@ -625,7 +624,7 @@ public void verbsAndCron(CombinedIndexBuildItem index, schemaContributorBuildItemBuildProducer.produce( new SchemaContributorBuildItem( - moduleBuilder -> moduleBuilder.registerVerbMethod(projectRoot, method, className, + moduleBuilder -> moduleBuilder.registerVerbMethod(method, className, Visibility.VISIBILITY_SCOPE_NONE, false, ModuleBuilder.BodyType.DISALLOWED, new ModuleBuilder.VerbCustomization() .setMetadataCallback(builder -> builder.addMetadata(Metadata.newBuilder() @@ -669,7 +668,7 @@ public void verbsAndCron(CombinedIndexBuildItem index, schemaContributorBuildItemBuildProducer.produce( new SchemaContributorBuildItem( - moduleBuilder -> moduleBuilder.registerSQLQueryMethod(projectRoot, callMethod, className, + moduleBuilder -> moduleBuilder.registerSQLQueryMethod(callMethod, className, actualReturnType, dbName, command, rawSQL, fields, colToFieldName))); } From c18e1d71ec06174f212d338716b1f3bd4d94fcd5 Mon Sep 17 00:00:00 2001 From: Stuart Douglas Date: Wed, 7 May 2025 07:51:33 +1000 Subject: [PATCH 2/2] tmp --- .../main/java/xyz/block/ftl/deployment/HTTPProcessor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java index 5b26bd912b..29f6c8ce66 100644 --- a/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java +++ b/jvm-runtime/ftl-runtime/common/deployment/src/main/java/xyz/block/ftl/deployment/HTTPProcessor.java @@ -27,6 +27,7 @@ import xyz.block.ftl.runtime.VerbRegistry; import xyz.block.ftl.runtime.builtin.HttpRequest; import xyz.block.ftl.runtime.builtin.HttpResponse; +import xyz.block.ftl.schema.v1.Array; import xyz.block.ftl.schema.v1.IngressPathComponent; import xyz.block.ftl.schema.v1.IngressPathLiteral; import xyz.block.ftl.schema.v1.IngressPathParameter; @@ -192,7 +193,9 @@ public void accept(ModuleBuilder moduleBuilder) { } else { queryParamsType = Type.newBuilder() .setMap(xyz.block.ftl.schema.v1.Map.newBuilder().setKey(stringType) - .setValue(stringType)); + .setValue(Type.newBuilder() + .setArray( + Array.newBuilder().setElement(stringType)))); } ModuleBuilder.VerbCustomization verbCustomization = new ModuleBuilder.VerbCustomization();