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 559bead5c701 CAMEL-22783: camel-xslt - Add option to set 
xpathTotalOpLimit on comp… (#20638)
559bead5c701 is described below

commit 559bead5c701e41214a180130779bf0bde96cb35
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Dec 29 09:05:03 2025 +0100

    CAMEL-22783: camel-xslt - Add option to set xpathTotalOpLimit on comp… 
(#20638)
    
    * CAMEL-22783: camel-xslt - Add option to set xpathTotalOpLimit on component
---
 .../org/apache/camel/catalog/components/xj.json    |  3 +-
 .../camel/catalog/components/xslt-saxon.json       |  3 +-
 .../org/apache/camel/catalog/components/xslt.json  |  3 +-
 .../META-INF/org/apache/camel/component/xj/xj.json |  3 +-
 .../camel/component/xslt/saxon/xslt-saxon.json     |  3 +-
 .../component/xslt/XsltComponentConfigurer.java    |  6 +++
 .../org/apache/camel/component/xslt/xslt.json      |  3 +-
 .../apache/camel/component/xslt/XsltComponent.java | 35 ++++++++++++-
 .../camel/component/xslt/ZXsltTotalOpsTest.java    | 59 ++++++++++++++++++++++
 .../component/dsl/XjComponentBuilderFactory.java   | 20 ++++++++
 .../component/dsl/XsltComponentBuilderFactory.java | 20 ++++++++
 .../dsl/XsltSaxonComponentBuilderFactory.java      | 20 ++++++++
 12 files changed, 171 insertions(+), 7 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
index 30102c4006b8..bbfa1fe95e6f 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
@@ -35,7 +35,8 @@
     "transformerFactoryClass": { "index": 8, "kind": "property", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
     "transformerFactoryConfigurationStrategy": { "index": 9, "kind": 
"property", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
     "uriResolver": { "index": 10, "kind": "property", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver. Should not be used together with the option 'uriResolverFactory'." 
},
-    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." }
+    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." },
+    "xpathTotalOpLimit": { "index": 12, "kind": "property", "displayName": 
"Xpath Total Op Limit", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Limits the total 
number of XPath operators in an XSL Stylesheet. The default (from JDK) is 
10000. Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit" }
   },
   "headers": {
     "CamelXsltFileName": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The XSLT file name", "constantName": 
"org.apache.camel.component.xj.XJConstants#XSLT_FILE_NAME" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
index 0c824c004bb5..6df50dd982d9 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
@@ -35,7 +35,8 @@
     "transformerFactoryClass": { "index": 8, "kind": "property", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
     "transformerFactoryConfigurationStrategy": { "index": 9, "kind": 
"property", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
     "uriResolver": { "index": 10, "kind": "property", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver. Should not be used together with the option 'uriResolverFactory'." 
},
-    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." }
+    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." },
+    "xpathTotalOpLimit": { "index": 12, "kind": "property", "displayName": 
"Xpath Total Op Limit", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Limits the total 
number of XPath operators in an XSL Stylesheet. The default (from JDK) is 
10000. Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit" }
   },
   "headers": {
     "CamelXsltResourceUri": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "A URI for the template resource to load and use instead 
of the endpoint configured.", "constantName": 
"org.apache.camel.component.xslt.XsltConstants#XSLT_RESOURCE_URI" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
index 6565bd787743..b83bd5f45f6e 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
@@ -31,7 +31,8 @@
     "transformerFactoryClass": { "index": 4, "kind": "property", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
     "transformerFactoryConfigurationStrategy": { "index": 5, "kind": 
"property", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
     "uriResolver": { "index": 6, "kind": "property", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver. Should not be used together with the option 'uriResolverFactory'." 
},
-    "uriResolverFactory": { "index": 7, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." }
+    "uriResolverFactory": { "index": 7, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." },
+    "xpathTotalOpLimit": { "index": 8, "kind": "property", "displayName": 
"Xpath Total Op Limit", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Limits the total 
number of XPath operators in an XSL Stylesheet. The default (from JDK) is 
10000. Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit" }
   },
   "headers": {
     "CamelXsltResourceUri": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "A URI for the template resource to load and use instead 
of the endpoint configured.", "constantName": 
"org.apache.camel.component.xslt.XsltConstants#XSLT_RESOURCE_URI" },
diff --git 
a/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
 
b/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
index 30102c4006b8..bbfa1fe95e6f 100644
--- 
a/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
+++ 
b/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
@@ -35,7 +35,8 @@
     "transformerFactoryClass": { "index": 8, "kind": "property", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
     "transformerFactoryConfigurationStrategy": { "index": 9, "kind": 
"property", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
     "uriResolver": { "index": 10, "kind": "property", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver. Should not be used together with the option 'uriResolverFactory'." 
},
-    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." }
+    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." },
+    "xpathTotalOpLimit": { "index": 12, "kind": "property", "displayName": 
"Xpath Total Op Limit", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Limits the total 
number of XPath operators in an XSL Stylesheet. The default (from JDK) is 
10000. Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit" }
   },
   "headers": {
     "CamelXsltFileName": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The XSLT file name", "constantName": 
"org.apache.camel.component.xj.XJConstants#XSLT_FILE_NAME" },
diff --git 
a/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
 
b/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
index 0c824c004bb5..6df50dd982d9 100644
--- 
a/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
+++ 
b/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
@@ -35,7 +35,8 @@
     "transformerFactoryClass": { "index": 8, "kind": "property", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
     "transformerFactoryConfigurationStrategy": { "index": 9, "kind": 
"property", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
     "uriResolver": { "index": 10, "kind": "property", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver. Should not be used together with the option 'uriResolverFactory'." 
},
-    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." }
+    "uriResolverFactory": { "index": 11, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." },
+    "xpathTotalOpLimit": { "index": 12, "kind": "property", "displayName": 
"Xpath Total Op Limit", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Limits the total 
number of XPath operators in an XSL Stylesheet. The default (from JDK) is 
10000. Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit" }
   },
   "headers": {
     "CamelXsltResourceUri": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "A URI for the template resource to load and use instead 
of the endpoint configured.", "constantName": 
"org.apache.camel.component.xslt.XsltConstants#XSLT_RESOURCE_URI" },
diff --git 
a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltComponentConfigurer.java
 
b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltComponentConfigurer.java
index b39cca92f77b..14dea08d8b6b 100644
--- 
a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltComponentConfigurer.java
+++ 
b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltComponentConfigurer.java
@@ -39,6 +39,8 @@ public class XsltComponentConfigurer extends 
PropertyConfigurerSupport implement
         case "uriResolver": target.setUriResolver(property(camelContext, 
javax.xml.transform.URIResolver.class, value)); return true;
         case "uriresolverfactory":
         case "uriResolverFactory": 
target.setUriResolverFactory(property(camelContext, 
org.apache.camel.component.xslt.XsltUriResolverFactory.class, value)); return 
true;
+        case "xpathtotaloplimit":
+        case "xpathTotalOpLimit": 
target.setXpathTotalOpLimit(property(camelContext, int.class, value)); return 
true;
         default: return false;
         }
     }
@@ -62,6 +64,8 @@ public class XsltComponentConfigurer extends 
PropertyConfigurerSupport implement
         case "uriResolver": return javax.xml.transform.URIResolver.class;
         case "uriresolverfactory":
         case "uriResolverFactory": return 
org.apache.camel.component.xslt.XsltUriResolverFactory.class;
+        case "xpathtotaloplimit":
+        case "xpathTotalOpLimit": return int.class;
         default: return null;
         }
     }
@@ -86,6 +90,8 @@ public class XsltComponentConfigurer extends 
PropertyConfigurerSupport implement
         case "uriResolver": return target.getUriResolver();
         case "uriresolverfactory":
         case "uriResolverFactory": return target.getUriResolverFactory();
+        case "xpathtotaloplimit":
+        case "xpathTotalOpLimit": return target.getXpathTotalOpLimit();
         default: return null;
         }
     }
diff --git 
a/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
 
b/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
index 6565bd787743..b83bd5f45f6e 100644
--- 
a/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
+++ 
b/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
@@ -31,7 +31,8 @@
     "transformerFactoryClass": { "index": 4, "kind": "property", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
     "transformerFactoryConfigurationStrategy": { "index": 5, "kind": 
"property", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
     "uriResolver": { "index": 6, "kind": "property", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver. Should not be used together with the option 'uriResolverFactory'." 
},
-    "uriResolverFactory": { "index": 7, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." }
+    "uriResolverFactory": { "index": 7, "kind": "property", "displayName": 
"Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
UriResolver which depends on a dynamic endpoint resource URI. Should not be 
used together with the option 'uriResolver'." },
+    "xpathTotalOpLimit": { "index": 8, "kind": "property", "displayName": 
"Xpath Total Op Limit", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Limits the total 
number of XPath operators in an XSL Stylesheet. The default (from JDK) is 
10000. Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit" }
   },
   "headers": {
     "CamelXsltResourceUri": { "index": 0, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "A URI for the template resource to load and use instead 
of the endpoint configured.", "constantName": 
"org.apache.camel.component.xslt.XsltConstants#XSLT_RESOURCE_URI" },
diff --git 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
index 385800353a7c..07eb42709281 100644
--- 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
+++ 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
@@ -36,6 +36,8 @@ public class XsltComponent extends DefaultComponent {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(XsltComponent.class);
 
+    private static final String XPATH_TOTAL_OP_LIMIT = 
"jdk.xml.xpathTotalOpLimit";
+
     @Metadata(label = "advanced")
     private URIResolver uriResolver;
     @Metadata(label = "advanced")
@@ -48,6 +50,8 @@ public class XsltComponent extends DefaultComponent {
     private TransformerFactoryConfigurationStrategy 
transformerFactoryConfigurationStrategy;
     @Metadata(label = "advanced")
     private String transformerFactoryClass;
+    @Metadata(label = "advanced", defaultValue = "10000")
+    private int xpathTotalOpLimit;
 
     public XsltComponent() {
     }
@@ -125,11 +129,40 @@ public class XsltComponent extends DefaultComponent {
         this.transformerFactoryClass = transformerFactoryClass;
     }
 
+    public int getXpathTotalOpLimit() {
+        return xpathTotalOpLimit;
+    }
+
+    /**
+     * Limits the total number of XPath operators in an XSL Stylesheet. The 
default (from JDK) is 10000.
+     *
+     * Configuring this corresponds to setting JVM system property: 
jdk.xml.xpathTotalOpLimit
+     */
+    public void setXpathTotalOpLimit(int xpathTotalOpLimit) {
+        this.xpathTotalOpLimit = xpathTotalOpLimit;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        super.doInit();
+        if (xpathTotalOpLimit > 0) {
+            LOG.info("XsltComponent is setting JVM system property: 
jdk.xml.xpathTotalOpLimit=" + xpathTotalOpLimit);
+            System.setProperty(XPATH_TOTAL_OP_LIMIT, "" + xpathTotalOpLimit);
+        }
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        super.doShutdown();
+        if (xpathTotalOpLimit > 0) {
+            System.clearProperty(XPATH_TOTAL_OP_LIMIT);
+        }
+    }
+
     @Override
     protected Endpoint createEndpoint(String uri, final String remaining, 
Map<String, Object> parameters) throws Exception {
         XsltEndpoint endpoint = createXsltEndpoint(uri);
         configureEndpoint(endpoint, remaining, parameters);
-
         return endpoint;
     }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/xslt/ZXsltTotalOpsTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/xslt/ZXsltTotalOpsTest.java
new file mode 100644
index 000000000000..9fce2915c6fc
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/xslt/ZXsltTotalOpsTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.component.xslt;
+
+import javax.xml.transform.TransformerConfigurationException;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.parallel.Isolated;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+@Isolated
+public class ZXsltTotalOpsTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testXsltTotalOps() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                XsltComponent xslt = context.getComponent("xslt", 
XsltComponent.class);
+                xslt.setXpathTotalOpLimit(1);
+
+                from("direct:start")
+                        
.to("xslt:org/apache/camel/component/xslt/example.xsl?output=bytes").to("mock:result");
+            }
+        });
+        try {
+            context.start();
+            fail("Should fail due to low total ops");
+        } catch (Exception e) {
+            TransformerConfigurationException tce
+                    = 
assertIsInstanceOf(TransformerConfigurationException.class, 
e.getCause().getCause().getCause());
+            assertTrue(tce.getMessage().endsWith("operators that exceeds the 
'1' limit set by 'system property'."));
+        }
+    }
+
+}
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XjComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XjComponentBuilderFactory.java
index 6fc9724ed30b..9291ba0ff2bf 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XjComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XjComponentBuilderFactory.java
@@ -277,6 +277,25 @@ public interface XjComponentBuilderFactory {
             doSetProperty("uriResolverFactory", uriResolverFactory);
             return this;
         }
+    
+        
+        /**
+         * Limits the total number of XPath operators in an XSL Stylesheet. The
+         * default (from JDK) is 10000. Configuring this corresponds to setting
+         * JVM system property: jdk.xml.xpathTotalOpLimit.
+         * 
+         * The option is a: &lt;code&gt;int&lt;/code&gt; type.
+         * 
+         * Default: 10000
+         * Group: advanced
+         * 
+         * @param xpathTotalOpLimit the value to set
+         * @return the dsl builder
+         */
+        default XjComponentBuilder xpathTotalOpLimit(int xpathTotalOpLimit) {
+            doSetProperty("xpathTotalOpLimit", xpathTotalOpLimit);
+            return this;
+        }
     }
 
     class XjComponentBuilderImpl
@@ -304,6 +323,7 @@ public interface XjComponentBuilderFactory {
             case "transformerFactoryConfigurationStrategy": ((XJComponent) 
component).setTransformerFactoryConfigurationStrategy((org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy)
 value); return true;
             case "uriResolver": ((XJComponent) 
component).setUriResolver((javax.xml.transform.URIResolver) value); return true;
             case "uriResolverFactory": ((XJComponent) 
component).setUriResolverFactory((org.apache.camel.component.xslt.XsltUriResolverFactory)
 value); return true;
+            case "xpathTotalOpLimit": ((XJComponent) 
component).setXpathTotalOpLimit((int) value); return true;
             default: return false;
             }
         }
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltComponentBuilderFactory.java
index a97114e13a2a..6390d5d75578 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltComponentBuilderFactory.java
@@ -206,6 +206,25 @@ public interface XsltComponentBuilderFactory {
             doSetProperty("uriResolverFactory", uriResolverFactory);
             return this;
         }
+    
+        
+        /**
+         * Limits the total number of XPath operators in an XSL Stylesheet. The
+         * default (from JDK) is 10000. Configuring this corresponds to setting
+         * JVM system property: jdk.xml.xpathTotalOpLimit.
+         * 
+         * The option is a: &lt;code&gt;int&lt;/code&gt; type.
+         * 
+         * Default: 10000
+         * Group: advanced
+         * 
+         * @param xpathTotalOpLimit the value to set
+         * @return the dsl builder
+         */
+        default XsltComponentBuilder xpathTotalOpLimit(int xpathTotalOpLimit) {
+            doSetProperty("xpathTotalOpLimit", xpathTotalOpLimit);
+            return this;
+        }
     }
 
     class XsltComponentBuilderImpl
@@ -229,6 +248,7 @@ public interface XsltComponentBuilderFactory {
             case "transformerFactoryConfigurationStrategy": ((XsltComponent) 
component).setTransformerFactoryConfigurationStrategy((org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy)
 value); return true;
             case "uriResolver": ((XsltComponent) 
component).setUriResolver((javax.xml.transform.URIResolver) value); return true;
             case "uriResolverFactory": ((XsltComponent) 
component).setUriResolverFactory((org.apache.camel.component.xslt.XsltUriResolverFactory)
 value); return true;
+            case "xpathTotalOpLimit": ((XsltComponent) 
component).setXpathTotalOpLimit((int) value); return true;
             default: return false;
             }
         }
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltSaxonComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltSaxonComponentBuilderFactory.java
index 3c08940d2c40..9ae7c4cb9298 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltSaxonComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/XsltSaxonComponentBuilderFactory.java
@@ -277,6 +277,25 @@ public interface XsltSaxonComponentBuilderFactory {
             doSetProperty("uriResolverFactory", uriResolverFactory);
             return this;
         }
+    
+        
+        /**
+         * Limits the total number of XPath operators in an XSL Stylesheet. The
+         * default (from JDK) is 10000. Configuring this corresponds to setting
+         * JVM system property: jdk.xml.xpathTotalOpLimit.
+         * 
+         * The option is a: &lt;code&gt;int&lt;/code&gt; type.
+         * 
+         * Default: 10000
+         * Group: advanced
+         * 
+         * @param xpathTotalOpLimit the value to set
+         * @return the dsl builder
+         */
+        default XsltSaxonComponentBuilder xpathTotalOpLimit(int 
xpathTotalOpLimit) {
+            doSetProperty("xpathTotalOpLimit", xpathTotalOpLimit);
+            return this;
+        }
     }
 
     class XsltSaxonComponentBuilderImpl
@@ -304,6 +323,7 @@ public interface XsltSaxonComponentBuilderFactory {
             case "transformerFactoryConfigurationStrategy": 
((XsltSaxonComponent) 
component).setTransformerFactoryConfigurationStrategy((org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy)
 value); return true;
             case "uriResolver": ((XsltSaxonComponent) 
component).setUriResolver((javax.xml.transform.URIResolver) value); return true;
             case "uriResolverFactory": ((XsltSaxonComponent) 
component).setUriResolverFactory((org.apache.camel.component.xslt.XsltUriResolverFactory)
 value); return true;
+            case "xpathTotalOpLimit": ((XsltSaxonComponent) 
component).setXpathTotalOpLimit((int) value); return true;
             default: return false;
             }
         }


Reply via email to