Skip to content

Commit 368401d

Browse files
committed
chore: remove uses of commons-codec. Java 17 has both Base64 and HexFormat
1 parent 23fa6d5 commit 368401d

11 files changed

Lines changed: 60 additions & 72 deletions

File tree

bin/testfiles/TCP_TESTS.jmx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
7474
class TimeServerHandler extends IoHandlerAdapter
7575
{
7676
private static final String EOL = "\n";
77-
Logger log = LoggerFactory.getLogger(TimeServerHandler.class);
77+
Logger log = LoggerFactory.getLogger(TimeServerHandler.class);
7878
public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
7979
{
8080
log.error("Exception occured", cause);
@@ -85,7 +85,7 @@ class TimeServerHandler extends IoHandlerAdapter
8585
{
8686
String str = message.trim().toString();
8787
log.info("Received {}", str);
88-
88+
8989
String[] words = str.split(" ");
9090
if(words[0].equalsIgnoreCase("quit") ) {
9191
session.close();
@@ -269,10 +269,10 @@ vars.put("CR",URLDecoder.decode("%0A", "ASCII"));
269269
<stringProp name="cacheKey">e7ac0019-16aa-40b4-b30f-e254c0a75f27</stringProp>
270270
<stringProp name="filename"></stringProp>
271271
<stringProp name="parameters"></stringProp>
272-
<stringProp name="script">import org.apache.commons.codec.binary.Hex;
273-
Hex hex = new Hex();
274-
OUT.println(new String(hex.decode(prev.getResponseData())));
275-
vars.put(&quot;result_decoded&quot;, new String(hex.decode(prev.getResponseData())));</stringProp>
272+
<stringProp name="script">import java.util.HexFormat;
273+
String decoded = new String(HexFormat.of().parseHex(prev.getResponseDataAsString()));
274+
OUT.println(decoded);
275+
vars.put(&quot;result_decoded&quot;, decoded);</stringProp>
276276
<stringProp name="scriptLanguage">groovy</stringProp>
277277
</JSR223PostProcessor>
278278
<hashTree/>
@@ -500,10 +500,10 @@ if (oldResponseMessage != null &amp;&amp; oldResponseMessage.contains(&quot;java
500500
<stringProp name="cacheKey">e7ac0019-16aa-40b4-b30f-e254c0a75f27</stringProp>
501501
<stringProp name="filename"></stringProp>
502502
<stringProp name="parameters"></stringProp>
503-
<stringProp name="script">import org.apache.commons.codec.binary.Hex;
504-
Hex hex = new Hex();
505-
OUT.println(new String(hex.decode(prev.getResponseData())));
506-
vars.put(&quot;result_decoded&quot;, new String(hex.decode(prev.getResponseData())));</stringProp>
503+
<stringProp name="script">import java.util.HexFormat;
504+
String decoded = new String(HexFormat.of().parseHex(prev.getResponseDataAsString()));
505+
OUT.println(decoded);
506+
vars.put(&quot;result_decoded&quot;, decoded);</stringProp>
507507
<stringProp name="scriptLanguage">groovy</stringProp>
508508
</JSR223PostProcessor>
509509
<hashTree/>

src/components/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ dependencies {
5151
implementation("net.minidev:json-smart")
5252
implementation("net.minidev:accessors-smart")
5353
implementation("org.apache.commons:commons-pool2")
54-
implementation("commons-codec:commons-codec")
5554
implementation("org.ow2.asm:asm")
5655
implementation("org.jodd:jodd-log") {
5756
exclude("ch.qos.logback")

src/core/build.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,6 @@ dependencies {
9191
implementation("com.github.weisj:darklaf-property-loader")
9292
implementation("com.github.weisj:darklaf-extensions-rsyntaxarea")
9393
implementation("com.miglayout:miglayout-swing")
94-
implementation("commons-codec:commons-codec") {
95-
because("DigestUtils")
96-
}
9794
implementation("org.apache-extras.beanshell:bsh:2.0b6") {
9895
because("Direct dependency required from BeanShellInterpreter")
9996
}

src/core/src/main/java/org/apache/jmeter/util/JSR223TestElement.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121
import java.io.File;
2222
import java.io.IOException;
2323
import java.io.Serializable;
24+
import java.nio.charset.StandardCharsets;
2425
import java.nio.file.Files;
26+
import java.security.MessageDigest;
27+
import java.security.NoSuchAlgorithmException;
2528
import java.util.Properties;
2629
import java.util.function.Function;
2730

@@ -32,7 +35,6 @@
3235
import javax.script.ScriptEngineManager;
3336
import javax.script.ScriptException;
3437

35-
import org.apache.commons.codec.digest.DigestUtils;
3638
import org.apache.jmeter.samplers.SampleResult;
3739
import org.apache.jmeter.samplers.Sampler;
3840
import org.apache.jmeter.testelement.TestStateListener;
@@ -306,8 +308,14 @@ public boolean compile()
306308
*/
307309
private void computeScriptMD5(String script) {
308310
// compute the md5 of the script if needed
309-
if(scriptMd5 == null) {
310-
scriptMd5 = ScriptCacheKey.ofString(DigestUtils.md5Hex(script));
311+
if (scriptMd5 == null) {
312+
try {
313+
MessageDigest md = MessageDigest.getInstance("MD5");
314+
md.update(script.getBytes(StandardCharsets.UTF_8));
315+
scriptMd5 = ScriptCacheKey.ofDigest(md.digest());
316+
} catch (NoSuchAlgorithmException e) {
317+
throw new RuntimeException("MessageDigest.getInstance(MD5) was not found", e);
318+
}
311319
}
312320
}
313321

src/core/src/main/java/org/apache/jmeter/util/ScriptCacheKey.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.jmeter.util;
1919

20+
import java.util.Arrays;
21+
import java.util.HexFormat;
2022
import java.util.Objects;
2123

2224
interface ScriptCacheKey {
@@ -25,8 +27,8 @@ interface ScriptCacheKey {
2527
* @param key cache key
2628
* @return cache key
2729
*/
28-
static ScriptCacheKey ofString(String key) {
29-
return new StringScriptCacheKey(key);
30+
static ScriptCacheKey ofDigest(byte[] key) {
31+
return new DigestScriptCacheKey(key);
3032
}
3133

3234
/**
@@ -40,11 +42,11 @@ static ScriptCacheKey ofFile(String language, String absolutePath, long lastModi
4042
return new FileScriptCacheKey(language, absolutePath, lastModified);
4143
}
4244

43-
final class StringScriptCacheKey implements ScriptCacheKey {
44-
final String contents;
45+
final class DigestScriptCacheKey implements ScriptCacheKey {
46+
final byte[] digest;
4547

46-
StringScriptCacheKey(String contents) {
47-
this.contents = contents;
48+
DigestScriptCacheKey(byte[] digest) {
49+
this.digest = digest;
4850
}
4951

5052
@Override
@@ -55,19 +57,19 @@ public boolean equals(Object o) {
5557
if (o == null || getClass() != o.getClass()) {
5658
return false;
5759
}
58-
StringScriptCacheKey that = (StringScriptCacheKey) o;
59-
return Objects.equals(contents, that.contents);
60+
DigestScriptCacheKey that = (DigestScriptCacheKey) o;
61+
return Arrays.equals(digest, that.digest);
6062
}
6163

6264
@Override
6365
public int hashCode() {
64-
return contents.hashCode();
66+
return Arrays.hashCode(digest);
6567
}
6668

6769
@Override
6870
public String toString() {
6971
return "StringScriptCacheKey{" +
70-
"contents='" + contents + '\'' +
72+
"contents='" + HexFormat.of().formatHex(digest) + '\'' +
7173
'}';
7274
}
7375
}

src/core/src/main/java/org/apache/jmeter/util/keystore/JmeterKeyStore.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@
3434
import java.util.Collection;
3535
import java.util.Enumeration;
3636
import java.util.HashMap;
37+
import java.util.HexFormat;
3738
import java.util.List;
3839
import java.util.Map;
3940
import java.util.Objects;
4041
import java.util.stream.Collectors;
4142

42-
import org.apache.commons.codec.binary.Hex;
4343
import org.apache.jmeter.threads.JMeterContextService;
4444
import org.apache.jorphan.util.StringUtilities;
4545
import org.slf4j.Logger;
@@ -242,7 +242,7 @@ private static String sanDataToString(Object data) {
242242
if (data instanceof String s) {
243243
return s;
244244
}
245-
return Hex.encodeHexString((byte[]) data);
245+
return HexFormat.of().formatHex((byte[]) data);
246246
}
247247

248248
private static String sanGeneralNameIndexToName(Integer index) {

src/dist/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ dependencies {
8989
api(project(p))
9090
}
9191

92+
runtimeOnly("commons-codec:commons-codec") {
93+
because("commons-codec was a dependency in previous JMeter versions, so we keep it for compatibility")
94+
}
95+
9296
binLicense(project(":src:licenses", "binLicense"))
9397
srcLicense(project(":src:licenses", "srcLicense"))
9498
generatorJar(project(":src:generator", "archives"))

src/functions/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ dependencies {
2424
testImplementation(testFixtures(projects.src.core))
2525

2626
implementation("org.mozilla:rhino")
27-
implementation("commons-codec:commons-codec")
2827
implementation("org.apache.commons:commons-jexl")
2928
implementation("org.apache.commons:commons-jexl3")
3029
implementation("commons-io:commons-io") {

src/functions/src/main/java/org/apache/jmeter/functions/DigestEncodeFunction.java

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@
2222
import java.security.NoSuchAlgorithmException;
2323
import java.util.ArrayList;
2424
import java.util.Collection;
25+
import java.util.HexFormat;
2526
import java.util.List;
26-
import java.util.Locale;
2727

28-
import org.apache.commons.codec.binary.Hex;
2928
import org.apache.jmeter.engine.util.CompoundVariable;
3029
import org.apache.jmeter.samplers.SampleResult;
3130
import org.apache.jmeter.samplers.Sampler;
@@ -85,7 +84,14 @@ public String execute(SampleResult previousResult, Sampler currentSampler) throw
8584
md.update(salt.getBytes(StandardCharsets.UTF_8));
8685
}
8786
byte[] bytes = md.digest();
88-
encodedString = uppercase(Hex.encodeHexString(bytes), values, 3);
87+
HexFormat hexFormat = HexFormat.of();
88+
if (values.length > 3) {
89+
String shouldUpperCase = values[3].execute();
90+
if (Boolean.parseBoolean(shouldUpperCase)) {
91+
hexFormat = hexFormat.withUpperCase();
92+
}
93+
}
94+
encodedString = hexFormat.formatHex(bytes);
8995
addVariableValue(encodedString, values, 4);
9096
} catch (NoSuchAlgorithmException e) {
9197
log.error("Error calling {} function with value {}, digest algorithm {}, salt {}, ", KEY, stringToEncode,
@@ -94,21 +100,6 @@ public String execute(SampleResult previousResult, Sampler currentSampler) throw
94100
return encodedString;
95101
}
96102

97-
/**
98-
* Upper case value if optional parameter value is true
99-
*
100-
* @param encodedString
101-
* @param index
102-
* @return
103-
*/
104-
private static String uppercase(String encodedString, CompoundVariable[] values, int index) {
105-
String shouldUpperCase = values.length > index ? values[index].execute() : null;
106-
if (Boolean.parseBoolean(shouldUpperCase)) {
107-
return encodedString.toUpperCase(Locale.ROOT);
108-
}
109-
return encodedString;
110-
}
111-
112103
@Override
113104
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
114105
checkParameterCount(parameters, MIN_PARAMETER_COUNT, MAX_PARAMETER_COUNT);

src/jorphan/src/main/java/org/apache/jorphan/util/JOrphanUtils.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.net.Socket;
2828
import java.security.SecureRandom;
2929
import java.util.ArrayList;
30+
import java.util.HexFormat;
3031
import java.util.List;
3132
import java.util.Map;
3233
import java.util.StringTokenizer;
@@ -403,15 +404,7 @@ public static boolean isXML(byte[] target) {
403404
* @return hex representation of binary input
404405
*/
405406
public static String baToHexString(byte[] ba) {
406-
StringBuilder sb = new StringBuilder(ba.length * 2);
407-
for (byte b : ba) {
408-
int j = b & 0xff;
409-
if (j < 16) {
410-
sb.append('0'); // $NON-NLS-1$ add zero padding
411-
}
412-
sb.append(Integer.toHexString(j));
413-
}
414-
return sb.toString();
407+
return baToHexString(ba, '\0');
415408
}
416409

417410
/**
@@ -422,18 +415,11 @@ public static String baToHexString(byte[] ba) {
422415
* @return hex representation of binary input
423416
*/
424417
public static String baToHexString(byte[] ba, char separator) {
425-
StringBuilder sb = new StringBuilder(ba.length * 2);
426-
for (int i = 0; i < ba.length; i++) {
427-
if (i > 0 && separator != 0) {
428-
sb.append(separator);
429-
}
430-
int j = ba[i] & 0xff;
431-
if (j < 16) {
432-
sb.append('0'); // $NON-NLS-1$ add zero padding
433-
}
434-
sb.append(Integer.toHexString(j));
418+
HexFormat format = HexFormat.of();
419+
if (separator != 0) {
420+
format = format.withDelimiter(Character.toString(separator));
435421
}
436-
return sb.toString();
422+
return format.formatHex(ba);
437423
}
438424

439425
/**

0 commit comments

Comments
 (0)