Skip to content

Commit 3dfeb32

Browse files
committed
feat: support servletNameFilter
1 parent a1bab09 commit 3dfeb32

16 files changed

+283
-273
lines changed

generator/src/main/java/com/reajason/javaweb/probe/payload/FilterProbeFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ private static Class<?> getFilterClass(String server) {
4545
return WebLogicFilterProbe.class;
4646
case Server.Undertow:
4747
return UndertowFilterProbe.class;
48+
case Server.Resin:
49+
return ResinFilterProbe.class;
4850
default:
4951
throw new GenerationException("filterProbe not supported for server: " + server);
5052
}

generator/src/main/java/com/reajason/javaweb/probe/payload/filter/ApusicFilterProbe.java

Lines changed: 55 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,73 +13,58 @@ public class ApusicFilterProbe {
1313

1414
@Override
1515
public String toString() {
16-
String msg = "";
16+
StringBuilder msg = new StringBuilder();
1717
Map<String, List<Map<String, String>>> allFiltersData = new LinkedHashMap<String, List<Map<String, String>>>();
1818
Set<Object> contexts = null;
1919
try {
2020
contexts = getContext();
2121
} catch (Throwable throwable) {
22-
msg += "context error: " + getErrorMessage(throwable);
22+
msg.append("context error: ").append(getErrorMessage(throwable));
2323
}
2424
if (contexts == null || contexts.isEmpty()) {
25-
msg += "context not found\n";
25+
msg.append("context not found\n");
2626
} else {
2727
for (Object context : contexts) {
2828
String contextRoot = getContextRoot(context);
29-
List<Map<String, String>> filters = collectFiltersData(context);
30-
allFiltersData.put(contextRoot, filters);
29+
try {
30+
List<Map<String, String>> filters = collectFiltersData(context);
31+
allFiltersData.put(contextRoot, filters);
32+
} catch (Throwable e) {
33+
msg.append(contextRoot).append(" failed ").append(getErrorMessage(e)).append("\n");
34+
}
3135
}
32-
msg += formatFiltersData(allFiltersData);
36+
msg.append(formatFiltersData(allFiltersData));
3337
}
34-
return msg;
38+
return msg.toString();
3539
}
3640

3741
@SuppressWarnings("all")
38-
private List<Map<String, String>> collectFiltersData(Object context) {
42+
private List<Map<String, String>> collectFiltersData(Object context) throws Exception {
3943
Map<String, Map<String, Object>> aggregatedData = new LinkedHashMap<>();
40-
41-
try {
42-
Object webModule = getFieldValue(context, "webapp");
43-
if (webModule == null) {
44-
return Collections.emptyList();
44+
Object webModule = getFieldValue(context, "webapp");
45+
Object[] filterMappings = (Object[]) invokeMethod(webModule, "getAllFilterMappings");
46+
Map<String, String> filterClassMap = new HashMap<>();
47+
48+
for (Object fm : filterMappings) {
49+
String name = (String) invokeMethod(fm, "getFilterName");
50+
if (!aggregatedData.containsKey(name)) {
51+
Map<String, Object> info = new HashMap<>();
52+
Object filterModel = invokeMethod(webModule, "getFilter", new Class[]{String.class}, new Object[]{name});
53+
info.put("filterName", name);
54+
info.put("filterClass", invokeMethod(filterModel, "getFilterClass"));
55+
info.put("urlPatterns", new LinkedHashSet<String>());
56+
info.put("servletNames", new LinkedHashSet<String>());
57+
aggregatedData.put(name, info);
4558
}
46-
47-
Object[] filterMappings = (Object[]) invokeMethod(webModule, "getAllFilterMappings");
48-
if (filterMappings == null || filterMappings.length == 0) {
49-
return Collections.emptyList();
59+
Map<String, Object> info = aggregatedData.get(name);
60+
String urlPattern = (String) invokeMethod(fm, "getUrlPattern");
61+
if (urlPattern != null) {
62+
((Set<String>) info.get("urlPatterns")).add(urlPattern);
5063
}
51-
52-
Object[] filters = (Object[]) invokeMethod(webModule, "getFilterList");
53-
Map<String, String> filterClassMap = new HashMap<>();
54-
if (filters != null) {
55-
for (Object filter : filters) {
56-
String name = (String) invokeMethod(filter, "getName");
57-
String className = (String) invokeMethod(filter, "getFilterClass");
58-
if (name != null && className != null) {
59-
filterClassMap.put(name, className);
60-
}
61-
}
62-
}
63-
64-
for (Object fm : filterMappings) {
65-
String name = (String) invokeMethod(fm, "getFilterName");
66-
if (name == null) {
67-
continue;
68-
}
69-
if (!aggregatedData.containsKey(name)) {
70-
Map<String, Object> info = new HashMap<>();
71-
info.put("filterName", name);
72-
info.put("filterClass", filterClassMap.getOrDefault(name, "N/A"));
73-
info.put("urlPatterns", new LinkedHashSet<String>());
74-
aggregatedData.put(name, info);
75-
}
76-
Map<String, Object> info = aggregatedData.get(name);
77-
String urlPattern = (String) invokeMethod(fm, "getUrlPattern");
78-
if (urlPattern != null) {
79-
((Set<String>) info.get("urlPatterns")).add(urlPattern);
80-
}
64+
String servletName = (String) invokeMethod(fm, "getServletName");
65+
if (servletName != null) {
66+
((Set<String>) info.get("servletNames")).add(servletName);
8167
}
82-
} catch (Exception ignored) {
8368
}
8469

8570
List<Map<String, String>> result = new ArrayList<>();
@@ -89,6 +74,8 @@ private List<Map<String, String>> collectFiltersData(Object context) {
8974
finalInfo.put("filterClass", (String) entry.get("filterClass"));
9075
Set<?> urls = (Set<?>) entry.get("urlPatterns");
9176
finalInfo.put("urlPatterns", urls.isEmpty() ? "" : urls.toString());
77+
Set<?> servletNames = (Set<?>) entry.get("servletNames");
78+
finalInfo.put("servletNames", servletNames.isEmpty() ? "" : servletNames.toString());
9279
result.add(finalInfo);
9380
}
9481
return result;
@@ -108,6 +95,7 @@ private String formatFiltersData(Map<String, List<Map<String, String>>> allFilte
10895
appendIfPresent(output, "", info.get("filterName"), "");
10996
appendIfPresent(output, " -> ", info.get("filterClass"), "");
11097
appendIfPresent(output, " -> URL:", info.get("urlPatterns"), "");
98+
appendIfPresent(output, " -> Servlet:", info.get("servletNames"), "");
11199
output.append("\n");
112100
}
113101
}
@@ -176,27 +164,30 @@ public static Object getFieldValue(Object obj, String fieldName) throws Exceptio
176164
throw new NoSuchFieldException(fieldName + " for " + obj.getClass().getName());
177165
}
178166

167+
public static Object invokeMethod(Object obj, String methodName) throws Exception {
168+
return invokeMethod(obj, methodName, null, null);
169+
}
170+
179171
@SuppressWarnings("all")
180-
public static Object invokeMethod(Object obj, String methodName) {
181-
try {
182-
Class<?> clazz = (obj instanceof Class) ? (Class<?>) obj : obj.getClass();
183-
Method method = null;
184-
while (clazz != null && method == null) {
185-
try {
172+
public static Object invokeMethod(Object obj, String methodName, Class<?>[] paramClazz, Object[] param) throws Exception {
173+
Class<?> clazz = (obj instanceof Class) ? (Class<?>) obj : obj.getClass();
174+
Method method = null;
175+
while (clazz != null && method == null) {
176+
try {
177+
if (paramClazz == null) {
186178
method = clazz.getDeclaredMethod(methodName);
187-
} catch (NoSuchMethodException e) {
188-
clazz = clazz.getSuperclass();
179+
} else {
180+
method = clazz.getDeclaredMethod(methodName, paramClazz);
189181
}
182+
} catch (NoSuchMethodException e) {
183+
clazz = clazz.getSuperclass();
190184
}
191-
if (method == null) {
192-
throw new NoSuchMethodException("Method not found: " + methodName);
193-
}
194-
195-
method.setAccessible(true);
196-
return method.invoke(obj instanceof Class ? null : obj);
197-
} catch (Exception e) {
198-
throw new RuntimeException("Error invoking method: " + methodName, e);
199185
}
186+
if (method == null) {
187+
throw new NoSuchMethodException("Method not found: " + methodName);
188+
}
189+
method.setAccessible(true);
190+
return method.invoke(obj instanceof Class ? null : obj, param);
200191
}
201192

202193
@SuppressWarnings("all")

generator/src/main/java/com/reajason/javaweb/probe/payload/filter/ResinFilterProbe.java

Lines changed: 64 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -13,73 +13,93 @@ public class ResinFilterProbe {
1313

1414
@Override
1515
public String toString() {
16-
String msg = "";
16+
StringBuilder msg = new StringBuilder();
1717
Map<String, List<Map<String, String>>> allFiltersData = new LinkedHashMap<String, List<Map<String, String>>>();
1818
Set<Object> contexts = null;
1919
try {
2020
contexts = getContext();
2121
} catch (Throwable throwable) {
22-
msg += "context error: " + getErrorMessage(throwable);
22+
msg.append("context error: ").append(getErrorMessage(throwable));
2323
}
2424
if (contexts == null || contexts.isEmpty()) {
25-
msg += "context not found\n";
25+
msg.append("context not found\n");
2626
} else {
2727
for (Object context : contexts) {
2828
String contextRoot = getContextRoot(context);
29-
List<Map<String, String>> filters = collectFiltersData(context);
30-
allFiltersData.put(contextRoot, filters);
29+
try {
30+
List<Map<String, String>> filters = collectFiltersData(context);
31+
allFiltersData.put(contextRoot, filters);
32+
} catch (Throwable e) {
33+
msg.append(contextRoot).append(" failed ").append(getErrorMessage(e)).append("\n");
34+
}
3135
}
32-
msg += formatFiltersData(allFiltersData);
36+
msg.append(formatFiltersData(allFiltersData));
3337
}
34-
return msg;
38+
return msg.toString();
3539
}
3640

37-
private List<Map<String, String>> collectFiltersData(Object context) {
38-
List<Map<String, String>> result = new ArrayList<>();
39-
try {
40-
Object filterMapper = getFieldValue(context, "_filterMapper");
41-
Object filterManager = getFieldValue(context, "_filterManager");
42-
if (filterMapper == null) return Collections.emptyList();
43-
ArrayList<Object> filterMappings = (ArrayList<Object>) getFieldValue(filterMapper, "_filterMap");
44-
for (Object filterMapping : filterMappings) {
45-
Map<String, String> info = new HashMap<>();
46-
String filterName = (String) invokeMethod(filterMapping, "getFilterName", null, null);
41+
@SuppressWarnings("unchecked")
42+
private List<Map<String, String>> collectFiltersData(Object context) throws Exception {
43+
Map<String, Map<String, Object>> aggregatedData = new LinkedHashMap<>();
44+
Object filterMapper = getFieldValue(context, "_filterMapper");
45+
Object filterManager = getFieldValue(context, "_filterManager");
46+
if (filterMapper == null) return Collections.emptyList();
47+
ArrayList<Object> filterMappings = (ArrayList<Object>) getFieldValue(filterMapper, "_filterMap");
48+
for (Object filterMapping : filterMappings) {
49+
String filterName = (String) invokeMethod(filterMapping, "getFilterName", null, null);
50+
if (aggregatedData.get(filterName) == null) {
51+
Map<String, Object> info = new HashMap<>();
4752
info.put("filterName", filterName);
4853
String filterClassName = (String) invokeMethod(filterMapping, "getFilterClassName", null, null);
49-
try {
50-
if (filterClassName == null) {
51-
Class<?> filterClass = (Class<?>) invokeMethod(filterMapping, "getFilterClass", null, null);
52-
if (filterClass != null) {
53-
filterClassName = filterClass.getName();
54-
} else {
55-
Object filter = ((Map<String, Object>) getFieldValue(filterManager, "_instances")).get(filterName);
56-
if (filter != null) {
57-
filterClassName = filter.getClass().getName();
58-
}
54+
if (filterClassName == null) {
55+
Class<?> filterClass = (Class<?>) invokeMethod(filterMapping, "getFilterClass", null, null);
56+
if (filterClass != null) {
57+
filterClassName = filterClass.getName();
58+
} else {
59+
Object filter = ((Map<String, Object>) getFieldValue(filterManager, "_instances")).get(filterName);
60+
if (filter != null) {
61+
filterClassName = filter.getClass().getName();
5962
}
6063
}
61-
} catch (Exception ignored) {
6264
}
6365
info.put("filterClass", filterClassName != null ? filterClassName : "N/A");
64-
65-
List<String> urlPatterns = new ArrayList<>();
66-
String urlPattern = invokeMethod(filterMapping, "getURLPattern", null, null).toString();
67-
if (urlPattern == null || urlPattern.isEmpty()) {
68-
List<Object> matchList = (List<Object>) getFieldValue(filterMapping, "_matchList");
69-
if (matchList != null && !matchList.isEmpty()) {
70-
for (Object match : matchList) {
71-
if (((Integer) getFieldValue(match, "_value")) == 1) {
72-
urlPatterns.add(getFieldValue(match, "_regex").toString());
73-
}
66+
info.put("urlPatterns", new LinkedHashSet<String>());
67+
info.put("servletNames", new LinkedHashSet<String>());
68+
aggregatedData.put(filterName, info);
69+
}
70+
Map<String, Object> info = aggregatedData.get(filterName);
71+
List<String> urlPatterns = new ArrayList<>();
72+
String urlPattern = (String) invokeMethod(filterMapping, "getURLPattern", null, null);
73+
if (urlPattern == null || urlPattern.isEmpty()) {
74+
List<Object> matchList = (List<Object>) getFieldValue(filterMapping, "_matchList");
75+
if (matchList != null && !matchList.isEmpty()) {
76+
for (Object match : matchList) {
77+
if (((Integer) getFieldValue(match, "_value")) == 1) {
78+
urlPatterns.add(getFieldValue(match, "_regex").toString());
7479
}
7580
}
76-
} else {
77-
urlPatterns.add(urlPattern);
7881
}
79-
info.put("urlPatterns", Arrays.toString(urlPatterns.toArray()));
80-
result.add(info);
82+
} else {
83+
urlPatterns.add(urlPattern);
8184
}
82-
} catch (Exception ignored) {
85+
if (!urlPatterns.isEmpty()) {
86+
((Set) info.get("urlPatterns")).addAll(urlPatterns);
87+
}
88+
List<String> servletNames = (List<String>) getFieldValue(filterMapping, "_servletNames");
89+
if (servletNames != null && !servletNames.isEmpty()) {
90+
((Set) info.get("servletNames")).addAll(servletNames);
91+
}
92+
}
93+
List<Map<String, String>> result = new ArrayList<>();
94+
for (Map<String, Object> entry : aggregatedData.values()) {
95+
Map<String, String> finalInfo = new HashMap<>();
96+
finalInfo.put("filterName", (String) entry.get("filterName"));
97+
finalInfo.put("filterClass", (String) entry.get("filterClass"));
98+
Set<?> urls = (Set<?>) entry.get("urlPatterns");
99+
finalInfo.put("urlPatterns", urls.isEmpty() ? "" : urls.toString());
100+
Set<?> servletNames = (Set<?>) entry.get("servletNames");
101+
finalInfo.put("servletNames", servletNames.isEmpty() ? "" : servletNames.toString());
102+
result.add(finalInfo);
83103
}
84104
return result;
85105
}
@@ -100,6 +120,7 @@ private String formatFiltersData(Map<String, List<Map<String, String>>> allFilte
100120
appendIfPresent(output, "", info.get("filterName"), "");
101121
appendIfPresent(output, " -> ", info.get("filterClass"), "");
102122
appendIfPresent(output, " -> URL:", info.get("urlPatterns"), "");
123+
appendIfPresent(output, " -> Servlet:", info.get("servletNames"), "");
103124
output.append("\n");
104125
}
105126
}

0 commit comments

Comments
 (0)