You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/12/06 05:48:58 UTC

[camel] 01/04: CAMEL-14263: Make property configurer for component and endpoints into only class.

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

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

commit 003666df9faf4d9e2335637d2167e62a9070f9ed
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Dec 6 06:11:52 2019 +0100

    CAMEL-14263: Make property configurer for component and endpoints into only class.
---
 .../apt/ComponentPropertyConfigurerGenerator.java  | 169 ---------------------
 .../tools/apt/EndpointAnnotationProcessor.java     |  25 +--
 ...rator.java => PropertyConfigurerGenerator.java} |  27 ++--
 .../camel/tools/apt/model/ComponentOption.java     |   2 +-
 .../camel/tools/apt/model/EndpointOption.java      |   2 +-
 .../camel/tools/apt/model/PropertyOption.java      |  27 ++++
 6 files changed, 55 insertions(+), 197 deletions(-)

diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ComponentPropertyConfigurerGenerator.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ComponentPropertyConfigurerGenerator.java
deleted file mode 100644
index 6685cf5..0000000
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ComponentPropertyConfigurerGenerator.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.tools.apt;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Set;
-
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic;
-import javax.tools.FileObject;
-import javax.tools.JavaFileObject;
-import javax.tools.StandardLocation;
-
-import org.apache.camel.tools.apt.helper.IOHelper;
-import org.apache.camel.tools.apt.model.ComponentOption;
-
-import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile;
-
-// TODO: ComponentPropertyConfigurerGenerator and EndpointPropertyConfigurerGenerator can be merged to one
-// TODO: Add support for ignore case
-
-public final class ComponentPropertyConfigurerGenerator {
-
-    private ComponentPropertyConfigurerGenerator() {
-    }
-
-    public static void generateExtendConfigurer(ProcessingEnvironment processingEnv, TypeElement parent,
-                                                String pn, String cn, String fqn) {
-
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn, parent);
-            w = src.openWriter();
-
-            w.write("/* Generated by org.apache.camel:apt */\n");
-            w.write("package " + pn + ";\n");
-            w.write("\n");
-            w.write("import " + parent.getQualifiedName().toString() + ";\n");
-            w.write("\n");
-            w.write("/**\n");
-            w.write(" * Source code generated by org.apache.camel:apt\n");
-            w.write(" */\n");
-            w.write("public class " + cn + " extends " + parent.getSimpleName().toString() + " {\n");
-            w.write("\n");
-            w.write("}\n");
-            w.write("\n");
-        } catch (Exception e) {
-            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
-            dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
-        }
-    }
-
-    public static void generatePropertyConfigurer(ProcessingEnvironment processingEnv, TypeElement parent,
-                                                  String pn, String cn, String fqn, String en,
-                                                  Set<ComponentOption> options) {
-
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn, parent);
-            w = src.openWriter();
-
-            int size = options.size();
-
-            w.write("/* Generated by org.apache.camel:apt */\n");
-            w.write("package " + pn + ";\n");
-            w.write("\n");
-            w.write("import java.util.HashMap;\n");
-            w.write("import java.util.Map;\n");
-            w.write("\n");
-            w.write("import org.apache.camel.CamelContext;\n");
-            w.write("import org.apache.camel.spi.GeneratedPropertyConfigurer;\n");
-            w.write("import org.apache.camel.support.component.PropertyConfigurerSupport;\n");
-            w.write("\n");
-            w.write("/**\n");
-            w.write(" * Source code generated by org.apache.camel:apt\n");
-            w.write(" */\n");
-            w.write("@SuppressWarnings(\"unchecked\")\n");
-            w.write("public class " + cn + " extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {\n");
-            w.write("\n");
-            w.write("    @Override\n");
-            w.write("    public boolean configure(CamelContext camelContext, Object component, String name, Object value, boolean ignoreCase) {\n");
-            w.write("        if (ignoreCase) {\n");
-            w.write("            return doConfigureIgnoreCase(camelContext, component, name, value);\n");
-            w.write("        } else {\n");
-            w.write("            return doConfigure(camelContext, component, name, value);\n");
-            w.write("        }\n");
-            w.write("    }\n");
-            w.write("\n");
-            w.write("    private static boolean doConfigure(CamelContext camelContext, Object component, String name, Object value) {\n");
-            w.write("        switch (name) {\n");
-            for (ComponentOption option : options) {
-                String getOrSet = option.getName();
-                getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1);
-                String setterLambda = setterLambda(en, getOrSet, option.getType(), option.getConfigurationField());
-                w.write(String.format("        case \"%s\": %s; return true;\n", option.getName(), setterLambda));
-            }
-            w.write("            default: return false;\n");
-            w.write("        }\n");
-            w.write("    }\n");
-            w.write("\n");
-            w.write("    private static boolean doConfigureIgnoreCase(CamelContext camelContext, Object component, String name, Object value) {\n");
-            w.write("        switch (name.toLowerCase()) {\n");
-            for (ComponentOption option : options) {
-                String getOrSet = option.getName();
-                getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1);
-                String setterLambda = setterLambda(en, getOrSet, option.getType(), option.getConfigurationField());
-                w.write(String.format("        case \"%s\": %s; return true;\n", option.getName().toLowerCase(), setterLambda));
-            }
-            w.write("            default: return false;\n");
-            w.write("        }\n");
-            w.write("    }\n");
-            w.write("\n");
-            w.write("}\n");
-            w.write("\n");
-        } catch (Exception e) {
-            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
-            dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
-        }
-    }
-
-    private static String setterLambda(String en, String getOrSet, String type, String configurationField) {
-        // type may contain generics so remove those
-        if (type.indexOf('<') != -1) {
-            type = type.substring(0, type.indexOf('<'));
-        }
-        if (configurationField != null) {
-            getOrSet = "get" + Character.toUpperCase(configurationField.charAt(0)) + configurationField.substring(1) + "().set" + getOrSet;
-        } else {
-            getOrSet = "set" + getOrSet;
-        }
-
-        // ((LogEndpoint) endpoint).setGroupSize(property(camelContext, java.lang.Integer.class, value))
-        return String.format("((%s) component).%s(property(camelContext, %s.class, value))", en, getOrSet, type);
-    }
-
-    public static void generateMetaInfConfigurer(ProcessingEnvironment processingEnv, String name, String fqn) {
-        try {
-            FileObject resource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "",
-                    "META-INF/services/org/apache/camel/configurer/" + name);
-            try (Writer w = resource.openWriter()) {
-                w.append("# Generated by camel annotation processor\n");
-                w.append("class=").append(fqn).append("\n");
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-}
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
index 2505e26..0d840bc 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
@@ -52,10 +52,7 @@ import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.tools.apt.helper.EndpointHelper;
 import org.apache.camel.tools.apt.helper.JsonSchemaHelper;
 import org.apache.camel.tools.apt.helper.Strings;
-import org.apache.camel.tools.apt.model.ComponentModel;
-import org.apache.camel.tools.apt.model.ComponentOption;
-import org.apache.camel.tools.apt.model.EndpointOption;
-import org.apache.camel.tools.apt.model.EndpointPath;
+import org.apache.camel.tools.apt.model.*;
 import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
 
@@ -206,13 +203,15 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
         String fqClassName = packageName + "." + className;
 
         if ("activemq".equals(scheme) || "amqp".equals(scheme)) {
-            ComponentPropertyConfigurerGenerator.generateExtendConfigurer(processingEnv, parent, packageName, className, fqClassName);
-            ComponentPropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-component", fqClassName);
+            PropertyConfigurerGenerator.generateExtendConfigurer(processingEnv, parent, packageName, className, fqClassName);
+            PropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-component", fqClassName);
         } else if (uriEndpoint.generateConfigurer() && !componentOptions.isEmpty()) {
             // only generate this once for the first scheme
             if (schemes == null || schemes[0].equals(scheme)) {
-                ComponentPropertyConfigurerGenerator.generatePropertyConfigurer(processingEnv, parent, packageName, className, fqClassName, componentClassName, componentOptions);
-                ComponentPropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-component", fqClassName);
+                Set<PropertyOption> set = new LinkedHashSet<>();
+                set.addAll(componentOptions);
+                PropertyConfigurerGenerator.generatePropertyConfigurer(processingEnv, parent, packageName, className, fqClassName, componentClassName, set);
+                PropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-component", fqClassName);
             }
         }
     }
