Camel catalog - Add api to validate endpoint uri

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

Branch: refs/heads/camel-2.16.x
Commit: 7caf775d9a49d172615fbaaa64400ee1a1f8cac8
Parents: e22c1ee
Author: Claus Ibsen <davscl...@apache.org>
Authored: Sun Dec 20 13:27:38 2015 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Mon Dec 21 13:42:32 2015 +0100

----------------------------------------------------------------------
 .../camel/catalog/DefaultCamelCatalog.java      |  2 +-
 .../apache/camel/catalog/ValidationResult.java  | 77 ++++++++++++++++++++
 .../apache/camel/catalog/CamelCatalogTest.java  | 17 +++++
 3 files changed, 95 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7caf775d/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index a5385cb..2580536 100644
--- 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -647,7 +647,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
     @Override
     public ValidationResult validateProperties(String uri) {
-        ValidationResult result = new ValidationResult();
+        ValidationResult result = new ValidationResult(uri);
 
         Map<String, String> properties;
         List<Map<String, String>> rows;

http://git-wip-us.apache.org/repos/asf/camel/blob/7caf775d/platforms/catalog/src/main/java/org/apache/camel/catalog/ValidationResult.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/ValidationResult.java
 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/ValidationResult.java
index 78952cd..4450133 100644
--- 
a/platforms/catalog/src/main/java/org/apache/camel/catalog/ValidationResult.java
+++ 
b/platforms/catalog/src/main/java/org/apache/camel/catalog/ValidationResult.java
@@ -24,6 +24,8 @@ import java.util.Set;
 
 public class ValidationResult implements Serializable {
 
+    private final String uri;
+
     // component
     private String syntaxError;
     private String unknownComponent;
@@ -36,6 +38,10 @@ public class ValidationResult implements Serializable {
     private Map<String, String> invalidInteger;
     private Map<String, String> invalidNumber;
 
+    public ValidationResult(String uri) {
+        this.uri = uri;
+    }
+
     public boolean isSuccess() {
         return syntaxError == null && unknownComponent == null
                 && unknown == null && required == null && invalidEnum == null
@@ -123,4 +129,75 @@ public class ValidationResult implements Serializable {
     public Map<String, String> getInvalidNumber() {
         return invalidNumber;
     }
+
+    /**
+     * A human readable summary of the validation errors.
+     *
+     * @return the summary, or <tt>null</tt> if no validation errors
+     */
+    public String summaryErrorMessage() {
+        if (isSuccess()) {
+            return null;
+        }
+
+        if (syntaxError != null) {
+            return "Syntax error " + syntaxError;
+        } else if (unknownComponent != null) {
+            return "Unknown component " + unknownComponent;
+        }
+
+        // for each invalid option build a reason message
+        Map<String, String> options = new LinkedHashMap<String, String>();
+        if (unknown != null) {
+            for (String name : unknown) {
+                options.put(name, "Unknown field");
+            }
+        }
+        if (required != null) {
+            for (String name : required) {
+                options.put(name, "Missing required field");
+            }
+        }
+        if (invalidEnum != null) {
+            for (Map.Entry<String, String> entry : invalidEnum.entrySet()) {
+                options.put(entry.getKey(), "Invalid enum value: " + 
entry.getValue());
+            }
+        }
+        if (invalidBoolean != null) {
+            for (Map.Entry<String, String> entry : invalidBoolean.entrySet()) {
+                options.put(entry.getKey(), "Invalid boolean value: " + 
entry.getValue());
+            }
+        }
+        if (invalidInteger != null) {
+            for (Map.Entry<String, String> entry : invalidInteger.entrySet()) {
+                options.put(entry.getKey(), "Invalid integer value: " + 
entry.getValue());
+            }
+        }
+        if (invalidNumber != null) {
+            for (Map.Entry<String, String> entry : invalidNumber.entrySet()) {
+                options.put(entry.getKey(), "Invalid number value: " + 
entry.getValue());
+            }
+        }
+
+        // build a table with the error summary nicely formatted
+        // lets use 24 as min length
+        int maxLen = 24;
+        for (String key : options.keySet()) {
+            maxLen = Math.max(maxLen, key.length());
+        }
+        String format = "%" + maxLen + "s    %s";
+
+        // build the human error summary
+        StringBuilder sb = new StringBuilder();
+        sb.append("Endpoint validator error\n");
+        
sb.append("---------------------------------------------------------------------------------------------------------------------------------------\n");
+        sb.append("\n\t").append(uri).append("\n");
+        for (Map.Entry<String, String> option : options.entrySet()) {
+            String out = String.format(format, option.getKey(), 
option.getValue());
+            sb.append("\n\t").append(out);
+        }
+        sb.append("\n\n");
+
+        return sb.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/7caf775d/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
----------------------------------------------------------------------
diff --git 
a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
 
b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index 6862fc8..b33ad5c 100644
--- 
a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ 
b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -24,6 +24,8 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static org.apache.camel.catalog.CatalogHelper.loadText;
 import static org.junit.Assert.assertEquals;
@@ -33,6 +35,8 @@ import static org.junit.Assert.assertTrue;
 
 public class CamelCatalogTest {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(CamelCatalogTest.class);
+
     static CamelCatalog catalog;
 
     @BeforeClass
@@ -431,6 +435,19 @@ public class CamelCatalogTest {
     }
 
     @Test
+    public void validatePropertiesSummary() throws Exception {
+        ValidationResult result = 
catalog.validateProperties("yammer:MESSAGES?blah=yada&accessToken=aaa&consumerKey=&useJson=no&initialDelay=five");
+        assertFalse(result.isSuccess());
+        String reason = result.summaryErrorMessage();
+        LOG.info(reason);
+
+        result = catalog.validateProperties("jms:unknown:myqueue");
+        assertFalse(result.isSuccess());
+        reason = result.summaryErrorMessage();
+        LOG.info(reason);
+    }
+
+    @Test
     public void testEndpointComponentName() throws Exception {
         String name = catalog.endpointComponentName("jms:queue:foo");
         assertEquals("jms", name);

Reply via email to