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: <code>int</code> 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: <code>int</code> 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: <code>int</code> 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;
}
}