@@ -233,13 +232,15 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
         String fqClassName = packageName + "." + className;
 
         if ("activemq".equals(scheme) || "amqp".equals(scheme)) {
-            EndpointPropertyConfigurerGenerator.generateExtendConfigurer(processingEnv, parent, packageName, className, fqClassName);
-            EndpointPropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-endpoint", fqClassName);
+            PropertyConfigurerGenerator.generateExtendConfigurer(processingEnv, parent, packageName, className, fqClassName);
+            PropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-endpoint", fqClassName);
         } else if (uriEndpoint.generateConfigurer() && !endpointOptions.isEmpty()) {
             // only generate this once for the first scheme
             if (schemes == null || schemes[0].equals(scheme)) {
-                EndpointPropertyConfigurerGenerator.generatePropertyConfigurer(processingEnv, parent, packageName, className, fqClassName, endpointClassName, endpointOptions);
-                EndpointPropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-endpoint", fqClassName);
+                Set<PropertyOption> set = new LinkedHashSet<>();
+                set.addAll(endpointOptions);
+                PropertyConfigurerGenerator.generatePropertyConfigurer(processingEnv, parent, packageName, className, fqClassName, endpointClassName, set);
+                PropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-endpoint", fqClassName);
             }
         }
     }
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java
similarity index 89%
rename from tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java
rename to tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java
index 54ef7c0..6c8af09 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java
@@ -28,15 +28,13 @@ import javax.tools.JavaFileObject;
 import javax.tools.StandardLocation;
 
 import org.apache.camel.tools.apt.helper.IOHelper;
