-
Notifications
You must be signed in to change notification settings - Fork 333
Expand file tree
/
Copy pathSpringHelper.java
More file actions
77 lines (69 loc) · 2.92 KB
/
SpringHelper.java
File metadata and controls
77 lines (69 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.datadog.debugger.util;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SpringHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringHelper.class);
public static boolean isSpringUsingOnlyMethodParameters(Instrumentation inst) {
try {
return isSpringUsingOnlyMethodParametersSpringVersion(inst);
} catch (Exception e) {
LOGGER.debug("isSpringUsingOnlyMethodParameters failed for SpringVersion", e);
// fallback to lookup for specific class
return isSpringUsingOnlyMethodParametersSpecificClass(inst);
}
}
private static boolean isSpringUsingOnlyMethodParametersSpringVersion(Instrumentation inst) {
try {
// scan for getting an already loaded class and get the classloader
ClassLoader springClassLoader = null;
for (Class<?> clazz : inst.getAllLoadedClasses()) {
if (clazz.getName().startsWith("org.springframework.core")) {
springClassLoader = clazz.getClassLoader();
}
}
if (springClassLoader == null) {
throw new IllegalStateException("Cannot find Spring classloader");
}
Class<?> springVersionClass =
Class.forName("org.springframework.core.SpringVersion", true, springClassLoader);
Method m = springVersionClass.getDeclaredMethod("getVersion");
String version = (String) m.invoke(null);
ParsedSpringVersion springVersion = new ParsedSpringVersion(version);
// if Spring version is 6.1+ only using MethodParameters
return springVersion.major > 6 || (springVersion.major == 6 && springVersion.minor >= 1);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static boolean isSpringUsingOnlyMethodParametersSpecificClass(Instrumentation inst) {
for (Class<?> clazz : inst.getAllLoadedClasses()) {
if ("org.springframework.web.client.RestClient".equals(clazz.getName())) {
// If this class (coming from Spring web since version 6.1) is found loaded it means Spring
// supports only getting parameter names from the MethodParameter attribute
return true;
}
}
// class not found, probably no Spring
return false;
}
private static class ParsedSpringVersion {
private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)");
final int major;
final int minor;
final int patch;
public ParsedSpringVersion(String strVersion) {
Matcher matcher = VERSION_PATTERN.matcher(strVersion);
if (matcher.find()) {
major = Integer.parseInt(matcher.group(1));
minor = Integer.parseInt(matcher.group(2));
patch = Integer.parseInt(matcher.group(3));
} else {
throw new IllegalArgumentException("Cannot parse SpringVersion: " + strVersion);
}
}
}
}