Repository: camel Updated Branches: refs/heads/master 73907c022 -> a9cf098fd
CAMEL-10703: camel-catalog - Add api for validating any Camel languge Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a9cf098f Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a9cf098f Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a9cf098f Branch: refs/heads/master Commit: a9cf098fdce05609a91d2ca79713a3f81b025d43 Parents: 73907c0 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Jan 13 12:59:10 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Jan 13 12:59:10 2017 +0100 ---------------------------------------------------------------------- .../org/apache/camel/catalog/CamelCatalog.java | 32 ++++++++- .../camel/catalog/DefaultCamelCatalog.java | 75 +++++++++++++++++++- .../camel/catalog/LanguageValidationResult.java | 65 +++++++++++++++++ .../camel/catalog/SimpleValidationResult.java | 45 ++---------- .../apache/camel/catalog/CamelCatalogTest.java | 31 ++++++-- 5 files changed, 202 insertions(+), 46 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a9cf098f/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java index ff70e58..a83b886 100644 --- a/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java +++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java @@ -359,7 +359,9 @@ public interface CamelCatalog { * * @param simple the simple expression * @return validation result + * @deprecated use {@link #validateSimpleExpression(ClassLoader, String)} */ + @Deprecated SimpleValidationResult validateSimpleExpression(String simple); /** @@ -367,7 +369,7 @@ public interface CamelCatalog { * <p/> * <b>Important:</b> This requires having <tt>camel-core</tt> on the classpath * - * @param classLoader a custom classloader to use for loading the simple language from the classpath + * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader * @param simple the simple expression * @return validation result */ @@ -380,7 +382,9 @@ public interface CamelCatalog { * * @param simple the simple predicate * @return validation result + * @deprecated use {@link #validateSimplePredicate(ClassLoader, String)} */ + @Deprecated SimpleValidationResult validateSimplePredicate(String simple); /** @@ -388,13 +392,37 @@ public interface CamelCatalog { * <p/> * <b>Important:</b> This requires having <tt>camel-core</tt> on the classpath * - * @param classLoader a custom classloader to use for loading the simple language from the classpath + * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader * @param simple the simple predicate * @return validation result */ SimpleValidationResult validateSimplePredicate(ClassLoader classLoader, String simple); /** + * Parses and validates the language as a predicate + * <p/> + * <b>Important:</b> This requires having <tt>camel-core</tt> and the language dependencies on the classpath + * + * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader + * @param language the name of the language + * @param text the predicate text + * @return validation result + */ + LanguageValidationResult validateLanguagePredicate(ClassLoader classLoader, String language, String text); + + /** + * Parses and validates the language as an expression + * <p/> + * <b>Important:</b> This requires having <tt>camel-core</tt> and the language dependencies on the classpath + * + * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader + * @param language the name of the language + * @param text the expression text + * @return validation result + */ + LanguageValidationResult validateLanguageExpression(ClassLoader classLoader, String language, String text); + + /** * Returns the component name from the given endpoint uri * * @param uri the endpoint uri http://git-wip-us.apache.org/repos/asf/camel/blob/a9cf098f/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 435d60b..e30616f 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 @@ -1797,7 +1797,7 @@ public class DefaultCamelCatalog implements CamelCatalog { @Override public SimpleValidationResult validateSimpleExpression(String simple) { - return doValidateSimple(DefaultCamelCatalog.class.getClassLoader(), simple, false); + return doValidateSimple(null, simple, false); } @Override @@ -1807,7 +1807,7 @@ public class DefaultCamelCatalog implements CamelCatalog { @Override public SimpleValidationResult validateSimplePredicate(String simple) { - return doValidateSimple(DefaultCamelCatalog.class.getClassLoader(), simple, true); + return doValidateSimple(null, simple, true); } @Override @@ -1816,6 +1816,10 @@ public class DefaultCamelCatalog implements CamelCatalog { } private SimpleValidationResult doValidateSimple(ClassLoader classLoader, String simple, boolean predicate) { + if (classLoader == null) { + classLoader = DefaultCamelCatalog.class.getClassLoader(); + } + SimpleValidationResult answer = new SimpleValidationResult(simple); Object instance = null; @@ -1890,6 +1894,73 @@ public class DefaultCamelCatalog implements CamelCatalog { return answer; } + @Override + public LanguageValidationResult validateLanguagePredicate(ClassLoader classLoader, String language, String text) { + return doValidateLanguage(classLoader, language, text, true); + } + + @Override + public LanguageValidationResult validateLanguageExpression(ClassLoader classLoader, String language, String text) { + return doValidateLanguage(classLoader, language, text, false); + } + + private LanguageValidationResult doValidateLanguage(ClassLoader classLoader, String language, String text, boolean predicate) { + if (classLoader == null) { + classLoader = DefaultCamelCatalog.class.getClassLoader(); + } + + SimpleValidationResult answer = new SimpleValidationResult(text); + + String json = languageJSonSchema(language); + if (json == null) { + answer.setError("Unknown language " + language); + return answer; + } + + List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false); + String className = null; + for (Map<String, String> row : rows) { + if (row.containsKey("javaType")) { + className = row.get("javaType"); + } + } + + if (className == null) { + answer.setError("Cannot find javaType for language " + language); + return answer; + } + + Object instance = null; + Class clazz = null; + try { + clazz = classLoader.loadClass(className); + instance = clazz.newInstance(); + } catch (Exception e) { + // ignore + } + + if (clazz != null && instance != null) { + Throwable cause = null; + try { + if (predicate) { + instance.getClass().getMethod("createPredicate", String.class).invoke(instance, text); + } else { + instance.getClass().getMethod("createExpression", String.class).invoke(instance, text); + } + } catch (InvocationTargetException e) { + cause = e.getTargetException(); + } catch (Exception e) { + cause = e; + } + + if (cause != null) { + answer.setError(cause.getMessage()); + } + } + + return answer; + } + /** * Special logic for log endpoints to deal when showAll=true */ http://git-wip-us.apache.org/repos/asf/camel/blob/a9cf098f/platforms/catalog/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java new file mode 100644 index 0000000..4a977eb --- /dev/null +++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java @@ -0,0 +1,65 @@ +/** + * 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.catalog; + +import java.io.Serializable; + +/** + * Validation result of parsing a language expression or predicate + */ +public class LanguageValidationResult implements Serializable { + private final String text; + private String error; + private String shortError; + private int index; + + public LanguageValidationResult(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public boolean isSuccess() { + return error == null; + } + + public void setError(String error) { + this.error = error; + } + + public String getError() { + return error; + } + + public String getShortError() { + return shortError; + } + + public void setShortError(String shortError) { + this.shortError = shortError; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/a9cf098f/platforms/catalog/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java index 5032758..5c86f23 100644 --- a/platforms/catalog/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java +++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java @@ -16,48 +16,17 @@ */ package org.apache.camel.catalog; -import java.io.Serializable; - -public class SimpleValidationResult implements Serializable { - - private final String simple; - private String error; - private String shortError; - private int index; +/** + * To be backwards compatible, but favor using {@link LanguageValidationResult} instead. + */ +public class SimpleValidationResult extends LanguageValidationResult { - public SimpleValidationResult(String simple) { - this.simple = simple; + public SimpleValidationResult(String text) { + super(text); } public String getSimple() { - return simple; + return getText(); } - public boolean isSuccess() { - return error == null; - } - - public void setError(String error) { - this.error = error; - } - - public String getError() { - return error; - } - - public String getShortError() { - return shortError; - } - - public void setShortError(String shortError) { - this.shortError = shortError; - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } } http://git-wip-us.apache.org/repos/asf/camel/blob/a9cf098f/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 e08e668..0682026 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 @@ -793,11 +793,11 @@ public class CamelCatalogTest { @Test public void testSimpleExpression() throws Exception { - SimpleValidationResult result = catalog.validateSimpleExpression("${body}"); + SimpleValidationResult result = catalog.validateSimpleExpression(null, "${body}"); assertTrue(result.isSuccess()); assertEquals("${body}", result.getSimple()); - result = catalog.validateSimpleExpression("${body"); + result = catalog.validateSimpleExpression(null, "${body"); assertFalse(result.isSuccess()); assertEquals("${body", result.getSimple()); LOG.info(result.getError()); @@ -808,11 +808,11 @@ public class CamelCatalogTest { @Test public void testSimplePredicate() throws Exception { - SimpleValidationResult result = catalog.validateSimplePredicate("${body} == 'abc'"); + SimpleValidationResult result = catalog.validateSimplePredicate(null, "${body} == 'abc'"); assertTrue(result.isSuccess()); assertEquals("${body} == 'abc'", result.getSimple()); - result = catalog.validateSimplePredicate("${body} > ${header.size"); + result = catalog.validateSimplePredicate(null, "${body} > ${header.size"); assertFalse(result.isSuccess()); assertEquals("${body} > ${header.size", result.getSimple()); LOG.info(result.getError()); @@ -822,6 +822,29 @@ public class CamelCatalogTest { } @Test + public void testValidateLanguage() throws Exception { + LanguageValidationResult result = catalog.validateLanguageExpression(null, "simple", "${body}"); + assertTrue(result.isSuccess()); + assertEquals("${body}", result.getText()); + + result = catalog.validateLanguageExpression(null, "header", "foo"); + assertTrue(result.isSuccess()); + assertEquals("foo", result.getText()); + + result = catalog.validateLanguagePredicate(null, "simple", "${body} > 10"); + assertTrue(result.isSuccess()); + assertEquals("${body} > 10", result.getText()); + + result = catalog.validateLanguagePredicate(null, "header", "bar"); + assertTrue(result.isSuccess()); + assertEquals("bar", result.getText()); + + result = catalog.validateLanguagePredicate(null, "foobar", "bar"); + assertFalse(result.isSuccess()); + assertEquals("Unknown language foobar", result.getError()); + } + + @Test public void testSpringCamelContext() throws Exception { String json = catalog.modelJSonSchema("camelContext"); assertNotNull(json);