-import org.apache.camel.tools.apt.model.EndpointOption;
+import org.apache.camel.tools.apt.model.PropertyOption;
 
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile;
 
-// TODO: ComponentPropertyConfigurerGenerator and EndpointPropertyConfigurerGenerator can be merged to one
+public final class PropertyConfigurerGenerator {
 
-public final class EndpointPropertyConfigurerGenerator {
-
-    private EndpointPropertyConfigurerGenerator() {
+    private PropertyConfigurerGenerator() {
     }
 
     public static void generateExtendConfigurer(ProcessingEnvironment processingEnv, TypeElement parent,
@@ -69,7 +67,7 @@ public final class EndpointPropertyConfigurerGenerator {
 
     public static void generatePropertyConfigurer(ProcessingEnvironment processingEnv, TypeElement parent,
                                                   String pn, String cn, String fqn, String en,
-                                                  Set<EndpointOption> options) {
+                                                  Set<PropertyOption> options) {
 
         Writer w = null;
         try {
@@ -95,17 +93,17 @@ public final class EndpointPropertyConfigurerGenerator {
             w.write("public class " + cn + " extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {\n");
             w.write("\n");
             w.write("    @Override\n");
-            w.write("    public boolean configure(CamelContext camelContext, Object endpoint, String name, Object value, boolean ignoreCase) {\n");
+            w.write("    public boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) {\n");
             w.write("        if (ignoreCase) {\n");
-            w.write("            return doConfigureIgnoreCase(camelContext, endpoint, name, value);\n");
+            w.write("            return doConfigureIgnoreCase(camelContext, target, name, value);\n");
             w.write("        } else {\n");
-            w.write("            return doConfigure(camelContext, endpoint, name, value);\n");
+            w.write("            return doConfigure(camelContext, target, name, value);\n");
             w.write("        }\n");
             w.write("    }\n");
             w.write("\n");
-            w.write("    private static boolean doConfigure(CamelContext camelContext, Object endpoint, String name, Object value) {\n");
+            w.write("    private static boolean doConfigure(CamelContext camelContext, Object target, String name, Object value) {\n");
             w.write("        switch (name) {\n");
-            for (EndpointOption option : options) {
+            for (PropertyOption option : options) {
                 String getOrSet = option.getName();
                 getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1);
                 String setterLambda = setterLambda(en, getOrSet, option.getType(), option.getConfigurationField());
@@ -115,9 +113,9 @@ public final class EndpointPropertyConfigurerGenerator {
             w.write("        }\n");
             w.write("    }\n");
             w.write("\n");
-            w.write("    private static boolean doConfigureIgnoreCase(CamelContext camelContext, Object endpoint, String name, Object value) {\n");
+            w.write("    private static boolean doConfigureIgnoreCase(CamelContext camelContext, Object target, String name, Object value) {\n");
             w.write("        switch (name.toLowerCase()) {\n");
-            for (EndpointOption option : options) {
+            for (PropertyOption option : options) {
                 String getOrSet = option.getName();
                 getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1);
                 String setterLambda = setterLambda(en, getOrSet, option.getType(), option.getConfigurationField());
@@ -148,7 +146,8 @@ public final class EndpointPropertyConfigurerGenerator {
             getOrSet = "set" + getOrSet;
         }
 
-        return String.format("((%s) endpoint).%s(property(camelContext, %s.class, value))", en, getOrSet, type);
+        // ((LogComponent) target).setGroupSize(property(camelContext, java.lang.Integer.class, value))
+        return String.format("((%s) target).%s(property(camelContext, %s.class, value))", en, getOrSet, type);
     }
 
     public static void generateMetaInfConfigurer(ProcessingEnvironment processingEnv, String name, String fqn) {
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java
index 537594b..dd77337 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java
@@ -20,7 +20,7 @@ import java.util.Set;
 
 import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
 
-public final class ComponentOption {
+public final class ComponentOption implements PropertyOption {
 
     private String name;
     private String displayName;
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
index a225e1d..c44ef4f 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
@@ -20,7 +20,7 @@ import java.util.Set;
 
 import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
 
-public final class EndpointOption {
+public final class EndpointOption implements PropertyOption {
 
     private String name;
     private String displayName;
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/PropertyOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/PropertyOption.java
new file mode 100644
index 0000000..3bcfc77
--- /dev/null
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/PropertyOption.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.tools.apt.model;
+
+public interface PropertyOption {
+
+    String getName();
+
+    String getType();
+
+    String getConfigurationField();
+
+}