You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by vl...@apache.org on 2025/11/25 13:08:14 UTC
(jmeter) 01/04: chore: replace xmlpull with Woodstox
This is an automated email from the ASF dual-hosted git repository.
vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git
commit 920fa60dc2ebd1d8644fc9c09478ca757c9931dc
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Mon Nov 10 10:10:39 2025 +0300
chore: replace xmlpull with Woodstox
xmlpull is unsupported, so let's move to a modern library
---
bin/testfiles/BatchTestLocal.xml | 980 ++++++++++-----------
bin/testfiles/Bug52968.xml | 36 +-
bin/testfiles/HTMLParserTestFile_2.xml | 120 +--
gradle/verification-keyring.keys | 28 +
gradle/verification-metadata.xml | 38 +-
lib/aareadme.txt | 280 ------
src/bom-thirdparty/build.gradle.kts | 3 +-
src/core/build.gradle.kts | 6 +
.../java/org/apache/jmeter/save/SaveService.java | 60 +-
.../save/converters/SampleResultConverter.java | 14 +-
.../save/converters/StringPropertyConverter.java | 5 +-
.../java/org/apache/jmeter/util/JMeterUtils.java | 6 +-
.../org/apache/jmeter/save/JMeterStaxDriver.kt | 29 +
.../apache/jmeter/save/XMLOutputFactoryDelegate.kt | 110 +++
.../jmeter/save/XMLStreamWriterSkipHeader.kt | 39 +
src/dist-check/build.gradle.kts | 6 +
.../org/apache/jmeter/save/TestSaveService.java | 246 +++---
src/dist/src/dist/expected_release_jars.csv | 5 +-
src/protocol/http/build.gradle.kts | 1 +
19 files changed, 975 insertions(+), 1037 deletions(-)
diff --git a/bin/testfiles/BatchTestLocal.xml b/bin/testfiles/BatchTestLocal.xml
index 9dc72df530..c307c944cd 100644
--- a/bin/testfiles/BatchTestLocal.xml
+++ b/bin/testfiles/BatchTestLocal.xml
@@ -1,782 +1,782 @@
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<sample s="true" lb="Setup 1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java 1 C1=1" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=1" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=1" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=1 C3=1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=2 C3=2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=3 C3=3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="If Test C1=1 C2=3 C3=3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=3 C3=3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=3 C3=3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=3 C3=3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=4 C3=4" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=5 C3=5" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java 1 C1=2" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=2" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=2" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=1 C3=6" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="If Test C1=2 C2=1 C3=6" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=1 C3=6" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=1 C3=6" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=1 C3=6" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=2 C3=7" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=3 C3=8" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=4 C3=9" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="If Test C1=2 C2=4 C3=9" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=4 C3=9" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=4 C3=9" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=4 C3=9" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=5 C3=10" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java 1 C1=1" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=1" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=1" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=1 C3=11" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=2 C3=12" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="If Test C1=1 C2=2 C3=12" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=2 C3=12" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=2 C3=12" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=2 C3=12" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=3 C3=13" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=4 C3=14" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=1 C2=5 C3=15" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="If Test C1=1 C2=5 C3=15" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=5 C3=15" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=5 C3=15" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=1 C2=5 C3=15" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java 1 C1=2" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=2" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Java 1 C1=2" rc="200" rm="OK" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
<responseData class="java.lang.String">ResultData</responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">SamplerData</samplerData>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=1 C3=16" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=2 C3=17" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=3 C3=18" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="If Test C1=2 C2=3 C3=18" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=3 C3=18" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=3 C3=18" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop3 C1=2 C2=3 C3=18" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Module" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=4 C3=19" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Loop5 C1=2 C2=5 C3=20" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If once 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java If once 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="false" lb="Java If all 1" rc="" rm="" dt="text" by="0" sc="1" ec="1" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="Java OK" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseData class="java.lang.String"></responseData>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseData class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="1 1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="2 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="3 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="0 4" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG1 = 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG OO = 1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG Loop =3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG2 = 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG1 = 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG Loop =3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG2 = 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG1 = 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG Loop =3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="TG2 = 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="CSV_VAR=2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="CSV_VAR=3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="CSV_VAR=1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="CSV_VAR=2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
<sample s="true" lb="BSH Counter: 1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <samplerData class="java.lang.String">SampleResult.setSampleLabel("BSH Counter: 1");</samplerData>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <samplerData class="java.lang.String">SampleResult.setSampleLabel("BSH Counter: 1");</samplerData>
</sample>
<sample s="true" lb="BSH Counter: 2" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <samplerData class="java.lang.String">SampleResult.setSampleLabel("BSH Counter: 2");</samplerData>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <samplerData class="java.lang.String">SampleResult.setSampleLabel("BSH Counter: 2");</samplerData>
</sample>
<sample s="true" lb="BSH Counter: 3" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <samplerData class="java.lang.String">SampleResult.setSampleLabel("BSH Counter: 3");</samplerData>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <samplerData class="java.lang.String">SampleResult.setSampleLabel("BSH Counter: 3");</samplerData>
</sample>
<sample s="true" lb="BSF Sampler" rc="200" rm="OK" dt="text" by="3" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">12*12</samplerData>
</sample>
<sample s="true" lb="JSR223 Sampler" rc="200" rm="OK" dt="text" by="3" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
<samplerData class="java.lang.String">11*11</samplerData>
</sample>
<sample s="true" lb="Post 1" rc="200" rm="OK" dt="text" by="0" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
</sample>
</testResults>
diff --git a/bin/testfiles/Bug52968.xml b/bin/testfiles/Bug52968.xml
index 097e304c8b..4a32d6b13e 100644
--- a/bin/testfiles/Bug52968.xml
+++ b/bin/testfiles/Bug52968.xml
@@ -10,61 +10,61 @@
<sample s="true" lb="TC-NOPARENT-1" rc="200" rm="Number of samples in transaction : 1, number of failing samples : 0" dt="" sc="1" ec="0" ng="1" na="1"/>
<sample s="true" lb="JR-MUSTEXECUTE" rc="" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF-JR0-0" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING0" rc="" rm="Number of samples in transaction : 1, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TNPF-JR0-1" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING0" rc="" rm="Number of samples in transaction : 1, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TNPF-JR0-2" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING0" rc="" rm="Number of samples in transaction : 1, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="true" lb="TNPF-JR0-0" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF-JR1-0" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING1" rc="" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="true" lb="TNPF-JR0-1" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF-JR1-1" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING1" rc="" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="true" lb="TNPF-JR0-2" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF-JR1-2" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING1" rc="" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="true" lb="TNPF2-JR1-0" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF2-JR2-0" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING2" rc="" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="true" lb="TNPF2-JR1-1" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF2-JR2-1" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING2" rc="" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="true" lb="TNPF2-JR1-2" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TNPF2-JR2-2" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<sample s="false" lb="TC-NOPARENT-FAILING2" rc="" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
@@ -92,61 +92,61 @@
<sample s="true" lb="JR-MUSTEXECUTE" rc="" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TC-PARENT-FAILING1" rc="500" rm="Number of samples in transaction : 1, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="false" lb="TPF-JR0-0" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING1" rc="500" rm="Number of samples in transaction : 1, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="false" lb="TPF-JR0-1" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING1" rc="500" rm="Number of samples in transaction : 1, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="false" lb="TPF-JR0-2" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING1" rc="500" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="true" lb="TP-JR0-0" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TP-JR1-0" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING1" rc="500" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="true" lb="TP-JR0-1" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TP-JR1-1" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING1" rc="500" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="true" lb="TP-JR0-2" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TP-JR1-2" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING2" rc="500" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="true" lb="TPF-JR1-0" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TPF-JR2-0" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING2" rc="500" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="true" lb="TPF-JR1-1" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TPF-JR2-1" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
<sample s="false" lb="TC-PARENT-FAILING2" rc="500" rm="Number of samples in transaction : 2, number of failing samples : 1" dt="" sc="1" ec="1" ng="1" na="1">
<sample s="true" lb="TPF-JR1-2" rc="200" rm="" dt="text" sc="1" ec="0" ng="1" na="1"/>
<sample s="false" lb="TPF-JR2-2" rc="500" rm="" dt="text" sc="1" ec="1" ng="1" na="1">
- <responseData class="java.lang.String"></responseData>
+ <responseData class="java.lang.String"/>
</sample>
<responseData class="java.lang.String">Non-TEXT response data, cannot record: ()</responseData>
</sample>
diff --git a/bin/testfiles/HTMLParserTestFile_2.xml b/bin/testfiles/HTMLParserTestFile_2.xml
index 36dc54f77f..e893245e92 100644
--- a/bin/testfiles/HTMLParserTestFile_2.xml
+++ b/bin/testfiles/HTMLParserTestFile_2.xml
@@ -2,110 +2,110 @@
<testResults version="1.2">
<httpSample s="true" lb="Download embedded" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="76146" sc="1" ec="0" ng="1" na="1">
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-0" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="40176" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2.html</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="1321" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/style.css</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-2" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="5819" sc="1" ec="0" ng="1" na="1">
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2_files/halfbanner.htm-0" rc="200" rm="OK" tn="" dt="text" de="UTF-8" by="398" sc="1" ec="0" ng="0" na="0">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/halfbanner.htm</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2_files/halfbanner.htm-1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="5421" sc="1" ec="0" ng="0" na="0">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/halfbanner_data/2011-na-234x60.png</java.net.URL>
</httpSample>
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/halfbanner.htm</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-3" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="8584" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/jakarta-logo.gif</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-4" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="8886" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/logo.jpg</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-5" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="3064" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/http-config-example.png</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-6" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="2395" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/scoping1.png</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-7" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="2641" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/scoping2.png</java.net.URL>
</httpSample>
<httpSample s="true" lb="file:testfiles/HTMLParserTestFile_2.html-8" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" de="UTF-8" by="3260" sc="1" ec="0" ng="1" na="1">
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2_files/scoping3.png</java.net.URL>
</httpSample>
- <responseHeader class="java.lang.String"></responseHeader>
- <requestHeader class="java.lang.String"></requestHeader>
- <responseFile class="java.lang.String"></responseFile>
- <cookies class="java.lang.String"></cookies>
+ <responseHeader class="java.lang.String"/>
+ <requestHeader class="java.lang.String"/>
+ <responseFile class="java.lang.String"/>
+ <cookies class="java.lang.String"/>
<method class="java.lang.String">GET</method>
- <queryString class="java.lang.String"></queryString>
+ <queryString class="java.lang.String"/>
<java.net.URL>file:testfiles/HTMLParserTestFile_2.html</java.net.URL>
</httpSample>
diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys
index 90d623d73a..7d1d5a6392 100644
--- a/gradle/verification-keyring.keys
+++ b/gradle/verification-keyring.keys
@@ -6685,6 +6685,34 @@ uAngfd6DOtCKYtNKP7xqDu/2bMU23cxGaRj2ToH4RfCClg1B
=rv9Q
-----END PGP PUBLIC KEY BLOCK-----
+pub 67BF80B10AD53983
+uid Colm O hEigeartaigh <co...@apache.org>
+
+sub 26107AC31C6209E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+xsBNBE1T+3UBCAC7mTa5TEQoI1M1oftvc2SSvt1OyzwWkqxP8+uTnz41aGI9t9h8
+WVKtVk331NTMYhdPCRLLEILaaePmCmVbLCBERGkm/L8SFWQKIjpI++AEiuJxvPWQ
+aB+2iA1HC7XA9ItW8082TnE3wz4e59FMgurns6HT9V/NTVlmNJqYEyDnRzwvFW0n
+rVDxIy3PP1QTWcydTWuulOz3J1TMt98jeTznzz6EY0vqM6F7F94o5GTPo4z05iiW
+Nh3OTs7afvB4z2nErvmedIHtbbOMWphLL9nZXfDO/7s/AY7hmXpABcJgX0NdVnD3
+NZ7mBYVnH6SounCOMAV0QuF03c4f50pbXKeNABEBAAG0KUNvbG0gTyBoRWlnZWFy
+dGFpZ2ggPGNvaGVpZ2VhQGFwYWNoZS5vcmc+zsBNBE1T+3UBCADdCjZJEPqzc9nG
+ru9MvRoJr3jqAiLOrfGpQRPKzX2Vzbpdm2loUIjP91iVinG+H48L+D7IaIlO42Iu
+RMX6fms+jDd19D/sWOeNx6dhmKyDUT0/Qs7bpIyE9PBaWs1DHMRfLtBfr4rLObwV
+6IPeODWM3yaMXyVhTf2AyLtWjNhAJoeh7g9ffZ18xdEmMoL0j/qfc87PW1Ts8fpg
+7t9QgzDqjLA3k8NLkPUT4z68ux7sDjM09oBS5O4CrGfY8xJflmpGqZusjA2WIA1G
+zb48KCdz2ljcuji8HNc/PZtTblxiJdB04aGUzK+Ify0fUsEERZWPlQxuAuPHyf/K
+RoXYKE9LABEBAAHCwF8EGAECAAkFAk1T+3UCGwwACgkQZ7+AsQrVOYNd0Af/VOFw
+E0Eo/XaPdposnBF0E0NyOla1XACz/FV66zXYSv6jC5dvyPIe1TzIuTpSm7WPFPYl
+1eIdvDXtfpJ9f9GDp8n4gw7wv9nvYBCiQvl4fmmY9kTfm55LuTUf/lynAVd8EHO3
+d9gVoLKMRhittXX7utyfUjRT2GO0iOIxHoKWmHEfZ7Vm2QIeyNgVQCi6559DTUib
+Jbop7ir7WDLrKgBetgG6zpfiXgOIDlK0dtbkEqyHuGfi9Bis7Y8O4Rnn8jxkhSmC
+1VrA3Xo6NklFA2DKKHNlOcw6tjgkriv99prqvPjzihylO8L/fnoYfgjAHs6vjhtq
+Q2HLF8bidnMgrMeWFA==
+=81ZR
+-----END PGP PUBLIC KEY BLOCK-----
+
pub 689CBE64F4BC997F
uid Szczepan Faber <sz...@gmail.com>
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index cd9371bb77..e142e946cf 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -17,7 +17,8 @@
<trusted-key id="015479E1055341431B4545AB72475FD306B9CAB7" group="com.googlecode.javaewah"/>
<trusted-key id="019082BC00E0324E2AEF4CF00D3B328562A119A7" group="org.openjdk.jmh"/>
<trusted-key id="04543577D6A9CC626239C50C7ECBD740FF06AEB5">
- <trusting group="com.sun.xml.bind" name="jaxb-bom-ext" version="4.0.6"/>
+ <trusting group="com.sun.xml.bind"/>
+ <trusting group="com.sun.xml.bind.mvn"/>
<trusting group="org.glassfish.jaxb"/>
</trusted-key>
<trusted-key id="050A37A2E0577F4BAA095B52602EC18D20C4661C">
@@ -32,18 +33,18 @@
<trusted-key id="0A4AA2D7C6053AB068D206AA4692A312EF600C15" group="org.wiremock"/>
<trusted-key id="0CC641C3A62453AB390066C4A41F13C999945293">
<trusting group="commons-collections"/>
- <trusting group="commons-logging" name="commons-logging" version="1.2"/>
+ <trusting group="commons-logging"/>
</trusted-key>
- <trusted-key id="0CDE80149711EB46DFF17AE421A24B3F8B0F594A" group="org.apache" name="apache" version="16"/>
+ <trusted-key id="0CDE80149711EB46DFF17AE421A24B3F8B0F594A" group="org.apache"/>
<trusted-key id="0D35D3F60078655126908E8AF3D1600878E85A3D" group="io.netty"/>
- <trusted-key id="10F3C7A02ECA55E502BADCF3991EFB94DB91127D" group="org.ow2" name="ow2" version="1.5.1"/>
+ <trusted-key id="10F3C7A02ECA55E502BADCF3991EFB94DB91127D" group="org.ow2"/>
<trusted-key id="124DAC8350968EC2A8260584EE8ECBBBC188FD5D" group="org.ajoberstar.grgit"/>
<trusted-key id="12D16069219C90212A974D119AE296FD02E9F65B" group="org.apache.commons"/>
<trusted-key id="13AC2213964ABE1D1C147C0E1939A2520BAB1D90" group="org.freemarker"/>
- <trusted-key id="147B691A19097624902F4EA9689CBE64F4BC997F" group="org.mockito" name="mockito-bom"/>
+ <trusted-key id="147B691A19097624902F4EA9689CBE64F4BC997F" group="org.mockito"/>
<trusted-key id="160A7A9CF46221A56B06AD64461A804F2609FD89" group="com.github.shyiko.klob"/>
<trusted-key id="184454FAD8697760F3E00D2E4A51A45B944FFD51" group="org.apache.tika"/>
- <trusted-key id="190D5A957FF22273E601F7A7C92C5FEC70161C62" group="org.apache" name="apache" version="18"/>
+ <trusted-key id="190D5A957FF22273E601F7A7C92C5FEC70161C62" group="org.apache"/>
<trusted-key id="19BEAB2D799C020F17C69126B16698A4ADF4D638" group="org.checkerframework"/>
<trusted-key id="1A2D608BF6D37AEF12D53A4F37B0A85F5CE89B0C" group="org.eclipse.jetty.toolchain"/>
<trusted-key id="1A55F091AD28C07F831FA44D7905DE25C78AD456" group="com.google.protobuf"/>
@@ -55,7 +56,10 @@
<trusted-key id="1FCFFE916B6670868FA0EA0391AE1504568EC4DD" group="org.jodd"/>
<trusted-key id="223D3A74B068ECA354DC385CE126833F9CF64915" group="org.apache.xbean"/>
<trusted-key id="2655176F748FD83725B4805FF2A01147D830C125" group="org.testcontainers"/>
- <trusted-key id="28118C070CB22A0175A2E8D43D12CA2AC19F3181" group="^com[.]fasterxml($|([.].*))" regex="true"/>
+ <trusted-key id="28118C070CB22A0175A2E8D43D12CA2AC19F3181">
+ <trusting group="org.codehaus.woodstox"/>
+ <trusting group="^com[.]fasterxml($|([.].*))" regex="true"/>
+ </trusted-key>
<trusted-key id="2B1042677FD8190C7B9FC0DC2161D72E7DCD4258" group="^org[.]sonarsource($|([.].*))" regex="true"/>
<trusted-key id="2B34821418CF19CF1F2A8352953E02E4F573B46F" group="jakarta.platform"/>
<trusted-key id="2C1708EA05ADF6966C32D6454A1BAC7F1E3B89B3" group="nl.jqno.equalsverifier"/>
@@ -83,7 +87,7 @@
<trusted-key id="41A1A08C62FCA78B79D3081164A16FAAEC16A4BE" group="org.apache.commons"/>
<trusted-key id="41CD49B4EF5876F9E9F691DABAC30622339994C4" group="org.jspecify"/>
<trusted-key id="41D266DB4427983A1A4AFB0C3684155E9365C30E" group="com.jayway.jsonpath"/>
- <trusted-key id="44FBDBBC1A00FE414F1C1873586654072EAD6677" group="org.sonatype.oss" name="oss-parent" version="9"/>
+ <trusted-key id="44FBDBBC1A00FE414F1C1873586654072EAD6677" group="org.sonatype.oss"/>
<trusted-key id="475F3B8E59E6E63AA78067482C7B12F2A511E325" group="org.slf4j"/>
<trusted-key id="47EB6836245D2D40E89DFB4136D4E9618F3ADAB5" group="io.github.microutils"/>
<trusted-key id="48B086A7D843CFA258E83286928FBF39003C0425">
@@ -113,7 +117,7 @@
<trusted-key id="60200AC4AE761F1614D6C46766D68DAA073BE985" group="org.slf4j"/>
<trusted-key id="60ECEF24611FE832714F86AA9D5BEFFA5942C049" group="org.apache.camel"/>
<trusted-key id="6214760097DC5CFAD0175AC2C9FBAA83A8753994">
- <trusting group="com.fasterxml" name="oss-parent" version="38"/>
+ <trusting group="com.fasterxml"/>
<trusting group="org.codehaus.woodstox"/>
</trusted-key>
<trusted-key id="635EE627345F3C1DD422B2E207D3516820BCF6B1" group="com.github.ben-manes.caffeine"/>
@@ -133,7 +137,7 @@
<trusted-key id="7B79ADD11F8A779FE90FD3D0893A028475557671" group="com.gradle"/>
<trusted-key id="7B9751FC3F01F134F476464CD0EB627D4885CED1" group="org.apache.velocity"/>
<trusted-key id="7C669810892CBD3148FA92995B05CCDE140C2876" group="org.eclipse.jgit"/>
- <trusted-key id="808D78B17A5A2D7C3668E31FBFFC9B54721244AD" group="org.apache.commons" name="commons-parent" version="39"/>
+ <trusted-key id="808D78B17A5A2D7C3668E31FBFFC9B54721244AD" group="org.apache.commons"/>
<trusted-key id="817EA1255546D6070A23AA00DB45D3A62A183CE2" group="com.miglayout"/>
<trusted-key id="82D8419BA697F0E7FB85916EE91287822FDB81B1" group="org.apache.geronimo.genesis"/>
<trusted-key id="839323A4780D5BF9A6978970152888E10EF880B3" group="org.unbescape"/>
@@ -148,7 +152,7 @@
<trusted-key id="98465301A4939C0279F2E847D89D05374952262B" group="org.jetbrains.dokka"/>
<trusted-key id="9857C388D7D1D9D031274CD0A5DEF5A76F94A471" group="^com[.]github[.]spotbugs($|([.].*))" regex="true"/>
<trusted-key id="9A4555C237785CA8A6DC1FE58799AF90C06EFBBD" group="org.jdom"/>
- <trusted-key id="A1483F88BA771993AB609C43590C2310CEE1C9BE" group="jakarta.jms" name="jakarta.jms-api" version="3.1.0"/>
+ <trusted-key id="A1483F88BA771993AB609C43590C2310CEE1C9BE" group="jakarta.jms"/>
<trusted-key id="A413F67D71BEEC23ADD0CE0ACB43338E060CF9FA" group="org.jacoco"/>
<trusted-key id="A48FADE54FA56B93FE66EC17A05EBEE656F3E01B" group="org.apache.geronimo.genesis"/>
<trusted-key id="A4FD709CC4B0515F2E6AF04E218FA0F6A941A037" group="com.github.kevinstern"/>
@@ -156,7 +160,7 @@
<trusted-key id="A7892505CF1A58076453E52D7999BEFBA1039E8B" group="net.bytebuddy"/>
<trusted-key id="A9789342F598AD5B1175EF357EB97D110DFADD60" group="com.googlecode.concurrent-trees"/>
<trusted-key id="AA417737BD805456DB3CBDDE6601E5C08DCCBB96" group="info.picocli"/>
- <trusted-key id="AA70C7C433D501636392EC02153E7A3C2B4E5118" group="org.eclipse.ee4j" name="project"/>
+ <trusted-key id="AA70C7C433D501636392EC02153E7A3C2B4E5118" group="org.eclipse.ee4j"/>
<trusted-key id="AA782B04ABD9E36CF3096037B59D3D0F9F9C8684" group="org.apache.cxf"/>
<trusted-key id="ADBC987D1A7B91DB6B0AAA81995EFBF4A3D20BEB" group="^com[.]pinterest($|([.].*))" regex="true"/>
<trusted-key id="AEB1E1AEC035C66FA39589D13EFC46EE83C40224" group="com.networknt"/>
@@ -185,6 +189,7 @@
<trusted-key id="D477D51812E692011DB11E66A6EA2E2BF22E0543" group="io.github.java-diff-utils"/>
<trusted-key id="D6F1BC78607808EC8E9F69437A8860944FAD5F62" group="org.apache.commons"/>
<trusted-key id="D76260C72DF74E66268F7770AB049DF4AB24C1EF" group="org.hsqldb"/>
+ <trusted-key id="DB45ECD19B97514F727105AE67BF80B10AD53983" group="org.apache.santuario" name="xmlsec" version="4.0.4"/>
<trusted-key id="DBD744ACE7ADE6AA50DD591F66B50994442D2D40" group="^com[.]squareup($|([.].*))" regex="true"/>
<trusted-key id="DDDEE87612E9FB95F5C8D91E411063A3A0FFD119" group="org.apache-extras.beanshell"/>
<trusted-key id="E06A36F67D8C1BD13F1F278D0CA7139CBC7026F9" group="dnsjava"/>
@@ -193,7 +198,7 @@
<trusted-key id="E5138A8E9F2E7E42D38B14D99AEE152CDCCEBFCB" group="io.github.hakky54"/>
<trusted-key id="E5B8247AF8A619A28F90FDFC9FF25980F5BA7E4F" group="org.fusesource.hawtbuf"/>
<trusted-key id="E5C3B1929191DF06136CCB2B164779204E106A76" group="org.javassist"/>
- <trusted-key id="E725C3877939E8FFEA7E3C44B6D3FC494798E478" group="com.sun.xml.ws" name="jaxws-ri-bom" version="4.0.3"/>
+ <trusted-key id="E725C3877939E8FFEA7E3C44B6D3FC494798E478" group="com.sun.xml.ws"/>
<trusted-key id="E77417AC194160A3FABD04969A259C7EE636C5ED" group="com.google.errorprone"/>
<trusted-key id="E7DC75FC24FB3C8DFE8086AD3D5839A2262CBBFB" group="org.jetbrains.kotlinx"/>
<trusted-key id="E85AED155021AF8A6C6B7A4A7C7D8456294423BA" group="org.objenesis"/>
@@ -203,7 +208,7 @@
<trusted-key id="EB1B3DE71713C9EC2E87CC26EE92349AD86DE446" group="com.google.j2objc"/>
<trusted-key id="EE0CA873074092F806F59B65D364ABAA39A47320" group="^com[.]google($|([.].*))" regex="true"/>
<trusted-key id="EED6202038849B47FEEAD1EC9266326161C26F29" group="net.javacrumbs.json-unit"/>
- <trusted-key id="F254B35617DC255D9344BCFA873A8E86B4372146" group="org.apache" name="apache" version="13"/>
+ <trusted-key id="F254B35617DC255D9344BCFA873A8E86B4372146" group="org.apache"/>
<trusted-key id="F3184BCD55F4D016E30D4C9BF42E87F9665015C9" group="org.jsoup"/>
<trusted-key id="F5FEBA84EB26C56457B2CF819E31AB27445478DB" group="org.infinispan"/>
<trusted-key id="FA77DCFEF2EE6EB2DEBEDD2C012579464D01C06A">
@@ -349,6 +354,11 @@
<sha256 value="ce15e856443960ad2c213b99a8e07ef5d40049ff1f3f0eb883848dddce250c13" origin="Generated by Gradle"/>
</artifact>
</component>
+ <component group="com.sun.xml.bind.mvn" name="jaxb-parent" version="4.0.6">
+ <artifact name="jaxb-parent-4.0.6.pom">
+ <sha256 value="ce83ef2301bba73fd97db192cff49aa82b2d49a03724ced7c8a66c75a0c597db" origin="Generated by Gradle"/>
+ </artifact>
+ </component>
<component group="com.sun.xml.ws" name="jaxws-ri-bom" version="4.0.3">
<artifact name="jaxws-ri-bom-4.0.3.pom">
<pgp value="E725C3877939E8FFEA7E3C44B6D3FC494798E478"/>
diff --git a/lib/aareadme.txt b/lib/aareadme.txt
index 80c49aa031..3dc0a5bf84 100644
--- a/lib/aareadme.txt
+++ b/lib/aareadme.txt
@@ -8,283 +8,3 @@ lib/junit - test jar for JUnit sampler
lib/opt - Directory where Optional 3rd party libraries live
lib/src - storage area for source and javadoc jars, e.g. for use in IDEs
Excluded from SVN, not included in classpath
-
-Which jars are used by which modules?
-====================================
-[not exhaustive]
-
-asm-7.1 (org.ow2.asm)
-----------------------
-- JSON Path extractor
-
-accessors-smart-1.2 (net.minidev)
-----------------------
-- JSON Path extractor
-
-bsf-2.4.0.jar (org.apache.bsf)
--------------
-http://jakarta.apache.org/site/downloads/downloads_bsf.cgi
-- BSF test elements (sampler etc.)
-
-bsh-2.0b6.jar (org.bsh)
--------------
-- BeanShell test elements
-
-dec-0.1.2 (org.brotli.dec)
------------------
-https://github.com/google/brotli/tree/master/java/org/brotli
-- Used by HTTP4 HC Impl for brotli decoding
-
-caffeine 2.8.0
------------------
-https://github.com/ben-manes/caffeine/
-- Used by CssParser
-- Used by JMS Publisher Sampler
-
-commons-codec-1.13
------------------
-http://commons.apache.org/downloads/download_codec.cgi
-- Used by ProxyControl and JSR223Test Element for Base64 and md5
-
-commons-collections-3.2.2
--------------------------
-http://commons.apache.org/downloads/download_collections.cgi
-- ListenerNotifier
-- Anakia
-
-commons-io-2.6
---------------
-http://commons.apache.org/downloads/download_io.cgi
-- FTPSampler
-
-commons-jexl-2.1.1, commons-jexl3-3.1
-----------------
-http://commons.apache.org/downloads/download_jexl.cgi
-- Jexl function and BSF test elements
-
-commons-lang-2.6
-----------------
-http://commons.apache.org/downloads/download_lang.cgi
-- velocity (Anakia)
-
-commons-lang3-3.9
-----------------
-http://commons.apache.org/downloads/download_lang.cgi
-- URLCollection (unescapeXml)
-
-commons-math3-3.6.1
------------------
-http://commons.apache.org/proper/commons-math/download_math.cgi
-- BackendListener
-
-commons-net-3.6
------------------
-http://commons.apache.org/downloads/download_net.cgi
-- FTPSampler
-
-commons-pool2-2.7.0
------------------
-http://commons.apache.org/proper/commons-pool/download_pool.cgi
-- BackendListener
-
-darcula
------------------
-https://github.com/bulenkov/Darcula/
-- Look and Feel
-
-dnsjava-2.1.9
------------------
-https://github.com/dnsjava/dnsjava
-- DNSCacheManager
-
-groovy-3.0.3
-----------------------
-Advised scripting language for JSR223 Test Elements
-
-freemarker-2.3.29.jar
-----------------------
-- used by Report/Dashboard feature
-
-javax.activation-api-1.2.0.jar
-----------------------
-- used by SMTP Sampler
-
-javax.activation-1.2.0.jar
-----------------------
-- used by SMTP Sampler
-
-jackson-annotations-2.9.9 (com.fasterxml.jackson)
-----------------------
-
-Used by JsonExporter in report generator (com.fasterxml.jackson)
-----------------------
-jackson-annotations-2.9.9 (https://github.com/FasterXML/jackson-annotations)
-jackson-core-2.9.9 (https://github.com/FasterXML/jackson-core)
-jackson-databind-2.9.9 (https://github.com/FasterXML/jackson-databind)
-
-jCharts-0.7.5 (org.jCharts)
--------------
-http://jcharts.sourceforge.net/downloads.html
-- AxisGraph,LineGraph,LineChart
-
-jdom-1.1.3
---------
-http://www.jdom.org/downloads/index.html
-- Anakia
-
-jodd-core-5.0.13
---------
-http://www.jodd.org/
-- CSS/JQuery like extractor dependency
-
-jodd-lagarto-5.0.6
---------
-http://jodd.org/doc/csselly/
-- CSS/JQuery like extractor
-
-jodd-log-5.0.6
---------
-http://www.jodd.org/
-- CSS/JQuery like extractor dependency
-
-jodd-props-5.0.6
---------
-http://www.jodd.org/
-- used by Report/Dashboard feature properties management
-
-json-path-2.4.0
---------
-https://github.com/jayway/JsonPath
-- JSON Path Extractor
-- JSON Path Renderer
-
-json-smart-2.3 (net.minidev)
---------
-https://github.com/netplex/json-smart-v2
-- JSON Path Extractor
-- JSON Path Renderer
-
-jsoup-1.12.1
---------
-http://www.jsoup.org/
-- CSS/JQuery like extractor
-
-log4j2-2.12.1
---------
-https://logging.apache.org/log4j/2.x/
-- Logging framework
-
-ph-css-6.2.0
---------
-https://github.com/phax/ph-css
-- CssParser
-
-ph-commons-9.3.7
---------
-https://github.com/phax/ph-commons
-- CssParser
-
-rhino-1.7.11
---------
-https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Download_Rhino
-- javascript function
-- IfController
-- WhileController
-- BSF (Javascript)
-
-jTidy-r938
-----
-- http: various modules for parsing html
-- org.xml.sax - various
-- XPathUtil (XPath assertion)
-
-junit 4.12
------------
-- unit tests, JUnit sampler
-
-HttpComponents
-- HttpComponents Core 4.4.12
-- HttpComponents Client 4.5.10
-- HttpComponents AsyncClient 4.1.4
-- HttpComponents Core NIO 4.4.12
------------
-http://hc.apache.org/
-- httpclient 4 implementation for HTTP sampler
-- httpasyncclient implementation for InfluxDB Backend Listener Client
-
-oro-2.0.8
----------
-http://jakarta.apache.org/site/downloads/downloads_oro.cgi
-- regular expressions: various
-
-rsyntaxtextarea-3.0.4
----------------------
-http://fifesoft.com/rsyntaxtextarea/
-- syntax coloration
-
-serialiser-2.7.1
-----------------
-http://www.apache.org/dyn/closer.cgi/xml/xalan-j
-- xalan
-
-slf4j-api-1.7.28
-----------------
-http://www.slf4j.org/
-- jodd-core
-- json-path
-- jmeter internal logging
-
-tika-1.21
---------------
-http://tika.apache.org/
-- Regular Expression Extractor
-
-commons-dbcp2-2.5.0 (org.apache.commons.dbcp2)
---------------------------
-- DataSourceElement (JDBC)
-
-Saxon-HE-9.9.1-5 (net.sf.saxon)
---------------------------
-- XPath2Extractor (XML)
-
-velocity-1.7
---------------
-http://velocity.apache.org/download.cgi
-- Anakia (create documentation) Not used by JMeter runtime
-
-xalan_2.7.1
------------
-http://www.apache.org/dyn/closer.cgi/xml/xalan-j
-+org.apache.xalan|xml|xpath
-
-xml-apis-1.4.01
---------------
-http://xerces.apache.org/xerces2-j/download.cgi
-+javax.xml
-+org.w3c.dom
-+org.xml.sax
-
-The x* jars above are used for XML handling
-
-xmlgraphics-commons-2.6 (org.apache.xmlgraphics.image.codec)
-------------------
-http://xmlgraphics.apache.org/commons/download.html
-- SaveGraphicsService
-
-xmlpull-1.1.3.1
----------------
-http://www.xmlpull.org/impls.shtml
-- xstream
-
-
-xpp3_min-1.1.4c
----------------
-http://x-stream.github.io/download.html
-or
-http://www.extreme.indiana.edu/dist/java-repository/xpp3/distributions/
-- xstream
-
-xstream-1.4.11
--------------
-http://x-stream.github.io/download.html
-- SaveService
diff --git a/src/bom-thirdparty/build.gradle.kts b/src/bom-thirdparty/build.gradle.kts
index fb4c59294c..e3d88db3a1 100644
--- a/src/bom-thirdparty/build.gradle.kts
+++ b/src/bom-thirdparty/build.gradle.kts
@@ -54,6 +54,7 @@ dependencies {
api("com.google.errorprone:error_prone_annotations:2.44.0")
api("com.helger.commons:ph-commons:12.1.0")
api("com.helger:ph-css:8.1.0")
+ api("com.fasterxml.woodstox:woodstox-core:7.1.0")
api("com.jayway.jsonpath:json-path:2.10.0")
api("com.miglayout:miglayout-core:11.4.2")
api("com.miglayout:miglayout-swing:11.4.2")
@@ -126,6 +127,7 @@ dependencies {
api("org.bouncycastle:bcprov-jdk18on:1.82")
api("org.brotli:dec:0.1.2")
api("org.freemarker:freemarker:2.3.34")
+ api("org.glassfish.jaxb:txw2:4.0.6")
api("org.jdom:jdom:1.1.3")
api("org.jetbrains.lets-plot:lets-plot-batik:4.8.0")
api("org.jetbrains.lets-plot:lets-plot-kotlin-jvm:4.11.2")
@@ -144,6 +146,5 @@ dependencies {
api("xalan:serializer:2.7.3")
api("xalan:xalan:2.7.3")
api("xml-apis:xml-apis:1.4.01")
- api("xmlpull:xmlpull:1.1.3.1")
}
}
diff --git a/src/core/build.gradle.kts b/src/core/build.gradle.kts
index ca9597a864..30be9b34c9 100644
--- a/src/core/build.gradle.kts
+++ b/src/core/build.gradle.kts
@@ -40,6 +40,8 @@ dependencies {
}
api("com.thoughtworks.xstream:xstream") {
because("XStream in used in public API")
+ // We use StaXDriver, so we exclude xmlpull, see https://x-stream.github.io/download.html#optional-deps
+ exclude("io.github.x-stream", "mxparser")
}
api("org.apache.logging.log4j:log4j-1.2-api")
api("org.apache.logging.log4j:log4j-api")
@@ -80,6 +82,10 @@ dependencies {
}
}
+ implementation("org.glassfish.jaxb:txw2") {
+ because("IndentingXMLStreamWriter is needed to indent the generated XML")
+ }
+ implementation("com.fasterxml.woodstox:woodstox-core")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing")
implementation("com.fasterxml.jackson.core:jackson-annotations")
diff --git a/src/core/src/main/java/org/apache/jmeter/save/SaveService.java b/src/core/src/main/java/org/apache/jmeter/save/SaveService.java
index 5a41d6ea0f..86c16fc626 100644
--- a/src/core/src/main/java/org/apache/jmeter/save/SaveService.java
+++ b/src/core/src/main/java/org/apache/jmeter/save/SaveService.java
@@ -56,7 +56,8 @@ import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.DataHolder;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
-import com.thoughtworks.xstream.io.xml.XppDriver;
+import com.thoughtworks.xstream.io.HierarchicalStreamDriver;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
import com.thoughtworks.xstream.mapper.CannotResolveClassException;
import com.thoughtworks.xstream.mapper.Mapper;
import com.thoughtworks.xstream.mapper.MapperWrapper;
@@ -78,8 +79,8 @@ public class SaveService {
public static final String TEST_CLASS_NAME = "TestClassName"; // $NON-NLS-1$
private static final class XStreamWrapper extends XStream {
- private XStreamWrapper(ReflectionProvider reflectionProvider) {
- super(reflectionProvider);
+ private XStreamWrapper(ReflectionProvider reflectionProvider, HierarchicalStreamDriver hierarchicalStreamDriver) {
+ super(reflectionProvider, hierarchicalStreamDriver);
}
// Override wrapMapper in order to insert the Wrapper in the chain
@@ -110,17 +111,16 @@ public class SaveService {
}
}
- private static final XStream JMXSAVER = new XStreamWrapper(new PureJavaReflectionProvider());
- private static final XStream JTLSAVER = new XStreamWrapper(new PureJavaReflectionProvider());
+ private static final JMeterStaxDriver STAXDRIVER_WITH_HEADER = new JMeterStaxDriver();
+ private static final JMeterStaxDriver STAXDRIVER_SKIP_HEADER = new JMeterStaxDriver(false, true);
+ private static final XStream JMXSAVER = new XStreamWrapper(new PureJavaReflectionProvider(), STAXDRIVER_WITH_HEADER);
+ private static final XStream JTLSAVER = new XStreamWrapper(new PureJavaReflectionProvider(), STAXDRIVER_WITH_HEADER);
static {
JTLSAVER.setMode(XStream.NO_REFERENCES); // This is needed to stop XStream keeping copies of each class
JMeterUtils.setupXStreamSecurityPolicy(JMXSAVER);
JMeterUtils.setupXStreamSecurityPolicy(JTLSAVER);
}
- // The XML header, with placeholder for encoding, since that is controlled by property
- private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"<ph>\"?>"; // $NON-NLS-1$
-
// Default file name
private static final String SAVESERVICE_PROPERTIES_FILE = "saveservice.properties"; // $NON-NLS-1$
@@ -299,25 +299,31 @@ public class SaveService {
// Called by Save function
public static void saveTree(HashTree tree, OutputStream out) throws IOException {
- // Get the OutputWriter to use
- OutputStreamWriter outputStreamWriter = getOutputStreamWriter(out);
- writeXmlHeader(outputStreamWriter);
- // Use deprecated method, to avoid duplicating code
ScriptWrapper wrapper = new ScriptWrapper();
wrapper.testPlan = tree;
- JMXSAVER.toXML(wrapper, outputStreamWriter);
- outputStreamWriter.write('\n');// Ensure terminated properly
- outputStreamWriter.close();
+
+ if (fileEncoding == null || fileEncoding.isEmpty()) {
+ JMXSAVER.toXML(wrapper, out);
+ } else {
+ // Get the OutputWriter to use
+ try (OutputStreamWriter outputStreamWriter = getOutputStreamWriter(out)) {
+ // Use deprecated method, to avoid duplicating code
+ JMXSAVER.toXML(wrapper, outputStreamWriter);
+ outputStreamWriter.write('\n');// Ensure terminated properly
+ }
+ }
}
// Used by Test code
public static void saveElement(Object el, OutputStream out) throws IOException {
// Get the OutputWriter to use
- OutputStreamWriter outputStreamWriter = getOutputStreamWriter(out);
- writeXmlHeader(outputStreamWriter);
- // Use deprecated method, to avoid duplicating code
- JMXSAVER.toXML(el, outputStreamWriter);
- outputStreamWriter.close();
+ if (fileEncoding == null || fileEncoding.isEmpty()) {
+ JMXSAVER.toXML(el, out);
+ } else {
+ try (OutputStreamWriter outputStreamWriter = getOutputStreamWriter(out)) {
+ JMXSAVER.toXML(el, outputStreamWriter);
+ }
+ }
}
// Used by Test code
@@ -344,7 +350,7 @@ public class SaveService {
// This is effectively the same as saver.toXML(Object, Writer) except we get to provide the DataHolder
// Don't know why there is no method for this in the XStream class
try {
- JTLSAVER.marshal(evt.getResult(), new XppDriver().createWriter(writer), dh);
+ JTLSAVER.marshal(evt.getResult(), STAXDRIVER_SKIP_HEADER.createWriter(writer), dh);
} catch(RuntimeException e) {
throw new IllegalArgumentException("Failed marshalling:"+(evt.getResult() != null ? showDebuggingInfo(evt.getResult()) : "null"), e);
}
@@ -411,7 +417,7 @@ public class SaveService {
dh.put(RESULTCOLLECTOR_HELPER_OBJECT, resultCollectorHelper); // Allow TestResultWrapper to feed back the samples
// This is effectively the same as saver.fromXML(InputStream) except we get to provide the DataHolder
// Don't know why there is no method for this in the XStream class
- JTLSAVER.unmarshal(new XppDriver().createReader(reader), null, dh);
+ JTLSAVER.unmarshal(STAXDRIVER_SKIP_HEADER.createReader(reader), null, dh);
inputStreamReader.close();
}
@@ -504,16 +510,6 @@ public class SaveService {
}
}
- private static void writeXmlHeader(OutputStreamWriter writer) throws IOException {
- // Write XML header if we have the charset to use for encoding
- Charset charset = getFileEncodingCharset();
- // We do not use getEncoding method of Writer, since that returns
- // the historical name
- String header = XML_HEADER.replaceAll("<ph>", charset.name());
- writer.write(header);
- writer.write('\n');
- }
-
// Normal output
// ---- Debugging information ----
// required-type : org.apache.jorphan.collections.ListedHashTree
diff --git a/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java b/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java
index cbbc3887b4..9ff73f4c8c 100644
--- a/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java
+++ b/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java
@@ -165,7 +165,10 @@ public class SampleResultConverter extends AbstractCollectionConverter {
writer.addAttribute(ATT_CLASS, JAVA_LANG_STRING);
try {
if (SampleResult.TEXT.equals(res.getDataType())){
- writer.setValue(new String(res.getResponseData(), res.getDataEncodingWithDefault()));
+ byte[] responseData = res.getResponseData();
+ if (responseData != null && responseData.length > 0) {
+ writer.setValue(new String(responseData, res.getDataEncodingWithDefault()));
+ }
} else {
writer.setValue("Non-TEXT response data, cannot record: (" + res.getDataType() + ")");
}
@@ -176,10 +179,7 @@ public class SampleResultConverter extends AbstractCollectionConverter {
writer.endNode();
}
if (save.saveFileName()){
- writer.startNode(TAG_RESPONSE_FILE);
- writer.addAttribute(ATT_CLASS, JAVA_LANG_STRING);
- writer.setValue(res.getResultFileName());
- writer.endNode();
+ writeString(writer, TAG_RESPONSE_FILE, res.getResultFileName());
}
}
@@ -356,7 +356,9 @@ public class SampleResultConverter extends AbstractCollectionConverter {
if (value != null) {
writer.startNode(tag);
writer.addAttribute(ATT_CLASS, JAVA_LANG_STRING);
- writer.setValue(value);
+ if (!value.isEmpty()) {
+ writer.setValue(value);
+ }
writer.endNode();
}
}
diff --git a/src/core/src/main/java/org/apache/jmeter/save/converters/StringPropertyConverter.java b/src/core/src/main/java/org/apache/jmeter/save/converters/StringPropertyConverter.java
index aafbebdf8a..2ff4059a72 100644
--- a/src/core/src/main/java/org/apache/jmeter/save/converters/StringPropertyConverter.java
+++ b/src/core/src/main/java/org/apache/jmeter/save/converters/StringPropertyConverter.java
@@ -48,7 +48,10 @@ public class StringPropertyConverter implements Converter {
public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext arg2) {
StringProperty prop = (StringProperty) obj;
writer.addAttribute(ConversionHelp.ATT_NAME, ConversionHelp.encode(prop.getName()));
- writer.setValue(ConversionHelp.encode(prop.getStringValue()));
+ String encoded = ConversionHelp.encode(prop.getStringValue());
+ if (encoded != null && !encoded.isEmpty()) {
+ writer.setValue(encoded);
+ }
}
/** {@inheritDoc} */
diff --git a/src/core/src/main/java/org/apache/jmeter/util/JMeterUtils.java b/src/core/src/main/java/org/apache/jmeter/util/JMeterUtils.java
index 816f2553f7..2a7c5b9c99 100644
--- a/src/core/src/main/java/org/apache/jmeter/util/JMeterUtils.java
+++ b/src/core/src/main/java/org/apache/jmeter/util/JMeterUtils.java
@@ -59,6 +59,7 @@ import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import org.apache.jmeter.gui.GuiPackage;
+import org.apache.jmeter.save.JMeterStaxDriver;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jorphan.gui.JFactory;
import org.apache.jorphan.gui.JMeterUIDefaults;
@@ -81,6 +82,7 @@ import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
import com.thoughtworks.xstream.security.AnyTypePermission;
import com.thoughtworks.xstream.security.NoTypePermission;
@@ -1416,8 +1418,8 @@ public class JMeterUtils implements UnitTestManager {
/**
* @return {@link XStream} XStream instance following JMeter security policy
*/
- public static final XStream createXStream() {
- XStream xstream = new XStream(new PureJavaReflectionProvider());
+ public static XStream createXStream() {
+ XStream xstream = new XStream(new PureJavaReflectionProvider(), new JMeterStaxDriver());
JMeterUtils.setupXStreamSecurityPolicy(xstream);
return xstream;
}
diff --git a/src/core/src/main/kotlin/org/apache/jmeter/save/JMeterStaxDriver.kt b/src/core/src/main/kotlin/org/apache/jmeter/save/JMeterStaxDriver.kt
new file mode 100644
index 0000000000..fef5c9383a
--- /dev/null
+++ b/src/core/src/main/kotlin/org/apache/jmeter/save/JMeterStaxDriver.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.jmeter.save
+
+import com.thoughtworks.xstream.io.xml.StaxDriver
+import javax.xml.stream.XMLOutputFactory
+
+public class JMeterStaxDriver(
+ public val xmlHeader: Boolean = true,
+ public val indent: Boolean = true,
+) : StaxDriver() {
+ override fun createOutputFactory(): XMLOutputFactory =
+ XMLOutputFactoryDelegate(super.createOutputFactory(), xmlHeader = xmlHeader, indent = indent)
+}
diff --git a/src/core/src/main/kotlin/org/apache/jmeter/save/XMLOutputFactoryDelegate.kt b/src/core/src/main/kotlin/org/apache/jmeter/save/XMLOutputFactoryDelegate.kt
new file mode 100644
index 0000000000..d2283a47cc
--- /dev/null
+++ b/src/core/src/main/kotlin/org/apache/jmeter/save/XMLOutputFactoryDelegate.kt
@@ -0,0 +1,110 @@
+/*
+ * 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.jmeter.save
+
+import com.sun.xml.txw2.output.IndentingXMLStreamWriter
+import java.io.OutputStream
+import java.io.Writer
+import javax.xml.stream.XMLEventWriter
+import javax.xml.stream.XMLOutputFactory
+import javax.xml.stream.XMLStreamWriter
+import javax.xml.transform.Result
+
+/**
+ * A custom implementation of `XMLOutputFactory` that delegates operations to another `XMLOutputFactory`
+ * with additional configurations such as optional XML header skipping and indentation.
+ *
+ * This class enhances the behavior of the specified `XMLOutputFactory` by allowing the output
+ * to be customized based on the provided configuration (e.g., whether to include the XML declaration header
+ * or enable indentation for formatted output).
+ *
+ * @constructor Creates an instance of `XMLOutputFactoryDelegate`.
+ * @param delegate The underlying `XMLOutputFactory` to which most operations are delegated.
+ * @param xmlHeader A flag indicating whether to include the XML declaration header in the output.
+ * @param indent A flag indicating whether to enable formatted (indented) output.
+ */
+public class XMLOutputFactoryDelegate(
+ private val delegate: XMLOutputFactory,
+ private val xmlHeader: Boolean,
+ private val indent: Boolean
+) : XMLOutputFactory() {
+ // Methods that wrap with XMLStreamWriterSkipHeader
+
+ private fun XMLStreamWriter.applyXmlStreamWriterConfiguration(): XMLStreamWriter {
+ var result = this
+ if (indent) {
+ result = IndentingXMLStreamWriter(this)
+ }
+ if (!xmlHeader) {
+ result = XMLStreamWriterSkipHeader(result)
+ }
+ return result
+ }
+
+ override fun createXMLStreamWriter(stream: Writer): XMLStreamWriter {
+ return delegate.createXMLStreamWriter(stream).applyXmlStreamWriterConfiguration()
+ }
+
+ override fun createXMLStreamWriter(stream: OutputStream): XMLStreamWriter {
+ return delegate.createXMLStreamWriter(stream).applyXmlStreamWriterConfiguration()
+ }
+
+ override fun createXMLStreamWriter(
+ stream: OutputStream,
+ encoding: String?
+ ): XMLStreamWriter {
+ return delegate.createXMLStreamWriter(stream, encoding).applyXmlStreamWriterConfiguration()
+ }
+
+ override fun createXMLStreamWriter(result: Result): XMLStreamWriter {
+ return delegate.createXMLStreamWriter(result).applyXmlStreamWriterConfiguration()
+ }
+
+ // Pure delegate methods below
+
+ override fun createXMLEventWriter(result: Result): XMLEventWriter {
+ return delegate.createXMLEventWriter(result)
+ }
+
+ override fun createXMLEventWriter(stream: OutputStream): XMLEventWriter {
+ return delegate.createXMLEventWriter(stream)
+ }
+
+ override fun createXMLEventWriter(
+ stream: OutputStream,
+ encoding: String?
+ ): XMLEventWriter {
+ return delegate.createXMLEventWriter(stream, encoding)
+ }
+
+ override fun createXMLEventWriter(stream: Writer): XMLEventWriter {
+ return delegate.createXMLEventWriter(stream)
+ }
+
+ override fun setProperty(name: String, value: Any?) {
+ return delegate.setProperty(name, value)
+ }
+
+ override fun getProperty(name: String): Any {
+ return delegate.getProperty(name)
+ }
+
+ override fun isPropertySupported(name: String): Boolean {
+ return delegate.isPropertySupported(name)
+ }
+}
diff --git a/src/core/src/main/kotlin/org/apache/jmeter/save/XMLStreamWriterSkipHeader.kt b/src/core/src/main/kotlin/org/apache/jmeter/save/XMLStreamWriterSkipHeader.kt
new file mode 100644
index 0000000000..ec91f003ee
--- /dev/null
+++ b/src/core/src/main/kotlin/org/apache/jmeter/save/XMLStreamWriterSkipHeader.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.jmeter.save
+
+import javax.xml.stream.XMLStreamWriter
+
+/**
+ * A custom implementation of `XMLStreamWriter` that skips writing the XML declaration header.
+ *
+ * @constructor Creates an instance of `XMLStreamWriterSkipHeader` that wraps the given [delegate] XMLStreamWriter.
+ * @param delegate The underlying `XMLStreamWriter` to which operations, except writing the XML header, are delegated.
+ */
+public class XMLStreamWriterSkipHeader(
+ private val delegate: XMLStreamWriter
+) : XMLStreamWriter by delegate {
+ override fun writeStartDocument() {
+ }
+
+ override fun writeStartDocument(version: String?) {
+ }
+
+ override fun writeStartDocument(encoding: String?, version: String?) {
+ }
+}
diff --git a/src/dist-check/build.gradle.kts b/src/dist-check/build.gradle.kts
index adbbd9faf6..c83b94cf7a 100644
--- a/src/dist-check/build.gradle.kts
+++ b/src/dist-check/build.gradle.kts
@@ -38,6 +38,12 @@ dependencies {
testImplementation("com.fasterxml.jackson.core:jackson-databind") {
because("It is used in ReportGeneratorSpec and HtmlReportGeneratorSpec")
}
+ testImplementation("org.apache.santuario:xmlsec:4.0.4") {
+ because("XML canonicalization for comparing XML in tests")
+ }
+ testImplementation("org.eclipse.jgit:org.eclipse.jgit:6.10.1.202505221210-r") {
+ because("Histogram diff for readable XML comparison output in tests")
+ }
extraTestDependencies(platform(projects.src.bomThirdparty))
extraTestDependencies(platform(projects.src.bomTesting))
diff --git a/src/dist-check/src/test/java/org/apache/jmeter/save/TestSaveService.java b/src/dist-check/src/test/java/org/apache/jmeter/save/TestSaveService.java
index 58f8866455..97ced70855 100644
--- a/src/dist-check/src/test/java/org/apache/jmeter/save/TestSaveService.java
+++ b/src/dist-check/src/test/java/org/apache/jmeter/save/TestSaveService.java
@@ -22,23 +22,29 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
+import java.util.regex.Pattern;
import org.apache.jmeter.junit.JMeterTestCase;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
+import org.apache.xml.security.Init;
+import org.apache.xml.security.c14n.Canonicalizer;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.diff.EditList;
+import org.eclipse.jgit.diff.HistogramDiff;
+import org.eclipse.jgit.diff.RawText;
+import org.eclipse.jgit.diff.RawTextComparator;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.FieldSource;
public class TestSaveService extends JMeterTestCase {
@@ -83,6 +89,10 @@ public class TestSaveService extends JMeterTestCase {
private static final boolean saveOut = JMeterUtils.getPropDefault("testsaveservice.saveout", false);
+ @BeforeAll
+ static void initXmlSecurity() {
+ Init.init();
+ }
@Test
public void testPROPVERSION() {
@@ -93,120 +103,66 @@ public class TestSaveService extends JMeterTestCase {
);
}
- @Test
- public void testLoadAndSave() throws Exception {
- boolean failed = false; // Did a test fail?
-
- for (final String fileName : FILES) {
- final File testFile = findTestFile("testfiles/" + fileName);
- final File savedFile = findTestFile("testfiles/Saved" + fileName);
- failed |= loadAndSave(testFile, fileName, true, savedFile);
- }
- for (final String fileName : FILES_LINES) {
- final File testFile = findTestFile("testfiles/" + fileName);
- final File savedFile = findTestFile("testfiles/Saved" + fileName);
- failed |= loadAndSave(testFile, fileName, false, savedFile);
- }
- if (failed) // TODO make these separate tests?
- {
- fail("One or more failures detected");
- }
- }
-
- private static boolean loadAndSave(File testFile, String fileName, boolean checkSize, File savedFile) throws Exception {
-
- boolean failed = false;
-
- final FileStats origStats = getFileStats(testFile);
- final FileStats savedStats = getFileStats(savedFile);
-
+ @ParameterizedTest
+ @FieldSource({"FILES", "FILES_LINES"})
+ void loadAndSave(String fileName) throws Exception {
+ File testFile = findTestFile("testfiles/" + fileName);
ByteArrayOutputStream out = new ByteArrayOutputStream(Math.toIntExact(testFile.length()));
- try {
+ try (out) {
HashTree tree = SaveService.loadTree(testFile);
SaveService.saveTree(tree, out);
- } finally {
- out.close(); // Make sure all the data is flushed out
}
+ byte[] resavedXml = out.toByteArray();
+ // Make sure all the data is flushed out
+
+ // Compare XML content using normalized form for better diff output
+ Path testFilePath = testFile.toPath();
+ Path expectedOutput = testFilePath.resolveSibling(testFilePath.getFileName().toString().replace(".jmx", ".expected.jmx"));
+ Path expectedFilePath = Files.exists(expectedOutput) ? expectedOutput : testFilePath;
+
+ String expectedXml = normalizeXml(
+ Files.readAllBytes(
+ expectedFilePath
+ )
+ );
+ String actualXml = normalizeXml(resavedXml);
- final FileStats compareStats = savedStats == FileStats.NO_STATS ? origStats : savedStats;
-
- final FileStats outputStats;
- try (ByteArrayInputStream ins = new ByteArrayInputStream(out.toByteArray());
- Reader insReader = new InputStreamReader(ins, Charset.defaultCharset());
- BufferedReader bufferedReader = new BufferedReader(insReader)) {
- outputStats = computeFileStats(bufferedReader);
- }
- // We only check the length of the result. Comparing the
- // actual result (out.toByteArray==original) will usually
- // fail, because the order of the properties within each
- // test element may change. Comparing the lengths should be
- // enough to detect most problem cases...
- if (checkSize && !compareStats.isSameSize(outputStats) || !compareStats.hasSameLinesCount(outputStats)) {
- failed = true;
- System.out.println();
- System.out.println("Loading file testfiles/" + fileName + " and "
- + "saving it back changes its size from " + compareStats.size + " to " + outputStats.size + ".");
- if (!origStats.hasSameLinesCount(outputStats)) {
- System.out.println("Number of lines changes from " + compareStats.lines + " to " + outputStats.lines);
- }
- if (saveOut) {
- final File outFile = findTestFile("testfiles/" + fileName + ".out");
- System.out.println("Write " + outFile);
- try (FileOutputStream outf = new FileOutputStream(outFile)) {
- outf.write(out.toByteArray());
- }
- System.out.println("Wrote " + outFile);
+ if (saveOut) {
+ if (!expectedXml.equals(actualXml)) {
+ Files.write(expectedOutput, resavedXml);
}
+ return;
}
-
- // Note this test will fail if a property is added or
- // removed to any of the components used in the test
- // files. The way to solve this is to appropriately change
- // the test file.
- return failed;
- }
-
- private static FileStats getFileStats(File testFile) throws IOException,
- FileNotFoundException {
- if (testFile == null || !testFile.exists()) {
- return FileStats.NO_STATS;
- }
- try (FileInputStream fis = new FileInputStream(testFile);
- InputStreamReader fileReader = new InputStreamReader(fis, Charset.defaultCharset());
- BufferedReader bufferedReader = new BufferedReader(fileReader)) {
- return computeFileStats(bufferedReader);
- }
- }
-
- /**
- * Calculate size and line count ignoring EOL and
- * "jmeterTestPlan" element which may vary because of
- * different attributes/attribute lengths.
- */
- private static FileStats computeFileStats(BufferedReader br) throws IOException {
- int length = 0;
- int lines = 0;
- String line;
- while ((line = br.readLine()) != null) {
- lines++;
- if (!line.startsWith("<jmeterTestPlan")) {
- length += line.length();
- }
- }
- return new FileStats(length, lines);
+ assertEquals(
+ expectedXml,
+ actualXml,
+ () -> {
+ String diff = computeHistogramDiff(expectedXml, actualXml);
+ StringBuilder message = new StringBuilder();
+ message.append("JMX file should be the same after load and save. ");
+ message.append("Comparing with ").append(expectedFilePath).append(". ");
+ message.append(" (diff is ").append(diff.length()).append(" chars, ")
+ .append(Math.round(diff.length() * 100.0 / expectedXml.length())).append("% of original)");
+
+ // Omit diff it is too large
+ if (diff.length() < expectedXml.length() * 0.8) {
+ message.append("\nDiff:\n").append(diff);
+ }
+ return message.toString();
+ }
+ );
}
- @Test
- public void testLoad() throws Exception {
- for (String fileName : FILES_LOAD_ONLY) {
- File file = findTestFile("testfiles/" + fileName);
- try {
- HashTree tree = SaveService.loadTree(file);
- assertNotNull(tree);
- } catch (IllegalArgumentException ex) {
- ex.addSuppressed(new Throwable("fileName=" + file.getAbsolutePath()));
- throw ex;
- }
+ @ParameterizedTest
+ @FieldSource("FILES_LOAD_ONLY")
+ public void testLoad(String fileName) throws Exception {
+ File file = findTestFile("testfiles/" + fileName);
+ try {
+ HashTree tree = SaveService.loadTree(file);
+ assertNotNull(tree);
+ } catch (IllegalArgumentException ex) {
+ ex.addSuppressed(new Throwable("fileName=" + file.getAbsolutePath()));
+ throw ex;
}
}
@@ -218,29 +174,57 @@ public class TestSaveService extends JMeterTestCase {
}
}
- private static class FileStats {
- int size;
- int lines;
+ /**
+ * Pattern to match the jmeterTestPlan root element with all its attributes.
+ * These attributes (jmeter version, properties version) change between JMeter versions
+ * and should be ignored when comparing XML content.
+ */
+ private static final Pattern JMETER_TEST_PLAN_PATTERN = Pattern.compile(
+ "<jmeterTestPlan[^>]*>"
+ );
- final static FileStats NO_STATS = new FileStats(-1, -1);
+ /**
+ * Normalizes XML for comparison using W3C Canonical XML (C14N).
+ * This sorts attributes alphabetically and normalizes whitespace.
+ * Also normalizes the jmeterTestPlan root element to ignore version differences.
+ */
+ private static String normalizeXml(byte[] xmlBytes) throws Exception {
+ Canonicalizer c14n = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ c14n.canonicalize(xmlBytes, out, true);
- public FileStats(int size, int lines) {
- this.size = size;
- this.lines = lines;
- }
+ // Normalize the jmeterTestPlan element to ignore version-specific attributes
+ String xml = out.toString(StandardCharsets.UTF_8);
+ xml = JMETER_TEST_PLAN_PATTERN.matcher(xml).replaceFirst("<jmeterTestPlan>");
- public boolean isSameSize(FileStats other) {
- if (other == null) {
- return false;
- }
- return size == other.size;
- }
+ return xml;
+ }
+
+
+ private static String computeHistogramDiff(String expected, String actual) {
+ return computeHistogramDiff(
+ expected.getBytes(StandardCharsets.UTF_8),
+ actual.getBytes(StandardCharsets.UTF_8)
+ );
+ }
+
+ /**
+ * Computes a histogram diff between expected and actual text, similar to git diff.
+ */
+ private static String computeHistogramDiff(byte[] expected, byte[] actual) {
+ try {
+ RawText expectedText = new RawText(expected);
+ RawText actualText = new RawText(actual);
+
+ EditList edits = new HistogramDiff().diff(RawTextComparator.DEFAULT, expectedText, actualText);
- public boolean hasSameLinesCount(FileStats other) {
- if (other == null) {
- return false;
+ ByteArrayOutputStream diffOutput = new ByteArrayOutputStream();
+ try (DiffFormatter formatter = new DiffFormatter(diffOutput)) {
+ formatter.format(edits, expectedText, actualText);
}
- return lines == other.lines;
+ return diffOutput.toString(StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ return "Failed to compute diff: " + e.getMessage();
}
}
}
diff --git a/src/dist/src/dist/expected_release_jars.csv b/src/dist/src/dist/expected_release_jars.csv
index e50e703032..931e086ec4 100644
--- a/src/dist/src/dist/expected_release_jars.csv
+++ b/src/dist/src/dist/expected_release_jars.csv
@@ -109,7 +109,6 @@
519087,mail-1.5.0-b01.jar
120438,miglayout-core-11.4.2.jar
23287,miglayout-swing-11.4.2.jar
-29680,mxparser-1.2.2.jar
99796,neo4j-bolt-connection-10.1.0.jar
320489,neo4j-bolt-connection-netty-10.1.0.jar
27442,neo4j-bolt-connection-pooled-10.1.0.jar
@@ -149,15 +148,17 @@
5783933,Saxon-HE-12.9.jar
283536,serializer-2.7.3.jar
69908,slf4j-api-2.0.17.jar
+195922,stax2-api-4.2.2.jar
10192,swing-extensions-laf-support-0.1.3.jar
2539,swing-extensions-visual-padding-0.1.3.jar
778543,tika-core-3.2.3.jar
+73265,txw2-4.0.6.jar
173935,unbescape-1.1.6.RELEASE.jar
+1608803,woodstox-core-7.1.0.jar
3455761,xalan-2.7.3.jar
220536,xml-apis-1.4.01.jar
85686,xml-apis-ext-1.3.04.jar
686441,xmlgraphics-commons-2.11.jar
-7188,xmlpull-1.1.3.1.jar
1033122,xmlresolver-5.3.3-data.jar
167889,xmlresolver-5.3.3.jar
646504,xstream-1.4.21.jar
diff --git a/src/protocol/http/build.gradle.kts b/src/protocol/http/build.gradle.kts
index 20961567e4..af6b3482f5 100644
--- a/src/protocol/http/build.gradle.kts
+++ b/src/protocol/http/build.gradle.kts
@@ -29,6 +29,7 @@ dependencies {
api("com.thoughtworks.xstream:xstream") {
because("HTTPResultConverter uses XStream in public API")
+ exclude("io.github.x-stream", "mxparser")
}
compileOnly("javax.activation:javax.activation-api") {