You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/03/22 17:55:49 UTC

[camel] branch main updated: CAMEL-16628: Allow to define headers in an enum (#7247)

This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 5e0f41c  CAMEL-16628: Allow to define headers in an enum (#7247)
5e0f41c is described below

commit 5e0f41cb366d07d96a68ffc83319d2c86c0abe5d
Author: Nicolas Filotto <es...@users.noreply.github.com>
AuthorDate: Tue Mar 22 18:55:05 2022 +0100

    CAMEL-16628: Allow to define headers in an enum (#7247)
    
    ## Motivation
    
    There are components that define their constants in an enum so it should be supported too.
    
    ## Modifications
    
    * Check if the header class is an enum and if so accept any field annotated with `@Metadata`
    * Use the name of the field as header name in case of an enum
---
 .../maven/packaging/EndpointSchemaGeneratorMojo.java      |  7 +++++--
 .../maven/packaging/EndpointSchemaGeneratorMojoTest.java  | 14 +++++++++-----
 .../camel/maven/packaging/endpoint/SomeConstants.java     |  4 ++--
 ...Constants.java => SomeEndpointUsingEnumConstants.java} | 15 +++------------
 .../{SomeConstants.java => SomeEnumConstants.java}        |  9 +++------
 5 files changed, 22 insertions(+), 27 deletions(-)

diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java
index 68fc70d..5ae8dbf 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java
@@ -316,8 +316,9 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo {
         }
         // A header class has been defined
         boolean foundHeader = false;
+        final boolean isEnum = headersClass.isEnum();
         for (Field field : headersClass.getDeclaredFields()) {
-            if (isStatic(field.getModifiers()) && field.getType() == String.class
+            if ((isEnum || isStatic(field.getModifiers()) && field.getType() == String.class)
                     && field.isAnnotationPresent(Metadata.class)) {
                 getLog().debug(
                         String.format("Trying to add the constant %s in the class %s as header.", field.getName(),
@@ -381,7 +382,9 @@ public class EndpointSchemaGeneratorMojo extends AbstractGeneratorMojo {
         }
         try {
             field.trySetAccessible();
-            header.setName((String) field.get(null));
+            // The name of the header is either the name of the field in case of an enum, otherwise it is the value
+            // of the field as we assume that it is a String constant
+            header.setName(field.getType().isEnum() ? field.getName() : (String) field.get(null));
             componentModel.addEndpointHeader(header);
         } catch (IllegalAccessException e) {
             getLog().debug(String.format("The field %s in class %s cannot be accessed", field.getName(),
diff --git a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojoTest.java b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojoTest.java
index d64649b..9032107 100644
--- a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojoTest.java
+++ b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojoTest.java
@@ -20,6 +20,7 @@ import java.nio.file.Paths;
 import java.util.List;
 
 import org.apache.camel.maven.packaging.endpoint.SomeEndpoint;
+import org.apache.camel.maven.packaging.endpoint.SomeEndpointUsingEnumConstants;
 import org.apache.camel.maven.packaging.endpoint.SomeEndpointWithBadHeaders;
 import org.apache.camel.maven.packaging.endpoint.SomeEndpointWithFilter;
 import org.apache.camel.maven.packaging.endpoint.SomeEndpointWithoutHeaders;
@@ -29,6 +30,8 @@ import org.apache.camel.tooling.model.ComponentModel.EndpointHeaderModel;
 import org.apache.maven.project.MavenProject;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -52,15 +55,16 @@ class EndpointSchemaGeneratorMojoTest {
         mojo.project = new MavenProject();
     }
 
-    @Test
-    void testCanRetrieveMetadataOfHeaders() {
-        mojo.addEndpointHeaders(model, SomeEndpoint.class.getAnnotation(UriEndpoint.class), "some");
+    @ParameterizedTest
+    @ValueSource(classes = { SomeEndpoint.class, SomeEndpointUsingEnumConstants.class })
+    void testCanRetrieveMetadataOfHeaders(Class<?> clazz) {
+        mojo.addEndpointHeaders(model, clazz.getAnnotation(UriEndpoint.class), "some");
         List<EndpointHeaderModel> endpointHeaders = model.getEndpointHeaders();
         assertEquals(2, endpointHeaders.size());
         // Full
         EndpointHeaderModel headerFull = endpointHeaders.get(0);
         assertEquals("header", headerFull.getKind());
-        assertEquals("name-full", headerFull.getName());
+        assertEquals("KEY_FULL", headerFull.getName());
         assertEquals("key full desc", headerFull.getDescription());
         assertEquals("my display name", headerFull.getDisplayName());
         assertEquals("org.apache.camel.maven.packaging.endpoint.SomeEndpoint$MyEnum", headerFull.getJavaType());
@@ -75,7 +79,7 @@ class EndpointSchemaGeneratorMojoTest {
         // Empty
         EndpointHeaderModel headerEmpty = endpointHeaders.get(1);
         assertEquals("header", headerEmpty.getKind());
-        assertEquals("name-empty", headerEmpty.getName());
+        assertEquals("KEY_EMPTY", headerEmpty.getName());
         assertTrue(headerEmpty.getDescription().isEmpty());
         assertTrue(headerEmpty.getDisplayName().isEmpty());
         assertTrue(headerEmpty.getJavaType().isEmpty());
diff --git a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
index ae4bbb3..f58468d 100644
--- a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
+++ b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
@@ -23,9 +23,9 @@ public final class SomeConstants {
     @Metadata(description = "key full desc", label = "my label", displayName = "my display name",
               javaType = "org.apache.camel.maven.packaging.endpoint.SomeEndpoint$MyEnum", required = true,
               defaultValue = "VAL1", deprecationNote = "my deprecated note", secret = true)
-    public static final String KEY_FULL = "name-full";
+    public static final String KEY_FULL = "KEY_FULL";
     @Metadata
-    static final String KEY_EMPTY = "name-empty";
+    static final String KEY_EMPTY = "KEY_EMPTY";
 
     private SomeConstants() {
     }
diff --git a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeEndpointUsingEnumConstants.java
similarity index 61%
copy from tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
copy to tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeEndpointUsingEnumConstants.java
index ae4bbb3..edcb55d 100644
--- a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
+++ b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeEndpointUsingEnumConstants.java
@@ -16,17 +16,8 @@
  */
 package org.apache.camel.maven.packaging.endpoint;
 
-import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
 
-public final class SomeConstants {
-    @Deprecated
-    @Metadata(description = "key full desc", label = "my label", displayName = "my display name",
-              javaType = "org.apache.camel.maven.packaging.endpoint.SomeEndpoint$MyEnum", required = true,
-              defaultValue = "VAL1", deprecationNote = "my deprecated note", secret = true)
-    public static final String KEY_FULL = "name-full";
-    @Metadata
-    static final String KEY_EMPTY = "name-empty";
-
-    private SomeConstants() {
-    }
+@UriEndpoint(scheme = "some", syntax = "some", title = "some", headersClass = SomeEnumConstants.class)
+public class SomeEndpointUsingEnumConstants {
 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeEnumConstants.java
similarity index 87%
copy from tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
copy to tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeEnumConstants.java
index ae4bbb3..e00be68 100644
--- a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeConstants.java
+++ b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/endpoint/SomeEnumConstants.java
@@ -18,15 +18,12 @@ package org.apache.camel.maven.packaging.endpoint;
 
 import org.apache.camel.spi.Metadata;
 
-public final class SomeConstants {
+public enum SomeEnumConstants {
     @Deprecated
     @Metadata(description = "key full desc", label = "my label", displayName = "my display name",
               javaType = "org.apache.camel.maven.packaging.endpoint.SomeEndpoint$MyEnum", required = true,
               defaultValue = "VAL1", deprecationNote = "my deprecated note", secret = true)
-    public static final String KEY_FULL = "name-full";
+    KEY_FULL,
     @Metadata
-    static final String KEY_EMPTY = "name-empty";
-
-    private SomeConstants() {
-    }
+    KEY_EMPTY;
 }