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 916f66f  CAMEL-16861: Polished joor and jsonpath language
916f66f is described below

commit 916f66f7b2c4a9611e21a736af4fd52540fa3e70
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Sep 13 20:58:15 2021 +0200

    CAMEL-16861: Polished joor and jsonpath language
---
 .../camel-joor/src/main/docs/joor-language.adoc    |  15 +-
 .../org/apache/camel/jsonpath/jsonpath.json        |   4 +-
 .../src/main/docs/jsonpath-language.adoc           | 162 ++++++++++-----------
 .../org/apache/camel/model/language/jsonpath.json  |   4 +-
 .../camel/model/language/JsonPathExpression.java   |   4 +-
 5 files changed, 90 insertions(+), 99 deletions(-)

diff --git a/components/camel-joor/src/main/docs/joor-language.adoc 
b/components/camel-joor/src/main/docs/joor-language.adoc
index dd3821e..8beefa9 100644
--- a/components/camel-joor/src/main/docs/joor-language.adoc
+++ b/components/camel-joor/src/main/docs/joor-language.adoc
@@ -9,12 +9,11 @@ 
include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/joor.adoc[o
 
 *Since Camel {since}*
 
-The jOOR language allows to use Java code in your Camel expression, with some 
limitations.
-The jOOR library integrates with the Java compiler and performs runtime 
compilation of Java code.
+The jOOR language allows using Java code in your Camel expression, with some 
limitations.
 
-NOTE: Java 8 is not supported.
-Java 11 or 14 is required.
+The jOOR library integrates with the Java compiler and performs runtime 
compilation of Java code.
 
+NOTE: Java 8 is not supported. Java 11 is required.
 
 == jOOR Options
 
@@ -77,7 +76,7 @@ Here we want to get the message body as a `com.foo.MyUser` 
type we can do as fol
 var user = bodyAs(com.foo.MyUser.class);
 ----
 
-You can omit _.class_ to make the function a little bit smaller:
+You can omit _.class_ to make the function a little smaller:
 
 [source,java]
 ----
@@ -201,7 +200,7 @@ You can also add aliases (key=value) where an alias will be 
used as a shorthand
 echo()=bodyAs(String) + bodyAs(String)
 ----
 
-Which allows to use _echo()_ in the jOOR language script such as:
+Which allows using _echo()_ in the jOOR language script such as:
 
 [source,java]
 ----
@@ -214,7 +213,7 @@ The _echo()_ alias will be replaced with its value 
resulting in a script as:
 
 [source,java]
 ----
-    .transform(joor("'Hello ' + bodyAs(String) + bodyAs(String)"))
+.transform(joor("'Hello ' + bodyAs(String) + bodyAs(String)"))
 ----
 
 You can configure a custom configuration location for the 
`camel-joor.properties` file or reference to a bean in the registry:
@@ -233,7 +232,7 @@ String config = "....";
 camelContext.getRegistry().put("MyJoorConfig", config);
 ----
 
-== Sample
+== Example
 
 For example to transform the message using jOOR language to upper case
 
diff --git 
a/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
 
b/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
index e15a3aa..b79c9c1 100644
--- 
a/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
+++ 
b/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
@@ -19,11 +19,11 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": 
true, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The expression value in 
your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the class name of the result type (type from output)" },
     "suppressExceptions": { "kind": "attribute", "displayName": "Suppress 
Exceptions", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to suppress exceptions such as 
PathNotFoundException." },
-    "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Whether to allow in inlined simple exceptions in the JsonPath 
expression" },
+    "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Whether to allow in inlined Simple exceptions in the JSONPath 
expression" },
     "allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy 
Predicate", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": true, "description": "Whether to allow using the easy predicate 
parser to pre-parse predicates." },
     "writeAsString": { "kind": "attribute", "displayName": "Write As String", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether to write the output of each row\/element as a 
JSON String value instead of a Map\/POJO value." },
     "headerName": { "kind": "attribute", "displayName": "Header Name", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Name 
of header to use as input, instead of the message body" },
-    "option": { "kind": "attribute", "displayName": "Option", "required": 
false, "type": "enum", "javaType": "java.lang.String", "enum": [ 
"ALWAYS_RETURN_LIST", "AS_PATH_LIST", "DEFAULT_PATH_LEAF_TO_NULL", 
"REQUIRE_PROPERTIES", "SUPPRESS_EXCEPTIONS" ], "deprecated": false, 
"autowired": false, "secret": false, "description": "To configure additional 
options on json path. Multiple values can be separated by comma." },
+    "option": { "kind": "attribute", "displayName": "Option", "required": 
false, "type": "enum", "javaType": "java.lang.String", "enum": [ 
"ALWAYS_RETURN_LIST", "AS_PATH_LIST", "DEFAULT_PATH_LEAF_TO_NULL", 
"REQUIRE_PROPERTIES", "SUPPRESS_EXCEPTIONS" ], "deprecated": false, 
"autowired": false, "secret": false, "description": "To configure additional 
options on JSONPath. Multiple values can be separated by comma." },
     "trim": { "kind": "attribute", "displayName": "Trim", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether to trim the value to remove leading and trailing whitespaces and line 
breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc 
b/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc
index 8995ae1..6a3d6e0 100644
--- a/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc
+++ b/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc
@@ -9,23 +9,11 @@ 
include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/jsonpath.ad
 
 *Since Camel {since}*
 
-Camel supports https://code.google.com/p/json-path/[JSonPath] to allow
-using Expression or Predicate
-on json messages.
+Camel supports https://code.google.com/p/json-path/[JSONPath] to allow
+using xref:manual::expression.adoc[Expression] or 
xref:manual::predicate.adoc[Predicate] on JSON messages.
 
-[source,java]
-----
-from("queue:books.new")
-  .choice()
-    .when().jsonpath("$.store.book[?(@.price < 10)]")
-      .to("jms:queue:book.cheap")
-    .when().jsonpath("$.store.book[?(@.price < 30)]")
-      .to("jms:queue:book.average")
-    .otherwise()
-      .to("jms:queue:book.expensive");
-----
 
-== JSonPath Options
+== JSONPath Options
 
 
 // language options: START
@@ -38,89 +26,100 @@ The JSONPath language supports 8 options, which are listed 
below.
 | Name | Default | Java Type | Description
 | resultType |  | String | Sets the class name of the result type (type from 
output)
 | suppressExceptions | false | Boolean | Whether to suppress exceptions such 
as PathNotFoundException.
-| allowSimple | true | Boolean | Whether to allow in inlined simple exceptions 
in the JsonPath expression
+| allowSimple | true | Boolean | Whether to allow in inlined Simple exceptions 
in the JSONPath expression
 | allowEasyPredicate | true | Boolean | Whether to allow using the easy 
predicate parser to pre-parse predicates.
 | writeAsString | false | Boolean | Whether to write the output of each 
row/element as a JSON String value instead of a Map/POJO value.
 | headerName |  | String | Name of header to use as input, instead of the 
message body
-| option |  | String | To configure additional options on json path. Multiple 
values can be separated by comma.
+| option |  | String | To configure additional options on JSONPath. Multiple 
values can be separated by comma.
 | trim | true | Boolean | Whether to trim the value to remove leading and 
trailing whitespaces and line breaks
 |===
 // language options: END
 
+== Examples
 
+For example, you can use JSONPath in a xref:manual::predicate.adoc[Predicate]
+with the xref:{eip-vc}:eips:choice-eip.adoc[Content Based Router] EIP.
 
+[source,java]
+----
+from("queue:books.new")
+  .choice()
+    .when().jsonpath("$.store.book[?(@.price < 10)]")
+      .to("jms:queue:book.cheap")
+    .when().jsonpath("$.store.book[?(@.price < 30)]")
+      .to("jms:queue:book.average")
+    .otherwise()
+      .to("jms:queue:book.expensive");
+----
 
-== Using XML configuration
-
-If you prefer to configure your routes in your Spring
-XML file then you can use xref:jsonpath-language.adoc[JSonPath] expressions as
-follows
+And in XML DSL:
 
 [source,xml]
 ----
-<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring";>
-  <route>
-    <from uri="direct:start"/>
-    <choice>
-      <when>
-        <jsonpath>$.store.book[?(@.price &lt; 10)]</jsonpath>
-        <to uri="mock:cheap"/>
-      </when>
-      <when>
-        <jsonpath>$.store.book[?(@.price &lt; 30)]</jsonpath>
-        <to uri="mock:average"/>
-      </when>
-      <otherwise>
-        <to uri="mock:expensive"/>
-      </otherwise>
-    </choice>
-  </route>
-</camelContext>
+<route>
+  <from uri="direct:start"/>
+  <choice>
+    <when>
+      <jsonpath>$.store.book[?(@.price &lt; 10)]</jsonpath>
+      <to uri="mock:cheap"/>
+    </when>
+    <when>
+      <jsonpath>$.store.book[?(@.price &lt; 30)]</jsonpath>
+      <to uri="mock:average"/>
+    </when>
+    <otherwise>
+      <to uri="mock:expensive"/>
+    </otherwise>
+  </choice>
+</route>
 ----
 
-== Syntax
-
-See the https://github.com/json-path/JsonPath[JSonPath] project page for
-further examples.
-
-== Easy Syntax
-
-*Since Camel 2.19*
+== JSONPath Syntax
 
-When you just want to define a basic predicate using jsonpath syntax it can be 
a bit hard to remember the syntax.
- So for example to find out all the cheap books you have to do
+Using the JSONPath syntax takes some time to learn, even for basic predicates.
+So for example to find out all the cheap books you have to do:
 
+[source,text]
 ----
 $.store.book[?(@.price < 20)]
 ----
 
-However what if you could just write it as
+=== Easy JSONPath Syntax
 
+However, what if you could just write it as:
+
+[source,text]
 ----
 store.book.price < 20
 ----
 
-And you can omit the path if you just want to look at nodes with a price key
+And you can omit the path if you just want to look at nodes with a price key:
 
+[source,text]
 ----
 price < 20
 ----
 
-To support this there is a `EasyPredicateParser` which kicks-in if you have 
define the predicate
-  using a basic style. That means the predicate must not start with the `$` 
sign, and only include one operator.
+To support this there is a `EasyPredicateParser` which kicks-in if you have 
defined the predicate
+using a basic style. That means the predicate must not start with the `$` 
sign, and only include one operator.
 
 The easy syntax is:
 
+[source,text]
 ----
 left OP right
 ----
 
-You can use Camel simple language in the right operator, eg
+You can use Camel simple language in the right operator, eg:
 
+[source,text]
 ----
 store.book.price < ${header.limit}
 ----
 
+See the https://github.com/json-path/JsonPath[JSONPath] project page for more 
syntax examples.
+
+
 == Supported message body types
 
 Camel JSonPath supports message body using the following types:
@@ -142,15 +141,13 @@ If a message body is of unsupported type then an 
exception is thrown by default,
 can configure JSonPath to suppress exceptions (see below)
 
 
-== Suppress exceptions
+== Suppressing exceptions
 
-*Since Camel 2.16*
-
-By default jsonpath will throw an exception if the json payload does not
+By default, jsonpath will throw an exception if the json payload does not
 have a valid path accordingly to the configured jsonpath expression. In
 some use-cases you may want to ignore this in case the json payload
-contains optional data. Therefore you can set the option
-suppressExceptions to true to ignore this as shown:
+contains optional data. Therefore, you can set the option
+`suppressExceptions` to `true` to ignore this as shown:
 
 [source,java]
 ----
@@ -185,9 +182,9 @@ This option is also available on the `@JsonPath` annotation.
 
 == Inline Simple expressions
 
-*Since Camel 2.18*
+It's possible to inlined xref:languages:simple-language.adoc[Simple] language
+in the JSONPath expression using the simple syntax `$\{xxx}`.
 
-Its now possible to inlined Simple language expressions in the JSonPath 
expression using the simple syntax $\{xxx}.
 An example is shown below:
 
 [source,java]
@@ -210,11 +207,11 @@ And in XML DSL:
   <from uri="direct:start"/>
   <choice>
     <when>
-      <jsonpath>$.store.book[?(@.price < ${header.cheap})]</jsonpath>
+      <jsonpath>$.store.book[?(@.price &lt; ${header.cheap})]</jsonpath>
       <to uri="mock:cheap"/>
     </when>
     <when>
-      <jsonpath>$.store.book[?(@.price < ${header.average})]</jsonpath>
+      <jsonpath>$.store.book[?(@.price &lt; ${header.average})]</jsonpath>
       <to uri="mock:average"/>
     </when>
     <otherwise>
@@ -224,7 +221,7 @@ And in XML DSL:
 </route>
 ----
 
-You can turn off support for inlined simple expression by setting the option 
allowSimple to false as shown:
+You can turn off support for inlined Simple expression by setting the option 
`allowSimple` to `false` as shown:
 
 [source,java]
 ----
@@ -235,16 +232,14 @@ And in XML DSL:
 
 [source,xml]
 ----
-<jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>
+<jsonpath allowSimple="false">$.store.book[?(@.price &lt; 10)]</jsonpath>
 ----
 
 == JSonPath injection
 
-You can use Bean Integration to invoke a
-method on a bean and use various languages such as JSonPath to extract a
-value from the message and bind it to a method parameter.
-
-For example
+You can use xref:manual::bean-integration.adoc[Bean Integration] to invoke a
+method on a bean and use various languages such as JSONPath (via the 
`@JsonPath` annotation)
+to extract a value from the message and bind it to a method parameter, as 
shown below:
 
 [source,java]
 ----
@@ -263,13 +258,13 @@ The encoding of the JSON document is
 detected automatically, if the document is encoded in unicode  (UTF-8,
 UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE ) as specified in  RFC-4627. If
 the encoding is a non-unicode encoding, you can either make sure that
-you enter the document in String format to the JSONPath component or you
-can specify the encoding in the header "*CamelJsonPathJsonEncoding*"
-(JsonpathConstants.HEADER_JSON_ENCODING).
+you enter the document in String format to JSONPath, or you
+can specify the encoding in the header `CamelJsonPathJsonEncoding` which
+is defined as a constant in: `JsonpathConstants.HEADER_JSON_ENCODING`.
 
-== Split JSon data into sub rows as JSon
+== Split JSON data into sub rows as JSON
 
-You can use jsonpath to split a JSon document, such as:
+You can use JSONPath to split a JSON document, such as:
 
 [source,java]
 ----
@@ -279,7 +274,7 @@ from("direct:start")
 ----
 
 Then each book is logged, however the message body is a `Map` instance. 
Sometimes
-you may want to output this as plain String JSon value instead, which can be 
done
+you may want to output this as plain String JSON value instead, which can be 
done
 with the `writeAsString` option as shown:
 
 [source,java]
@@ -289,17 +284,14 @@ from("direct:start")
     .to("log:book");
 ----
 
-Then each book is logged as a String JSon value. For earlier versions of Camel 
you
-would need to use camel-jackson dataformat and marshal the message body to 
make it
-convert the message body from `Map` to a `String` type.
+Then each book is logged as a String JSON value.
 
 == Using header as input
-*Since Camel 2.20*
 
-By default jsonpath uses the message body as the input source. However you can 
also use a header as input
+By default, JSONPath uses the message body as the input source. However, you 
can also use a header as input
 by specifying the `headerName` option.
 
-For example to count the number of books from a json document that
+For example to count the number of books from a JSON document that
 was stored in a header named `books` you can do:
 
 [source,java]
@@ -310,7 +302,7 @@ from("direct:start")
     .to("mock:result");
 ----
 
-In the `jsonpath` expression above we specify the name of the header as `books`
+In the `jsonpath` expression above we specify the name of the header as 
`books`,
 and we also told that we wanted the result to be converted as an integer by 
`int.class`.
 
 The same example in XML DSL would be:
diff --git 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
index 136041b..e332f19 100644
--- 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
+++ 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
@@ -15,11 +15,11 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": 
true, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The expression value in 
your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the class name of the result type (type from output)" },
     "suppressExceptions": { "kind": "attribute", "displayName": "Suppress 
Exceptions", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to suppress exceptions such as 
PathNotFoundException." },
-    "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Whether to allow in inlined simple exceptions in the JsonPath 
expression" },
+    "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "Whether to allow in inlined Simple exceptions in the JSONPath 
expression" },
     "allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy 
Predicate", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": true, "description": "Whether to allow using the easy predicate 
parser to pre-parse predicates." },
     "writeAsString": { "kind": "attribute", "displayName": "Write As String", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether to write the output of each row\/element as a 
JSON String value instead of a Map\/POJO value." },
     "headerName": { "kind": "attribute", "displayName": "Header Name", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Name 
of header to use as input, instead of the message body" },
-    "option": { "kind": "attribute", "displayName": "Option", "required": 
false, "type": "enum", "javaType": "java.lang.String", "enum": [ 
"ALWAYS_RETURN_LIST", "AS_PATH_LIST", "DEFAULT_PATH_LEAF_TO_NULL", 
"REQUIRE_PROPERTIES", "SUPPRESS_EXCEPTIONS" ], "deprecated": false, 
"autowired": false, "secret": false, "description": "To configure additional 
options on json path. Multiple values can be separated by comma." },
+    "option": { "kind": "attribute", "displayName": "Option", "required": 
false, "type": "enum", "javaType": "java.lang.String", "enum": [ 
"ALWAYS_RETURN_LIST", "AS_PATH_LIST", "DEFAULT_PATH_LEAF_TO_NULL", 
"REQUIRE_PROPERTIES", "SUPPRESS_EXCEPTIONS" ], "deprecated": false, 
"autowired": false, "secret": false, "description": "To configure additional 
options on JSONPath. Multiple values can be separated by comma." },
     "trim": { "kind": "attribute", "displayName": "Trim", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether to trim the value to remove leading and trailing whitespaces and line 
breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
index 79e7d9d..766ec58 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
@@ -92,7 +92,7 @@ public class JsonPathExpression extends ExpressionDefinition {
     }
 
     /**
-     * Whether to allow in inlined simple exceptions in the JsonPath expression
+     * Whether to allow in inlined Simple exceptions in the JSONPath expression
      */
     public void setAllowSimple(String allowSimple) {
         this.allowSimple = allowSimple;
@@ -143,7 +143,7 @@ public class JsonPathExpression extends 
ExpressionDefinition {
     }
 
     /**
-     * To configure additional options on json path. Multiple values can be 
separated by comma.
+     * To configure additional options on JSONPath. Multiple values can be 
separated by comma.
      */
     public void setOption(String option) {
         this.option = option;

Reply via email to