This is an automated email from the ASF dual-hosted git repository. davsclaus 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 b99464d79ef CAMEL-22368: camel-catalog - Add support for validating JQ language b99464d79ef is described below commit b99464d79eff6c6e2cdfe840a7d292f6b61eb3b2 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Aug 24 09:09:07 2025 +0200 CAMEL-22368: camel-catalog - Add support for validating JQ language --- catalog/camel-catalog/pom.xml | 6 ++++ .../org/apache/camel/catalog/CamelCatalogTest.java | 12 +++++++ .../org/apache/camel/language/jq/JqExpression.java | 2 +- .../org/apache/camel/language/jq/JqFunctions.java | 4 +-- .../org/apache/camel/language/jq/JqLanguage.java | 31 +++++++++++++---- .../camel/language/jq/JqLanguageValidateTest.java | 40 ++++++++++++++++++++++ 6 files changed, 86 insertions(+), 9 deletions(-) diff --git a/catalog/camel-catalog/pom.xml b/catalog/camel-catalog/pom.xml index 574407f4f29..af7bcf32092 100644 --- a/catalog/camel-catalog/pom.xml +++ b/catalog/camel-catalog/pom.xml @@ -104,6 +104,12 @@ <artifactId>camel-jsonpath</artifactId> <scope>test</scope> </dependency> + <!-- for testing jq language --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-jq</artifactId> + <scope>test</scope> + </dependency> <!-- for testing groovy language --> <dependency> <groupId>org.apache.camel</groupId> diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java index e2636a2c1a3..4b777b25f80 100644 --- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java +++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java @@ -1152,6 +1152,18 @@ public class CamelCatalogTest { assertEquals("$.store.book[?(@.price < 10)]", result.getText()); } + @Test + public void testValidateJQLanguage() { + LanguageValidationResult result = catalog.validateLanguagePredicate(null, "jq", ".foo == \"bar\""); + assertTrue(result.isSuccess()); + assertEquals(".foo == \"bar\"", result.getText()); + + result = catalog.validateLanguageExpression(null, "jq", ". ^^+ [{\"array\": body()}]"); + assertFalse(result.isSuccess()); + assertEquals(". ^^+ [{\"array\": body()}]", result.getText()); + assertEquals("Cannot compile query: . ^^+ [{\"array\": body()}]", result.getError()); + } + @Test public void testValidateGroovyLanguage() { LanguageValidationResult result = catalog.validateLanguageExpression(null, "groovy", "4 * 3"); diff --git a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java index 6f0029811d2..9501c72fa63 100644 --- a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java +++ b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqExpression.java @@ -72,7 +72,7 @@ public class JqExpression extends ExpressionAdapter implements ExpressionResultT this.typeConverter = camelContext.getTypeConverter(); try { - this.query = JsonQuery.compile(this.expression, Versions.JQ_1_6); + this.query = JsonQuery.compile(this.expression, Versions.JQ_1_7); } catch (JsonQueryException e) { throw new ExpressionIllegalSyntaxException(this.expression, e); } diff --git a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqFunctions.java b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqFunctions.java index e1b3ec86c19..1022447b136 100644 --- a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqFunctions.java +++ b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqFunctions.java @@ -53,14 +53,14 @@ public final class JqFunctions { camelContext.getApplicationContextClassLoader() != null ? camelContext.getApplicationContextClassLoader() : BuiltinFunctionLoader.class.getClassLoader(), - Versions.JQ_1_6); + Versions.JQ_1_7); Map<String, Function> fromJq = BuiltinFunctionLoader.getInstance() .loadFunctionsFromJsonJq( camelContext.getApplicationContextClassLoader() != null ? camelContext.getApplicationContextClassLoader() : BuiltinFunctionLoader.class.getClassLoader(), - Versions.JQ_1_6, + Versions.JQ_1_7, scope); if (fromServiceLoader != null) { diff --git a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java index 4363ae94070..e21bfd984ac 100644 --- a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java +++ b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java @@ -16,14 +16,15 @@ */ package org.apache.camel.language.jq; +import net.thisptr.jackson.jq.JsonQuery; import net.thisptr.jackson.jq.Scope; +import net.thisptr.jackson.jq.Versions; import net.thisptr.jackson.jq.module.loaders.BuiltinModuleLoader; import org.apache.camel.Expression; import org.apache.camel.StaticService; import org.apache.camel.spi.annotations.Language; import org.apache.camel.support.CamelContextHelper; import org.apache.camel.support.SingleInputTypedLanguageSupport; -import org.apache.camel.util.ObjectHelper; @Language("jq") public class JqLanguage extends SingleInputTypedLanguageSupport implements StaticService { @@ -32,16 +33,20 @@ public class JqLanguage extends SingleInputTypedLanguageSupport implements Stati @Override public void init() { - ObjectHelper.notNull(getCamelContext(), "CamelContext", this); - - this.rootScope = CamelContextHelper.findSingleByType(getCamelContext(), Scope.class); + if (getCamelContext() != null) { + this.rootScope = CamelContextHelper.findSingleByType(getCamelContext(), Scope.class); + } if (this.rootScope == null) { this.rootScope = Scope.newEmptyScope(); this.rootScope.setModuleLoader(BuiltinModuleLoader.getInstance()); - JqFunctions.load(getCamelContext(), rootScope); + if (getCamelContext() != null) { + JqFunctions.load(getCamelContext(), rootScope); + } } - JqFunctions.loadFromRegistry(getCamelContext(), rootScope); + if (getCamelContext() != null) { + JqFunctions.loadFromRegistry(getCamelContext(), rootScope); + } JqFunctions.loadLocal(rootScope); } @@ -70,4 +75,18 @@ public class JqLanguage extends SingleInputTypedLanguageSupport implements Stati return answer; } + // use by tooling + public boolean validateExpression(String expression) throws Exception { + init(); + JsonQuery jq = JsonQuery.compile(expression, Versions.JQ_1_7); + return true; + } + + // use by tooling + public boolean validatePredicate(String expression) throws Exception { + init(); + JsonQuery.compile(expression, Versions.JQ_1_7); + return true; + } + } diff --git a/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqLanguageValidateTest.java b/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqLanguageValidateTest.java new file mode 100644 index 00000000000..84e5ca2e487 --- /dev/null +++ b/components/camel-jq/src/test/java/org/apache/camel/language/jq/JqLanguageValidateTest.java @@ -0,0 +1,40 @@ +/* + * 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.language.jq; + +import net.thisptr.jackson.jq.exception.JsonQueryException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.fail; + +public class JqLanguageValidateTest { + + @Test + public void testValidateLanguage() throws Exception { + JqLanguage lan = new JqLanguage(); + lan.init(); + Assertions.assertTrue(lan.validateExpression(". + [{\"array\": body()}]")); + try { + Assertions.assertFalse(lan.validateExpression(". ^^+ [{\"array\": body()}]")); + fail(); + } catch (JsonQueryException e) { + Assertions.assertTrue(e.getMessage().startsWith("Cannot compile query")); + } + } + +}