diff --git a/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/JWTProperties.java b/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/JWTProperties.java index a0176ece16..7cf5b4a0eb 100644 --- a/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/JWTProperties.java +++ b/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/JWTProperties.java @@ -17,6 +17,7 @@ public record JWTProperties( @TemplateProperty( label = "JWK URL", description = "Well-known URL of JWKs", + feel = FeelMode.optional, group = "authorization") @FEEL String jwkUrl, diff --git a/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookAuthorization.java b/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookAuthorization.java index dcee62a35e..c47f168384 100644 --- a/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookAuthorization.java +++ b/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookAuthorization.java @@ -43,12 +43,14 @@ record BasicAuth( @TemplateProperty( label = "Username", description = "Username for basic authentication", + feel = FeelMode.optional, group = "authorization") @FEEL String username, @TemplateProperty( label = "Password", description = "Password for basic authentication", + feel = FeelMode.optional, group = "authorization") @FEEL String password) @@ -59,6 +61,7 @@ record ApiKeyAuth( @TemplateProperty( label = "API key", description = "Expected API key", + feel = FeelMode.optional, group = "authorization") @FEEL String apiKey, diff --git a/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookConnectorProperties.java b/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookConnectorProperties.java index 284b3fe42e..a4d875aee6 100644 --- a/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookConnectorProperties.java +++ b/connectors/webhook/src/main/java/io/camunda/connector/inbound/model/WebhookConnectorProperties.java @@ -68,6 +68,7 @@ public record WebhookConnectorProperties( description = "Shared secret key", group = "authentication", optional = true, + feel = FeelMode.optional, condition = @PropertyCondition(property = "inbound.shouldValidateHmac", equals = "enabled")) String hmacSecret, @@ -76,6 +77,7 @@ public record WebhookConnectorProperties( label = "HMAC header", description = "Name of header attribute that will contain the HMAC value", group = "authentication", + feel = FeelMode.optional, optional = true, condition = @PropertyCondition(property = "inbound.shouldValidateHmac", equals = "enabled")) diff --git a/element-template-generator/core/src/main/java/io/camunda/connector/generator/dsl/Property.java b/element-template-generator/core/src/main/java/io/camunda/connector/generator/dsl/Property.java index 852e00f160..814d729ff4 100644 --- a/element-template-generator/core/src/main/java/io/camunda/connector/generator/dsl/Property.java +++ b/element-template-generator/core/src/main/java/io/camunda/connector/generator/dsl/Property.java @@ -43,7 +43,9 @@ public enum FeelMode { optional, required, @JsonIgnore - disabled + disabled, + @JsonIgnore + system_default, } public record GeneratedValue(String type) {} diff --git a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/annotation/TemplateProperty.java b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/annotation/TemplateProperty.java index 4d738dab62..7c326dc2f5 100644 --- a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/annotation/TemplateProperty.java +++ b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/annotation/TemplateProperty.java @@ -69,8 +69,11 @@ */ DropdownPropertyChoice[] choices() default {}; - /** Whether the property should support FEEL expressions */ - FeelMode feel() default FeelMode.optional; + /** + * Defines the support for FEEL expressions in the property. By default, for inbound connectors, + * FEEL is disabled; for outbound connectors, FEEL is optional. + */ + FeelMode feel() default FeelMode.system_default; /** Default value for the property */ String defaultValue() default ""; diff --git a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/FieldProcessor.java b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/FieldProcessor.java index 1e29d457ea..c86297e766 100644 --- a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/FieldProcessor.java +++ b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/FieldProcessor.java @@ -17,9 +17,11 @@ package io.camunda.connector.generator.java.processor; import io.camunda.connector.generator.dsl.PropertyBuilder; +import io.camunda.connector.generator.java.util.TemplateGenerationContext; import java.lang.reflect.Field; public interface FieldProcessor { - void process(Field field, PropertyBuilder propertyBuilder); + void process( + Field field, PropertyBuilder propertyBuilder, final TemplateGenerationContext context); } diff --git a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/JakartaValidationFieldProcessor.java b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/JakartaValidationFieldProcessor.java index 2477dfbb0f..5edb6dda17 100644 --- a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/JakartaValidationFieldProcessor.java +++ b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/JakartaValidationFieldProcessor.java @@ -19,6 +19,7 @@ import io.camunda.connector.generator.dsl.PropertyBuilder; import io.camunda.connector.generator.dsl.PropertyConstraints; import io.camunda.connector.generator.dsl.PropertyConstraints.PropertyConstraintsBuilder; +import io.camunda.connector.generator.java.util.TemplateGenerationContext; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -31,7 +32,8 @@ public class JakartaValidationFieldProcessor implements FieldProcessor { @Override - public void process(Field field, PropertyBuilder propertyBuilder) { + public void process( + Field field, PropertyBuilder propertyBuilder, final TemplateGenerationContext context) { PropertyConstraintsBuilder constraintsBuilder = PropertyConstraints.builder(); if (hasNotEmptyConstraint(field)) { diff --git a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/TemplatePropertyFieldProcessor.java b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/TemplatePropertyFieldProcessor.java index 831d70e008..b50bec4393 100644 --- a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/TemplatePropertyFieldProcessor.java +++ b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/processor/TemplatePropertyFieldProcessor.java @@ -17,10 +17,12 @@ package io.camunda.connector.generator.java.processor; import io.camunda.connector.generator.dsl.DropdownProperty.DropdownPropertyBuilder; +import io.camunda.connector.generator.dsl.Property; import io.camunda.connector.generator.dsl.PropertyBuilder; import io.camunda.connector.generator.dsl.PropertyCondition; import io.camunda.connector.generator.dsl.PropertyConstraints; import io.camunda.connector.generator.java.annotation.TemplateProperty; +import io.camunda.connector.generator.java.util.TemplateGenerationContext; import java.lang.reflect.Field; import java.util.Arrays; @@ -28,15 +30,22 @@ public class TemplatePropertyFieldProcessor implements FieldProcessor { @Override - public void process(Field field, PropertyBuilder builder) { + public void process( + Field field, PropertyBuilder builder, final TemplateGenerationContext context) { var annotation = field.getAnnotation(TemplateProperty.class); if (annotation == null) { return; } builder.optional(annotation.optional()); + if (!(builder instanceof DropdownPropertyBuilder)) { - builder.feel(annotation.feel()); + if (annotation.feel() == Property.FeelMode.system_default) { + builder.feel(determineDefaultFeelModeBasedOnContext(context)); + } else { + builder.feel(annotation.feel()); + } } + if (!annotation.label().isBlank()) { builder.label(annotation.label()); } @@ -53,6 +62,13 @@ public void process(Field field, PropertyBuilder builder) { builder.constraints(buildConstraints(annotation)); } + private Property.FeelMode determineDefaultFeelModeBasedOnContext( + final TemplateGenerationContext context) { + return context instanceof TemplateGenerationContext.Inbound + ? Property.FeelMode.disabled + : Property.FeelMode.optional; + } + private PropertyCondition buildCondition(TemplateProperty propertyAnnotation) { var conditionAnnotation = propertyAnnotation.condition(); if (conditionAnnotation.property().isBlank()) { diff --git a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/util/TemplatePropertiesUtil.java b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/util/TemplatePropertiesUtil.java index 9aa0a037a7..57051c9aeb 100644 --- a/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/util/TemplatePropertiesUtil.java +++ b/element-template-generator/core/src/main/java/io/camunda/connector/generator/java/util/TemplatePropertiesUtil.java @@ -203,7 +203,7 @@ private static PropertyBuilder buildProperty(Field field, TemplateGenerationCont .binding(createBinding(bindingName, context)); for (FieldProcessor processor : fieldProcessors) { - processor.process(field, propertyBuilder); + processor.process(field, propertyBuilder, context); } return propertyBuilder; } diff --git a/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/InboundClassBasedTemplateGeneratorTest.java b/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/InboundClassBasedTemplateGeneratorTest.java index ebf37727ef..5cb7e96e39 100644 --- a/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/InboundClassBasedTemplateGeneratorTest.java +++ b/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/InboundClassBasedTemplateGeneratorTest.java @@ -27,10 +27,12 @@ import io.camunda.connector.generator.dsl.DropdownProperty; import io.camunda.connector.generator.dsl.DropdownProperty.DropdownChoice; import io.camunda.connector.generator.dsl.Property.FeelMode; +import io.camunda.connector.generator.dsl.PropertyBinding; import io.camunda.connector.generator.dsl.PropertyBinding.MessageProperty; import io.camunda.connector.generator.dsl.PropertyBinding.ZeebeProperty; import io.camunda.connector.generator.dsl.PropertyBinding.ZeebeSubscriptionProperty; import io.camunda.connector.generator.dsl.PropertyCondition.Equals; +import io.camunda.connector.generator.dsl.StringProperty; import io.camunda.connector.generator.java.example.inbound.MyConnectorExecutable; import java.util.List; import java.util.Set; @@ -258,4 +260,25 @@ void messageStartEvent_hasCorrelationProperties() { .isEqualTo("messageIdExpression"); } } + + @Test + void stringProperty_hasCorrectDefaults() { + // given + var type = + new ConnectorElementType( + Set.of(BpmnType.START_EVENT), BpmnType.MESSAGE_START_EVENT, null, null); + var config = new GeneratorConfiguration(ConnectorMode.NORMAL, null, null, null, Set.of(type)); + + // when + var template = generator.generate(MyConnectorExecutable.class, config).getFirst(); + + var property = getPropertyByLabel("Prop 1", template); + + assertThat(property).isInstanceOf(StringProperty.class); + assertThat(property.getType()).isEqualTo("String"); + assertThat(property.isOptional()).isFalse(); + assertThat(property.getFeel()).isEqualTo(null); + assertThat(property.getBinding()).isEqualTo(new PropertyBinding.ZeebeProperty("prop1")); + assertThat(property.getConstraints()).isNull(); + } } diff --git a/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/example/inbound/MyConnectorProperties.java b/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/example/inbound/MyConnectorProperties.java index 25c06eebbe..bc47d1f4e1 100644 --- a/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/example/inbound/MyConnectorProperties.java +++ b/element-template-generator/core/src/test/java/io/camunda/connector/generator/java/example/inbound/MyConnectorProperties.java @@ -16,4 +16,6 @@ */ package io.camunda.connector.generator.java.example.inbound; -public record MyConnectorProperties(String prop1) {} +import io.camunda.connector.generator.java.annotation.TemplateProperty; + +public record MyConnectorProperties(@TemplateProperty() String prop1) {}