Repository: camel
Updated Branches:
  refs/heads/camel-2.18.x 762495717 -> 7f3b452aa


CAMEL-10951: fix constant literals in spring-boot configuration classes


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/29bdc91c
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/29bdc91c
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/29bdc91c

Branch: refs/heads/camel-2.18.x
Commit: 29bdc91c8ce04d481ceed78e0c0fb513199e5b5f
Parents: 7624957
Author: Nicola Ferraro <ni.ferr...@gmail.com>
Authored: Tue Mar 7 14:53:54 2017 +0100
Committer: Nicola Ferraro <ni.ferr...@gmail.com>
Committed: Tue Mar 7 16:23:41 2017 +0100

----------------------------------------------------------------------
 .../SpringBootAutoConfigurationMojo.java        | 71 ++++++++++++++++++--
 1 file changed, 66 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/29bdc91c/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
----------------------------------------------------------------------
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
index 8ebe2f4..0f83ff2 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java
@@ -38,11 +38,13 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+
 import org.apache.camel.maven.packaging.model.ComponentModel;
 import org.apache.camel.maven.packaging.model.ComponentOptionModel;
 import org.apache.camel.maven.packaging.model.DataFormatModel;
@@ -130,6 +132,8 @@ public class SpringBootAutoConfigurationMojo extends 
AbstractMojo {
         PRIMITIVEMAP.put("float", "java.lang.Float");
     }
 
+    private static final List<String> JAVA_LANG_TYPES = 
Arrays.asList("Boolean", "Byte", "Character", "Class", "Double", "Float", 
"Integer", "Long", "Object", "Short", "String");
+
     /**
      * The maven project.
      *
@@ -453,16 +457,20 @@ public class SpringBootAutoConfigurationMojo extends 
AbstractMojo {
                 }
 
                 String defaultValue = null;
+                String defaultValueLiteral = null;
                 if (sourceProp.hasAnnotation(UriParam.class)) {
                     defaultValue = 
sourceProp.getAnnotation(UriParam.class).getStringValue("defaultValue");
+                    defaultValueLiteral = 
sourceProp.getAnnotation(UriParam.class).getLiteralValue("defaultValue");
                 } else if (sourceProp.hasAnnotation(UriPath.class)) {
                     defaultValue = 
sourceProp.getAnnotation(UriPath.class).getStringValue("defaultValue");
+                    defaultValueLiteral = 
sourceProp.getAnnotation(UriPath.class).getLiteralValue("defaultValue");
                 }
+
+                defaultValueLiteral = makeFQ(nestedType, defaultValueLiteral);
+
                 if (!Strings.isBlank(defaultValue)) {
-                    if ("java.lang.String".equals(optionType)) {
-                        prop.getField().setStringInitializer(defaultValue);
-                    } else if ("integer".equals(optionType) || 
"boolean".equals(optionType)) {
-                        prop.getField().setLiteralInitializer(defaultValue);
+                    if ("integer".equals(optionType) || 
"boolean".equals(optionType) || "java.lang.String".equals(optionType)) {
+                        
prop.getField().setLiteralInitializer(defaultValueLiteral);
                     } else if (anEnum) {
                         String enumShortName = optionClass.getSimpleName();
                         prop.getField().setLiteralInitializer(enumShortName + 
"." + defaultValue);
@@ -479,6 +487,59 @@ public class SpringBootAutoConfigurationMojo extends 
AbstractMojo {
         writeSourceIfChanged(javaClass, fileName);
     }
 
+    private String makeFQ(JavaClassSource source, String literal) {
+        if (literal == null) {
+            return null;
+        }
+
+        if (Pattern.matches("[A-Z][A-Z0-9_]*", literal)) {
+            return source.getQualifiedName() + "." + literal;
+        }
+
+        Map<String, String> fq = new HashMap<>();
+        List<String> classes = extractClasses(literal);
+        for (String cl : classes) {
+
+            boolean found = false;
+            for (Import im : source.getImports()) {
+                if (cl.equals(im.getSimpleName())) {
+                    fq.put(cl, im.getQualifiedName());
+                    found = true;
+                    break;
+                }
+            }
+
+            if (!found) {
+                // if it's not a java.lang object, then it's in the same 
package
+                if (!JAVA_LANG_TYPES.contains(cl)) {
+                    fq.put(cl, source.getPackage() + "." + cl);
+                }
+            }
+        }
+
+        if (fq.size() > 0) {
+            String res = literal;
+            for (Map.Entry<String, String> fqn : fq.entrySet()) {
+                res = res.replace(fqn.getKey(), fqn.getValue());
+            }
+            return res;
+        }
+        return literal;
+    }
+
+    private List<String> extractClasses(String literal) {
+        if (literal.startsWith("\"") && literal.endsWith("\"")) {
+            return Collections.emptyList();
+        }
+        List<String> classes = new LinkedList<>();
+        Pattern regex = 
Pattern.compile("[^A-Za-z0-9_.]*([A-Z][A-Za-z0-9]*)[.][A-Za-z0-9_.-]+");
+        Matcher m = regex.matcher(literal);
+        while (m.find()) {
+            classes.add(m.group(1));
+        }
+        return classes;
+    }
+
     // resolved property type name and property source, Roaster doesn't 
resolve inner classes correctly
     private class ResolvedProperty {
         private String propertyType;
@@ -851,7 +912,7 @@ public class SpringBootAutoConfigurationMojo extends 
AbstractMojo {
         String configurationName = name.replace("DataFormatAutoConfiguration", 
"DataFormatConfiguration");
         AnnotationSource<JavaClassSource> ann = 
javaClass.addAnnotation(EnableConfigurationProperties.class);
         ann.setLiteralValue("value", configurationName + ".class");
-        
+
         javaClass.addAnnotation(Conditional.class).setLiteralValue(name + 
".Condition.class");
 
         // add method for auto configure

Reply via email to